trajectopy 4.0.9__tar.gz → 4.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. {trajectopy-4.0.9 → trajectopy-4.2.0}/PKG-INFO +5 -2
  2. trajectopy-4.2.0/example_data/KITTI_ORB.traj +4544 -0
  3. trajectopy-4.2.0/example_data/KITTI_SPTAM.traj +4544 -0
  4. trajectopy-4.2.0/example_data/KITTI_gt.traj +4544 -0
  5. {trajectopy-4.0.9 → trajectopy-4.2.0}/pyproject.toml +4 -1
  6. trajectopy-4.2.0/requirements.txt +2019 -0
  7. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_trajectory.py +25 -0
  8. trajectopy-4.2.0/trajectopy/__version__.py +1 -0
  9. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/core/trajectory.py +16 -10
  10. trajectopy-4.2.0/trajectopy/gui/__init__.py +1 -0
  11. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/app.py +26 -3
  12. trajectopy-4.2.0/trajectopy/gui/managers/__init__.py +1 -0
  13. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/managers/file_manager.py +8 -8
  14. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/managers/plot_manager.py +6 -6
  15. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/managers/requests.py +12 -5
  16. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/managers/session_manager.py +13 -13
  17. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/managers/trajectory_manager.py +50 -24
  18. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/managers/ui_manager.py +56 -12
  19. trajectopy-4.2.0/trajectopy/gui/models/__init__.py +1 -0
  20. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/models/entries.py +1 -1
  21. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/models/property_model.py +5 -5
  22. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/models/result_model.py +4 -4
  23. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/models/selection.py +1 -1
  24. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/models/table_model.py +6 -6
  25. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/models/trajectory_model.py +4 -4
  26. trajectopy-4.2.0/trajectopy/gui/themes.py +364 -0
  27. trajectopy-4.2.0/trajectopy/gui/utils.py +108 -0
  28. trajectopy-4.2.0/trajectopy/gui/views/__init__.py +1 -0
  29. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/views/about_window.py +3 -9
  30. trajectopy-4.2.0/trajectopy/gui/views/alignment_edit_window.py +153 -0
  31. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/views/dof_organizer.py +4 -6
  32. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/views/json_settings_view.py +6 -16
  33. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/views/main_window.py +278 -107
  34. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/views/mpl_plot_tabs.py +5 -11
  35. trajectopy-4.2.0/trajectopy/gui/views/playback_window.py +392 -0
  36. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/views/progress_window.py +7 -11
  37. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/views/properties_window.py +5 -3
  38. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/views/result_context_menu.py +9 -9
  39. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/views/result_selection_window.py +3 -3
  40. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/views/result_table_view.py +22 -41
  41. trajectopy-4.2.0/trajectopy/gui/views/timeline_widget.py +207 -0
  42. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/views/trajectory_context_menu.py +40 -11
  43. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/views/trajectory_table_view.py +31 -55
  44. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/lib/alignment/data.py +1 -1
  45. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/lib/alignment/direct.py +1 -1
  46. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/merging.py +2 -0
  47. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/readers/utils.py +1 -1
  48. trajectopy-4.2.0/uv.lock +2853 -0
  49. trajectopy-4.0.9/example_data/KITTI_ORB.traj +0 -4543
  50. trajectopy-4.0.9/example_data/KITTI_SPTAM.traj +0 -4543
  51. trajectopy-4.0.9/example_data/KITTI_gt.traj +0 -4544
  52. trajectopy-4.0.9/requirements.txt +0 -1797
  53. trajectopy-4.0.9/trajectopy/__version__.py +0 -1
  54. trajectopy-4.0.9/trajectopy/gui/__init__.py +0 -1
  55. trajectopy-4.0.9/trajectopy/gui/managers/__init__.py +0 -0
  56. trajectopy-4.0.9/trajectopy/gui/models/__init__.py +0 -0
  57. trajectopy-4.0.9/trajectopy/gui/utils.py +0 -54
  58. trajectopy-4.0.9/trajectopy/gui/views/__init__.py +0 -0
  59. trajectopy-4.0.9/trajectopy/gui/views/alignment_edit_window.py +0 -208
  60. trajectopy-4.0.9/uv.lock +0 -2617
  61. {trajectopy-4.0.9 → trajectopy-4.2.0}/.gitattributes +0 -0
  62. {trajectopy-4.0.9 → trajectopy-4.2.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  63. {trajectopy-4.0.9 → trajectopy-4.2.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  64. {trajectopy-4.0.9 → trajectopy-4.2.0}/.gitignore +0 -0
  65. {trajectopy-4.0.9 → trajectopy-4.2.0}/.images/along_cross_frames.png +0 -0
  66. {trajectopy-4.0.9 → trajectopy-4.2.0}/.images/igg.gif +0 -0
  67. {trajectopy-4.0.9 → trajectopy-4.2.0}/.images/plot.png +0 -0
  68. {trajectopy-4.0.9 → trajectopy-4.2.0}/.images/trajectopy_gif_low_quality.gif +0 -0
  69. {trajectopy-4.0.9 → trajectopy-4.2.0}/.images/uni_bonn.svg +0 -0
  70. {trajectopy-4.0.9 → trajectopy-4.2.0}/.pre-commit-config.yaml +0 -0
  71. {trajectopy-4.0.9 → trajectopy-4.2.0}/.pylintrc +0 -0
  72. {trajectopy-4.0.9 → trajectopy-4.2.0}/CITATION.cff +0 -0
  73. {trajectopy-4.0.9 → trajectopy-4.2.0}/LICENSE +0 -0
  74. {trajectopy-4.0.9 → trajectopy-4.2.0}/README.md +0 -0
  75. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_data/custom_alignment.result +0 -0
  76. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_data/default.mplstyle +0 -0
  77. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_data/matplotlib_settings.json +0 -0
  78. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_data/report.html +0 -0
  79. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_data/report_settings.json +0 -0
  80. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_scripts/align.py +0 -0
  81. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_scripts/alignment.py +0 -0
  82. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_scripts/ate.py +0 -0
  83. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_scripts/mpl_plot.py +0 -0
  84. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_scripts/multi_report.py +0 -0
  85. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_scripts/rpe.py +0 -0
  86. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_scripts/single_report.py +0 -0
  87. {trajectopy-4.0.9 → trajectopy-4.2.0}/example_scripts/trajectory_plot.py +0 -0
  88. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/__init__.py +0 -0
  89. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/data/abs_dev.result +0 -0
  90. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/data/align_entry.result +0 -0
  91. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/data/generated_trajectory.traj +0 -0
  92. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/data/noisy_trajectory.traj +0 -0
  93. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/data/open_loop_trajectory.traj +0 -0
  94. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/data/rel_dev_meter.result +0 -0
  95. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/data/rel_dev_second.result +0 -0
  96. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_alignment.py +0 -0
  97. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_approximation.py +0 -0
  98. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_comparison.py +0 -0
  99. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_io.py +0 -0
  100. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_matching.py +0 -0
  101. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_merging.py +0 -0
  102. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_pipeline.py +0 -0
  103. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_positions_rotations.py +0 -0
  104. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_processing_edge_cases.py +0 -0
  105. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_processing_errors.py +0 -0
  106. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_readers_edge_cases.py +0 -0
  107. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_readers_errors.py +0 -0
  108. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_settings.py +0 -0
  109. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_settings_edge_cases.py +0 -0
  110. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_settings_validation.py +0 -0
  111. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_sorting.py +0 -0
  112. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/test_trajectory_validation.py +0 -0
  113. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/testdata.py +0 -0
  114. {trajectopy-4.0.9 → trajectopy-4.2.0}/test/util.py +0 -0
  115. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/LICENSE +0 -0
  116. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/__init__.py +0 -0
  117. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/__main__.py +0 -0
  118. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/cli/__init__.py +0 -0
  119. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/cli/main.py +0 -0
  120. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/core/__init__.py +0 -0
  121. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/core/positions.py +0 -0
  122. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/core/rotations.py +0 -0
  123. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/core/settings.py +0 -0
  124. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/exceptions.py +0 -0
  125. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/resources/full-icon-poppins.png +0 -0
  126. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/resources/icon-bg.ico +0 -0
  127. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/resources/icon-bg.png +0 -0
  128. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/gui/resources/icon.png +0 -0
  129. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/__init__.py +0 -0
  130. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/alignment.py +0 -0
  131. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/approximation.py +0 -0
  132. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/evaluation.py +0 -0
  133. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/interpolation.py +0 -0
  134. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/lib/__init__.py +0 -0
  135. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/lib/alignment/__init__.py +0 -0
  136. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/lib/alignment/egrad_interface.py +0 -0
  137. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/lib/alignment/equations.py +0 -0
  138. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/lib/alignment/estimation.py +0 -0
  139. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/lib/alignment/parameters.py +0 -0
  140. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/lib/approximation/__init__.py +0 -0
  141. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/lib/approximation/cubic_approximation.py +0 -0
  142. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/lib/approximation/line_approximation.py +0 -0
  143. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/lib/approximation/voxelizer.py +0 -0
  144. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/matching.py +0 -0
  145. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/processing/sorting.py +0 -0
  146. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/py.typed +0 -0
  147. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/readers/__init__.py +0 -0
  148. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/readers/ascii.py +0 -0
  149. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/readers/rosbag.py +0 -0
  150. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/readers/rosmsg.py +0 -0
  151. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/results/__init__.py +0 -0
  152. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/results/alignment_result.py +0 -0
  153. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/results/ate_result.py +0 -0
  154. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/results/rpe_result.py +0 -0
  155. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/utils/__init__.py +0 -0
  156. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/utils/common.py +0 -0
  157. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/utils/definitions.py +0 -0
  158. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/visualization/__init__.py +0 -0
  159. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/visualization/assets/icon.png +0 -0
  160. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/visualization/assets/style.css +0 -0
  161. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/visualization/default.mplstyle +0 -0
  162. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/visualization/mpl_plots.py +0 -0
  163. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/visualization/plotly_plots.py +0 -0
  164. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/visualization/plotly_reports.py +0 -0
  165. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/visualization/report_data.py +0 -0
  166. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/visualization/templates/generic.html +0 -0
  167. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/visualization/templates/multi_template.html +0 -0
  168. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy/visualization/templates/single_template.html +0 -0
  169. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/core/positions.md +0 -0
  170. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/core/rotations.md +0 -0
  171. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/core/settings.md +0 -0
  172. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/core/trajectory.md +0 -0
  173. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/index.md +0 -0
  174. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/processing/alignment.md +0 -0
  175. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/processing/approximation.md +0 -0
  176. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/processing/evaluation.md +0 -0
  177. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/processing/interpolation.md +0 -0
  178. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/processing/matching.md +0 -0
  179. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/processing/merging.md +0 -0
  180. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/processing/parameters.md +0 -0
  181. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/processing/sorting.md +0 -0
  182. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/results/alignment_result.md +0 -0
  183. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/results/ate_result.md +0 -0
  184. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/results/rpe_result.md +0 -0
  185. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/visualization/mpl_plots.md +0 -0
  186. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/visualization/plotly_plots.md +0 -0
  187. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/api/visualization/plotly_reports.md +0 -0
  188. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/assets/icon.png +0 -0
  189. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/file_formats.md +0 -0
  190. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/index.md +0 -0
  191. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/javascripts/mathjax.js +0 -0
  192. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/settings.md +0 -0
  193. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/stylesheets/extra.css +0 -0
  194. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/docs/user_guide.md +0 -0
  195. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy-docs/mkdocs.yml +0 -0
  196. {trajectopy-4.0.9 → trajectopy-4.2.0}/trajectopy.spec +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: trajectopy
3
- Version: 4.0.9
3
+ Version: 4.2.0
4
4
  Summary: Trajectory Evaluation in Python
5
5
  Project-URL: Homepage, https://gereon-t.github.io/trajectopy/
6
6
  Project-URL: Documentation, https://gereon-t.github.io/trajectopy/
@@ -29,11 +29,14 @@ Requires-Dist: numpy>=2.0.2
29
29
  Requires-Dist: pandas>=2.2.3
30
30
  Requires-Dist: plotly>=6.1.0
31
31
  Requires-Dist: pyproj>=3.6.1
32
+ Requires-Dist: pyside6>=6.11.0
33
+ Requires-Dist: pyvista>=0.47.2
34
+ Requires-Dist: pyvistaqt>=0.11.4
32
35
  Requires-Dist: rich>=14.0.0
33
36
  Requires-Dist: rosbags>=0.9.23
34
37
  Requires-Dist: scipy>=1.13.1
35
38
  Provides-Extra: gui
36
- Requires-Dist: pyqt6; extra == 'gui'
39
+ Requires-Dist: pyside6; extra == 'gui'
37
40
  Description-Content-Type: text/markdown
38
41
 
39
42
  <div align="center">