umap-project 3.3.2__py3-none-any.whl → 3.4.0__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 (242) hide show
  1. umap/__init__.py +1 -1
  2. umap/context_processors.py +4 -1
  3. umap/locale/cs_CZ/LC_MESSAGES/django.mo +0 -0
  4. umap/locale/cs_CZ/LC_MESSAGES/django.po +43 -33
  5. umap/locale/da/LC_MESSAGES/django.mo +0 -0
  6. umap/locale/da/LC_MESSAGES/django.po +43 -33
  7. umap/locale/de/LC_MESSAGES/django.mo +0 -0
  8. umap/locale/de/LC_MESSAGES/django.po +64 -53
  9. umap/locale/el/LC_MESSAGES/django.mo +0 -0
  10. umap/locale/el/LC_MESSAGES/django.po +35 -29
  11. umap/locale/en/LC_MESSAGES/django.po +47 -41
  12. umap/locale/es/LC_MESSAGES/django.mo +0 -0
  13. umap/locale/es/LC_MESSAGES/django.po +43 -33
  14. umap/locale/et/LC_MESSAGES/django.mo +0 -0
  15. umap/locale/et/LC_MESSAGES/django.po +58 -54
  16. umap/locale/eu/LC_MESSAGES/django.mo +0 -0
  17. umap/locale/eu/LC_MESSAGES/django.po +43 -33
  18. umap/locale/fa_IR/LC_MESSAGES/django.mo +0 -0
  19. umap/locale/fa_IR/LC_MESSAGES/django.po +43 -33
  20. umap/locale/fr/LC_MESSAGES/django.mo +0 -0
  21. umap/locale/fr/LC_MESSAGES/django.po +36 -30
  22. umap/locale/gl/LC_MESSAGES/django.mo +0 -0
  23. umap/locale/gl/LC_MESSAGES/django.po +43 -33
  24. umap/locale/hu/LC_MESSAGES/django.mo +0 -0
  25. umap/locale/hu/LC_MESSAGES/django.po +35 -29
  26. umap/locale/is/LC_MESSAGES/django.mo +0 -0
  27. umap/locale/is/LC_MESSAGES/django.po +43 -33
  28. umap/locale/it/LC_MESSAGES/django.mo +0 -0
  29. umap/locale/it/LC_MESSAGES/django.po +43 -33
  30. umap/locale/nl/LC_MESSAGES/django.mo +0 -0
  31. umap/locale/nl/LC_MESSAGES/django.po +35 -29
  32. umap/locale/pl/LC_MESSAGES/django.mo +0 -0
  33. umap/locale/pl/LC_MESSAGES/django.po +114 -103
  34. umap/locale/pt/LC_MESSAGES/django.mo +0 -0
  35. umap/locale/pt/LC_MESSAGES/django.po +43 -33
  36. umap/locale/th_TH/LC_MESSAGES/django.mo +0 -0
  37. umap/locale/th_TH/LC_MESSAGES/django.po +310 -109
  38. umap/locale/zh_TW/LC_MESSAGES/django.mo +0 -0
  39. umap/locale/zh_TW/LC_MESSAGES/django.po +80 -70
  40. umap/management/commands/switch_user.py +2 -2
  41. umap/migrations/0018_datalayer_uuid.py +1 -1
  42. umap/models.py +7 -3
  43. umap/settings/local.py.sample +1 -1
  44. umap/static/umap/base.css +89 -32
  45. umap/static/umap/content.css +129 -33
  46. umap/static/umap/css/bar.css +82 -20
  47. umap/static/umap/css/browser.css +163 -0
  48. umap/static/umap/css/contextmenu.css +15 -0
  49. umap/static/umap/css/dialog.css +36 -16
  50. umap/static/umap/css/form.css +123 -33
  51. umap/static/umap/css/icon.css +46 -3
  52. umap/static/umap/css/panel.css +7 -3
  53. umap/static/umap/css/popup.css +34 -8
  54. umap/static/umap/css/tooltip.css +8 -4
  55. umap/static/umap/img/16-white.svg +26 -8
  56. umap/static/umap/img/16.svg +1 -1
  57. umap/static/umap/img/source/16-white.svg +36 -18
  58. umap/static/umap/img/source/16.svg +1 -1
  59. umap/static/umap/js/components/alerts/alert.css +69 -31
  60. umap/static/umap/js/components/alerts/alert.js +20 -2
  61. umap/static/umap/js/components/base.js +1 -1
  62. umap/static/umap/js/modules/browser.js +69 -61
  63. umap/static/umap/js/modules/caption.js +10 -7
  64. umap/static/umap/js/modules/data/features.js +89 -63
  65. umap/static/umap/js/modules/data/fields.js +446 -0
  66. umap/static/umap/js/modules/data/layer.js +116 -196
  67. umap/static/umap/js/modules/domutils.js +109 -0
  68. umap/static/umap/js/modules/filters.js +780 -0
  69. umap/static/umap/js/modules/form/builder.js +8 -5
  70. umap/static/umap/js/modules/form/fields.js +111 -221
  71. umap/static/umap/js/modules/formatter.js +24 -1
  72. umap/static/umap/js/modules/help.js +4 -3
  73. umap/static/umap/js/modules/i18n.js +1 -1
  74. umap/static/umap/js/modules/importer.js +1 -1
  75. umap/static/umap/js/modules/importers/opendata.js +15 -0
  76. umap/static/umap/js/modules/importers/openrouteservice.js +6 -1
  77. umap/static/umap/js/modules/managers.js +2 -1
  78. umap/static/umap/js/modules/permissions.js +39 -31
  79. umap/static/umap/js/modules/rendering/controls.js +11 -9
  80. umap/static/umap/js/modules/rendering/icon.js +3 -8
  81. umap/static/umap/js/modules/rendering/layers/base.js +3 -3
  82. umap/static/umap/js/modules/rendering/layers/classified.js +18 -11
  83. umap/static/umap/js/modules/rendering/layers/cluster.js +23 -11
  84. umap/static/umap/js/modules/rendering/layers/heat.js +27 -21
  85. umap/static/umap/js/modules/rendering/map.js +1 -0
  86. umap/static/umap/js/modules/rendering/template.js +50 -23
  87. umap/static/umap/js/modules/rendering/ui.js +33 -25
  88. umap/static/umap/js/modules/rules.js +38 -44
  89. umap/static/umap/js/modules/schema.js +3 -6
  90. umap/static/umap/js/modules/share.js +5 -4
  91. umap/static/umap/js/modules/tableeditor.js +50 -38
  92. umap/static/umap/js/modules/templates.js +2 -3
  93. umap/static/umap/js/modules/ui/bar.js +55 -23
  94. umap/static/umap/js/modules/ui/dialog.js +38 -27
  95. umap/static/umap/js/modules/ui/panel.js +23 -8
  96. umap/static/umap/js/modules/ui/tooltip.js +6 -5
  97. umap/static/umap/js/modules/umap.js +158 -51
  98. umap/static/umap/js/modules/utils.js +24 -2
  99. umap/static/umap/js/umap.core.js +1 -110
  100. umap/static/umap/locale/am_ET.js +52 -17
  101. umap/static/umap/locale/am_ET.json +52 -17
  102. umap/static/umap/locale/ar.js +52 -17
  103. umap/static/umap/locale/ar.json +52 -17
  104. umap/static/umap/locale/ast.js +52 -17
  105. umap/static/umap/locale/ast.json +52 -17
  106. umap/static/umap/locale/bg.js +52 -17
  107. umap/static/umap/locale/bg.json +52 -17
  108. umap/static/umap/locale/br.js +48 -22
  109. umap/static/umap/locale/br.json +48 -22
  110. umap/static/umap/locale/ca.js +52 -17
  111. umap/static/umap/locale/ca.json +52 -17
  112. umap/static/umap/locale/cs_CZ.js +52 -17
  113. umap/static/umap/locale/cs_CZ.json +52 -17
  114. umap/static/umap/locale/da.js +54 -17
  115. umap/static/umap/locale/da.json +54 -17
  116. umap/static/umap/locale/de.js +102 -67
  117. umap/static/umap/locale/de.json +102 -67
  118. umap/static/umap/locale/el.js +52 -17
  119. umap/static/umap/locale/el.json +52 -17
  120. umap/static/umap/locale/en.js +54 -16
  121. umap/static/umap/locale/en.json +54 -16
  122. umap/static/umap/locale/en_US.json +52 -17
  123. umap/static/umap/locale/es.js +54 -17
  124. umap/static/umap/locale/es.json +54 -17
  125. umap/static/umap/locale/et.js +91 -56
  126. umap/static/umap/locale/et.json +91 -56
  127. umap/static/umap/locale/eu.js +84 -49
  128. umap/static/umap/locale/eu.json +84 -49
  129. umap/static/umap/locale/fa_IR.js +52 -17
  130. umap/static/umap/locale/fa_IR.json +52 -17
  131. umap/static/umap/locale/fi.js +52 -17
  132. umap/static/umap/locale/fi.json +52 -17
  133. umap/static/umap/locale/fr.js +54 -17
  134. umap/static/umap/locale/fr.json +54 -17
  135. umap/static/umap/locale/gl.js +52 -17
  136. umap/static/umap/locale/gl.json +52 -17
  137. umap/static/umap/locale/he.js +52 -17
  138. umap/static/umap/locale/he.json +52 -17
  139. umap/static/umap/locale/hr.js +52 -17
  140. umap/static/umap/locale/hr.json +52 -17
  141. umap/static/umap/locale/hu.js +59 -24
  142. umap/static/umap/locale/hu.json +59 -24
  143. umap/static/umap/locale/id.js +52 -17
  144. umap/static/umap/locale/id.json +52 -17
  145. umap/static/umap/locale/is.js +52 -17
  146. umap/static/umap/locale/is.json +52 -17
  147. umap/static/umap/locale/it.js +52 -17
  148. umap/static/umap/locale/it.json +52 -17
  149. umap/static/umap/locale/ja.js +52 -17
  150. umap/static/umap/locale/ja.json +52 -17
  151. umap/static/umap/locale/ko.js +52 -17
  152. umap/static/umap/locale/ko.json +52 -17
  153. umap/static/umap/locale/lt.js +52 -17
  154. umap/static/umap/locale/lt.json +52 -17
  155. umap/static/umap/locale/ms.js +52 -17
  156. umap/static/umap/locale/ms.json +52 -17
  157. umap/static/umap/locale/nl.js +52 -17
  158. umap/static/umap/locale/nl.json +52 -17
  159. umap/static/umap/locale/no.js +52 -17
  160. umap/static/umap/locale/no.json +52 -17
  161. umap/static/umap/locale/pl.js +53 -17
  162. umap/static/umap/locale/pl.json +53 -17
  163. umap/static/umap/locale/pl_PL.json +52 -17
  164. umap/static/umap/locale/pt.js +52 -17
  165. umap/static/umap/locale/pt.json +52 -17
  166. umap/static/umap/locale/pt_BR.js +52 -17
  167. umap/static/umap/locale/pt_BR.json +52 -17
  168. umap/static/umap/locale/pt_PT.js +52 -17
  169. umap/static/umap/locale/pt_PT.json +52 -17
  170. umap/static/umap/locale/ro.js +52 -17
  171. umap/static/umap/locale/ro.json +52 -17
  172. umap/static/umap/locale/ru.js +52 -17
  173. umap/static/umap/locale/ru.json +52 -17
  174. umap/static/umap/locale/si.js +1 -1
  175. umap/static/umap/locale/si.json +1 -1
  176. umap/static/umap/locale/sk_SK.js +52 -17
  177. umap/static/umap/locale/sk_SK.json +52 -17
  178. umap/static/umap/locale/sl.js +52 -17
  179. umap/static/umap/locale/sl.json +52 -17
  180. umap/static/umap/locale/sr.js +52 -17
  181. umap/static/umap/locale/sr.json +52 -17
  182. umap/static/umap/locale/sv.js +52 -17
  183. umap/static/umap/locale/sv.json +52 -17
  184. umap/static/umap/locale/th_TH.js +52 -17
  185. umap/static/umap/locale/th_TH.json +52 -17
  186. umap/static/umap/locale/tr.js +52 -17
  187. umap/static/umap/locale/tr.json +52 -17
  188. umap/static/umap/locale/uk_UA.js +52 -17
  189. umap/static/umap/locale/uk_UA.json +52 -17
  190. umap/static/umap/locale/vi.js +52 -17
  191. umap/static/umap/locale/vi.json +52 -17
  192. umap/static/umap/locale/vi_VN.json +52 -17
  193. umap/static/umap/locale/zh.js +52 -17
  194. umap/static/umap/locale/zh.json +52 -17
  195. umap/static/umap/locale/zh_CN.json +52 -17
  196. umap/static/umap/locale/zh_TW.Big5.json +52 -17
  197. umap/static/umap/locale/zh_TW.js +53 -17
  198. umap/static/umap/locale/zh_TW.json +53 -17
  199. umap/static/umap/map.css +63 -226
  200. umap/static/umap/unittests/utils.js +18 -0
  201. umap/static/umap/vars.css +23 -5
  202. umap/templates/umap/components/alerts/alert.html +32 -29
  203. umap/templates/umap/css.html +2 -1
  204. umap/templates/umap/login_popup_end.html +18 -9
  205. umap/templates/umap/user_map_table.html +7 -2
  206. umap/tests/integration/conftest.py +10 -6
  207. umap/tests/integration/test_anonymous_owned_map.py +90 -37
  208. umap/tests/integration/test_basics.py +25 -1
  209. umap/tests/integration/test_browser.py +37 -0
  210. umap/tests/integration/test_cluster.py +110 -0
  211. umap/tests/integration/test_conditional_rules.py +107 -52
  212. umap/tests/integration/test_datalayer.py +9 -16
  213. umap/tests/integration/test_draw_polygon.py +6 -0
  214. umap/tests/integration/test_draw_polyline.py +11 -0
  215. umap/tests/integration/test_edit_marker.py +12 -1
  216. umap/tests/integration/test_export_map.py +19 -0
  217. umap/tests/integration/test_fields.py +541 -0
  218. umap/tests/integration/test_filters.py +616 -0
  219. umap/tests/integration/test_iframe.py +1 -1
  220. umap/tests/integration/test_import.py +38 -42
  221. umap/tests/integration/test_map_preview.py +1 -1
  222. umap/tests/integration/test_picto.py +1 -1
  223. umap/tests/integration/test_popup.py +31 -0
  224. umap/tests/integration/test_remote_data.py +60 -4
  225. umap/tests/integration/test_save.py +1 -1
  226. umap/tests/integration/test_share.py +4 -4
  227. umap/tests/integration/test_tableeditor.py +31 -7
  228. umap/tests/integration/test_websocket_sync.py +71 -20
  229. umap/tests/test_dashboard.py +11 -1
  230. umap/tests/test_statics.py +2 -2
  231. umap/tests/test_utils.py +19 -2
  232. umap/tests/test_views.py +1 -1
  233. umap/urls.py +1 -0
  234. umap/utils.py +8 -1
  235. umap/views.py +5 -0
  236. {umap_project-3.3.2.dist-info → umap_project-3.4.0.dist-info}/METADATA +15 -15
  237. {umap_project-3.3.2.dist-info → umap_project-3.4.0.dist-info}/RECORD +240 -236
  238. umap/static/umap/js/modules/facets.js +0 -164
  239. umap/tests/integration/test_facets_browser.py +0 -279
  240. {umap_project-3.3.2.dist-info → umap_project-3.4.0.dist-info}/WHEEL +0 -0
  241. {umap_project-3.3.2.dist-info → umap_project-3.4.0.dist-info}/entry_points.txt +0 -0
  242. {umap_project-3.3.2.dist-info → umap_project-3.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -10,7 +10,7 @@ msgid ""
10
10
  msgstr ""
11
11
  "Project-Id-Version: uMap\n"
12
12
  "Report-Msgid-Bugs-To: \n"
13
- "POT-Creation-Date: 2025-06-10 09:19+0000\n"
13
+ "POT-Creation-Date: 2025-10-14 15:28+0000\n"
14
14
  "PO-Revision-Date: 2013-11-22 14:00+0000\n"
15
15
  "Last-Translator: lecalam, 2024-2025\n"
16
16
  "Language-Team: Portuguese (http://app.transifex.com/openstreetmap/umap/language/pt/)\n"
@@ -327,7 +327,7 @@ msgstr "Ver mapas com estrela de %(current_user)s's"
327
327
  msgid "%(current_user)s has no starred maps yet."
328
328
  msgstr "%(current_user)s não tem mapas com estrela."
329
329
 
330
- #: templates/base.html:13
330
+ #: templates/base.html:16
331
331
  msgid ""
332
332
  "uMap lets you create maps with OpenStreetMap layers in a minute and embed "
333
333
  "them in your site."
@@ -411,48 +411,54 @@ msgid "Play with the demo"
411
411
  msgstr "Testar a demo"
412
412
 
413
413
  #: templates/umap/components/alerts/alert.html:17
414
- #: templates/umap/components/alerts/alert.html:66
415
- #: templates/umap/components/alerts/alert.html:94
414
+ #: templates/umap/components/alerts/alert.html:69
415
+ #: templates/umap/components/alerts/alert.html:97
416
416
  msgid "Close"
417
417
  msgstr "Fechar"
418
418
 
419
419
  #: templates/umap/components/alerts/alert.html:32
420
420
  #, python-format
421
421
  msgid ""
422
- "Pro-tip: to easily find back your maps, <a href=\"%(login_url)s\" "
423
- "target=\"_blank\">create an account</a> or <a href=\"%(login_url)s\" "
424
- "target=\"_blank\">log in</a>."
425
- msgstr "Sugestão: para voltar a encontrar facilmente os seus mapas, <a href=\"%(login_url)s\" target=\"_blank\">crie uma conta</a> ou <a href=\"%(login_url)s\" target=\"_blank\">inicie a sessão</a>."
422
+ "Oops, I didn't mean it, I want to <a href=\"%(login_url)s\" "
423
+ "class=\"login\">create an account</a> or <a href=\"%(login_url)s\" "
424
+ "class=\"login\">log in</a> (no worry, we'll attach the map to your account)."
425
+ msgstr ""
426
426
 
427
- #: templates/umap/components/alerts/alert.html:37
427
+ #: templates/umap/components/alerts/alert.html:35
428
+ msgid ""
429
+ "Yes, I want to continue editing anonymously, I will save the secret edit "
430
+ "link to be able to edit this map later or on another device"
431
+ msgstr ""
432
+
433
+ #: templates/umap/components/alerts/alert.html:39
428
434
  msgid "Here is your secret link to edit the map, please keep it safe:"
429
435
  msgstr "Aqui está a sua hiperligação secreta para editar o mapa, por favor mantenha-a segura:"
430
436
 
431
- #: templates/umap/components/alerts/alert.html:41
437
+ #: templates/umap/components/alerts/alert.html:43
432
438
  msgid "Copy link"
433
439
  msgstr "Copiar hiperligação"
434
440
 
435
- #: templates/umap/components/alerts/alert.html:48
441
+ #: templates/umap/components/alerts/alert.html:50
436
442
  msgid "Enter your email address to receive the secret link:"
437
443
  msgstr "Introduza o seu endereço de e-mail para receber a hiperligação secreta:"
438
444
 
439
- #: templates/umap/components/alerts/alert.html:54
445
+ #: templates/umap/components/alerts/alert.html:56
440
446
  msgid "Email"
441
447
  msgstr "E-mail"
442
448
 
443
- #: templates/umap/components/alerts/alert.html:57
449
+ #: templates/umap/components/alerts/alert.html:59
444
450
  msgid "Send me the link"
445
451
  msgstr "Envie-me a hiperligação"
446
452
 
447
- #: templates/umap/components/alerts/alert.html:81
453
+ #: templates/umap/components/alerts/alert.html:84
448
454
  msgid "See their edits in another tab"
449
455
  msgstr "Ver as edições deles noutro separador"
450
456
 
451
- #: templates/umap/components/alerts/alert.html:84
457
+ #: templates/umap/components/alerts/alert.html:87
452
458
  msgid "Keep your changes and loose theirs"
453
459
  msgstr "Manter as minhas mudanças e perder as deles"
454
460
 
455
- #: templates/umap/components/alerts/alert.html:87
461
+ #: templates/umap/components/alerts/alert.html:90
456
462
  msgid "Keep their changes and loose yours"
457
463
  msgstr "Manter as mudanças deles e perder as minhas"
458
464
 
@@ -533,7 +539,7 @@ msgstr "Sucesso na identificação. Continuando..."
533
539
  msgid "template"
534
540
  msgstr ""
535
541
 
536
- #: templates/umap/map_list.html:18 views.py:458
542
+ #: templates/umap/map_list.html:18 views.py:459
537
543
  msgid "by"
538
544
  msgstr "por"
539
545
 
@@ -721,7 +727,7 @@ msgstr "Últimos mapas criados"
721
727
  msgid "Search maps"
722
728
  msgstr "Procurar mapas"
723
729
 
724
- #: templates/umap/search_bar.html:14
730
+ #: templates/umap/search_bar.html:14 templates/umap/user_map_table.html:15
725
731
  msgid "Any category"
726
732
  msgstr ""
727
733
 
@@ -814,70 +820,74 @@ msgstr ""
814
820
  msgid "No template found."
815
821
  msgstr ""
816
822
 
817
- #: views.py:233
823
+ #: views.py:235
818
824
  msgid "Cannot delete a team with more than one member"
819
825
  msgstr "Não é possível eliminar uma equipa com mais de um membro"
820
826
 
821
- #: views.py:237
827
+ #: views.py:239
822
828
  #, python-format
823
829
  msgid "Team “%(name)s” has been deleted"
824
830
  msgstr "A equipa “%(name)s” foi eliminada"
825
831
 
826
- #: views.py:463
832
+ #: views.py:464
827
833
  msgid "View the map"
828
834
  msgstr "Ver o mapa"
829
835
 
830
- #: views.py:864
836
+ #: views.py:872
831
837
  msgid "See full screen"
832
838
  msgstr "Ver em ecrã inteiro"
833
839
 
834
- #: views.py:1007
840
+ #: views.py:1015
835
841
  msgid "Map editors updated with success!"
836
842
  msgstr "Os editores do mapa foram atualizados com sucesso!"
837
843
 
838
- #: views.py:1043
844
+ #: views.py:1051
839
845
  #, python-format
840
846
  msgid "The uMap edit link for your map: %(map_name)s"
841
847
  msgstr "A hiperligação de edição do uMap para o seu mapa: %(map_name)s"
842
848
 
843
- #: views.py:1046
849
+ #: views.py:1054
844
850
  #, python-format
845
851
  msgid "Here is your secret edit link: %(link)s"
846
852
  msgstr "Aqui está a hiperligação de edição secreta: %(link)s"
847
853
 
848
- #: views.py:1053
854
+ #: views.py:1061
849
855
  #, python-format
850
856
  msgid "Can't send email to %(email)s"
851
857
  msgstr "Não é possível enviar o email para %(email)s"
852
858
 
853
- #: views.py:1056
859
+ #: views.py:1064
854
860
  #, python-format
855
861
  msgid "Email sent to %(email)s"
856
862
  msgstr "Email enviado para %(email)s"
857
863
 
858
- #: views.py:1067
864
+ #: views.py:1075
859
865
  msgid "Only its owner can delete the map."
860
866
  msgstr "Só o proprietário pode eliminar o mapa."
861
867
 
862
- #: views.py:1073
868
+ #: views.py:1081
863
869
  msgid "Map successfully deleted."
864
870
  msgstr "Mapa eliminado com sucesso."
865
871
 
866
- #: views.py:1099
872
+ #: views.py:1107
867
873
  #, python-format
868
874
  msgid ""
869
875
  "Your map has been cloned! If you want to edit this map from another "
870
876
  "computer, please use this link: %(anonymous_url)s"
871
877
  msgstr "O seu mapa foi clonado! Se quiser editar este mapa noutro computador, por favor utilize esta hiperligação: %(anonymous_url)s"
872
878
 
873
- #: views.py:1104
879
+ #: views.py:1112
874
880
  msgid "Congratulations, your map has been cloned!"
875
881
  msgstr "Parabéns, o seu mapa foi clonado!"
876
882
 
877
- #: views.py:1358
883
+ #: views.py:1366
878
884
  msgid "Layer successfully deleted."
879
885
  msgstr "Camada eliminada com sucesso."
880
886
 
881
- #: views.py:1380
887
+ #: views.py:1388
882
888
  msgid "Permissions updated with success!"
883
889
  msgstr "Permissões atualizadas com sucesso!"
890
+
891
+ #: views.py:1405
892
+ msgid "Generic"
893
+ msgstr ""
Binary file