dulus 0.2.19__tar.gz → 0.2.20__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 (164) hide show
  1. {dulus-0.2.19/dulus.egg-info → dulus-0.2.20}/PKG-INFO +2 -2
  2. {dulus-0.2.19 → dulus-0.2.20}/README.md +1 -1
  3. {dulus-0.2.19 → dulus-0.2.20}/docs/news.md +2 -0
  4. {dulus-0.2.19 → dulus-0.2.20/dulus.egg-info}/PKG-INFO +2 -2
  5. {dulus-0.2.19 → dulus-0.2.20}/dulus.py +10 -2
  6. {dulus-0.2.19 → dulus-0.2.20}/pyproject.toml +1 -1
  7. {dulus-0.2.19 → dulus-0.2.20}/LICENSE +0 -0
  8. {dulus-0.2.19 → dulus-0.2.20}/MANIFEST.in +0 -0
  9. {dulus-0.2.19 → dulus-0.2.20}/agent.py +0 -0
  10. {dulus-0.2.19 → dulus-0.2.20}/backend/__init__.py +0 -0
  11. {dulus-0.2.19 → dulus-0.2.20}/backend/compressor.py +0 -0
  12. {dulus-0.2.19 → dulus-0.2.20}/backend/context.py +0 -0
  13. {dulus-0.2.19 → dulus-0.2.20}/backend/githook.py +0 -0
  14. {dulus-0.2.19 → dulus-0.2.20}/backend/marketplace.py +0 -0
  15. {dulus-0.2.19 → dulus-0.2.20}/backend/mempalace_bridge.py +0 -0
  16. {dulus-0.2.19 → dulus-0.2.20}/backend/personas.py +0 -0
  17. {dulus-0.2.19 → dulus-0.2.20}/backend/plugins.py +0 -0
  18. {dulus-0.2.19 → dulus-0.2.20}/backend/server.py +0 -0
  19. {dulus-0.2.19 → dulus-0.2.20}/backend/tasks.py +0 -0
  20. {dulus-0.2.19 → dulus-0.2.20}/batch_api.py +0 -0
  21. {dulus-0.2.19 → dulus-0.2.20}/checkpoint/__init__.py +0 -0
  22. {dulus-0.2.19 → dulus-0.2.20}/checkpoint/hooks.py +0 -0
  23. {dulus-0.2.19 → dulus-0.2.20}/checkpoint/store.py +0 -0
  24. {dulus-0.2.19 → dulus-0.2.20}/checkpoint/types.py +0 -0
  25. {dulus-0.2.19 → dulus-0.2.20}/claude_code_watcher.py +0 -0
  26. {dulus-0.2.19 → dulus-0.2.20}/clipboard_utils.py +0 -0
  27. {dulus-0.2.19 → dulus-0.2.20}/cloudsave.py +0 -0
  28. {dulus-0.2.19 → dulus-0.2.20}/common.py +0 -0
  29. {dulus-0.2.19 → dulus-0.2.20}/compaction.py +0 -0
  30. {dulus-0.2.19 → dulus-0.2.20}/config.py +0 -0
  31. {dulus-0.2.19 → dulus-0.2.20}/context.py +0 -0
  32. {dulus-0.2.19 → dulus-0.2.20}/data/__init__.py +0 -0
  33. {dulus-0.2.19 → dulus-0.2.20}/data/active_persona.json +0 -0
  34. {dulus-0.2.19 → dulus-0.2.20}/data/context.json +0 -0
  35. {dulus-0.2.19 → dulus-0.2.20}/data/marketplace.json +0 -0
  36. {dulus-0.2.19 → dulus-0.2.20}/data/personas.json +0 -0
  37. {dulus-0.2.19 → dulus-0.2.20}/data/plugins/__init__.py +0 -0
  38. {dulus-0.2.19 → dulus-0.2.20}/data/plugins/composio/__init__.py +0 -0
  39. {dulus-0.2.19 → dulus-0.2.20}/data/plugins/composio/composio_plugin/__init__.py +0 -0
  40. {dulus-0.2.19 → dulus-0.2.20}/data/plugins/composio/composio_plugin/session_manager.py +0 -0
  41. {dulus-0.2.19 → dulus-0.2.20}/data/plugins/composio/composio_plugin/tool_generator.py +0 -0
  42. {dulus-0.2.19 → dulus-0.2.20}/data/plugins/composio/plugin.json +0 -0
  43. {dulus-0.2.19 → dulus-0.2.20}/data/plugins/composio/plugin_tool.py +0 -0
  44. {dulus-0.2.19 → dulus-0.2.20}/data/tasks.json +0 -0
  45. {dulus-0.2.19 → dulus-0.2.20}/docs/README.md +0 -0
  46. {dulus-0.2.19 → dulus-0.2.20}/docs/__init__.py +0 -0
  47. {dulus-0.2.19 → dulus-0.2.20}/docs/api.html +0 -0
  48. {dulus-0.2.19 → dulus-0.2.20}/docs/architecture.md +0 -0
  49. {dulus-0.2.19 → dulus-0.2.20}/docs/azure-speech-template.json +0 -0
  50. {dulus-0.2.19 → dulus-0.2.20}/docs/dashboard/index.html +0 -0
  51. {dulus-0.2.19 → dulus-0.2.20}/docs/divider.svg +0 -0
  52. {dulus-0.2.19 → dulus-0.2.20}/docs/generate.py +0 -0
  53. {dulus-0.2.19 → dulus-0.2.20}/docs/hero.svg +0 -0
  54. {dulus-0.2.19 → dulus-0.2.20}/docs/index.html +0 -0
  55. {dulus-0.2.19 → dulus-0.2.20}/docs/nvidia-models.svg +0 -0
  56. {dulus-0.2.19 → dulus-0.2.20}/docs/particle-playground.html +0 -0
  57. {dulus-0.2.19 → dulus-0.2.20}/docs/personas/index.html +0 -0
  58. {dulus-0.2.19 → dulus-0.2.20}/docs/poetry-banner.png +0 -0
  59. {dulus-0.2.19 → dulus-0.2.20}/docs/preview.html +0 -0
  60. {dulus-0.2.19 → dulus-0.2.20}/docs/sec-agents.svg +0 -0
  61. {dulus-0.2.19 → dulus-0.2.20}/docs/sec-brainstorm.svg +0 -0
  62. {dulus-0.2.19 → dulus-0.2.20}/docs/sec-bridges.svg +0 -0
  63. {dulus-0.2.19 → dulus-0.2.20}/docs/sec-features.svg +0 -0
  64. {dulus-0.2.19 → dulus-0.2.20}/docs/sec-freetier.svg +0 -0
  65. {dulus-0.2.19 → dulus-0.2.20}/docs/sec-memory.svg +0 -0
  66. {dulus-0.2.19 → dulus-0.2.20}/docs/sec-models.svg +0 -0
  67. {dulus-0.2.19 → dulus-0.2.20}/docs/sec-perms.svg +0 -0
  68. {dulus-0.2.19 → dulus-0.2.20}/docs/sec-plugins.svg +0 -0
  69. {dulus-0.2.19 → dulus-0.2.20}/docs/sec-quickstart.svg +0 -0
  70. {dulus-0.2.19 → dulus-0.2.20}/docs/sec-ssj.svg +0 -0
  71. {dulus-0.2.19 → dulus-0.2.20}/docs/spinners.svg +0 -0
  72. {dulus-0.2.19 → dulus-0.2.20}/docs/split-pane.svg +0 -0
  73. {dulus-0.2.19 → dulus-0.2.20}/docs/terminal-boot.svg +0 -0
  74. {dulus-0.2.19 → dulus-0.2.20}/docs/uploads/particle-playground.html +0 -0
  75. {dulus-0.2.19 → dulus-0.2.20}/dulus.egg-info/SOURCES.txt +0 -0
  76. {dulus-0.2.19 → dulus-0.2.20}/dulus.egg-info/dependency_links.txt +0 -0
  77. {dulus-0.2.19 → dulus-0.2.20}/dulus.egg-info/entry_points.txt +0 -0
  78. {dulus-0.2.19 → dulus-0.2.20}/dulus.egg-info/requires.txt +0 -0
  79. {dulus-0.2.19 → dulus-0.2.20}/dulus.egg-info/top_level.txt +0 -0
  80. {dulus-0.2.19 → dulus-0.2.20}/dulus_gui.py +0 -0
  81. {dulus-0.2.19 → dulus-0.2.20}/dulus_mcp/__init__.py +0 -0
  82. {dulus-0.2.19 → dulus-0.2.20}/dulus_mcp/client.py +0 -0
  83. {dulus-0.2.19 → dulus-0.2.20}/dulus_mcp/config.py +0 -0
  84. {dulus-0.2.19 → dulus-0.2.20}/dulus_mcp/tools.py +0 -0
  85. {dulus-0.2.19 → dulus-0.2.20}/dulus_mcp/types.py +0 -0
  86. {dulus-0.2.19 → dulus-0.2.20}/gui/__init__.py +0 -0
  87. {dulus-0.2.19 → dulus-0.2.20}/gui/agent_bridge.py +0 -0
  88. {dulus-0.2.19 → dulus-0.2.20}/gui/chat_widget.py +0 -0
  89. {dulus-0.2.19 → dulus-0.2.20}/gui/main_window.py +0 -0
  90. {dulus-0.2.19 → dulus-0.2.20}/gui/personas.py +0 -0
  91. {dulus-0.2.19 → dulus-0.2.20}/gui/session_utils.py +0 -0
  92. {dulus-0.2.19 → dulus-0.2.20}/gui/settings_dialog.py +0 -0
  93. {dulus-0.2.19 → dulus-0.2.20}/gui/sidebar.py +0 -0
  94. {dulus-0.2.19 → dulus-0.2.20}/gui/tasks_view.py +0 -0
  95. {dulus-0.2.19 → dulus-0.2.20}/gui/themes.py +0 -0
  96. {dulus-0.2.19 → dulus-0.2.20}/gui/tool_panel.py +0 -0
  97. {dulus-0.2.19 → dulus-0.2.20}/input.py +0 -0
  98. {dulus-0.2.19 → dulus-0.2.20}/license_manager.py +0 -0
  99. {dulus-0.2.19 → dulus-0.2.20}/memory/__init__.py +0 -0
  100. {dulus-0.2.19 → dulus-0.2.20}/memory/audit.py +0 -0
  101. {dulus-0.2.19 → dulus-0.2.20}/memory/consolidator.py +0 -0
  102. {dulus-0.2.19 → dulus-0.2.20}/memory/context.py +0 -0
  103. {dulus-0.2.19 → dulus-0.2.20}/memory/offload.py +0 -0
  104. {dulus-0.2.19 → dulus-0.2.20}/memory/palace.py +0 -0
  105. {dulus-0.2.19 → dulus-0.2.20}/memory/scan.py +0 -0
  106. {dulus-0.2.19 → dulus-0.2.20}/memory/sessions.py +0 -0
  107. {dulus-0.2.19 → dulus-0.2.20}/memory/store.py +0 -0
  108. {dulus-0.2.19 → dulus-0.2.20}/memory/tools.py +0 -0
  109. {dulus-0.2.19 → dulus-0.2.20}/memory/types.py +0 -0
  110. {dulus-0.2.19 → dulus-0.2.20}/memory/vector_search.py +0 -0
  111. {dulus-0.2.19 → dulus-0.2.20}/multi_agent/__init__.py +0 -0
  112. {dulus-0.2.19 → dulus-0.2.20}/multi_agent/subagent.py +0 -0
  113. {dulus-0.2.19 → dulus-0.2.20}/multi_agent/tools.py +0 -0
  114. {dulus-0.2.19 → dulus-0.2.20}/offload_helper.py +0 -0
  115. {dulus-0.2.19 → dulus-0.2.20}/plugin/__init__.py +0 -0
  116. {dulus-0.2.19 → dulus-0.2.20}/plugin/autoadapter.py +0 -0
  117. {dulus-0.2.19 → dulus-0.2.20}/plugin/loader.py +0 -0
  118. {dulus-0.2.19 → dulus-0.2.20}/plugin/recommend.py +0 -0
  119. {dulus-0.2.19 → dulus-0.2.20}/plugin/store.py +0 -0
  120. {dulus-0.2.19 → dulus-0.2.20}/plugin/types.py +0 -0
  121. {dulus-0.2.19 → dulus-0.2.20}/providers.py +0 -0
  122. {dulus-0.2.19 → dulus-0.2.20}/setup.cfg +0 -0
  123. {dulus-0.2.19 → dulus-0.2.20}/skill/__init__.py +0 -0
  124. {dulus-0.2.19 → dulus-0.2.20}/skill/builtin.py +0 -0
  125. {dulus-0.2.19 → dulus-0.2.20}/skill/clawhub.py +0 -0
  126. {dulus-0.2.19 → dulus-0.2.20}/skill/executor.py +0 -0
  127. {dulus-0.2.19 → dulus-0.2.20}/skill/loader.py +0 -0
  128. {dulus-0.2.19 → dulus-0.2.20}/skill/tools.py +0 -0
  129. {dulus-0.2.19 → dulus-0.2.20}/skills.py +0 -0
  130. {dulus-0.2.19 → dulus-0.2.20}/spinner.py +0 -0
  131. {dulus-0.2.19 → dulus-0.2.20}/string_utils.py +0 -0
  132. {dulus-0.2.19 → dulus-0.2.20}/subagent.py +0 -0
  133. {dulus-0.2.19 → dulus-0.2.20}/task/__init__.py +0 -0
  134. {dulus-0.2.19 → dulus-0.2.20}/task/store.py +0 -0
  135. {dulus-0.2.19 → dulus-0.2.20}/task/tools.py +0 -0
  136. {dulus-0.2.19 → dulus-0.2.20}/task/types.py +0 -0
  137. {dulus-0.2.19 → dulus-0.2.20}/tests/test_checkpoint.py +0 -0
  138. {dulus-0.2.19 → dulus-0.2.20}/tests/test_compaction.py +0 -0
  139. {dulus-0.2.19 → dulus-0.2.20}/tests/test_diff_view.py +0 -0
  140. {dulus-0.2.19 → dulus-0.2.20}/tests/test_injection_fix.py +0 -0
  141. {dulus-0.2.19 → dulus-0.2.20}/tests/test_license.py +0 -0
  142. {dulus-0.2.19 → dulus-0.2.20}/tests/test_mcp.py +0 -0
  143. {dulus-0.2.19 → dulus-0.2.20}/tests/test_memory.py +0 -0
  144. {dulus-0.2.19 → dulus-0.2.20}/tests/test_plugin.py +0 -0
  145. {dulus-0.2.19 → dulus-0.2.20}/tests/test_skills.py +0 -0
  146. {dulus-0.2.19 → dulus-0.2.20}/tests/test_subagent.py +0 -0
  147. {dulus-0.2.19 → dulus-0.2.20}/tests/test_task.py +0 -0
  148. {dulus-0.2.19 → dulus-0.2.20}/tests/test_telegram_buffer.py +0 -0
  149. {dulus-0.2.19 → dulus-0.2.20}/tests/test_tool_registry.py +0 -0
  150. {dulus-0.2.19 → dulus-0.2.20}/tests/test_voice.py +0 -0
  151. {dulus-0.2.19 → dulus-0.2.20}/tmux_offloader.py +0 -0
  152. {dulus-0.2.19 → dulus-0.2.20}/tmux_tools.py +0 -0
  153. {dulus-0.2.19 → dulus-0.2.20}/tool_registry.py +0 -0
  154. {dulus-0.2.19 → dulus-0.2.20}/tools.py +0 -0
  155. {dulus-0.2.19 → dulus-0.2.20}/ui/__init__.py +0 -0
  156. {dulus-0.2.19 → dulus-0.2.20}/ui/input.py +0 -0
  157. {dulus-0.2.19 → dulus-0.2.20}/ui/render.py +0 -0
  158. {dulus-0.2.19 → dulus-0.2.20}/voice/__init__.py +0 -0
  159. {dulus-0.2.19 → dulus-0.2.20}/voice/keyterms.py +0 -0
  160. {dulus-0.2.19 → dulus-0.2.20}/voice/recorder.py +0 -0
  161. {dulus-0.2.19 → dulus-0.2.20}/voice/stt.py +0 -0
  162. {dulus-0.2.19 → dulus-0.2.20}/voice/tts.py +0 -0
  163. {dulus-0.2.19 → dulus-0.2.20}/webchat.py +0 -0
  164. {dulus-0.2.19 → dulus-0.2.20}/webchat_server.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.19
