lx-annotate 0.0.1__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.
Files changed (1188) hide show
  1. lx_annotate/__init__.py +0 -0
  2. lx_annotate/admin.py +1 -0
  3. lx_annotate/apps.py +42 -0
  4. lx_annotate/asgi.py +40 -0
  5. lx_annotate/auth_views.py +44 -0
  6. lx_annotate/file_watcher.py +559 -0
  7. lx_annotate/keycloak_auth.py +144 -0
  8. lx_annotate/management/__init__.py +1 -0
  9. lx_annotate/management/commands/__init__.py +1 -0
  10. lx_annotate/management/commands/export_route_manifest.py +138 -0
  11. lx_annotate/management/commands/run_filewatcher.py +30 -0
  12. lx_annotate/management/commands/start_filewatcher.py +1 -0
  13. lx_annotate/middleware/__init__.py +23 -0
  14. lx_annotate/middleware/lookup_tracker.py +122 -0
  15. lx_annotate/migration_overrides/__init__.py +1 -0
  16. lx_annotate/migration_overrides/endoreg_db/0001_initial.py +5 -0
  17. lx_annotate/migration_overrides/endoreg_db/0001_squashed_0001_initial.py +5408 -0
  18. lx_annotate/migration_overrides/endoreg_db/0002_export_flags.py +5 -0
  19. lx_annotate/migration_overrides/endoreg_db/0003_patientexaminationreport_report_and_more.py +7 -0
  20. lx_annotate/migration_overrides/endoreg_db/0004_videofile_uuid.py +48 -0
  21. lx_annotate/migration_overrides/endoreg_db/0005_rawpdffile_uuid.py +48 -0
  22. lx_annotate/migration_overrides/endoreg_db/0006_applicationsettings.py +5 -0
  23. lx_annotate/migration_overrides/endoreg_db/0007_pdfprocessinghistory.py +5 -0
  24. lx_annotate/migration_overrides/endoreg_db/0008_imageclassificationannotation_upsert_fields.py +15 -0
  25. lx_annotate/migration_overrides/endoreg_db/0009_patientexamination_draft_updated_at_and_more.py +98 -0
  26. lx_annotate/migration_overrides/endoreg_db/0010_remove_requirementset_reqset_exam_links_and_more.py +158 -0
  27. lx_annotate/migration_overrides/endoreg_db/0011_hub_ingest_metadata.py +19 -0
  28. lx_annotate/migration_overrides/endoreg_db/0012_networknode_transferjob.py +5 -0
  29. lx_annotate/migration_overrides/endoreg_db/0013_remove_legacy_requirement_models.py +5 -0
  30. lx_annotate/migration_overrides/endoreg_db/__init__.py +1 -0
  31. lx_annotate/run_gunicorn.py +29 -0
  32. lx_annotate/serializers.py +20 -0
  33. lx_annotate/settings/__init__.py +0 -0
  34. lx_annotate/settings/config.py +210 -0
  35. lx_annotate/settings/secret_key.py +40 -0
  36. lx_annotate/settings/settings_base.py +313 -0
  37. lx_annotate/settings/settings_dev.py +130 -0
  38. lx_annotate/settings/settings_prod.py +252 -0
  39. lx_annotate/settings/settings_test.py +156 -0
  40. lx_annotate/static/AnnotationDashboard-D35JYvrC.js +1 -0
  41. lx_annotate/static/AnnotationDashboard-DMZZ8ZMX.css +1 -0
  42. lx_annotate/static/AnnotationDashboard-OeFWLB-b.js +1 -0
  43. lx_annotate/static/Anonymization-Bd9LTm0-.js +1 -0
  44. lx_annotate/static/AnonymizationCorrectionComponent-BPyn1Euk.css +1 -0
  45. lx_annotate/static/AnonymizationCorrectionComponent-CAO-Cg0B.js +1 -0
  46. lx_annotate/static/AnonymizationOverview-CGBsqOFg.js +1 -0
  47. lx_annotate/static/AnonymizationOverview-DUuDRweL.css +1 -0
  48. lx_annotate/static/AnonymizationValidationComponent-BARZClvg.css +1 -0
  49. lx_annotate/static/AnonymizationValidationComponent-Bd7Ndg-z.js +1 -0
  50. lx_annotate/static/Dashboard-DsKQzZNG.js +1 -0
  51. lx_annotate/static/Examination-CeCEv25w.js +1 -0
  52. lx_annotate/static/PageOverview-B8gUoFeQ.js +1 -0
  53. lx_annotate/static/PatientAdder-BlwvntXl.js +1 -0
  54. lx_annotate/static/PatientAdder-CFDJpfd1.js +1 -0
  55. lx_annotate/static/PatientAdder-DOhN0oE-.css +1 -0
  56. lx_annotate/static/PatientOverview-C7XuyKPN.js +1 -0
  57. lx_annotate/static/PatientOverview-oorWuJjf.css +1 -0
  58. lx_annotate/static/Profil-lke9QkYz.js +1 -0
  59. lx_annotate/static/ReportGenerator-DJn6kaoO.js +1 -0
  60. lx_annotate/static/RequirementGenerator-BC9a09T1.css +1 -0
  61. lx_annotate/static/RequirementGenerator-CeDfg9J_.js +1 -0
  62. lx_annotate/static/Timeline-CMheelus.js +1 -0
  63. lx_annotate/static/Timeline-DA5RpACe.css +1 -0
  64. lx_annotate/static/UeberUns-DnTs7q1V.js +1 -0
  65. lx_annotate/static/Validierung-Bobt4Qg1.js +1 -0
  66. lx_annotate/static/Validierung-u-u0EBv0.css +1 -0
  67. lx_annotate/static/VideoExamination-B8b7SxA_.js +1 -0
  68. lx_annotate/static/VideoExamination-DdMsVSAF.css +1 -0
  69. lx_annotate/static/admin/css/autocomplete.css +279 -0
  70. lx_annotate/static/admin/css/base.css +1180 -0
  71. lx_annotate/static/admin/css/changelists.css +343 -0
  72. lx_annotate/static/admin/css/dark_mode.css +130 -0
  73. lx_annotate/static/admin/css/dashboard.css +29 -0
  74. lx_annotate/static/admin/css/forms.css +498 -0
  75. lx_annotate/static/admin/css/login.css +61 -0
  76. lx_annotate/static/admin/css/nav_sidebar.css +150 -0
  77. lx_annotate/static/admin/css/responsive.css +904 -0
  78. lx_annotate/static/admin/css/responsive_rtl.css +89 -0
  79. lx_annotate/static/admin/css/rtl.css +293 -0
  80. lx_annotate/static/admin/css/unusable_password_field.css +19 -0
  81. lx_annotate/static/admin/css/vendor/select2/LICENSE-SELECT2.md +21 -0
  82. lx_annotate/static/admin/css/vendor/select2/select2.css +481 -0
  83. lx_annotate/static/admin/css/vendor/select2/select2.min.css +1 -0
  84. lx_annotate/static/admin/css/widgets.css +613 -0
  85. lx_annotate/static/admin/img/LICENSE +20 -0
  86. lx_annotate/static/admin/img/README.txt +7 -0
  87. lx_annotate/static/admin/img/calendar-icons.svg +63 -0
  88. lx_annotate/static/admin/img/gis/move_vertex_off.svg +1 -0
  89. lx_annotate/static/admin/img/gis/move_vertex_on.svg +1 -0
  90. lx_annotate/static/admin/img/icon-addlink.svg +3 -0
  91. lx_annotate/static/admin/img/icon-alert.svg +3 -0
  92. lx_annotate/static/admin/img/icon-calendar.svg +9 -0
  93. lx_annotate/static/admin/img/icon-changelink.svg +3 -0
  94. lx_annotate/static/admin/img/icon-clock.svg +9 -0
  95. lx_annotate/static/admin/img/icon-deletelink.svg +3 -0
  96. lx_annotate/static/admin/img/icon-hidelink.svg +3 -0
  97. lx_annotate/static/admin/img/icon-no.svg +3 -0
  98. lx_annotate/static/admin/img/icon-unknown-alt.svg +3 -0
  99. lx_annotate/static/admin/img/icon-unknown.svg +3 -0
  100. lx_annotate/static/admin/img/icon-viewlink.svg +3 -0
  101. lx_annotate/static/admin/img/icon-yes.svg +3 -0
  102. lx_annotate/static/admin/img/inline-delete.svg +3 -0
  103. lx_annotate/static/admin/img/search.svg +3 -0
  104. lx_annotate/static/admin/img/selector-icons.svg +34 -0
  105. lx_annotate/static/admin/img/sorting-icons.svg +19 -0
  106. lx_annotate/static/admin/img/tooltag-add.svg +3 -0
  107. lx_annotate/static/admin/img/tooltag-arrowright.svg +3 -0
  108. lx_annotate/static/admin/js/SelectBox.js +116 -0
  109. lx_annotate/static/admin/js/SelectFilter2.js +311 -0
  110. lx_annotate/static/admin/js/actions.js +204 -0
  111. lx_annotate/static/admin/js/admin/DateTimeShortcuts.js +408 -0
  112. lx_annotate/static/admin/js/admin/RelatedObjectLookups.js +252 -0
  113. lx_annotate/static/admin/js/autocomplete.js +33 -0
  114. lx_annotate/static/admin/js/calendar.js +239 -0
  115. lx_annotate/static/admin/js/cancel.js +29 -0
  116. lx_annotate/static/admin/js/change_form.js +16 -0
  117. lx_annotate/static/admin/js/core.js +184 -0
  118. lx_annotate/static/admin/js/filters.js +30 -0
  119. lx_annotate/static/admin/js/inlines.js +359 -0
  120. lx_annotate/static/admin/js/jquery.init.js +8 -0
  121. lx_annotate/static/admin/js/nav_sidebar.js +79 -0
  122. lx_annotate/static/admin/js/popup_response.js +15 -0
  123. lx_annotate/static/admin/js/prepopulate.js +43 -0
  124. lx_annotate/static/admin/js/prepopulate_init.js +15 -0
  125. lx_annotate/static/admin/js/theme.js +51 -0
  126. lx_annotate/static/admin/js/unusable_password_field.js +29 -0
  127. lx_annotate/static/admin/js/urlify.js +169 -0
  128. lx_annotate/static/admin/js/vendor/jquery/LICENSE.txt +20 -0
  129. lx_annotate/static/admin/js/vendor/jquery/jquery.js +10716 -0
  130. lx_annotate/static/admin/js/vendor/jquery/jquery.min.js +2 -0
  131. lx_annotate/static/admin/js/vendor/select2/LICENSE.md +21 -0
  132. lx_annotate/static/admin/js/vendor/select2/i18n/af.js +3 -0
  133. lx_annotate/static/admin/js/vendor/select2/i18n/ar.js +3 -0
  134. lx_annotate/static/admin/js/vendor/select2/i18n/az.js +3 -0
  135. lx_annotate/static/admin/js/vendor/select2/i18n/bg.js +3 -0
  136. lx_annotate/static/admin/js/vendor/select2/i18n/bn.js +3 -0
  137. lx_annotate/static/admin/js/vendor/select2/i18n/bs.js +3 -0
  138. lx_annotate/static/admin/js/vendor/select2/i18n/ca.js +3 -0
  139. lx_annotate/static/admin/js/vendor/select2/i18n/cs.js +3 -0
  140. lx_annotate/static/admin/js/vendor/select2/i18n/da.js +3 -0
  141. lx_annotate/static/admin/js/vendor/select2/i18n/de.js +3 -0
  142. lx_annotate/static/admin/js/vendor/select2/i18n/dsb.js +3 -0
  143. lx_annotate/static/admin/js/vendor/select2/i18n/el.js +3 -0
  144. lx_annotate/static/admin/js/vendor/select2/i18n/en.js +3 -0
  145. lx_annotate/static/admin/js/vendor/select2/i18n/es.js +3 -0
  146. lx_annotate/static/admin/js/vendor/select2/i18n/et.js +3 -0
  147. lx_annotate/static/admin/js/vendor/select2/i18n/eu.js +3 -0
  148. lx_annotate/static/admin/js/vendor/select2/i18n/fa.js +3 -0
  149. lx_annotate/static/admin/js/vendor/select2/i18n/fi.js +3 -0
  150. lx_annotate/static/admin/js/vendor/select2/i18n/fr.js +3 -0
  151. lx_annotate/static/admin/js/vendor/select2/i18n/gl.js +3 -0
  152. lx_annotate/static/admin/js/vendor/select2/i18n/he.js +3 -0
  153. lx_annotate/static/admin/js/vendor/select2/i18n/hi.js +3 -0
  154. lx_annotate/static/admin/js/vendor/select2/i18n/hr.js +3 -0
  155. lx_annotate/static/admin/js/vendor/select2/i18n/hsb.js +3 -0
  156. lx_annotate/static/admin/js/vendor/select2/i18n/hu.js +3 -0
  157. lx_annotate/static/admin/js/vendor/select2/i18n/hy.js +3 -0
  158. lx_annotate/static/admin/js/vendor/select2/i18n/id.js +3 -0
  159. lx_annotate/static/admin/js/vendor/select2/i18n/is.js +3 -0
  160. lx_annotate/static/admin/js/vendor/select2/i18n/it.js +3 -0
  161. lx_annotate/static/admin/js/vendor/select2/i18n/ja.js +3 -0
  162. lx_annotate/static/admin/js/vendor/select2/i18n/ka.js +3 -0
  163. lx_annotate/static/admin/js/vendor/select2/i18n/km.js +3 -0
  164. lx_annotate/static/admin/js/vendor/select2/i18n/ko.js +3 -0
  165. lx_annotate/static/admin/js/vendor/select2/i18n/lt.js +3 -0
  166. lx_annotate/static/admin/js/vendor/select2/i18n/lv.js +3 -0
  167. lx_annotate/static/admin/js/vendor/select2/i18n/mk.js +3 -0
  168. lx_annotate/static/admin/js/vendor/select2/i18n/ms.js +3 -0
  169. lx_annotate/static/admin/js/vendor/select2/i18n/nb.js +3 -0
  170. lx_annotate/static/admin/js/vendor/select2/i18n/ne.js +3 -0
  171. lx_annotate/static/admin/js/vendor/select2/i18n/nl.js +3 -0
  172. lx_annotate/static/admin/js/vendor/select2/i18n/pl.js +3 -0
  173. lx_annotate/static/admin/js/vendor/select2/i18n/ps.js +3 -0
  174. lx_annotate/static/admin/js/vendor/select2/i18n/pt-BR.js +3 -0
  175. lx_annotate/static/admin/js/vendor/select2/i18n/pt.js +3 -0
  176. lx_annotate/static/admin/js/vendor/select2/i18n/ro.js +3 -0
  177. lx_annotate/static/admin/js/vendor/select2/i18n/ru.js +3 -0
  178. lx_annotate/static/admin/js/vendor/select2/i18n/sk.js +3 -0
  179. lx_annotate/static/admin/js/vendor/select2/i18n/sl.js +3 -0
  180. lx_annotate/static/admin/js/vendor/select2/i18n/sq.js +3 -0
  181. lx_annotate/static/admin/js/vendor/select2/i18n/sr-Cyrl.js +3 -0
  182. lx_annotate/static/admin/js/vendor/select2/i18n/sr.js +3 -0
  183. lx_annotate/static/admin/js/vendor/select2/i18n/sv.js +3 -0
  184. lx_annotate/static/admin/js/vendor/select2/i18n/th.js +3 -0
  185. lx_annotate/static/admin/js/vendor/select2/i18n/tk.js +3 -0
  186. lx_annotate/static/admin/js/vendor/select2/i18n/tr.js +3 -0
  187. lx_annotate/static/admin/js/vendor/select2/i18n/uk.js +3 -0
  188. lx_annotate/static/admin/js/vendor/select2/i18n/vi.js +3 -0
  189. lx_annotate/static/admin/js/vendor/select2/i18n/zh-CN.js +3 -0
  190. lx_annotate/static/admin/js/vendor/select2/i18n/zh-TW.js +3 -0
  191. lx_annotate/static/admin/js/vendor/select2/select2.full.js +6820 -0
  192. lx_annotate/static/admin/js/vendor/select2/select2.full.min.js +2 -0
  193. lx_annotate/static/admin/js/vendor/xregexp/LICENSE.txt +21 -0
  194. lx_annotate/static/admin/js/vendor/xregexp/xregexp.js +6126 -0
  195. lx_annotate/static/admin/js/vendor/xregexp/xregexp.min.js +17 -0
  196. lx_annotate/static/annotationStore-DEHKjdKh.js +1 -0
  197. lx_annotate/static/assets/AnnotationDashboard-D35JYvrC.js +1 -0
  198. lx_annotate/static/assets/AnnotationDashboard-DMZZ8ZMX.css +1 -0
  199. lx_annotate/static/assets/AnnotationDashboard-OeFWLB-b.js +1 -0
  200. lx_annotate/static/assets/Anonymization-Bd9LTm0-.js +1 -0
  201. lx_annotate/static/assets/AnonymizationCorrectionComponent-BPyn1Euk.css +1 -0
  202. lx_annotate/static/assets/AnonymizationCorrectionComponent-CAO-Cg0B.js +1 -0
  203. lx_annotate/static/assets/AnonymizationOverview-CGBsqOFg.js +1 -0
  204. lx_annotate/static/assets/AnonymizationOverview-DUuDRweL.css +1 -0
  205. lx_annotate/static/assets/AnonymizationValidationComponent-BARZClvg.css +1 -0
  206. lx_annotate/static/assets/AnonymizationValidationComponent-Bd7Ndg-z.js +1 -0
  207. lx_annotate/static/assets/Dashboard-DsKQzZNG.js +1 -0
  208. lx_annotate/static/assets/Examination-CeCEv25w.js +1 -0
  209. lx_annotate/static/assets/PageOverview-B8gUoFeQ.js +1 -0
  210. lx_annotate/static/assets/PatientAdder-BlwvntXl.js +1 -0
  211. lx_annotate/static/assets/PatientAdder-CFDJpfd1.js +1 -0
  212. lx_annotate/static/assets/PatientAdder-DOhN0oE-.css +1 -0
  213. lx_annotate/static/assets/PatientOverview-C7XuyKPN.js +1 -0
  214. lx_annotate/static/assets/PatientOverview-oorWuJjf.css +1 -0
  215. lx_annotate/static/assets/Profil-lke9QkYz.js +1 -0
  216. lx_annotate/static/assets/ReportGenerator-DJn6kaoO.js +1 -0
  217. lx_annotate/static/assets/RequirementGenerator-BC9a09T1.css +1 -0
  218. lx_annotate/static/assets/RequirementGenerator-CeDfg9J_.js +1 -0
  219. lx_annotate/static/assets/Timeline-CMheelus.js +1 -0
  220. lx_annotate/static/assets/Timeline-DA5RpACe.css +1 -0
  221. lx_annotate/static/assets/UeberUns-DnTs7q1V.js +1 -0
  222. lx_annotate/static/assets/Validierung-Bobt4Qg1.js +1 -0
  223. lx_annotate/static/assets/Validierung-u-u0EBv0.css +1 -0
  224. lx_annotate/static/assets/VideoExamination-B8b7SxA_.js +1 -0
  225. lx_annotate/static/assets/VideoExamination-DdMsVSAF.css +1 -0
  226. lx_annotate/static/assets/annotationStore-DEHKjdKh.js +1 -0
  227. lx_annotate/static/assets/authStore-w8taChNC.js +1 -0
  228. lx_annotate/static/assets/base.css +86 -0
  229. lx_annotate/static/assets/css/material-dashboard.css +27935 -0
  230. lx_annotate/static/assets/css/material-dashboard.css.map +360 -0
  231. lx_annotate/static/assets/css/material-dashboard.min.css +42 -0
  232. lx_annotate/static/assets/css/nucleo-icons.css +597 -0
  233. lx_annotate/static/assets/css/nucleo-svg.css +135 -0
  234. lx_annotate/static/assets/fonts/nucleo-icons.eot +0 -0
  235. lx_annotate/static/assets/fonts/nucleo-icons.svg +312 -0
  236. lx_annotate/static/assets/fonts/nucleo-icons.ttf +0 -0
  237. lx_annotate/static/assets/fonts/nucleo-icons.woff +0 -0
  238. lx_annotate/static/assets/fonts/nucleo-icons.woff2 +0 -0
  239. lx_annotate/static/assets/fonts/nucleo.eot +0 -0
  240. lx_annotate/static/assets/fonts/nucleo.ttf +0 -0
  241. lx_annotate/static/assets/fonts/nucleo.woff +0 -0
  242. lx_annotate/static/assets/fonts/nucleo.woff2 +0 -0
  243. lx_annotate/static/assets/js/core/bootstrap.bundle.min.js +6 -0
  244. lx_annotate/static/assets/js/core/bootstrap.min.js +6 -0
  245. lx_annotate/static/assets/js/core/popper.min.js +4 -0
  246. lx_annotate/static/assets/js/material-dashboard.js +879 -0
  247. lx_annotate/static/assets/js/material-dashboard.js.map +1 -0
  248. lx_annotate/static/assets/js/material-dashboard.min.js +17 -0
  249. lx_annotate/static/assets/js/plugins/Chart.extension.js +130 -0
  250. lx_annotate/static/assets/js/plugins/bootstrap-notify.js +432 -0
  251. lx_annotate/static/assets/js/plugins/chartjs.min.js +13 -0
  252. lx_annotate/static/assets/js/plugins/countup.min.js +1 -0
  253. lx_annotate/static/assets/js/plugins/get_annotations.js +49 -0
  254. lx_annotate/static/assets/js/plugins/perfect-scrollbar.min.js +19 -0
  255. lx_annotate/static/assets/js/plugins/random-name-generator.js +81 -0
  256. lx_annotate/static/assets/js/plugins/smooth-scrollbar.min.js +25 -0
  257. lx_annotate/static/assets/js/plugins/submission-handler.js +73 -0
  258. lx_annotate/static/assets/js/plugins/world.js +2464 -0
  259. lx_annotate/static/assets/logo.svg +1 -0
  260. lx_annotate/static/assets/main-DGGk9Vng.css +37 -0
  261. lx_annotate/static/assets/main-DethiONo.js +36 -0
  262. lx_annotate/static/assets/main.css +32 -0
  263. lx_annotate/static/assets/mediaTypeStore-D6KIykKn.js +1 -0
  264. lx_annotate/static/assets/nucleo-icons-BgnVbBvX.eot +0 -0
  265. lx_annotate/static/assets/nucleo-icons-BuEzPWOc.woff +0 -0
  266. lx_annotate/static/assets/nucleo-icons-C6OFysxg.svg +312 -0
  267. lx_annotate/static/assets/nucleo-icons-CTnIBWcu.woff2 +0 -0
  268. lx_annotate/static/assets/nucleo-icons-kNTzvw2K.ttf +0 -0
  269. lx_annotate/static/assets/patientStore-BazAFCNw.js +1 -0
  270. lx_annotate/static/assets/scss/material-dashboard/_alert.scss +17 -0
  271. lx_annotate/static/assets/scss/material-dashboard/_avatars.scss +123 -0
  272. lx_annotate/static/assets/scss/material-dashboard/_badge.scss +8 -0
  273. lx_annotate/static/assets/scss/material-dashboard/_breadcrumbs.scss +48 -0
  274. lx_annotate/static/assets/scss/material-dashboard/_buttons.scss +191 -0
  275. lx_annotate/static/assets/scss/material-dashboard/_cards.scss +60 -0
  276. lx_annotate/static/assets/scss/material-dashboard/_dark-version.scss +281 -0
  277. lx_annotate/static/assets/scss/material-dashboard/_dropdown.scss +292 -0
  278. lx_annotate/static/assets/scss/material-dashboard/_dropup.scss +41 -0
  279. lx_annotate/static/assets/scss/material-dashboard/_fixed-plugin.scss +60 -0
  280. lx_annotate/static/assets/scss/material-dashboard/_footer.scss +17 -0
  281. lx_annotate/static/assets/scss/material-dashboard/_forms.scss +49 -0
  282. lx_annotate/static/assets/scss/material-dashboard/_gradients.scss +18 -0
  283. lx_annotate/static/assets/scss/material-dashboard/_header.scss +25 -0
  284. lx_annotate/static/assets/scss/material-dashboard/_icons.scss +32 -0
  285. lx_annotate/static/assets/scss/material-dashboard/_info-areas.scss +178 -0
  286. lx_annotate/static/assets/scss/material-dashboard/_misc.scss +442 -0
  287. lx_annotate/static/assets/scss/material-dashboard/_nav.scss +123 -0
  288. lx_annotate/static/assets/scss/material-dashboard/_navbar-vertical.scss +725 -0
  289. lx_annotate/static/assets/scss/material-dashboard/_navbar.scss +220 -0
  290. lx_annotate/static/assets/scss/material-dashboard/_pagination.scss +58 -0
  291. lx_annotate/static/assets/scss/material-dashboard/_popovers.scss +10 -0
  292. lx_annotate/static/assets/scss/material-dashboard/_progress.scss +15 -0
  293. lx_annotate/static/assets/scss/material-dashboard/_ripple.scss +15 -0
  294. lx_annotate/static/assets/scss/material-dashboard/_rtl.scss +125 -0
  295. lx_annotate/static/assets/scss/material-dashboard/_social-buttons.scss +42 -0
  296. lx_annotate/static/assets/scss/material-dashboard/_tables.scss +53 -0
  297. lx_annotate/static/assets/scss/material-dashboard/_tilt.scss +11 -0
  298. lx_annotate/static/assets/scss/material-dashboard/_timeline.scss +137 -0
  299. lx_annotate/static/assets/scss/material-dashboard/_tooltips.scss +9 -0
  300. lx_annotate/static/assets/scss/material-dashboard/_typography.scss +301 -0
  301. lx_annotate/static/assets/scss/material-dashboard/_utilities-extend.scss +11 -0
  302. lx_annotate/static/assets/scss/material-dashboard/_utilities.scss +837 -0
  303. lx_annotate/static/assets/scss/material-dashboard/_variables.scss +1674 -0
  304. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_accordion.scss +149 -0
  305. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_alert.scss +71 -0
  306. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_badge.scss +38 -0
  307. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_breadcrumb.scss +40 -0
  308. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_button-group.scss +142 -0
  309. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_buttons.scss +207 -0
  310. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_card.scss +234 -0
  311. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_carousel.scss +226 -0
  312. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_close.scss +40 -0
  313. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_containers.scss +41 -0
  314. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_dropdown.scss +249 -0
  315. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_forms.scss +9 -0
  316. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_functions.scss +302 -0
  317. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_grid.scss +33 -0
  318. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_helpers.scss +10 -0
  319. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_images.scss +42 -0
  320. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_list-group.scss +192 -0
  321. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_maps.scss +54 -0
  322. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_mixins.scss +43 -0
  323. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_modal.scss +237 -0
  324. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_nav.scss +172 -0
  325. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_navbar.scss +278 -0
  326. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_offcanvas.scss +144 -0
  327. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_pagination.scss +109 -0
  328. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_placeholders.scss +51 -0
  329. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_popover.scss +196 -0
  330. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_progress.scss +59 -0
  331. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_reboot.scss +610 -0
  332. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_root.scss +73 -0
  333. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_spinners.scss +85 -0
  334. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_tables.scss +164 -0
  335. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_toasts.scss +73 -0
  336. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_tooltip.scss +120 -0
  337. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_transitions.scss +27 -0
  338. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_type.scss +106 -0
  339. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_utilities.scss +647 -0
  340. lx_annotate/static/assets/scss/material-dashboard/bootstrap/_variables.scss +1634 -0
  341. lx_annotate/static/assets/scss/material-dashboard/bootstrap/bootstrap-grid.scss +64 -0
  342. lx_annotate/static/assets/scss/material-dashboard/bootstrap/bootstrap-reboot.scss +9 -0
  343. lx_annotate/static/assets/scss/material-dashboard/bootstrap/bootstrap-utilities.scss +18 -0
  344. lx_annotate/static/assets/scss/material-dashboard/bootstrap/bootstrap.scss +51 -0
  345. lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_floating-labels.scss +75 -0
  346. lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_form-check.scss +175 -0
  347. lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_form-control.scss +194 -0
  348. lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_form-range.scss +91 -0
  349. lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_form-select.scss +71 -0
  350. lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_form-text.scss +11 -0
  351. lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_input-group.scss +132 -0
  352. lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_labels.scss +36 -0
  353. lx_annotate/static/assets/scss/material-dashboard/bootstrap/forms/_validation.scss +12 -0
  354. lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_clearfix.scss +3 -0
  355. lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_color-bg.scss +10 -0
  356. lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_colored-links.scss +12 -0
  357. lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_position.scss +36 -0
  358. lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_ratio.scss +26 -0
  359. lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_stacks.scss +15 -0
  360. lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_stretched-link.scss +15 -0
  361. lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_text-truncation.scss +7 -0
  362. lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_visually-hidden.scss +8 -0
  363. lx_annotate/static/assets/scss/material-dashboard/bootstrap/helpers/_vr.scss +8 -0
  364. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_alert.scss +15 -0
  365. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_backdrop.scss +14 -0
  366. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_banner.scss +9 -0
  367. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_border-radius.scss +78 -0
  368. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_box-shadow.scss +18 -0
  369. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_breakpoints.scss +127 -0
  370. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_buttons.scss +70 -0
  371. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_caret.scss +64 -0
  372. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_clearfix.scss +9 -0
  373. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_color-scheme.scss +7 -0
  374. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_container.scss +11 -0
  375. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_deprecate.scss +10 -0
  376. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_forms.scss +152 -0
  377. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_gradients.scss +47 -0
  378. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_grid.scss +151 -0
  379. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_image.scss +16 -0
  380. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_list-group.scss +24 -0
  381. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_lists.scss +7 -0
  382. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_pagination.scss +10 -0
  383. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_reset-text.scss +17 -0
  384. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_resize.scss +6 -0
  385. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_table-variants.scss +24 -0
  386. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_text-truncate.scss +8 -0
  387. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_transition.scss +26 -0
  388. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_utilities.scss +97 -0
  389. lx_annotate/static/assets/scss/material-dashboard/bootstrap/mixins/_visually-hidden.scss +29 -0
  390. lx_annotate/static/assets/scss/material-dashboard/bootstrap/utilities/_api.scss +47 -0
  391. lx_annotate/static/assets/scss/material-dashboard/bootstrap/vendor/_rfs.scss +354 -0
  392. lx_annotate/static/assets/scss/material-dashboard/cards/card-background.scss +81 -0
  393. lx_annotate/static/assets/scss/material-dashboard/cards/card-rotate.scss +148 -0
  394. lx_annotate/static/assets/scss/material-dashboard/custom/_styles.scss +0 -0
  395. lx_annotate/static/assets/scss/material-dashboard/custom/_variables.scss +0 -0
  396. lx_annotate/static/assets/scss/material-dashboard/forms/_form-check.scss +91 -0
  397. lx_annotate/static/assets/scss/material-dashboard/forms/_form-select.scss +3 -0
  398. lx_annotate/static/assets/scss/material-dashboard/forms/_form-switch.scss +43 -0
  399. lx_annotate/static/assets/scss/material-dashboard/forms/_forms.scss +6 -0
  400. lx_annotate/static/assets/scss/material-dashboard/forms/_input-group.scss +312 -0
  401. lx_annotate/static/assets/scss/material-dashboard/forms/_inputs.scss +47 -0
  402. lx_annotate/static/assets/scss/material-dashboard/forms/_labels.scss +21 -0
  403. lx_annotate/static/assets/scss/material-dashboard/mixins/_badge.scss +12 -0
  404. lx_annotate/static/assets/scss/material-dashboard/mixins/_buttons.scss +12 -0
  405. lx_annotate/static/assets/scss/material-dashboard/mixins/_colored-shadows.scss +5 -0
  406. lx_annotate/static/assets/scss/material-dashboard/mixins/_hover.scss +27 -0
  407. lx_annotate/static/assets/scss/material-dashboard/mixins/_social-buttons.scss +46 -0
  408. lx_annotate/static/assets/scss/material-dashboard/mixins/_vendor.scss +58 -0
  409. lx_annotate/static/assets/scss/material-dashboard/mixins/mixins.scss +6 -0
  410. lx_annotate/static/assets/scss/material-dashboard/plugins/free/_flatpickr.scss +878 -0
  411. lx_annotate/static/assets/scss/material-dashboard/plugins/free/_nouislider.scss +298 -0
  412. lx_annotate/static/assets/scss/material-dashboard/plugins/free/_perfect-scrollbar.scss +116 -0
  413. lx_annotate/static/assets/scss/material-dashboard/plugins/free/_prism.scss +142 -0
  414. lx_annotate/static/assets/scss/material-dashboard/plugins/free/plugins.scss +4 -0
  415. lx_annotate/static/assets/scss/material-dashboard/theme.scss +63 -0
  416. lx_annotate/static/assets/scss/material-dashboard/variables/_animations.scss +45 -0
  417. lx_annotate/static/assets/scss/material-dashboard/variables/_avatars.scss +28 -0
  418. lx_annotate/static/assets/scss/material-dashboard/variables/_badge.scss +40 -0
  419. lx_annotate/static/assets/scss/material-dashboard/variables/_breadcrumb.scss +5 -0
  420. lx_annotate/static/assets/scss/material-dashboard/variables/_cards-extend.scss +28 -0
  421. lx_annotate/static/assets/scss/material-dashboard/variables/_cards.scss +65 -0
  422. lx_annotate/static/assets/scss/material-dashboard/variables/_choices.scss +8 -0
  423. lx_annotate/static/assets/scss/material-dashboard/variables/_dark-version.scss +9 -0
  424. lx_annotate/static/assets/scss/material-dashboard/variables/_dropdowns.scss +53 -0
  425. lx_annotate/static/assets/scss/material-dashboard/variables/_fixed-plugin.scss +7 -0
  426. lx_annotate/static/assets/scss/material-dashboard/variables/_form-switch.scss +3 -0
  427. lx_annotate/static/assets/scss/material-dashboard/variables/_full-calendar.scss +6 -0
  428. lx_annotate/static/assets/scss/material-dashboard/variables/_header.scss +24 -0
  429. lx_annotate/static/assets/scss/material-dashboard/variables/_info-areas.scss +32 -0
  430. lx_annotate/static/assets/scss/material-dashboard/variables/_misc-extend.scss +48 -0
  431. lx_annotate/static/assets/scss/material-dashboard/variables/_misc.scss +59 -0
  432. lx_annotate/static/assets/scss/material-dashboard/variables/_navbar-vertical.scss +65 -0
  433. lx_annotate/static/assets/scss/material-dashboard/variables/_navbar.scss +17 -0
  434. lx_annotate/static/assets/scss/material-dashboard/variables/_pagination.scss +19 -0
  435. lx_annotate/static/assets/scss/material-dashboard/variables/_ripple.scss +32 -0
  436. lx_annotate/static/assets/scss/material-dashboard/variables/_rtl.scss +1 -0
  437. lx_annotate/static/assets/scss/material-dashboard/variables/_social-buttons.scss +28 -0
  438. lx_annotate/static/assets/scss/material-dashboard/variables/_table.scss +19 -0
  439. lx_annotate/static/assets/scss/material-dashboard/variables/_timeline.scss +20 -0
  440. lx_annotate/static/assets/scss/material-dashboard/variables/_utilities-extend.scss +32 -0
  441. lx_annotate/static/assets/scss/material-dashboard/variables/_utilities.scss +195 -0
  442. lx_annotate/static/assets/scss/material-dashboard/variables/_virtual-reality.scss +5 -0
  443. lx_annotate/static/assets/scss/material-dashboard.scss +30 -0
  444. lx_annotate/static/assets/usePollingProtection-5vxQa-Ko.js +1 -0
  445. lx_annotate/static/assets/videoStore-ClqdABXQ.js +2 -0
  446. lx_annotate/static/authStore-w8taChNC.js +1 -0
  447. lx_annotate/static/base.css +86 -0
  448. lx_annotate/static/css/material-dashboard.css +27935 -0
  449. lx_annotate/static/css/material-dashboard.css.map +360 -0
  450. lx_annotate/static/css/material-dashboard.min.css +42 -0
  451. lx_annotate/static/css/nucleo-icons.css +597 -0
  452. lx_annotate/static/css/nucleo-svg.css +135 -0
  453. lx_annotate/static/django_extensions/css/jquery.autocomplete.css +38 -0
  454. lx_annotate/static/django_extensions/img/indicator.gif +0 -0
  455. lx_annotate/static/django_extensions/js/jquery.ajaxQueue.js +116 -0
  456. lx_annotate/static/django_extensions/js/jquery.autocomplete.js +1152 -0
  457. lx_annotate/static/django_extensions/js/jquery.bgiframe.js +39 -0
  458. lx_annotate/static/fonts/nucleo-icons.eot +0 -0
  459. lx_annotate/static/fonts/nucleo-icons.svg +312 -0
  460. lx_annotate/static/fonts/nucleo-icons.ttf +0 -0
  461. lx_annotate/static/fonts/nucleo-icons.woff +0 -0
  462. lx_annotate/static/fonts/nucleo-icons.woff2 +0 -0
  463. lx_annotate/static/fonts/nucleo.eot +0 -0
  464. lx_annotate/static/fonts/nucleo.ttf +0 -0
  465. lx_annotate/static/fonts/nucleo.woff +0 -0
  466. lx_annotate/static/fonts/nucleo.woff2 +0 -0
  467. lx_annotate/static/img/ColoReg.png +0 -0
  468. lx_annotate/static/img/Universitaetsklinikum_Wuerzburg.jpg +0 -0
  469. lx_annotate/static/img/ag_lux_logo_light_grey.svg +1 -0
  470. lx_annotate/static/img/apple-icon.png +0 -0
  471. lx_annotate/static/img/bg-pricing.jpg +0 -0
  472. lx_annotate/static/img/bg-smart-home-1.jpg +0 -0
  473. lx_annotate/static/img/bg-smart-home-2.jpg +0 -0
  474. lx_annotate/static/img/bruce-mars.jpg +0 -0
  475. lx_annotate/static/img/down-arrow-dark.svg +11 -0
  476. lx_annotate/static/img/down-arrow-white.svg +1 -0
  477. lx_annotate/static/img/down-arrow.svg +11 -0
  478. lx_annotate/static/img/drake.jpg +0 -0
  479. lx_annotate/static/img/favicon.png +0 -0
  480. lx_annotate/static/img/frames_demo/frame1.jpg +0 -0
  481. lx_annotate/static/img/frames_demo/frame2.jpg +0 -0
  482. lx_annotate/static/img/frames_demo/frame3.jpg +0 -0
  483. lx_annotate/static/img/frames_demo/frame4.jpg +0 -0
  484. lx_annotate/static/img/home-decor-1.jpg +0 -0
  485. lx_annotate/static/img/home-decor-2.jpg +0 -0
  486. lx_annotate/static/img/home-decor-3.jpg +0 -0
  487. lx_annotate/static/img/icons/flags/AU.png +0 -0
  488. lx_annotate/static/img/icons/flags/BR.png +0 -0
  489. lx_annotate/static/img/icons/flags/DE.png +0 -0
  490. lx_annotate/static/img/icons/flags/GB.png +0 -0
  491. lx_annotate/static/img/icons/flags/US.png +0 -0
  492. lx_annotate/static/img/illustrations/chat.png +0 -0
  493. lx_annotate/static/img/illustrations/danger-chat-ill.png +0 -0
  494. lx_annotate/static/img/illustrations/dark-lock-ill.png +0 -0
  495. lx_annotate/static/img/illustrations/error-404.png +0 -0
  496. lx_annotate/static/img/illustrations/error-500.png +0 -0
  497. lx_annotate/static/img/illustrations/illustration-lock.jpg +0 -0
  498. lx_annotate/static/img/illustrations/illustration-reset.jpg +0 -0
  499. lx_annotate/static/img/illustrations/illustration-signin.jpg +0 -0
  500. lx_annotate/static/img/illustrations/illustration-signup.jpg +0 -0
  501. lx_annotate/static/img/illustrations/illustration-verification.jpg +0 -0
  502. lx_annotate/static/img/illustrations/lock.png +0 -0
  503. lx_annotate/static/img/illustrations/pattern-tree.svg +20 -0
  504. lx_annotate/static/img/illustrations/rocket-white.png +0 -0
  505. lx_annotate/static/img/ivana-square.jpg +0 -0
  506. lx_annotate/static/img/ivana-squares.jpg +0 -0
  507. lx_annotate/static/img/ivancik.jpg +0 -0
  508. lx_annotate/static/img/kal-visuals-square.jpg +0 -0
  509. lx_annotate/static/img/logo-ct-dark.png +0 -0
  510. lx_annotate/static/img/logo-ct.png +0 -0
  511. lx_annotate/static/img/logos/ag_lux_logo_light_grey.svg +1 -0
  512. lx_annotate/static/img/logos/ag_lux_logo_white.svg +1 -0
  513. lx_annotate/static/img/logos/gray-logos/logo-coinbase.svg +16 -0
  514. lx_annotate/static/img/logos/gray-logos/logo-nasa.svg +9 -0
  515. lx_annotate/static/img/logos/gray-logos/logo-netflix.svg +9 -0
  516. lx_annotate/static/img/logos/gray-logos/logo-pinterest.svg +9 -0
  517. lx_annotate/static/img/logos/gray-logos/logo-spotify.svg +9 -0
  518. lx_annotate/static/img/logos/gray-logos/logo-vodafone.svg +9 -0
  519. lx_annotate/static/img/logos/mastercard.png +0 -0
  520. lx_annotate/static/img/logos/visa.png +0 -0
  521. lx_annotate/static/img/marie.jpg +0 -0
  522. lx_annotate/static/img/meeting.jpg +0 -0
  523. lx_annotate/static/img/office-dark.jpg +0 -0
  524. lx_annotate/static/img/product-12.jpg +0 -0
  525. lx_annotate/static/img/products/product-1-min.jpg +0 -0
  526. lx_annotate/static/img/products/product-11.jpg +0 -0
  527. lx_annotate/static/img/products/product-2-min.jpg +0 -0
  528. lx_annotate/static/img/products/product-3-min.jpg +0 -0
  529. lx_annotate/static/img/products/product-4-min.jpg +0 -0
  530. lx_annotate/static/img/products/product-5-min.jpg +0 -0
  531. lx_annotate/static/img/products/product-6-min.jpg +0 -0
  532. lx_annotate/static/img/products/product-7-min.jpg +0 -0
  533. lx_annotate/static/img/products/product-details-1.jpg +0 -0
  534. lx_annotate/static/img/products/product-details-2.jpg +0 -0
  535. lx_annotate/static/img/products/product-details-3.jpg +0 -0
  536. lx_annotate/static/img/products/product-details-4.jpg +0 -0
  537. lx_annotate/static/img/products/product-details-5.jpg +0 -0
  538. lx_annotate/static/img/shapes/pattern-lines.svg +91 -0
  539. lx_annotate/static/img/shapes/waves-white.svg +324 -0
  540. lx_annotate/static/img/small-logos/bootstrap.svg +9 -0
  541. lx_annotate/static/img/small-logos/creative-tim.svg +7 -0
  542. lx_annotate/static/img/small-logos/devto.svg +9 -0
  543. lx_annotate/static/img/small-logos/github.svg +10 -0
  544. lx_annotate/static/img/small-logos/google-webdev.svg +11 -0
  545. lx_annotate/static/img/small-logos/icon-bulb.svg +37 -0
  546. lx_annotate/static/img/small-logos/icon-sun-cloud.png +0 -0
  547. lx_annotate/static/img/small-logos/logo-asana.svg +16 -0
  548. lx_annotate/static/img/small-logos/logo-atlassian.svg +16 -0
  549. lx_annotate/static/img/small-logos/logo-invision.svg +10 -0
  550. lx_annotate/static/img/small-logos/logo-jira.svg +21 -0
  551. lx_annotate/static/img/small-logos/logo-slack.svg +12 -0
  552. lx_annotate/static/img/small-logos/logo-spotify.svg +9 -0
  553. lx_annotate/static/img/small-logos/logo-xd.svg +11 -0
  554. lx_annotate/static/img/team-1.jpg +0 -0
  555. lx_annotate/static/img/team-2.jpg +0 -0
  556. lx_annotate/static/img/team-3.jpg +0 -0
  557. lx_annotate/static/img/team-4.jpg +0 -0
  558. lx_annotate/static/img/team-5.jpg +0 -0
  559. lx_annotate/static/img/tesla-model-s.png +0 -0
  560. lx_annotate/static/img/vr-bg.jpg +0 -0
  561. lx_annotate/static/js/core/bootstrap.bundle.min.js +6 -0
  562. lx_annotate/static/js/core/bootstrap.min.js +6 -0
  563. lx_annotate/static/js/core/popper.min.js +4 -0
  564. lx_annotate/static/js/material-dashboard.js +879 -0
  565. lx_annotate/static/js/material-dashboard.js.map +1 -0
  566. lx_annotate/static/js/material-dashboard.min.js +17 -0
  567. lx_annotate/static/js/plugins/Chart.extension.js +130 -0
  568. lx_annotate/static/js/plugins/bootstrap-notify.js +432 -0
  569. lx_annotate/static/js/plugins/chartjs.min.js +13 -0
  570. lx_annotate/static/js/plugins/countup.min.js +1 -0
  571. lx_annotate/static/js/plugins/get_annotations.js +49 -0
  572. lx_annotate/static/js/plugins/perfect-scrollbar.min.js +19 -0
  573. lx_annotate/static/js/plugins/random-name-generator.js +81 -0
  574. lx_annotate/static/js/plugins/smooth-scrollbar.min.js +25 -0
  575. lx_annotate/static/js/plugins/submission-handler.js +73 -0
  576. lx_annotate/static/js/plugins/world.js +2464 -0
  577. lx_annotate/static/logo.svg +1 -0
  578. lx_annotate/static/main-DGGk9Vng.css +37 -0
  579. lx_annotate/static/main-DethiONo.js +36 -0
  580. lx_annotate/static/main.css +32 -0
  581. lx_annotate/static/mediaTypeStore-D6KIykKn.js +1 -0
  582. lx_annotate/static/modeltranslation/css/tabbed_translation_fields.css +101 -0
  583. lx_annotate/static/modeltranslation/js/clearable_inputs.js +19 -0
  584. lx_annotate/static/modeltranslation/js/force_jquery.js +3 -0
  585. lx_annotate/static/modeltranslation/js/tabbed_translation_fields.js +549 -0
  586. lx_annotate/static/nucleo-icons-BgnVbBvX.eot +0 -0
  587. lx_annotate/static/nucleo-icons-BuEzPWOc.woff +0 -0
  588. lx_annotate/static/nucleo-icons-C6OFysxg.svg +312 -0
  589. lx_annotate/static/nucleo-icons-CTnIBWcu.woff2 +0 -0
  590. lx_annotate/static/nucleo-icons-kNTzvw2K.ttf +0 -0
  591. lx_annotate/static/patientStore-BazAFCNw.js +1 -0
  592. lx_annotate/static/rest_framework/css/bootstrap-theme.min.css +6 -0
  593. lx_annotate/static/rest_framework/css/bootstrap-theme.min.css.map +1 -0
  594. lx_annotate/static/rest_framework/css/bootstrap-tweaks.css +237 -0
  595. lx_annotate/static/rest_framework/css/bootstrap.min.css +6 -0
  596. lx_annotate/static/rest_framework/css/bootstrap.min.css.map +1 -0
  597. lx_annotate/static/rest_framework/css/default.css +82 -0
  598. lx_annotate/static/rest_framework/css/font-awesome-4.0.3.css +1338 -0
  599. lx_annotate/static/rest_framework/css/prettify.css +30 -0
  600. lx_annotate/static/rest_framework/docs/css/base.css +359 -0
  601. lx_annotate/static/rest_framework/docs/css/highlight.css +125 -0
  602. lx_annotate/static/rest_framework/docs/css/jquery.json-view.min.css +11 -0
  603. lx_annotate/static/rest_framework/docs/img/favicon.ico +0 -0
  604. lx_annotate/static/rest_framework/docs/img/grid.png +0 -0
  605. lx_annotate/static/rest_framework/docs/js/api.js +315 -0
  606. lx_annotate/static/rest_framework/docs/js/highlight.pack.js +2 -0
  607. lx_annotate/static/rest_framework/docs/js/jquery.json-view.min.js +7 -0
  608. lx_annotate/static/rest_framework/fonts/fontawesome-webfont.eot +0 -0
  609. lx_annotate/static/rest_framework/fonts/fontawesome-webfont.svg +414 -0
  610. lx_annotate/static/rest_framework/fonts/fontawesome-webfont.ttf +0 -0
  611. lx_annotate/static/rest_framework/fonts/fontawesome-webfont.woff +0 -0
  612. lx_annotate/static/rest_framework/fonts/glyphicons-halflings-regular.eot +0 -0
  613. lx_annotate/static/rest_framework/fonts/glyphicons-halflings-regular.svg +288 -0
  614. lx_annotate/static/rest_framework/fonts/glyphicons-halflings-regular.ttf +0 -0
  615. lx_annotate/static/rest_framework/fonts/glyphicons-halflings-regular.woff +0 -0
  616. lx_annotate/static/rest_framework/fonts/glyphicons-halflings-regular.woff2 +0 -0
  617. lx_annotate/static/rest_framework/img/glyphicons-halflings-white.png +0 -0
  618. lx_annotate/static/rest_framework/img/glyphicons-halflings.png +0 -0
  619. lx_annotate/static/rest_framework/img/grid.png +0 -0
  620. lx_annotate/static/rest_framework/js/ajax-form.js +133 -0
  621. lx_annotate/static/rest_framework/js/bootstrap.min.js +6 -0
  622. lx_annotate/static/rest_framework/js/coreapi-0.1.1.js +2043 -0
  623. lx_annotate/static/rest_framework/js/csrf.js +53 -0
  624. lx_annotate/static/rest_framework/js/default.js +47 -0
  625. lx_annotate/static/rest_framework/js/jquery-3.7.1.min.js +2 -0
  626. lx_annotate/static/rest_framework/js/load-ajax-form.js +3 -0
  627. lx_annotate/static/rest_framework/js/prettify-min.js +28 -0
  628. lx_annotate/static/scss/material-dashboard/_alert.scss +17 -0
  629. lx_annotate/static/scss/material-dashboard/_avatars.scss +123 -0
  630. lx_annotate/static/scss/material-dashboard/_badge.scss +8 -0
  631. lx_annotate/static/scss/material-dashboard/_breadcrumbs.scss +48 -0
  632. lx_annotate/static/scss/material-dashboard/_buttons.scss +191 -0
  633. lx_annotate/static/scss/material-dashboard/_cards.scss +60 -0
  634. lx_annotate/static/scss/material-dashboard/_dark-version.scss +281 -0
  635. lx_annotate/static/scss/material-dashboard/_dropdown.scss +292 -0
  636. lx_annotate/static/scss/material-dashboard/_dropup.scss +41 -0
  637. lx_annotate/static/scss/material-dashboard/_fixed-plugin.scss +60 -0
  638. lx_annotate/static/scss/material-dashboard/_footer.scss +17 -0
  639. lx_annotate/static/scss/material-dashboard/_forms.scss +49 -0
  640. lx_annotate/static/scss/material-dashboard/_gradients.scss +18 -0
  641. lx_annotate/static/scss/material-dashboard/_header.scss +25 -0
  642. lx_annotate/static/scss/material-dashboard/_icons.scss +32 -0
  643. lx_annotate/static/scss/material-dashboard/_info-areas.scss +178 -0
  644. lx_annotate/static/scss/material-dashboard/_misc.scss +442 -0
  645. lx_annotate/static/scss/material-dashboard/_nav.scss +123 -0
  646. lx_annotate/static/scss/material-dashboard/_navbar-vertical.scss +725 -0
  647. lx_annotate/static/scss/material-dashboard/_navbar.scss +220 -0
  648. lx_annotate/static/scss/material-dashboard/_pagination.scss +58 -0
  649. lx_annotate/static/scss/material-dashboard/_popovers.scss +10 -0
  650. lx_annotate/static/scss/material-dashboard/_progress.scss +15 -0
  651. lx_annotate/static/scss/material-dashboard/_ripple.scss +15 -0
  652. lx_annotate/static/scss/material-dashboard/_rtl.scss +125 -0
  653. lx_annotate/static/scss/material-dashboard/_social-buttons.scss +42 -0
  654. lx_annotate/static/scss/material-dashboard/_tables.scss +53 -0
  655. lx_annotate/static/scss/material-dashboard/_tilt.scss +11 -0
  656. lx_annotate/static/scss/material-dashboard/_timeline.scss +137 -0
  657. lx_annotate/static/scss/material-dashboard/_tooltips.scss +9 -0
  658. lx_annotate/static/scss/material-dashboard/_typography.scss +301 -0
  659. lx_annotate/static/scss/material-dashboard/_utilities-extend.scss +11 -0
  660. lx_annotate/static/scss/material-dashboard/_utilities.scss +837 -0
  661. lx_annotate/static/scss/material-dashboard/_variables.scss +1674 -0
  662. lx_annotate/static/scss/material-dashboard/bootstrap/_accordion.scss +149 -0
  663. lx_annotate/static/scss/material-dashboard/bootstrap/_alert.scss +71 -0
  664. lx_annotate/static/scss/material-dashboard/bootstrap/_badge.scss +38 -0
  665. lx_annotate/static/scss/material-dashboard/bootstrap/_breadcrumb.scss +40 -0
  666. lx_annotate/static/scss/material-dashboard/bootstrap/_button-group.scss +142 -0
  667. lx_annotate/static/scss/material-dashboard/bootstrap/_buttons.scss +207 -0
  668. lx_annotate/static/scss/material-dashboard/bootstrap/_card.scss +234 -0
  669. lx_annotate/static/scss/material-dashboard/bootstrap/_carousel.scss +226 -0
  670. lx_annotate/static/scss/material-dashboard/bootstrap/_close.scss +40 -0
  671. lx_annotate/static/scss/material-dashboard/bootstrap/_containers.scss +41 -0
  672. lx_annotate/static/scss/material-dashboard/bootstrap/_dropdown.scss +249 -0
  673. lx_annotate/static/scss/material-dashboard/bootstrap/_forms.scss +9 -0
  674. lx_annotate/static/scss/material-dashboard/bootstrap/_functions.scss +302 -0
  675. lx_annotate/static/scss/material-dashboard/bootstrap/_grid.scss +33 -0
  676. lx_annotate/static/scss/material-dashboard/bootstrap/_helpers.scss +10 -0
  677. lx_annotate/static/scss/material-dashboard/bootstrap/_images.scss +42 -0
  678. lx_annotate/static/scss/material-dashboard/bootstrap/_list-group.scss +192 -0
  679. lx_annotate/static/scss/material-dashboard/bootstrap/_maps.scss +54 -0
  680. lx_annotate/static/scss/material-dashboard/bootstrap/_mixins.scss +43 -0
  681. lx_annotate/static/scss/material-dashboard/bootstrap/_modal.scss +237 -0
  682. lx_annotate/static/scss/material-dashboard/bootstrap/_nav.scss +172 -0
  683. lx_annotate/static/scss/material-dashboard/bootstrap/_navbar.scss +278 -0
  684. lx_annotate/static/scss/material-dashboard/bootstrap/_offcanvas.scss +144 -0
  685. lx_annotate/static/scss/material-dashboard/bootstrap/_pagination.scss +109 -0
  686. lx_annotate/static/scss/material-dashboard/bootstrap/_placeholders.scss +51 -0
  687. lx_annotate/static/scss/material-dashboard/bootstrap/_popover.scss +196 -0
  688. lx_annotate/static/scss/material-dashboard/bootstrap/_progress.scss +59 -0
  689. lx_annotate/static/scss/material-dashboard/bootstrap/_reboot.scss +610 -0
  690. lx_annotate/static/scss/material-dashboard/bootstrap/_root.scss +73 -0
  691. lx_annotate/static/scss/material-dashboard/bootstrap/_spinners.scss +85 -0
  692. lx_annotate/static/scss/material-dashboard/bootstrap/_tables.scss +164 -0
  693. lx_annotate/static/scss/material-dashboard/bootstrap/_toasts.scss +73 -0
  694. lx_annotate/static/scss/material-dashboard/bootstrap/_tooltip.scss +120 -0
  695. lx_annotate/static/scss/material-dashboard/bootstrap/_transitions.scss +27 -0
  696. lx_annotate/static/scss/material-dashboard/bootstrap/_type.scss +106 -0
  697. lx_annotate/static/scss/material-dashboard/bootstrap/_utilities.scss +647 -0
  698. lx_annotate/static/scss/material-dashboard/bootstrap/_variables.scss +1634 -0
  699. lx_annotate/static/scss/material-dashboard/bootstrap/bootstrap-grid.scss +64 -0
  700. lx_annotate/static/scss/material-dashboard/bootstrap/bootstrap-reboot.scss +9 -0
  701. lx_annotate/static/scss/material-dashboard/bootstrap/bootstrap-utilities.scss +18 -0
  702. lx_annotate/static/scss/material-dashboard/bootstrap/bootstrap.scss +51 -0
  703. lx_annotate/static/scss/material-dashboard/bootstrap/forms/_floating-labels.scss +75 -0
  704. lx_annotate/static/scss/material-dashboard/bootstrap/forms/_form-check.scss +175 -0
  705. lx_annotate/static/scss/material-dashboard/bootstrap/forms/_form-control.scss +194 -0
  706. lx_annotate/static/scss/material-dashboard/bootstrap/forms/_form-range.scss +91 -0
  707. lx_annotate/static/scss/material-dashboard/bootstrap/forms/_form-select.scss +71 -0
  708. lx_annotate/static/scss/material-dashboard/bootstrap/forms/_form-text.scss +11 -0
  709. lx_annotate/static/scss/material-dashboard/bootstrap/forms/_input-group.scss +132 -0
  710. lx_annotate/static/scss/material-dashboard/bootstrap/forms/_labels.scss +36 -0
  711. lx_annotate/static/scss/material-dashboard/bootstrap/forms/_validation.scss +12 -0
  712. lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_clearfix.scss +3 -0
  713. lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_color-bg.scss +10 -0
  714. lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_colored-links.scss +12 -0
  715. lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_position.scss +36 -0
  716. lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_ratio.scss +26 -0
  717. lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_stacks.scss +15 -0
  718. lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_stretched-link.scss +15 -0
  719. lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_text-truncation.scss +7 -0
  720. lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_visually-hidden.scss +8 -0
  721. lx_annotate/static/scss/material-dashboard/bootstrap/helpers/_vr.scss +8 -0
  722. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_alert.scss +15 -0
  723. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_backdrop.scss +14 -0
  724. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_banner.scss +9 -0
  725. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_border-radius.scss +78 -0
  726. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_box-shadow.scss +18 -0
  727. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_breakpoints.scss +127 -0
  728. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_buttons.scss +70 -0
  729. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_caret.scss +64 -0
  730. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_clearfix.scss +9 -0
  731. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_color-scheme.scss +7 -0
  732. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_container.scss +11 -0
  733. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_deprecate.scss +10 -0
  734. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_forms.scss +152 -0
  735. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_gradients.scss +47 -0
  736. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_grid.scss +151 -0
  737. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_image.scss +16 -0
  738. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_list-group.scss +24 -0
  739. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_lists.scss +7 -0
  740. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_pagination.scss +10 -0
  741. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_reset-text.scss +17 -0
  742. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_resize.scss +6 -0
  743. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_table-variants.scss +24 -0
  744. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_text-truncate.scss +8 -0
  745. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_transition.scss +26 -0
  746. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_utilities.scss +97 -0
  747. lx_annotate/static/scss/material-dashboard/bootstrap/mixins/_visually-hidden.scss +29 -0
  748. lx_annotate/static/scss/material-dashboard/bootstrap/utilities/_api.scss +47 -0
  749. lx_annotate/static/scss/material-dashboard/bootstrap/vendor/_rfs.scss +354 -0
  750. lx_annotate/static/scss/material-dashboard/cards/card-background.scss +81 -0
  751. lx_annotate/static/scss/material-dashboard/cards/card-rotate.scss +148 -0
  752. lx_annotate/static/scss/material-dashboard/custom/_styles.scss +0 -0
  753. lx_annotate/static/scss/material-dashboard/custom/_variables.scss +0 -0
  754. lx_annotate/static/scss/material-dashboard/forms/_form-check.scss +91 -0
  755. lx_annotate/static/scss/material-dashboard/forms/_form-select.scss +3 -0
  756. lx_annotate/static/scss/material-dashboard/forms/_form-switch.scss +43 -0
  757. lx_annotate/static/scss/material-dashboard/forms/_forms.scss +6 -0
  758. lx_annotate/static/scss/material-dashboard/forms/_input-group.scss +312 -0
  759. lx_annotate/static/scss/material-dashboard/forms/_inputs.scss +47 -0
  760. lx_annotate/static/scss/material-dashboard/forms/_labels.scss +21 -0
  761. lx_annotate/static/scss/material-dashboard/mixins/_badge.scss +12 -0
  762. lx_annotate/static/scss/material-dashboard/mixins/_buttons.scss +12 -0
  763. lx_annotate/static/scss/material-dashboard/mixins/_colored-shadows.scss +5 -0
  764. lx_annotate/static/scss/material-dashboard/mixins/_hover.scss +27 -0
  765. lx_annotate/static/scss/material-dashboard/mixins/_social-buttons.scss +46 -0
  766. lx_annotate/static/scss/material-dashboard/mixins/_vendor.scss +58 -0
  767. lx_annotate/static/scss/material-dashboard/mixins/mixins.scss +6 -0
  768. lx_annotate/static/scss/material-dashboard/plugins/free/_flatpickr.scss +878 -0
  769. lx_annotate/static/scss/material-dashboard/plugins/free/_nouislider.scss +298 -0
  770. lx_annotate/static/scss/material-dashboard/plugins/free/_perfect-scrollbar.scss +116 -0
  771. lx_annotate/static/scss/material-dashboard/plugins/free/_prism.scss +142 -0
  772. lx_annotate/static/scss/material-dashboard/plugins/free/plugins.scss +4 -0
  773. lx_annotate/static/scss/material-dashboard/theme.scss +63 -0
  774. lx_annotate/static/scss/material-dashboard/variables/_animations.scss +45 -0
  775. lx_annotate/static/scss/material-dashboard/variables/_avatars.scss +28 -0
  776. lx_annotate/static/scss/material-dashboard/variables/_badge.scss +40 -0
  777. lx_annotate/static/scss/material-dashboard/variables/_breadcrumb.scss +5 -0
  778. lx_annotate/static/scss/material-dashboard/variables/_cards-extend.scss +28 -0
  779. lx_annotate/static/scss/material-dashboard/variables/_cards.scss +65 -0
  780. lx_annotate/static/scss/material-dashboard/variables/_choices.scss +8 -0
  781. lx_annotate/static/scss/material-dashboard/variables/_dark-version.scss +9 -0
  782. lx_annotate/static/scss/material-dashboard/variables/_dropdowns.scss +53 -0
  783. lx_annotate/static/scss/material-dashboard/variables/_fixed-plugin.scss +7 -0
  784. lx_annotate/static/scss/material-dashboard/variables/_form-switch.scss +3 -0
  785. lx_annotate/static/scss/material-dashboard/variables/_full-calendar.scss +6 -0
  786. lx_annotate/static/scss/material-dashboard/variables/_header.scss +24 -0
  787. lx_annotate/static/scss/material-dashboard/variables/_info-areas.scss +32 -0
  788. lx_annotate/static/scss/material-dashboard/variables/_misc-extend.scss +48 -0
  789. lx_annotate/static/scss/material-dashboard/variables/_misc.scss +59 -0
  790. lx_annotate/static/scss/material-dashboard/variables/_navbar-vertical.scss +65 -0
  791. lx_annotate/static/scss/material-dashboard/variables/_navbar.scss +17 -0
  792. lx_annotate/static/scss/material-dashboard/variables/_pagination.scss +19 -0
  793. lx_annotate/static/scss/material-dashboard/variables/_ripple.scss +32 -0
  794. lx_annotate/static/scss/material-dashboard/variables/_rtl.scss +1 -0
  795. lx_annotate/static/scss/material-dashboard/variables/_social-buttons.scss +28 -0
  796. lx_annotate/static/scss/material-dashboard/variables/_table.scss +19 -0
  797. lx_annotate/static/scss/material-dashboard/variables/_timeline.scss +20 -0
  798. lx_annotate/static/scss/material-dashboard/variables/_utilities-extend.scss +32 -0
  799. lx_annotate/static/scss/material-dashboard/variables/_utilities.scss +195 -0
  800. lx_annotate/static/scss/material-dashboard/variables/_virtual-reality.scss +5 -0
  801. lx_annotate/static/scss/material-dashboard.scss +30 -0
  802. lx_annotate/static/silent-check-sso.html +8 -0
  803. lx_annotate/static/usePollingProtection-5vxQa-Ko.js +1 -0
  804. lx_annotate/static/videoStore-ClqdABXQ.js +2 -0
  805. lx_annotate/staticfiles/.vite/manifest.json +502 -0
  806. lx_annotate/staticfiles/AboutUs.js +1 -0
  807. lx_annotate/staticfiles/AnnotationDashboard.css +1 -0
  808. lx_annotate/staticfiles/AnnotationDashboard.js +1 -0
  809. lx_annotate/staticfiles/AnnotationDashboard2.js +1 -0
  810. lx_annotate/staticfiles/AnonymizationCorrectionComponent.css +1 -0
  811. lx_annotate/staticfiles/AnonymizationCorrectionComponent.js +1 -0
  812. lx_annotate/staticfiles/AnonymizationOverview.css +1 -0
  813. lx_annotate/staticfiles/AnonymizationOverview.js +1 -0
  814. lx_annotate/staticfiles/AnonymizationValidationComponent.css +1 -0
  815. lx_annotate/staticfiles/AnonymizationValidationComponent.js +1 -0
  816. lx_annotate/staticfiles/ApplicationSettingsPage.css +1 -0
  817. lx_annotate/staticfiles/ApplicationSettingsPage.js +1 -0
  818. lx_annotate/staticfiles/CaseResolutionPage.js +1 -0
  819. lx_annotate/staticfiles/CaseSetupPage.js +1 -0
  820. lx_annotate/staticfiles/Dashboard.js +1 -0
  821. lx_annotate/staticfiles/Documentation.css +1 -0
  822. lx_annotate/staticfiles/Documentation.js +1 -0
  823. lx_annotate/staticfiles/Examination.js +1 -0
  824. lx_annotate/staticfiles/Export.css +1 -0
  825. lx_annotate/staticfiles/Export.js +1 -0
  826. lx_annotate/staticfiles/FinalizedResultPage.js +1 -0
  827. lx_annotate/staticfiles/FindingsCapturePage.css +1 -0
  828. lx_annotate/staticfiles/FindingsCapturePage.js +1 -0
  829. lx_annotate/staticfiles/FindingsDetail.css +1 -0
  830. lx_annotate/staticfiles/FindingsDetail.js +1 -0
  831. lx_annotate/staticfiles/FrameAnnotation.css +1 -0
  832. lx_annotate/staticfiles/FrameAnnotation.js +1 -0
  833. lx_annotate/staticfiles/FrameSelectorPage.css +1 -0
  834. lx_annotate/staticfiles/FrameSelectorPage.js +1 -0
  835. lx_annotate/staticfiles/LookupStatusPanel.vue_vue_type_script_setup_true_lang.js +1 -0
  836. lx_annotate/staticfiles/MedicalBlock.css +1 -0
  837. lx_annotate/staticfiles/MedicalBlock.vue_vue_type_style_index_0_lang.js +1 -0
  838. lx_annotate/staticfiles/PageOverview.js +1 -0
  839. lx_annotate/staticfiles/PatientOverview.css +1 -0
  840. lx_annotate/staticfiles/PatientOverview.js +1 -0
  841. lx_annotate/staticfiles/Profile.js +1 -0
  842. lx_annotate/staticfiles/ReportEditorPage.js +4 -0
  843. lx_annotate/staticfiles/ReportGenerator.css +1 -0
  844. lx_annotate/staticfiles/ReportGenerator.js +1 -0
  845. lx_annotate/staticfiles/ReportTemplateBuilderPage.js +7 -0
  846. lx_annotate/staticfiles/ReportingShell.css +1 -0
  847. lx_annotate/staticfiles/ReportingShell.js +1 -0
  848. lx_annotate/staticfiles/ReportingWorklistPage.js +1 -0
  849. lx_annotate/staticfiles/RequirementGenerator.css +1 -0
  850. lx_annotate/staticfiles/RequirementGenerator.js +1 -0
  851. lx_annotate/staticfiles/RequirementIssues.vue_vue_type_script_setup_true_lang.js +1 -0
  852. lx_annotate/staticfiles/Timeline.css +1 -0
  853. lx_annotate/staticfiles/Timeline.js +1 -0
  854. lx_annotate/staticfiles/VideoExamination.css +1 -0
  855. lx_annotate/staticfiles/VideoExamination.js +1 -0
  856. lx_annotate/staticfiles/assets/base.css +86 -0
  857. lx_annotate/staticfiles/assets/css/material-dashboard.css +27935 -0
  858. lx_annotate/staticfiles/assets/css/material-dashboard.css.map +360 -0
  859. lx_annotate/staticfiles/assets/css/material-dashboard.min.css +42 -0
  860. lx_annotate/staticfiles/assets/css/nucleo-icons.css +597 -0
  861. lx_annotate/staticfiles/assets/css/nucleo-svg.css +135 -0
  862. lx_annotate/staticfiles/assets/fonts/nucleo-icons.eot +0 -0
  863. lx_annotate/staticfiles/assets/fonts/nucleo-icons.svg +312 -0
  864. lx_annotate/staticfiles/assets/fonts/nucleo-icons.ttf +0 -0
  865. lx_annotate/staticfiles/assets/fonts/nucleo-icons.woff +0 -0
  866. lx_annotate/staticfiles/assets/fonts/nucleo-icons.woff2 +0 -0
  867. lx_annotate/staticfiles/assets/fonts/nucleo.eot +0 -0
  868. lx_annotate/staticfiles/assets/fonts/nucleo.ttf +0 -0
  869. lx_annotate/staticfiles/assets/fonts/nucleo.woff +0 -0
  870. lx_annotate/staticfiles/assets/fonts/nucleo.woff2 +0 -0
  871. lx_annotate/staticfiles/assets/js/core/bootstrap.bundle.min.js +6 -0
  872. lx_annotate/staticfiles/assets/js/core/bootstrap.min.js +6 -0
  873. lx_annotate/staticfiles/assets/js/core/popper.min.js +4 -0
  874. lx_annotate/staticfiles/assets/js/material-dashboard.js +879 -0
  875. lx_annotate/staticfiles/assets/js/material-dashboard.js.map +1 -0
  876. lx_annotate/staticfiles/assets/js/material-dashboard.min.js +17 -0
  877. lx_annotate/staticfiles/assets/js/plugins/Chart.extension.js +130 -0
  878. lx_annotate/staticfiles/assets/js/plugins/bootstrap-notify.js +432 -0
  879. lx_annotate/staticfiles/assets/js/plugins/chartjs.min.js +13 -0
  880. lx_annotate/staticfiles/assets/js/plugins/countup.min.js +1 -0
  881. lx_annotate/staticfiles/assets/js/plugins/get_annotations.js +49 -0
  882. lx_annotate/staticfiles/assets/js/plugins/perfect-scrollbar.min.js +19 -0
  883. lx_annotate/staticfiles/assets/js/plugins/random-name-generator.js +81 -0
  884. lx_annotate/staticfiles/assets/js/plugins/smooth-scrollbar.min.js +25 -0
  885. lx_annotate/staticfiles/assets/js/plugins/submission-handler.js +73 -0
  886. lx_annotate/staticfiles/assets/js/plugins/world.js +2464 -0
  887. lx_annotate/staticfiles/assets/logo.svg +1 -0
  888. lx_annotate/staticfiles/assets/main.css +32 -0
  889. lx_annotate/staticfiles/assets/scss/material-dashboard/_alert.scss +17 -0
  890. lx_annotate/staticfiles/assets/scss/material-dashboard/_avatars.scss +123 -0
  891. lx_annotate/staticfiles/assets/scss/material-dashboard/_badge.scss +8 -0
  892. lx_annotate/staticfiles/assets/scss/material-dashboard/_breadcrumbs.scss +48 -0
  893. lx_annotate/staticfiles/assets/scss/material-dashboard/_buttons.scss +191 -0
  894. lx_annotate/staticfiles/assets/scss/material-dashboard/_cards.scss +60 -0
  895. lx_annotate/staticfiles/assets/scss/material-dashboard/_dark-version.scss +281 -0
  896. lx_annotate/staticfiles/assets/scss/material-dashboard/_dropdown.scss +292 -0
  897. lx_annotate/staticfiles/assets/scss/material-dashboard/_dropup.scss +41 -0
  898. lx_annotate/staticfiles/assets/scss/material-dashboard/_fixed-plugin.scss +60 -0
  899. lx_annotate/staticfiles/assets/scss/material-dashboard/_footer.scss +17 -0
  900. lx_annotate/staticfiles/assets/scss/material-dashboard/_forms.scss +49 -0
  901. lx_annotate/staticfiles/assets/scss/material-dashboard/_gradients.scss +18 -0
  902. lx_annotate/staticfiles/assets/scss/material-dashboard/_header.scss +25 -0
  903. lx_annotate/staticfiles/assets/scss/material-dashboard/_icons.scss +32 -0
  904. lx_annotate/staticfiles/assets/scss/material-dashboard/_info-areas.scss +178 -0
  905. lx_annotate/staticfiles/assets/scss/material-dashboard/_misc.scss +442 -0
  906. lx_annotate/staticfiles/assets/scss/material-dashboard/_nav.scss +123 -0
  907. lx_annotate/staticfiles/assets/scss/material-dashboard/_navbar-vertical.scss +725 -0
  908. lx_annotate/staticfiles/assets/scss/material-dashboard/_navbar.scss +220 -0
  909. lx_annotate/staticfiles/assets/scss/material-dashboard/_pagination.scss +58 -0
  910. lx_annotate/staticfiles/assets/scss/material-dashboard/_popovers.scss +10 -0
  911. lx_annotate/staticfiles/assets/scss/material-dashboard/_progress.scss +15 -0
  912. lx_annotate/staticfiles/assets/scss/material-dashboard/_ripple.scss +15 -0
  913. lx_annotate/staticfiles/assets/scss/material-dashboard/_rtl.scss +125 -0
  914. lx_annotate/staticfiles/assets/scss/material-dashboard/_social-buttons.scss +42 -0
  915. lx_annotate/staticfiles/assets/scss/material-dashboard/_tables.scss +53 -0
  916. lx_annotate/staticfiles/assets/scss/material-dashboard/_tilt.scss +11 -0
  917. lx_annotate/staticfiles/assets/scss/material-dashboard/_timeline.scss +137 -0
  918. lx_annotate/staticfiles/assets/scss/material-dashboard/_tooltips.scss +9 -0
  919. lx_annotate/staticfiles/assets/scss/material-dashboard/_typography.scss +301 -0
  920. lx_annotate/staticfiles/assets/scss/material-dashboard/_utilities-extend.scss +11 -0
  921. lx_annotate/staticfiles/assets/scss/material-dashboard/_utilities.scss +837 -0
  922. lx_annotate/staticfiles/assets/scss/material-dashboard/_variables.scss +1674 -0
  923. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_accordion.scss +149 -0
  924. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_alert.scss +71 -0
  925. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_badge.scss +38 -0
  926. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_breadcrumb.scss +40 -0
  927. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_button-group.scss +142 -0
  928. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_buttons.scss +207 -0
  929. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_card.scss +234 -0
  930. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_carousel.scss +226 -0
  931. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_close.scss +40 -0
  932. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_containers.scss +41 -0
  933. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_dropdown.scss +249 -0
  934. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_forms.scss +9 -0
  935. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_functions.scss +302 -0
  936. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_grid.scss +33 -0
  937. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_helpers.scss +10 -0
  938. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_images.scss +42 -0
  939. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_list-group.scss +192 -0
  940. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_maps.scss +54 -0
  941. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_mixins.scss +43 -0
  942. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_modal.scss +237 -0
  943. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_nav.scss +172 -0
  944. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_navbar.scss +278 -0
  945. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_offcanvas.scss +144 -0
  946. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_pagination.scss +109 -0
  947. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_placeholders.scss +51 -0
  948. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_popover.scss +196 -0
  949. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_progress.scss +59 -0
  950. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_reboot.scss +610 -0
  951. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_root.scss +73 -0
  952. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_spinners.scss +85 -0
  953. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_tables.scss +164 -0
  954. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_toasts.scss +73 -0
  955. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_tooltip.scss +120 -0
  956. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_transitions.scss +27 -0
  957. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_type.scss +106 -0
  958. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_utilities.scss +647 -0
  959. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/_variables.scss +1634 -0
  960. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/bootstrap-grid.scss +64 -0
  961. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/bootstrap-reboot.scss +9 -0
  962. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/bootstrap-utilities.scss +18 -0
  963. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/bootstrap.scss +51 -0
  964. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_floating-labels.scss +75 -0
  965. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_form-check.scss +175 -0
  966. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_form-control.scss +194 -0
  967. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_form-range.scss +91 -0
  968. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_form-select.scss +71 -0
  969. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_form-text.scss +11 -0
  970. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_input-group.scss +132 -0
  971. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_labels.scss +36 -0
  972. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/forms/_validation.scss +12 -0
  973. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_clearfix.scss +3 -0
  974. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_color-bg.scss +10 -0
  975. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_colored-links.scss +12 -0
  976. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_position.scss +36 -0
  977. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_ratio.scss +26 -0
  978. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_stacks.scss +15 -0
  979. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_stretched-link.scss +15 -0
  980. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_text-truncation.scss +7 -0
  981. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_visually-hidden.scss +8 -0
  982. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/helpers/_vr.scss +8 -0
  983. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_alert.scss +15 -0
  984. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_backdrop.scss +14 -0
  985. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_banner.scss +9 -0
  986. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_border-radius.scss +78 -0
  987. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_box-shadow.scss +18 -0
  988. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_breakpoints.scss +127 -0
  989. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_buttons.scss +70 -0
  990. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_caret.scss +64 -0
  991. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_clearfix.scss +9 -0
  992. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_color-scheme.scss +7 -0
  993. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_container.scss +11 -0
  994. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_deprecate.scss +10 -0
  995. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_forms.scss +152 -0
  996. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_gradients.scss +47 -0
  997. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_grid.scss +151 -0
  998. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_image.scss +16 -0
  999. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_list-group.scss +24 -0
  1000. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_lists.scss +7 -0
  1001. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_pagination.scss +10 -0
  1002. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_reset-text.scss +17 -0
  1003. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_resize.scss +6 -0
  1004. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_table-variants.scss +24 -0
  1005. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_text-truncate.scss +8 -0
  1006. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_transition.scss +26 -0
  1007. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_utilities.scss +97 -0
  1008. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/mixins/_visually-hidden.scss +29 -0
  1009. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/utilities/_api.scss +47 -0
  1010. lx_annotate/staticfiles/assets/scss/material-dashboard/bootstrap/vendor/_rfs.scss +354 -0
  1011. lx_annotate/staticfiles/assets/scss/material-dashboard/cards/card-background.scss +81 -0
  1012. lx_annotate/staticfiles/assets/scss/material-dashboard/cards/card-rotate.scss +148 -0
  1013. lx_annotate/staticfiles/assets/scss/material-dashboard/custom/_styles.scss +0 -0
  1014. lx_annotate/staticfiles/assets/scss/material-dashboard/custom/_variables.scss +0 -0
  1015. lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_form-check.scss +91 -0
  1016. lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_form-select.scss +3 -0
  1017. lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_form-switch.scss +43 -0
  1018. lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_forms.scss +6 -0
  1019. lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_input-group.scss +312 -0
  1020. lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_inputs.scss +47 -0
  1021. lx_annotate/staticfiles/assets/scss/material-dashboard/forms/_labels.scss +21 -0
  1022. lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/_badge.scss +12 -0
  1023. lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/_buttons.scss +12 -0
  1024. lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/_colored-shadows.scss +5 -0
  1025. lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/_hover.scss +27 -0
  1026. lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/_social-buttons.scss +46 -0
  1027. lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/_vendor.scss +58 -0
  1028. lx_annotate/staticfiles/assets/scss/material-dashboard/mixins/mixins.scss +6 -0
  1029. lx_annotate/staticfiles/assets/scss/material-dashboard/plugins/free/_flatpickr.scss +878 -0
  1030. lx_annotate/staticfiles/assets/scss/material-dashboard/plugins/free/_nouislider.scss +298 -0
  1031. lx_annotate/staticfiles/assets/scss/material-dashboard/plugins/free/_perfect-scrollbar.scss +116 -0
  1032. lx_annotate/staticfiles/assets/scss/material-dashboard/plugins/free/_prism.scss +142 -0
  1033. lx_annotate/staticfiles/assets/scss/material-dashboard/plugins/free/plugins.scss +4 -0
  1034. lx_annotate/staticfiles/assets/scss/material-dashboard/theme.scss +63 -0
  1035. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_animations.scss +45 -0
  1036. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_avatars.scss +28 -0
  1037. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_badge.scss +40 -0
  1038. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_breadcrumb.scss +5 -0
  1039. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_cards-extend.scss +28 -0
  1040. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_cards.scss +65 -0
  1041. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_choices.scss +8 -0
  1042. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_dark-version.scss +9 -0
  1043. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_dropdowns.scss +53 -0
  1044. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_fixed-plugin.scss +7 -0
  1045. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_form-switch.scss +3 -0
  1046. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_full-calendar.scss +6 -0
  1047. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_header.scss +24 -0
  1048. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_info-areas.scss +32 -0
  1049. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_misc-extend.scss +48 -0
  1050. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_misc.scss +59 -0
  1051. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_navbar-vertical.scss +65 -0
  1052. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_navbar.scss +17 -0
  1053. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_pagination.scss +19 -0
  1054. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_ripple.scss +32 -0
  1055. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_rtl.scss +1 -0
  1056. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_social-buttons.scss +28 -0
  1057. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_table.scss +19 -0
  1058. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_timeline.scss +20 -0
  1059. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_utilities-extend.scss +32 -0
  1060. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_utilities.scss +195 -0
  1061. lx_annotate/staticfiles/assets/scss/material-dashboard/variables/_virtual-reality.scss +5 -0
  1062. lx_annotate/staticfiles/assets/scss/material-dashboard.scss +30 -0
  1063. lx_annotate/staticfiles/dateHelpers.js +1 -0
  1064. lx_annotate/staticfiles/examinationStore.js +1 -0
  1065. lx_annotate/staticfiles/findingsApi.js +1 -0
  1066. lx_annotate/staticfiles/img/Universitaetsklinikum_Wuerzburg.jpg +0 -0
  1067. lx_annotate/staticfiles/img/ag_lux_logo_light_grey.svg +1 -0
  1068. lx_annotate/staticfiles/img/apple-icon.png +0 -0
  1069. lx_annotate/staticfiles/img/bg-pricing.jpg +0 -0
  1070. lx_annotate/staticfiles/img/bg-smart-home-1.jpg +0 -0
  1071. lx_annotate/staticfiles/img/bg-smart-home-2.jpg +0 -0
  1072. lx_annotate/staticfiles/img/bruce-mars.jpg +0 -0
  1073. lx_annotate/staticfiles/img/down-arrow-dark.svg +11 -0
  1074. lx_annotate/staticfiles/img/down-arrow-white.svg +1 -0
  1075. lx_annotate/staticfiles/img/down-arrow.svg +11 -0
  1076. lx_annotate/staticfiles/img/drake.jpg +0 -0
  1077. lx_annotate/staticfiles/img/favicon.png +0 -0
  1078. lx_annotate/staticfiles/img/frames_demo/frame1.jpg +0 -0
  1079. lx_annotate/staticfiles/img/frames_demo/frame2.jpg +0 -0
  1080. lx_annotate/staticfiles/img/frames_demo/frame3.jpg +0 -0
  1081. lx_annotate/staticfiles/img/frames_demo/frame4.jpg +0 -0
  1082. lx_annotate/staticfiles/img/home-decor-1.jpg +0 -0
  1083. lx_annotate/staticfiles/img/home-decor-2.jpg +0 -0
  1084. lx_annotate/staticfiles/img/home-decor-3.jpg +0 -0
  1085. lx_annotate/staticfiles/img/icons/flags/AU.png +0 -0
  1086. lx_annotate/staticfiles/img/icons/flags/BR.png +0 -0
  1087. lx_annotate/staticfiles/img/icons/flags/DE.png +0 -0
  1088. lx_annotate/staticfiles/img/icons/flags/GB.png +0 -0
  1089. lx_annotate/staticfiles/img/icons/flags/US.png +0 -0
  1090. lx_annotate/staticfiles/img/illustrations/chat.png +0 -0
  1091. lx_annotate/staticfiles/img/illustrations/danger-chat-ill.png +0 -0
  1092. lx_annotate/staticfiles/img/illustrations/dark-lock-ill.png +0 -0
  1093. lx_annotate/staticfiles/img/illustrations/error-404.png +0 -0
  1094. lx_annotate/staticfiles/img/illustrations/error-500.png +0 -0
  1095. lx_annotate/staticfiles/img/illustrations/illustration-lock.jpg +0 -0
  1096. lx_annotate/staticfiles/img/illustrations/illustration-reset.jpg +0 -0
  1097. lx_annotate/staticfiles/img/illustrations/illustration-signin.jpg +0 -0
  1098. lx_annotate/staticfiles/img/illustrations/illustration-signup.jpg +0 -0
  1099. lx_annotate/staticfiles/img/illustrations/illustration-verification.jpg +0 -0
  1100. lx_annotate/staticfiles/img/illustrations/lock.png +0 -0
  1101. lx_annotate/staticfiles/img/illustrations/pattern-tree.svg +20 -0
  1102. lx_annotate/staticfiles/img/illustrations/rocket-white.png +0 -0
  1103. lx_annotate/staticfiles/img/ivana-square.jpg +0 -0
  1104. lx_annotate/staticfiles/img/ivana-squares.jpg +0 -0
  1105. lx_annotate/staticfiles/img/ivancik.jpg +0 -0
  1106. lx_annotate/staticfiles/img/kal-visuals-square.jpg +0 -0
  1107. lx_annotate/staticfiles/img/logo-ct-dark.png +0 -0
  1108. lx_annotate/staticfiles/img/logo-ct.png +0 -0
  1109. lx_annotate/staticfiles/img/logos/ag_lux_logo_light_grey.svg +1 -0
  1110. lx_annotate/staticfiles/img/logos/ag_lux_logo_white.svg +1 -0
  1111. lx_annotate/staticfiles/img/logos/gray-logos/logo-coinbase.svg +16 -0
  1112. lx_annotate/staticfiles/img/logos/gray-logos/logo-nasa.svg +9 -0
  1113. lx_annotate/staticfiles/img/logos/gray-logos/logo-netflix.svg +9 -0
  1114. lx_annotate/staticfiles/img/logos/gray-logos/logo-pinterest.svg +9 -0
  1115. lx_annotate/staticfiles/img/logos/gray-logos/logo-spotify.svg +9 -0
  1116. lx_annotate/staticfiles/img/logos/gray-logos/logo-vodafone.svg +9 -0
  1117. lx_annotate/staticfiles/img/logos/mastercard.png +0 -0
  1118. lx_annotate/staticfiles/img/logos/visa.png +0 -0
  1119. lx_annotate/staticfiles/img/marie.jpg +0 -0
  1120. lx_annotate/staticfiles/img/meeting.jpg +0 -0
  1121. lx_annotate/staticfiles/img/office-dark.jpg +0 -0
  1122. lx_annotate/staticfiles/img/product-12.jpg +0 -0
  1123. lx_annotate/staticfiles/img/products/product-1-min.jpg +0 -0
  1124. lx_annotate/staticfiles/img/products/product-11.jpg +0 -0
  1125. lx_annotate/staticfiles/img/products/product-2-min.jpg +0 -0
  1126. lx_annotate/staticfiles/img/products/product-3-min.jpg +0 -0
  1127. lx_annotate/staticfiles/img/products/product-4-min.jpg +0 -0
  1128. lx_annotate/staticfiles/img/products/product-5-min.jpg +0 -0
  1129. lx_annotate/staticfiles/img/products/product-6-min.jpg +0 -0
  1130. lx_annotate/staticfiles/img/products/product-7-min.jpg +0 -0
  1131. lx_annotate/staticfiles/img/products/product-details-1.jpg +0 -0
  1132. lx_annotate/staticfiles/img/products/product-details-2.jpg +0 -0
  1133. lx_annotate/staticfiles/img/products/product-details-3.jpg +0 -0
  1134. lx_annotate/staticfiles/img/products/product-details-4.jpg +0 -0
  1135. lx_annotate/staticfiles/img/products/product-details-5.jpg +0 -0
  1136. lx_annotate/staticfiles/img/shapes/pattern-lines.svg +91 -0
  1137. lx_annotate/staticfiles/img/shapes/waves-white.svg +324 -0
  1138. lx_annotate/staticfiles/img/small-logos/bootstrap.svg +9 -0
  1139. lx_annotate/staticfiles/img/small-logos/creative-tim.svg +7 -0
  1140. lx_annotate/staticfiles/img/small-logos/devto.svg +9 -0
  1141. lx_annotate/staticfiles/img/small-logos/github.svg +10 -0
  1142. lx_annotate/staticfiles/img/small-logos/google-webdev.svg +11 -0
  1143. lx_annotate/staticfiles/img/small-logos/icon-bulb.svg +37 -0
  1144. lx_annotate/staticfiles/img/small-logos/icon-sun-cloud.png +0 -0
  1145. lx_annotate/staticfiles/img/small-logos/logo-asana.svg +16 -0
  1146. lx_annotate/staticfiles/img/small-logos/logo-atlassian.svg +16 -0
  1147. lx_annotate/staticfiles/img/small-logos/logo-invision.svg +10 -0
  1148. lx_annotate/staticfiles/img/small-logos/logo-jira.svg +21 -0
  1149. lx_annotate/staticfiles/img/small-logos/logo-slack.svg +12 -0
  1150. lx_annotate/staticfiles/img/small-logos/logo-spotify.svg +9 -0
  1151. lx_annotate/staticfiles/img/small-logos/logo-xd.svg +11 -0
  1152. lx_annotate/staticfiles/img/team-1.jpg +0 -0
  1153. lx_annotate/staticfiles/img/team-2.jpg +0 -0
  1154. lx_annotate/staticfiles/img/team-3.jpg +0 -0
  1155. lx_annotate/staticfiles/img/team-4.jpg +0 -0
  1156. lx_annotate/staticfiles/img/team-5.jpg +0 -0
  1157. lx_annotate/staticfiles/img/tesla-model-s.png +0 -0
  1158. lx_annotate/staticfiles/img/vr-bg.jpg +0 -0
  1159. lx_annotate/staticfiles/index.js +52 -0
  1160. lx_annotate/staticfiles/main.css +37 -0
  1161. lx_annotate/staticfiles/main.js +36 -0
  1162. lx_annotate/staticfiles/mediaTypeStore.js +1 -0
  1163. lx_annotate/staticfiles/nucleo-icons.eot +0 -0
  1164. lx_annotate/staticfiles/nucleo-icons.svg +312 -0
  1165. lx_annotate/staticfiles/nucleo-icons.ttf +0 -0
  1166. lx_annotate/staticfiles/nucleo-icons.woff +0 -0
  1167. lx_annotate/staticfiles/nucleo-icons.woff2 +0 -0
  1168. lx_annotate/staticfiles/patientExaminationStore.js +1 -0
  1169. lx_annotate/staticfiles/patientStore.js +1 -0
  1170. lx_annotate/staticfiles/pdf.js +13 -0
  1171. lx_annotate/staticfiles/pdf.worker.min.js +1 -0
  1172. lx_annotate/staticfiles/pdf.worker.min.mjs +21 -0
  1173. lx_annotate/staticfiles/reportSubmissionUtils.js +1 -0
  1174. lx_annotate/staticfiles/reportTemplatesApi.js +1 -0
  1175. lx_annotate/staticfiles/silent-check-sso.html +8 -0
  1176. lx_annotate/staticfiles/timeHelpers.js +1 -0
  1177. lx_annotate/staticfiles/useDebug.js +1 -0
  1178. lx_annotate/staticfiles/useFindingSelectors.js +1 -0
  1179. lx_annotate/staticfiles/useReportTemplates.css +1 -0
  1180. lx_annotate/staticfiles/useReportTemplates.js +1 -0
  1181. lx_annotate/staticfiles/videoStore.js +1 -0
  1182. lx_annotate/templates/base.html +42 -0
  1183. lx_annotate/urls.py +141 -0
  1184. lx_annotate/wsgi.py +18 -0
  1185. lx_annotate-0.0.1.dist-info/METADATA +236 -0
  1186. lx_annotate-0.0.1.dist-info/RECORD +1188 -0
  1187. lx_annotate-0.0.1.dist-info/WHEEL +4 -0
  1188. lx_annotate-0.0.1.dist-info/licenses/LICENSE +21 -0
