ata-coder 2.4.7__tar.gz → 2.4.8__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.
- {ata_coder-2.4.7/ata_coder.egg-info → ata_coder-2.4.8}/PKG-INFO +1 -1
- {ata_coder-2.4.7 → ata_coder-2.4.8}/agent.py +4 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/agent_tools.py +2 -1
- {ata_coder-2.4.7 → ata_coder-2.4.8/ata_coder.egg-info}/PKG-INFO +1 -1
- {ata_coder-2.4.7 → ata_coder-2.4.8}/change_tracker.py +1 -1
- {ata_coder-2.4.7 → ata_coder-2.4.8}/config.py +7 -3
- {ata_coder-2.4.7 → ata_coder-2.4.8}/main.py +3 -3
- {ata_coder-2.4.7 → ata_coder-2.4.8}/memory.py +3 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/privilege.py +10 -6
- {ata_coder-2.4.7 → ata_coder-2.4.8}/pyproject.toml +1 -1
- {ata_coder-2.4.7 → ata_coder-2.4.8}/safety_guard.py +1 -1
- {ata_coder-2.4.7 → ata_coder-2.4.8}/server.py +6 -2
- {ata_coder-2.4.7 → ata_coder-2.4.8}/server_session.py +1 -1
- {ata_coder-2.4.7 → ata_coder-2.4.8}/setup_wizard.py +1 -1
- {ata_coder-2.4.7 → ata_coder-2.4.8}/LICENSE +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/MANIFEST.in +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/README.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/__init__.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/agent_compact.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/agent_controller.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/agent_extension.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/agent_routing.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/agent_subsystems.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/agent_undo.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/anthropic_client.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/ata_coder.egg-info/SOURCES.txt +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/ata_coder.egg-info/dependency_links.txt +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/ata_coder.egg-info/entry_points.txt +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/ata_coder.egg-info/requires.txt +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/ata_coder.egg-info/top_level.txt +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/clawd_integration.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/commands/__init__.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/commands/_core.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/commands/_safety.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/commands/_settings.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/commands/_workflow.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/context_manager.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/core/__init__.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/core/events.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/core/queue.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/core/state.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/event_queue.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/extension.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/extensions/__init__.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/extensions/hello_skill.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/fool_proof.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/git_workflow.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/gui.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/llm_client.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/mcp_client.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/model_registry.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/model_router.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/permissions.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/project.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/prompt_template.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/prompts/auto-mode.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/prompts/coding-rules.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/prompts/execution-guardrails.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/prompts/memory-system.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/prompts/output-style.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/prompts/safety.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/prompts/slash-commands.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/prompts/sub-agents.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/prompts/system-reminders.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/prompts/system.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/prompts/tool-policy.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/py.typed +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/repl_theme.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/repl_tracker.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/repl_ui.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/self_correct.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/server_shell.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/session.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/settings.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/setup.cfg +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skill_extension.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/architect/SKILL.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/code-reviewer/SKILL.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/codecraft/SKILL.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/debugger/SKILL.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/doc-writer/SKILL.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/general-coder/SKILL.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/math-calculator/README.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/math-calculator/SKILL.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/math-calculator/handler.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/math-calculator/prompts/system.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/math-calculator/requirements.txt +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/math-calculator/resources/constants.json +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/math-calculator/tests/test_handler.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/security-auditor/SKILL.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/test-writer/SKILL.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/weather-skill/README.md +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/weather-skill/handler.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/weather-skill/manifest.json +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/weather-skill/prompts/system_prompt.txt +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/weather-skill/prompts/user_prompt_template.txt +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/weather-skill/requirements.txt +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/weather-skill/resources/city_list.json +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/weather-skill/resources/error_messages.json +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/weather-skill/tests/test_handler.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills/weather-skill/weather_utils.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/skills.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/sub_agent.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/sub_agent_manager.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/system_prompt_builder.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/task_planner.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/terminal.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_agent.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_change_tracker.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_config.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_event_queue.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_extension.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_fibonacci.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_fool_proof.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_llm_client.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_memory.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_model_registry.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_permissions.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_privilege.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_prompt_template.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_safety_guard.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_server.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_skill_handlers.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_sub_agent.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tests/test_tools.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/token_counter.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tools/__init__.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tools/definitions.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tools/executor.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tools/result.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tools/strategy.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tools/subagent.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/tools/web.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/types.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/utils.py +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/web/css/style.css +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/web/index.html +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/web/js/app.js +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/web/package-lock.json +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/web/package.json +0 -0
- {ata_coder-2.4.7 → ata_coder-2.4.8}/web/tsconfig.json +0 -0
|
@@ -142,6 +142,10 @@ class CoderAgent(CompactionMixin, ToolExecutionMixin,
|
|
|
142
142
|
self.self_correct = SelfCorrectionEngine(max_retries=1)
|
|
143
143
|
self.git = GitWorkflow(self.tools.workspace)
|
|
144
144
|
|
|
145
|
+
# Per-instance self-correction depth (was a class variable shared across
|
|
146
|
+
# all agent instances — dangerous under ThreadingHTTPServer in server mode).
|
|
147
|
+
self._self_correct_depth: int = 0
|
|
148
|
+
|
|
145
149
|
self._state = AgentState()
|
|
146
150
|
self._on_event: Callable[[AgentEvent], None] | None = None
|
|
147
151
|
self._current_session_id: str = ""
|
|
@@ -17,7 +17,8 @@ class ToolExecutionMixin:
|
|
|
17
17
|
# ── Tool execution ────────────────────────────────────────────────────
|
|
18
18
|
|
|
19
19
|
# Guard depth for self-correction retry — prevents infinite recursion.
|
|
20
|
-
|
|
20
|
+
# These are set as INSTANCE variables in CoderAgent.__init__ to avoid
|
|
21
|
+
# cross-session contamination under ThreadingHTTPServer (server mode).
|
|
21
22
|
_MAX_SELF_CORRECT_DEPTH: int = 1
|
|
22
23
|
|
|
23
24
|
async def _execute_tool(self, tool_name: str, arguments: dict[str, Any]) -> ToolResult:
|
|
@@ -197,17 +197,21 @@ class AppConfig:
|
|
|
197
197
|
# Using a lazy pattern because AppConfig.load() references _from_settings()
|
|
198
198
|
# which is defined after the dataclass body in this module.
|
|
199
199
|
_config: AppConfig | None = None
|
|
200
|
+
_config_lock = threading.Lock()
|
|
200
201
|
|
|
201
202
|
|
|
202
203
|
def get_config() -> AppConfig:
|
|
203
204
|
"""Return the module-level config singleton (lazy init on first call).
|
|
204
205
|
|
|
205
|
-
After the first call the config is cached.
|
|
206
|
-
|
|
206
|
+
After the first call the config is cached. Double-checked locking
|
|
207
|
+
protects the lazy-init path when server.py runs under ThreadingHTTPServer
|
|
208
|
+
(where multiple threads may race on the first call).
|
|
207
209
|
"""
|
|
208
210
|
global _config
|
|
209
211
|
if _config is None:
|
|
210
|
-
|
|
212
|
+
with _config_lock:
|
|
213
|
+
if _config is None: # double-check
|
|
214
|
+
_config = AppConfig.load()
|
|
211
215
|
return _config
|
|
212
216
|
|
|
213
217
|
|
|
@@ -44,7 +44,7 @@ if sys.platform == 'win32':
|
|
|
44
44
|
_patched_init.__ata_patched__ = True
|
|
45
45
|
_sp.Popen.__init__ = _patched_init
|
|
46
46
|
|
|
47
|
-
__version__ = "2.4.
|
|
47
|
+
__version__ = "2.4.8"
|
|
48
48
|
|
|
49
49
|
import asyncio
|
|
50
50
|
import logging
|
|
@@ -90,12 +90,12 @@ def _signal_handler(sig, frame):
|
|
|
90
90
|
try:
|
|
91
91
|
get_clawd().shutdown()
|
|
92
92
|
except Exception:
|
|
93
|
-
|
|
93
|
+
logger.debug("Clawd shutdown failed during signal handler", exc_info=True)
|
|
94
94
|
for handler in _cleanup_handlers:
|
|
95
95
|
try:
|
|
96
96
|
handler()
|
|
97
97
|
except Exception:
|
|
98
|
-
|
|
98
|
+
logger.debug("Cleanup handler %s failed", handler, exc_info=True)
|
|
99
99
|
sys.exit(1)
|
|
100
100
|
|
|
101
101
|
|
|
@@ -97,6 +97,9 @@ class Memory:
|
|
|
97
97
|
@classmethod
|
|
98
98
|
def from_frontmatter(cls, raw: str) -> "Memory | None":
|
|
99
99
|
"""Parse a markdown file with YAML frontmatter into a Memory."""
|
|
100
|
+
# Non-greedy match for the frontmatter separator; uses a negative
|
|
101
|
+
# lookahead to ensure we match the FIRST closing --- (avoiding false
|
|
102
|
+
# matches on YAML separators inside code blocks in the body).
|
|
100
103
|
match = re.match(r"^---\s*\n(.*?)\n---\s*\n(.*)", raw, re.DOTALL)
|
|
101
104
|
if not match:
|
|
102
105
|
return None
|
|
@@ -167,15 +167,19 @@ def wrap_privileged_command(command: str) -> str:
|
|
|
167
167
|
)
|
|
168
168
|
|
|
169
169
|
elif os_family == OSFamily.WINDOWS:
|
|
170
|
-
# Encode command as
|
|
171
|
-
#
|
|
172
|
-
#
|
|
170
|
+
# Encode the entire command as a single base64 PowerShell script to
|
|
171
|
+
# avoid nested-quoting injection through cmd.exe. The script is
|
|
172
|
+
# executed directly by PowerShell without going through cmd.exe at all,
|
|
173
|
+
# which eliminates the shlex.quote / cmd.exe quoting mismatch.
|
|
174
|
+
# We embed the base64 script in a here-string so that special
|
|
175
|
+
# characters ($, `, ", etc.) in the original command are harmless.
|
|
173
176
|
encoded = base64.b64encode(command.encode("utf-16-le")).decode()
|
|
174
|
-
|
|
177
|
+
# Use PowerShell -EncodedCommand directly (no cmd.exe intermediary)
|
|
175
178
|
return (
|
|
176
179
|
'powershell -Command "'
|
|
177
|
-
'Start-Process -Verb RunAs -Wait -FilePath
|
|
178
|
-
f'-ArgumentList {
|
|
180
|
+
'Start-Process -Verb RunAs -Wait -FilePath powershell.exe '
|
|
181
|
+
f'-ArgumentList \\"-NoProfile -EncodedCommand {encoded}\\"'
|
|
182
|
+
'"'
|
|
179
183
|
)
|
|
180
184
|
|
|
181
185
|
return command
|
|
@@ -114,7 +114,7 @@ DESTRUCTIVE_PATTERNS = [
|
|
|
114
114
|
(r">\s*/dev/sd", RiskLevel.CRITICAL, "Direct disk write"),
|
|
115
115
|
(r">\s*/dev/nvme", RiskLevel.CRITICAL, "Direct NVMe write"),
|
|
116
116
|
(r"\bshred\s+", RiskLevel.DANGER, "Secure file deletion"),
|
|
117
|
-
(r"\$\(
|
|
117
|
+
(r"\$\([^)]+\)", RiskLevel.CAUTION, "Command substitution detected"),
|
|
118
118
|
(r"`[^`]+`", RiskLevel.CAUTION, "Backtick command substitution detected"),
|
|
119
119
|
(r"chmod\s+777\s+/", RiskLevel.CRITICAL, "World-writable root"),
|
|
120
120
|
(r"chmod\s+-R\s+777\s+/", RiskLevel.CRITICAL, "World-writable root recursive"),
|
|
@@ -70,12 +70,12 @@ class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
|
|
|
70
70
|
b"",
|
|
71
71
|
]))
|
|
72
72
|
except Exception:
|
|
73
|
-
|
|
73
|
+
logger.debug("Failed to send 503 response", exc_info=True)
|
|
74
74
|
finally:
|
|
75
75
|
try:
|
|
76
76
|
request.close()
|
|
77
77
|
except Exception:
|
|
78
|
-
|
|
78
|
+
logger.debug("Failed to close rejected request socket", exc_info=True)
|
|
79
79
|
return
|
|
80
80
|
# Atomic read-modify-write under lock (was: bare GIL-only read+write)
|
|
81
81
|
self._active_threads += 1
|
|
@@ -83,6 +83,10 @@ class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
|
|
|
83
83
|
super().process_request(request, client_address)
|
|
84
84
|
finally:
|
|
85
85
|
with self._thread_lock:
|
|
86
|
+
if self._active_threads <= 0:
|
|
87
|
+
logger.error("Thread counter underflow! _active_threads=%d — "
|
|
88
|
+
"a decrement was matched to no increment, indicating "
|
|
89
|
+
"a bug in process_request pairing.", self._active_threads)
|
|
86
90
|
self._active_threads = max(0, self._active_threads - 1)
|
|
87
91
|
from pathlib import Path
|
|
88
92
|
from typing import Any
|
|
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
|