3
+ Version: 0.2.20
4
4
  Summary: Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace
5
5
  Author: KevRojo
6
6
  License: GPL-3.0
@@ -69,7 +69,7 @@ SET /sticky_input ON since the first run for the best experience!
69
69
  <a href="https://pypi.org/project/dulus/"><img src="https://static.pepy.tech/badge/dulus?style=flat-square" alt="downloads"/></a>
70
70
  <img src="https://img.shields.io/badge/python-3.11+-ff6b1f?style=flat-square&labelColor=07070a" alt="python"/>
71
71
  <img src="https://img.shields.io/badge/license-GPLv3-ff6b1f?style=flat-square&labelColor=07070a" alt="license"/>
72
- <img src="https://img.shields.io/badge/version-v0.2.19-ff6b1f?style=flat-square&labelColor=07070a" alt="version"/>
72
+ <img src="https://img.shields.io/badge/version-v0.2.20-ff6b1f?style=flat-square&labelColor=07070a" alt="version"/>
73
73
  <img src="https://img.shields.io/badge/providers-11-ff6b1f?style=flat-square&labelColor=07070a" alt="providers"/>
74
74
  <img src="https://img.shields.io/badge/tools-27-ff6b1f?style=flat-square&labelColor=07070a" alt="tools"/>