File without changes
lx_annotate/admin.py ADDED
@@ -0,0 +1 @@
1
+ # Register your models here.
lx_annotate/apps.py ADDED
@@ -0,0 +1,42 @@
1
+ from django.apps import AppConfig
2
+ import os
3
+ import sys
4
+ import threading
5
+
6
+
7
+ class LxAnnotateConfig(AppConfig):
8
+ default_auto_field = "django.db.models.BigAutoField"
9
+ name = "lx_annotate"
10
+
11
+ # This is running in development server only. On luxnix, filewatcher is started via systemd service.
12
+ def ready(self):
13
+ # Only for runserver
14
+ if "runserver" not in sys.argv:
15
+ return
16
+
17
+ # Only in autoreload child, not in the parent
18
+ if os.environ.get("RUN_MAIN") != "true":
19
+ return
20
+
21
+ self.start_file_watcher()
22
+
23
+ def start_file_watcher(self) -> bool:
24
+ def run_watcher():
25
+ try:
26
+ from django.core.management import call_command
27
+
28
+ print("📁 Starting file watcher service...")
29
+ call_command("start_filewatcher", log_level="INFO")
30
+ except Exception as e:
31
+ print(f"⚠️ Failed to start file watcher: {e}")
32
+ return False
33
+
34
+ watcher_thread = threading.Thread(target=run_watcher, daemon=True)
35
+ watcher_thread.start()
36
+ print("✅ File watcher service started in background")
37
+ return True
38
+
39
+
40
+ # class lxAnonymizerConfig(AppConfig):
41
+ # default_auto_field = 'django.db.models.BigAutoField'
42
+ # name = 'lx-anonymizer'
lx_annotate/asgi.py ADDED
@@ -0,0 +1,40 @@
1
+ """
2
+ ASGI config for lx-annotate project.
3
+
4
+ It exposes the ASGI callable as a module-level variable named ``application``.
5
+
6
+ For more information on this file, see
7
+ https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/
8
+ """
9
+
10
+ import os
11
+
12
+ os.environ["DJANGO_SETTINGS_MODULE"] = "lx_annotate.settings.settings_prod"
13
+ from django.core.asgi import get_asgi_application
14
+ from django.core.wsgi import get_wsgi_application
15
+
16
+ from asgiref.wsgi import WsgiToAsgi
17
+ from whitenoise import WhiteNoise
18
+
19
+ import importlib
20
+ import traceback
21
+ import sys
22
+
23
+ print("DJANGO_SETTINGS_MODULE =", os.getenv("DJANGO_SETTINGS_MODULE"))
24
+ print("sys.path[:10] =", sys.path[:10])
25
+
26
+ m = os.getenv("DJANGO_SETTINGS_MODULE", "lx_annotate.settings.settings_prod")
27
+ staticfiles_dir = os.getenv(
28
+ "DJANGO_STATIC_ROOT", os.path.join(os.path.dirname(__file__), "static")
29
+ )
30
+ try:
31
+ importlib.import_module(m)
32
+ print("Imported settings module OK:", m)
33
+ except Exception:
34
+ traceback.print_exc()
35
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lx_annotate.settings.settings_prod")
36
+
37
+ wsgi_application = get_wsgi_application()
38
+ application = get_asgi_application()
39
+ whitenoise_application = WhiteNoise(wsgi_application, root=staticfiles_dir)
40
+ wsgi_asgi_application = WsgiToAsgi(wsgi_application)
@@ -0,0 +1,44 @@
1
+ from rest_framework.decorators import api_view, permission_classes
2
+ from rest_framework.permissions import AllowAny
3
+ from rest_framework.response import Response
4
+ from rest_framework import status
5
+
6
+
7
+ @api_view(["GET"])
8
+ @permission_classes([AllowAny])
9
+ def user_status(request):
10
+ """
11
+ Check if user is authenticated via Keycloak
12
+ """
13
+ if hasattr(request, "user") and request.user.is_authenticated:
14
+ return Response(
15
+ {
16
+ "is_authenticated": True,
17
+ "username": request.user.username,
18
+ "groups": getattr(request.user, "roles", []), # Keycloak uses roles
19
+ }
20
+ )
21
+
22
+ return Response({"is_authenticated": False})
23
+
24
+
25
+ @api_view(["GET"])
26
+ def current_user(request):
27
+ """
28
+ Get current authenticated user info
29
+ """
30
+ if not request.user.is_authenticated:
31
+ return Response(
32
+ {"error": "Not authenticated"}, status=status.HTTP_401_UNAUTHORIZED
33
+ )
34
+
35
+ return Response(
36
+ {
37
+ "id": getattr(request.user, "id", None),
38
+ "username": request.user.username,
39
+ "email": getattr(request.user, "email", ""),
40
+ "groups": getattr(request.user, "roles", []),
41
+ "is_staff": getattr(request.user, "is_staff", False),
42
+ "is_active": getattr(request.user, "is_active", True),
43
+ }
44
+ )
@@ -0,0 +1,559 @@
1
+ """
2
+ File watcher service packaged with the lx_annotate Django app.
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ import glob
8
+ import logging
9
+ import os
10
+ import shutil
11
+ import threading
12
+ import time
13
+ from concurrent.futures import ThreadPoolExecutor
14
+ from pathlib import Path
15
+ from typing import Set
16
+
17
+ import requests
18
+ from watchdog.events import FileCreatedEvent, FileMovedEvent, FileSystemEventHandler
19
+ from watchdog.observers import Observer
20
+
21
+ from endoreg_db.models import Center, EndoscopyProcessor
22
+ from endoreg_db.services.hub import process_preanonymized_watcher_file
23
+ from endoreg_db.services.report_import import ReportImportService
24
+ from endoreg_db.services.video_import import VideoImportService
25
+ from endoreg_db.utils.paths import data_paths
26
+
27
+ try:
28
+ from endoreg_db.utils import data_paths as root_data_paths
29
+
30
+ project_root = root_data_paths["project_root"]
31
+ except (ImportError, ModuleNotFoundError, KeyError):
32
+ project_root = Path(__file__).resolve().parent.parent
33
+
34
+ PROJECT_ROOT = Path(project_root)
35
+ RUNTIME_DATA_DIR = Path(
36
+ os.getenv("LX_ANNOTATE_DATA_DIR", os.getenv("DATA_DIR", str(PROJECT_ROOT / "data")))
37
+ )
38
+ LOG_DIR = RUNTIME_DATA_DIR / "logs"
39
+ LOG_DIR.mkdir(parents=True, exist_ok=True)
40
+
41
+
42
+ def _setup_ffmpeg() -> None:
43
+ """Ensure FFmpeg binaries are available in PATH."""
44
+ for binary in ("ffmpeg", "ffprobe"):
45
+ if shutil.which(binary):
46
+ continue
47
+
48
+ for pattern in (
49
+ f"/nix/store/*/bin/{binary}",
50
+ f"/usr/bin/{binary}",
51
+ f"/usr/local/bin/{binary}",
52
+ ):
53
+ matches = glob.glob(pattern)
54
+ if not matches:
55
+ continue
56
+
57
+ bin_dir = Path(matches[0]).parent
58
+ current_path = os.environ.get("PATH", "")
59
+ if str(bin_dir) not in current_path:
60
+ os.environ["PATH"] = f"{bin_dir}:{current_path}"
61
+ break
62
+
63
+
64
+ _setup_ffmpeg()
65
+
66
+ logging.basicConfig(
67
+ level=getattr(logging, os.getenv("WATCHER_LOG_LEVEL", "INFO")),
68
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
69
+ handlers=[logging.StreamHandler(), logging.FileHandler(LOG_DIR / "file_watcher.log")],
70
+ )
71
+
72
+ logging.getLogger("watchdog").setLevel(logging.WARNING)
73
+ logging.getLogger("watchdog.observers").setLevel(logging.WARNING)
74
+ logging.getLogger("watchdog.observers.inotify_buffer").setLevel(logging.WARNING)
75
+
76
+ logger = logging.getLogger(__name__)
77
+
78
+ video_import_service = VideoImportService()
79
+ report_import_service = ReportImportService()
80
+
81
+
82
+ def unload_ollama_model(model_name: str = "llama3.2:1b") -> None:
83
+ """Request Ollama to unload the model immediately."""
84
+ try:
85
+ requests.post(
86
+ "http://localhost:11434/api/chat",
87
+ json={"model": model_name, "keep_alive": 0},
88
+ timeout=2,
89
+ )
90
+ logger.info("Requested immediate VRAM release for model: %s", model_name)
91
+ except Exception as exc:
92
+ logger.warning("Failed to unload Ollama model (VRAM might not be freed): %s", exc)
93
+
94
+
95
+ def should_ignore_file(file_path: str | Path) -> bool:
96
+ """Skip internal/temporary files and quarantine paths."""
97
+ p = Path(file_path)
98
+ if p.suffix == ".lock":
99
+ return True
100
+ if any(part == "_processing" for part in p.parts):
101
+ return True
102
+ if p.name.startswith(".") or p.name.startswith("~"):
103
+ return True
104
+ return False
105
+
106
+
107
+ class AutoProcessingHandler(FileSystemEventHandler):
108
+ """Handle file-system events for automatic processing of videos and reports."""
109
+
110
+ def __init__(self) -> None:
111
+ super().__init__()
112
+ self.processed_files: Set[str] = set()
113
+ self.in_flight_files: Set[str] = set()
114
+ self.files_lock = threading.Lock()
115
+ self.video_extensions = {".mp4", ".avi", ".mov", ".mkv", ".webm", ".m4v"}
116
+ self.report_extensions = {".pdf"}
117
+ self.pseudonymized_extensions = {".pdf", ".mp4"}
118
+
119
+ self.default_center = "university_hospital_wuerzburg"
120
+ self.default_processor = "olympus_cv_1500"
121
+ self.default_model = "image_multilabel_classification_colonoscopy_default"
122
+
123
+ self.executor = ThreadPoolExecutor(max_workers=2, thread_name_prefix="FileProcessor")
124
+ self.pseudonymized_dir = data_paths["import_preanonymized"].resolve()
125
+
126
+ logger.info("AutoProcessingHandler initialized")
127
+ logger.info("Monitoring video extensions: %s", self.video_extensions)
128
+ logger.info("Monitoring report extensions: %s", self.report_extensions)
129
+ logger.info(
130
+ "Monitoring pseudonymized extensions: %s", self.pseudonymized_extensions
131
+ )
132
+ logger.info("Pseudonymized intake directory: %s", self.pseudonymized_dir)
133
+
134
+ def dispatch(self, event): # type: ignore[override]
135
+ if event.is_directory:
136
+ return
137
+ if hasattr(event, "event_type") and event.event_type in {"opened", "closed"}:
138
+ return
139
+
140
+ src_path = str(event.src_path)
141
+ dest_path = getattr(event, "dest_path", None)
142
+ if should_ignore_file(src_path):
143
+ return
144
+ if dest_path and should_ignore_file(dest_path):
145
+ return
146
+
147
+ path = Path(src_path)
148
+ if (
149
+ path.name.startswith(".")
150
+ or path.name.startswith("~")
151
+ or "tmp" in str(path)
152
+ or "transcoding" in str(path)
153
+ ):
154
+ return
155
+
156
+ super().dispatch(event)
157
+
158
+ def on_created(self, event):
159
+ if isinstance(event, FileCreatedEvent) and not event.is_directory:
160
+ self._submit_file(str(event.src_path))
161
+
162
+ def on_moved(self, event) -> None:
163
+ if isinstance(event, FileMovedEvent) and not event.is_directory:
164
+ self._submit_file(str(event.dest_path))
165
+
166
+ def _ensure_processing_slot(self, file_path: str) -> bool:
167
+ with self.files_lock:
168
+ if file_path in self.processed_files or file_path in self.in_flight_files:
169
+ return False
170
+ self.in_flight_files.add(file_path)
171
+ return True
172
+
173
+ def _release_processing_slot(self, file_path: str) -> None:
174
+ with self.files_lock:
175
+ self.in_flight_files.discard(file_path)
176
+
177
+ def _mark_processed(self, file_path: str) -> None:
178
+ with self.files_lock:
179
+ self.processed_files.add(file_path)
180
+
181
+ def _unmark_processed(self, file_path: str) -> None:
182
+ with self.files_lock:
183
+ self.processed_files.discard(file_path)
184
+
185
+ def _submit_file(self, file_path: str) -> None:
186
+ if not self._ensure_processing_slot(file_path):
187
+ logger.debug("Skipping duplicate file event: %s", file_path)
188
+ return
189
+ self.executor.submit(self._process_file, file_path)
190
+
191
+ def _process_file(self, file_path: str) -> None:
192
+ path_key = str(Path(file_path))
193
+ path = Path(file_path)
194
+
195
+ try:
196
+ with self.files_lock:
197
+ if path_key in self.processed_files:
198
+ logger.debug("File already processed: %s", path_key)
199
+ return
200
+ if path_key not in self.in_flight_files:
201
+ self.in_flight_files.add(path_key)
202
+
203
+ if should_ignore_file(path):
204
+ logger.debug("Skipping ignored file: %s", path)
205
+ return
206
+
207
+ if not self._wait_for_file_stable(path):
208
+ logger.warning("File not stable after waiting: %s", path)
209
+ return
210
+
211
+ file_extension = path.suffix.lower()
212
+ parent_dir = path.parent.resolve()
213
+ logger.debug("Parent: %s", parent_dir)
214
+
215
+ if (
216
+ parent_dir == data_paths["import_video"].resolve()
217
+ and file_extension in self.video_extensions
218
+ ):
219
+ logger.info("New video detected: %s", path)
220
+ self._process_video(path)
221
+ elif (
222
+ parent_dir == data_paths["import_report"].resolve()
223
+ and file_extension in self.report_extensions
224
+ ):
225
+ logger.info("New report detected: %s", path)
226
+ self._process_report(path)
227
+ elif (
228
+ parent_dir == self.pseudonymized_dir
229
+ and file_extension in self.pseudonymized_extensions
230
+ ):
231
+ logger.info("New pseudonymized file detected: %s", path)
232
+ self._process_pseudonymized(path)
233
+ else:
234
+ logger.debug("Ignoring file (wrong type/location): %s", path)
235
+ except Exception as exc:
236
+ logger.error("Error processing file %s: %s", file_path, exc, exc_info=True)
237
+ finally:
238
+ self._release_processing_slot(path_key)
239
+
240
+ def _wait_for_file_stable(self, path: Path, timeout: int = 30) -> bool:
241
+ if not path.exists() or should_ignore_file(path):
242
+ return False
243
+
244
+ initial_size = -1
245
+ stable_checks = 0
246
+ for _ in range(timeout):
247
+ try:
248
+ current_size = path.stat().st_size
249
+ if current_size == initial_size:
250
+ stable_checks += 1
251
+ if stable_checks >= 3:
252
+ logger.debug("File stable: %s (%s bytes)", path, current_size)
253
+ return True
254
+ else:
255
+ stable_checks = 0
256
+ initial_size = current_size
257
+ logger.debug("File still changing: %s (%s bytes)", path, current_size)
258
+ time.sleep(1)
259
+ except (OSError, IOError) as exc:
260
+ logger.debug("Error checking file size: %s", exc)
261
+ time.sleep(1)
262
+
263
+ return False
264
+
265
+ def _process_video(self, video_path: Path) -> None:
266
+ try:
267
+ logger.info("Starting video processing: %s", video_path)
268
+ video_file = None
269
+ self._mark_processed(str(video_path))
270
+
271
+ try:
272
+ from endoreg_db.exceptions import InsufficientStorageError
273
+ from endoreg_db.models.media.video.create_from_file import (
274
+ check_storage_capacity,
275
+ )
276
+
277
+ storage_root = os.getenv(
278
+ "DJANGO_DATA_DIR", str(RUNTIME_DATA_DIR / "videos")
279
+ )
280
+ check_storage_capacity(video_path, Path(storage_root))
281
+ except InsufficientStorageError as storage_error:
282
+ logger.error(
283
+ "Insufficient storage space for %s: %s",
284
+ video_path,
285
+ storage_error,
286
+ )
287
+ self._unmark_processed(str(video_path))
288
+ return
289
+ except Exception as storage_error:
290
+ logger.warning("Storage check failed, proceeding anyway: %s", storage_error)
291
+
292
+ try:
293
+ video_file = video_import_service.import_and_anonymize(
294
+ file_path=video_path,
295
+ center_name=self.default_center,
296
+ processor_name=self.default_processor,
297
+ retry=False,
298
+ delete_source=False,
299
+ )
300
+ if video_file is None:
301
+ logger.info(
302
+ "Video import skipped (already being processed): %s", video_path
303
+ )
304
+ return
305
+ if not video_file.sensitive_meta:
306
+ logger.warning(
307
+ "Video imported but no SensitiveMeta created: %s",
308
+ video_file.video_hash,
309
+ )
310
+ logger.info("Video imported successfully: %s", video_file.video_hash)
311
+ except Exception as import_error:
312
+ error_msg = str(import_error)
313
+ if "Insufficient storage" in error_msg or "No space left on device" in error_msg:
314
+ logger.error(
315
+ "Storage error during import for %s: %s", video_path, import_error
316
+ )
317
+ self._unmark_processed(str(video_path))
318
+ return
319
+ if "already exists" in error_msg:
320
+ logger.info("Video %s already exists in database, skipping", video_path)
321
+ return
322
+ logger.error("Import failed for %s: %s", video_path, import_error)
323
+ self._unmark_processed(str(video_path))
324
+ return
325
+
326
+ if video_file and getattr(video_file, "pk", None):
327
+ try:
328
+ unload_ollama_model(model_name=self.default_model)
329
+ success = video_file.pipe_1(
330
+ model_name=self.default_model, delete_frames_after=True
331
+ )
332
+ if success:
333
+ logger.info(
334
+ "Video segmentation completed: %s", video_file.video_hash
335
+ )
336
+ else:
337
+ logger.error(
338
+ "Video segmentation failed: %s", video_file.video_hash
339
+ )
340
+ except Exception as exc:
341
+ logger.error("Error during video segmentation: %s", exc, exc_info=True)
342
+
343
+ logger.info("Video processing completed: %s", video_path)
344
+ if video_path.exists():
345
+ logger.info("Source video still exists: %s", video_path)
346
+ video_path.unlink()
347
+ except Exception as exc:
348
+ error_msg = str(exc)
349
+ logger.error("Error processing video %s: %s", video_path, error_msg, exc_info=True)
350
+ if any(
351
+ phrase in error_msg.lower()
352
+ for phrase in ["insufficient storage", "no space left", "disk full"]
353
+ ):
354
+ logger.warning(
355
+ "Storage error for %s, will retry when space is available", video_path
356
+ )
357
+ self._unmark_processed(str(video_path))
358
+ return
359
+ logger.warning("Removing %s from processed set due to error", video_path)
360
+ self._unmark_processed(str(video_path))
361
+
362
+ def _process_report(self, report_path: Path) -> None:
363
+ try:
364
+ logger.info("Starting report processing: %s", report_path)
365
+ self._mark_processed(str(report_path))
366
+
367
+ try:
368
+ from endoreg_db.exceptions import InsufficientStorageError
369
+
370
+ storage_root = os.getenv(
371
+ "report_STORAGE_ROOT", str(RUNTIME_DATA_DIR / "reports")
372
+ )
373
+ storage_root_path = Path(storage_root)
374
+ if not storage_root_path.is_absolute():
375
+ storage_root_path = PROJECT_ROOT / storage_root_path
376
+ storage_root_path.mkdir(parents=True, exist_ok=True)
377
+ if not storage_root_path.exists():
378
+ raise InsufficientStorageError(
379
+ f"Storage root does not exist: {storage_root_path}"
380
+ )
381
+
382
+ raw_report = report_import_service.import_and_anonymize(
383
+ file_path=report_path,
384
+ center_name=self.default_center,
385
+ delete_source=False,
386
+ )
387
+ if raw_report:
388
+ logger.info(
389
+ "report imported successfully: %s", raw_report.pdf_hash
390
+ )
391
+ try:
392
+ if report_path.exists():
393
+ report_path.unlink()
394
+ except Exception as exc:
395
+ logger.error(
396
+ "Error removing report file %s: %s", report_path, exc
397
+ )
398
+ else:
399
+ logger.info(
400
+ "report import skipped (already being processed): %s", report_path
401
+ )
402
+ self._unmark_processed(str(report_path))
403
+ except InsufficientStorageError as storage_error:
404
+ logger.error(
405
+ "Insufficient storage space for %s: %s", report_path, storage_error
406
+ )
407
+ self._unmark_processed(str(report_path))
408
+ except Exception as import_error:
409
+ logger.error("report import failed for %s: %s", report_path, import_error)
410
+ self._unmark_processed(str(report_path))
411
+ except Exception as exc:
412
+ logger.error("Error processing report %s: %s", report_path, exc, exc_info=True)
413
+ self._unmark_processed(str(report_path))
414
+
415
+ def _process_pseudonymized(self, file_path: Path) -> None:
416
+ try:
417
+ logger.info("Starting pseudonymized processing: %s", file_path)
418
+ self._mark_processed(str(file_path))
419
+ process_preanonymized_watcher_file(file_path=file_path)
420
+ logger.info("Pseudonymized processing completed: %s", file_path)
421
+ except Exception as exc:
422
+ logger.error(
423
+ "Error processing pseudonymized file %s: %s",
424
+ file_path,
425
+ exc,
426
+ exc_info=True,
427
+ )
428
+ self._unmark_processed(str(file_path))
429
+
430
+ def shutdown(self) -> None:
431
+ logger.info("Shutting down file processor threads...")
432
+ self.executor.shutdown(wait=True)
433
+ logger.info("File processor threads shut down")
434
+
435
+
436
+ class FileWatcherService:
437
+ """Main service class for file watching and automatic processing."""
438
+
439
+ def __init__(self) -> None:
440
+ self.observer = Observer()
441
+ self.handler = AutoProcessingHandler()
442
+ self.video_dir = data_paths["import_video"].resolve()
443
+ self.report_dir = data_paths["import_report"].resolve()
444
+ self.pseudonymized_dir = self.handler.pseudonymized_dir
445
+
446
+ self.video_dir.mkdir(parents=True, exist_ok=True)
447
+ self.report_dir.mkdir(parents=True, exist_ok=True)
448
+ self.pseudonymized_dir.mkdir(parents=True, exist_ok=True)
449
+
450
+ logger.info("Video directory: %s", self.video_dir)
451
+ logger.info("report directory: %s", self.report_dir)
452
+ logger.info("Pseudonymized directory: %s", self.pseudonymized_dir)
453
+ logger.info("Using observer: %s", type(self.observer).__name__)
454
+
455
+ def start(self) -> None:
456
+ try:
457
+ self._validate_django_setup()
458
+ self.observer.schedule(self.handler, str(self.video_dir), recursive=False)
459
+ self.observer.schedule(self.handler, str(self.report_dir), recursive=False)
460
+ self.observer.schedule(
461
+ self.handler, str(self.pseudonymized_dir), recursive=False
462
+ )
463
+ self.observer.start()
464
+ logger.info("File watcher service started successfully")
465
+ logger.info("Monitoring: %s", self.video_dir)
466
+ logger.info("Monitoring: %s", self.report_dir)
467
+ logger.info("Monitoring: %s", self.pseudonymized_dir)
468
+ self.handler.executor.submit(self._process_existing_files)
469
+
470
+ try:
471
+ while True:
472
+ time.sleep(10)
473
+ self._health_check()
474
+ except KeyboardInterrupt:
475
+ logger.info("Received shutdown signal")
476
+ except Exception as exc:
477
+ logger.error("Error starting file watcher service: %s", exc, exc_info=True)
478
+ raise
479
+ finally:
480
+ self.stop()
481
+
482
+ def stop(self) -> None:
483
+ if self.observer.is_alive():
484
+ self.observer.stop()
485
+ self.observer.join()
486
+ logger.info("File watcher service stopped")
487
+ self.handler.shutdown()
488
+
489
+ def _validate_django_setup(self) -> None:
490
+ from django.db import connection
491
+
492
+ connection.ensure_connection()
493
+ Center.objects.first()
494
+ EndoscopyProcessor.objects.first()
495
+ logger.info("Django setup validation successful")
496
+
497
+ def _process_existing_files(self) -> None:
498
+ logger.info("Processing existing files...")
499
+ for video_file in self.video_dir.glob("*"):
500
+ if video_file.is_file() and video_file.suffix.lower() in self.handler.video_extensions:
501
+ logger.info("Processing existing video: %s", video_file)
502
+ self.handler._process_file(str(video_file))
503
+
504
+ for report_file in self.report_dir.glob("*"):
505
+ if report_file.is_file() and report_file.suffix.lower() in self.handler.report_extensions:
506
+ logger.info("Processing existing report: %s", report_file)
507
+ self.handler._process_file(str(report_file))
508
+
509
+ for pseudonymized_file in self.pseudonymized_dir.glob("*"):
510
+ if (
511
+ pseudonymized_file.is_file()
512
+ and pseudonymized_file.suffix.lower()
513
+ in self.handler.pseudonymized_extensions
514
+ ):
515
+ logger.info(
516
+ "Processing existing pseudonymized file: %s", pseudonymized_file
517
+ )
518
+ self.handler._process_file(str(pseudonymized_file))
519
+
520
+ logger.info("Existing files processing completed")
521
+
522
+ def _health_check(self) -> None:
523
+ if not self.observer.is_alive():
524
+ logger.error("Observer thread died, restarting...")
525
+ self.observer = Observer()
526
+ self.observer.schedule(self.handler, str(self.video_dir), recursive=False)
527
+ self.observer.schedule(self.handler, str(self.report_dir), recursive=False)
528
+ self.observer.schedule(
529
+ self.handler, str(self.pseudonymized_dir), recursive=False
530
+ )
531
+ self.observer.start()
532
+
533
+ try:
534
+ storage_root = RUNTIME_DATA_DIR / "storage" / "videos"
535
+ if storage_root.exists():
536
+ total, used, free = shutil.disk_usage(storage_root)
537
+ free_gb = free / (1024**3)
538
+ total_gb = total / (1024**3)
539
+ usage_percent = (used / total) * 100
540
+ logger.debug(
541
+ "Storage: %.1f GB free of %.1f GB (%.1f%% used)",
542
+ free_gb,
543
+ total_gb,
544
+ usage_percent,
545
+ )
546
+ if free_gb < 5.0:
547
+ logger.warning("Storage space running low: %.1f GB free", free_gb)
548
+ elif usage_percent > 90:
549
+ logger.warning("Storage usage high: %.1f%% used", usage_percent)
550
+ except Exception as exc:
551
+ logger.debug("Storage check failed: %s", exc)
552
+
553
+
554
+ def run_file_watcher() -> None:
555
+ logger.info("Starting File Watcher Service")
556
+ logger.info("Project root: %s", PROJECT_ROOT)
557
+ logger.info("Django settings: %s", os.environ.get("DJANGO_SETTINGS_MODULE"))
558
+ FileWatcherService().start()
559
+