75
75
  <img src="https://img.shields.io/badge/tests-263+-ff6b1f?style=flat-square&labelColor=07070a" alt="tests"/>
@@ -22,7 +22,7 @@ SET /sticky_input ON since the first run for the best experience!
22
22
  <a href="https://pypi.org/project/dulus/"><img src="https://static.pepy.tech/badge/dulus?style=flat-square" alt="downloads"/></a>
23
23
  <img src="https://img.shields.io/badge/python-3.11+-ff6b1f?style=flat-square&labelColor=07070a" alt="python"/>
24
24
  <img src="https://img.shields.io/badge/license-GPLv3-ff6b1f?style=flat-square&labelColor=07070a" alt="license"/>
25
- <img src="https://img.shields.io/badge/version-v0.2.19-ff6b1f?style=flat-square&labelColor=07070a" alt="version"/>
25
+ <img src="https://img.shields.io/badge/version-v0.2.20-ff6b1f?style=flat-square&labelColor=07070a" alt="version"/>
26
26
  <img src="https://img.shields.io/badge/providers-11-ff6b1f?style=flat-square&labelColor=07070a" alt="providers"/>
27
27
  <img src="https://img.shields.io/badge/tools-27-ff6b1f?style=flat-square&labelColor=07070a" alt="tools"/>
28
28
  <img src="https://img.shields.io/badge/tests-263+-ff6b1f?style=flat-square&labelColor=07070a" alt="tests"/>
@@ -3,6 +3,8 @@
3
3
  ## 🔥🔥🔥 News (Pacific Time)
4
4
 
5
5
 
6
+ - May 09, 2026 (**v0.2.20**): **IPC port-collision fix on Windows** — `SO_REUSEADDR` on Windows lets two sockets share the same port, which would let a second Dulus instance silently "steal" the IPC listener. Switched to `SO_EXCLUSIVEADDRUSE` so the second instance correctly backs off and acts as a client. Verified end-to-end with the new test harness.
7
+
6
8
  - May 09, 2026 (**v0.2.19**): **Shared sessions via tiny TCP socket — daemon workaround supremo**
7
9
  - **One Dulus, many shells.** When a Dulus REPL or `--daemon` is running, it now listens on `127.0.0.1:5151`. Any subsequent `dulus "do X"` from another shell forwards the prompt to that live session over the socket and prints back the reply — same history, same memory, same plugins, same tool state. No session manager, no IPC framework, no systemd unit. 80 lines of plain TCP.
8
10
  - **Falls back gracefully.** If no listener is up, the CLI behaves exactly as before (spawns its own `--print` process). Daemon/gui/`--cmd`/`--run-tool` modes intentionally bypass the IPC dispatch — they need their own process.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.19
3
+ Version: 0.2.20
4
4
  Summary: Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace
5
5
  Author: KevRojo
6
6
  License: GPL-3.0
@@ -69,7 +69,7 @@ SET /sticky_input ON since the first run for the best experience!
69
69
  <a href="https://pypi.org/project/dulus/"><img src="https://static.pepy.tech/badge/dulus?style=flat-square" alt="downloads"/></a>
70
70
  <img src="https://img.shields.io/badge/python-3.11+-ff6b1f?style=flat-square&labelColor=07070a" alt="python"/>
71
71
  <img src="https://img.shields.io/badge/license-GPLv3-ff6b1f?style=flat-square&labelColor=07070a" alt="license"/>
72
- <img src="https://img.shields.io/badge/version-v0.2.19-ff6b1f?style=flat-square&labelColor=07070a" alt="version"/>
72
+ <img src="https://img.shields.io/badge/version-v0.2.20-ff6b1f?style=flat-square&labelColor=07070a" alt="version"/>
73
73
  <img src="https://img.shields.io/badge/providers-11-ff6b1f?style=flat-square&labelColor=07070a" alt="providers"/>
74
74
  <img src="https://img.shields.io/badge/tools-27-ff6b1f?style=flat-square&labelColor=07070a" alt="tools"/>
75
75
  <img src="https://img.shields.io/badge/tests-263+-ff6b1f?style=flat-square&labelColor=07070a" alt="tests"/>
@@ -218,7 +218,7 @@ try:
218
218
  from importlib.metadata import version as _pkg_version
219
219
  VERSION = _pkg_version("dulus")
220
220
  except Exception:
221
- VERSION = "0.2.19" # dev fallback — keep in sync with pyproject.toml
221
+ VERSION = "0.2.20" # dev fallback — keep in sync with pyproject.toml
222
222
 
223
223
  # ── ANSI helpers (used even with rich for non-markdown output) ─────────────
224
224
  from common import C, clr, info, ok, warn, err, stream_thinking, print_tool_start, print_tool_end, sanitize_text
@@ -3739,7 +3739,15 @@ def _ipc_server_loop(config, state):
3739
3739
  import json as _json
3740
3740
 
3741
3741
  sock = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
3742
- sock.setsockopt(_socket.SOL_SOCKET, _socket.SO_REUSEADDR, 1)
3742
+ # On Windows, SO_REUSEADDR lets two sockets share a port — wrong here; we
3743
+ # want a hard "port is taken, back off." SO_EXCLUSIVEADDRUSE gives us that.
3744
+ # On Linux, SO_REUSEADDR only matters for TIME_WAIT recovery, so skipping
3745
+ # it is fine — restart cooldown is a few seconds at worst.
3746
+ if hasattr(_socket, "SO_EXCLUSIVEADDRUSE"):
3747
+ try:
3748
+ sock.setsockopt(_socket.SOL_SOCKET, _socket.SO_EXCLUSIVEADDRUSE, 1)
3749
+ except OSError:
3750
+ pass
3743
3751
  try:
3744
3752
  sock.bind((DULUS_IPC_HOST, DULUS_IPC_PORT))
3745
3753
  except OSError:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dulus"
7
- version = "0.2.19"
7
+ version = "0.2.20"
8
8
  description = "Spanish-first multi-provider AI CLI — 14 NVIDIA models free, Mesa Redonda, voice, TTS, RTK token reducer, MemPalace"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes