codebase-retrieval-context-engine 2.0.5__tar.gz → 2.0.7__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.
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/PKG-INFO +13 -1
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/README.md +12 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/__init__.py +1 -1
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/mcp/server.py +5 -2
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/query/formatter.py +36 -4
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/workspace.py +6 -6
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/pyproject.toml +1 -1
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/.env.example +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/.github/workflows/ci.yml +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/.gitignore +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/CONTRIBUTING.md +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/LICENSE +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/README.backup.md +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/assets/corbell_ui.png +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/assets/logo.png +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/assets/mermaid_diagram.png +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/assets/star_history.png +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/cli/__init__.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/cli/commands/__init__.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/cli/commands/debug.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/cli/commands/index.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/cli/commands/query.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/cli/main.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/__init__.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/constants.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/embeddings/__init__.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/embeddings/base.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/embeddings/extractor.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/embeddings/factory.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/embeddings/model.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/embeddings/search_cache.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/embeddings/sqlite_store.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/gitignore.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/graph/__init__.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/graph/builder.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/graph/method_graph.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/graph/providers/__init__.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/graph/providers/aws_patterns.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/graph/providers/azure_patterns.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/graph/providers/gcp_patterns.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/graph/schema.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/graph/sqlite_store.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/indexing/__init__.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/indexing/builder.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/indexing/lock.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/indexing/tracker.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/llm_client.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/mcp/__init__.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/query/__init__.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/query/diagnostics.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/query/engine.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/query/enhancer.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/query/graph_expander.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/query/merger.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/corbell/core/query/reranker.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/graph.json +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/requirements.txt +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/test_regex.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/__init__.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/conftest.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_builder.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_embeddings.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_graph_expander.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_graph_sqlite_store.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_llm_client.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_mcp.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_merger.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_method_graph_improvements.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_new_language_support.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_query_engine.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_reranker.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_search_cache.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_tracker.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/tests/test_workspace.py +0 -0
- {codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/uv.lock +0 -0
{codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codebase-retrieval-context-engine
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.7
|
|
4
4
|
Summary: Code retrieval engine — hybrid embedding + graph search for LLM context injection.
|
|
5
5
|
Project-URL: Homepage, https://github.com/nullmastermind/local-context-engine
|
|
6
6
|
Project-URL: Repository, https://github.com/nullmastermind/local-context-engine
|
|
@@ -76,6 +76,18 @@ claude mcp add-json codebase-retrieval --scope user '{"type":"stdio","command":"
|
|
|
76
76
|
|
|
77
77
|
That's it. The AI agent passes workspace path and triggers index builds automatically.
|
|
78
78
|
|
|
79
|
+
## Update
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
uv tool upgrade codebase-retrieval-context-engine
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Or if installed via `uvx` (auto-managed):
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
uvx --upgrade codebase-retrieval-context-engine
|
|
89
|
+
```
|
|
90
|
+
|
|
79
91
|
## Remove from Claude Code
|
|
80
92
|
|
|
81
93
|
```bash
|
{codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/README.md
RENAMED
|
@@ -16,6 +16,18 @@ claude mcp add-json codebase-retrieval --scope user '{"type":"stdio","command":"
|
|
|
16
16
|
|
|
17
17
|
That's it. The AI agent passes workspace path and triggers index builds automatically.
|
|
18
18
|
|
|
19
|
+
## Update
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
uv tool upgrade codebase-retrieval-context-engine
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or if installed via `uvx` (auto-managed):
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
uvx --upgrade codebase-retrieval-context-engine
|
|
29
|
+
```
|
|
30
|
+
|
|
19
31
|
## Remove from Claude Code
|
|
20
32
|
|
|
21
33
|
```bash
|
|
@@ -128,12 +128,15 @@ async def codebase_retrieval_tool(
|
|
|
128
128
|
)
|
|
129
129
|
|
|
130
130
|
def _run_pipeline():
|
|
131
|
+
from corbell.core.workspace import build_config
|
|
132
|
+
|
|
133
|
+
cfg = build_config(ws_path)
|
|
131
134
|
return codebase_retrieval(
|
|
132
135
|
query=information_request,
|
|
133
136
|
workspace_path=ws_path,
|
|
134
|
-
top_k=
|
|
137
|
+
top_k=cfg.query.top_k,
|
|
135
138
|
use_llm=True,
|
|
136
|
-
rerank=
|
|
139
|
+
rerank=cfg.query.rerank,
|
|
137
140
|
)
|
|
138
141
|
|
|
139
142
|
return await anyio.to_thread.run_sync(_run_pipeline, cancellable=True)
|
|
@@ -12,6 +12,8 @@ if TYPE_CHECKING:
|
|
|
12
12
|
def format_results(
|
|
13
13
|
chunks: List["ScoredChunk"],
|
|
14
14
|
repo_paths: Dict[str, str],
|
|
15
|
+
max_output_bytes: int = 80_000,
|
|
16
|
+
max_line_chars: int = 1000,
|
|
15
17
|
) -> str:
|
|
16
18
|
"""Format scored chunks as annotated code blocks for LLM context injection.
|
|
17
19
|
|
|
@@ -26,16 +28,24 @@ def format_results(
|
|
|
26
28
|
chunks: Scored chunks to format (pre-sorted by score descending).
|
|
27
29
|
repo_paths: Mapping of repo_id -> absolute repo path string.
|
|
28
30
|
Used to resolve relative file paths to absolute paths.
|
|
31
|
+
max_output_bytes: Maximum total output size in bytes. Truncation stops at the
|
|
32
|
+
last complete chunk boundary that fits. Defaults to 80 000 (~20K tokens).
|
|
33
|
+
max_line_chars: Maximum characters per source line before inline truncation.
|
|
34
|
+
Defaults to 1000.
|
|
29
35
|
|
|
30
36
|
Returns:
|
|
31
|
-
Formatted string with all chunks, separated by blank lines.
|
|
37
|
+
Formatted string with all chunks, separated by blank lines. If the output
|
|
38
|
+
exceeds max_output_bytes, a trailing note reports how many results were shown.
|
|
32
39
|
"""
|
|
33
40
|
if not chunks:
|
|
34
41
|
return ""
|
|
35
42
|
|
|
43
|
+
total = len(chunks)
|
|
36
44
|
blocks: List[str] = []
|
|
45
|
+
accumulated_bytes = 0
|
|
46
|
+
truncation_footer = ""
|
|
37
47
|
|
|
38
|
-
for chunk in chunks:
|
|
48
|
+
for n, chunk in enumerate(chunks):
|
|
39
49
|
abs_path = _resolve_absolute_path(chunk.file_path, chunk.repo_id, repo_paths)
|
|
40
50
|
|
|
41
51
|
# Read the actual lines for this chunk range
|
|
@@ -47,16 +57,38 @@ def format_results(
|
|
|
47
57
|
# Build the header: path#Lstart-end
|
|
48
58
|
header = f"{abs_path}#L{chunk.start_line}-{chunk.end_line}"
|
|
49
59
|
|
|
50
|
-
# Build numbered lines
|
|
60
|
+
# Build numbered lines with per-line truncation
|
|
51
61
|
numbered_lines: List[str] = []
|
|
52
62
|
for i, line in enumerate(lines):
|
|
53
63
|
line_num = chunk.start_line + i
|
|
64
|
+
if len(line) > max_line_chars:
|
|
65
|
+
line = line[:max_line_chars] + " [truncated — use Read tool for full content]"
|
|
54
66
|
numbered_lines.append(f"{line_num}: {line}")
|
|
55
67
|
|
|
56
68
|
block = header + "\n" + "\n".join(numbered_lines)
|
|
69
|
+
|
|
70
|
+
# Per-output size gate: check if adding this block would exceed the limit
|
|
71
|
+
# Account for the separator ("\n\n") between blocks
|
|
72
|
+
separator_size = 2 if blocks else 0
|
|
73
|
+
block_bytes = len(block.encode("utf-8"))
|
|
74
|
+
if accumulated_bytes + separator_size + block_bytes > max_output_bytes:
|
|
75
|
+
# Collect remaining chunk headers so the agent knows what else is relevant
|
|
76
|
+
remaining_headers: List[str] = []
|
|
77
|
+
for remaining in chunks[n:]:
|
|
78
|
+
rp = _resolve_absolute_path(remaining.file_path, remaining.repo_id, repo_paths)
|
|
79
|
+
remaining_headers.append(f"{rp}#L{remaining.start_line}-{remaining.end_line}")
|
|
80
|
+
truncation_footer = (
|
|
81
|
+
f"\n\n[Showing {n}/{total} results. "
|
|
82
|
+
f"Remaining (use Read tool):\n"
|
|
83
|
+
+ "\n".join(remaining_headers)
|
|
84
|
+
+ "]"
|
|
85
|
+
)
|
|
86
|
+
break
|
|
87
|
+
|
|
57
88
|
blocks.append(block)
|
|
89
|
+
accumulated_bytes += separator_size + block_bytes
|
|
58
90
|
|
|
59
|
-
return "\n\n".join(blocks)
|
|
91
|
+
return "\n\n".join(blocks) + truncation_footer
|
|
60
92
|
|
|
61
93
|
|
|
62
94
|
def _resolve_absolute_path(
|
|
@@ -42,7 +42,7 @@ class StorageConfig(BaseModel):
|
|
|
42
42
|
class QueryConfig(BaseModel):
|
|
43
43
|
"""Query pipeline configuration."""
|
|
44
44
|
|
|
45
|
-
top_k: int =
|
|
45
|
+
top_k: int = 24
|
|
46
46
|
expand_call_depth: int = 2
|
|
47
47
|
expand_max_chunks: int = 30
|
|
48
48
|
rerank: bool = True
|
|
@@ -55,8 +55,8 @@ class IndexingConfig(BaseModel):
|
|
|
55
55
|
|
|
56
56
|
skip_dirs: List[str] = Field(default_factory=list)
|
|
57
57
|
max_file_bytes: int = 1024 * 1024 # 1 MB
|
|
58
|
-
chunk_size: int =
|
|
59
|
-
chunk_overlap: int =
|
|
58
|
+
chunk_size: int = 32
|
|
59
|
+
chunk_overlap: int = 8
|
|
60
60
|
|
|
61
61
|
model_config = {"extra": "ignore"}
|
|
62
62
|
|
|
@@ -379,9 +379,9 @@ def build_config(workspace_path: Path) -> WorkspaceConfig:
|
|
|
379
379
|
workspace_path = workspace_path.resolve()
|
|
380
380
|
|
|
381
381
|
# Parse env vars
|
|
382
|
-
top_k = int(os.environ.get("CORBELL_TOP_K", "
|
|
383
|
-
chunk_size = int(os.environ.get("CORBELL_CHUNK_SIZE", "
|
|
384
|
-
chunk_overlap = int(os.environ.get("CORBELL_CHUNK_OVERLAP", "
|
|
382
|
+
top_k = int(os.environ.get("CORBELL_TOP_K", "24"))
|
|
383
|
+
chunk_size = int(os.environ.get("CORBELL_CHUNK_SIZE", "32"))
|
|
384
|
+
chunk_overlap = int(os.environ.get("CORBELL_CHUNK_OVERLAP", "8"))
|
|
385
385
|
expand_call_depth = int(os.environ.get("CORBELL_EXPAND_CALL_DEPTH", "2"))
|
|
386
386
|
expand_max_chunks = int(os.environ.get("CORBELL_EXPAND_MAX_CHUNKS", "30"))
|
|
387
387
|
rerank_str = os.environ.get("CORBELL_RERANK", "true").lower()
|
{codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/pyproject.toml
RENAMED
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "codebase-retrieval-context-engine"
|
|
7
|
-
version = "2.0.
|
|
7
|
+
version = "2.0.7"
|
|
8
8
|
description = "Code retrieval engine — hybrid embedding + graph search for LLM context injection."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = {text = "Apache-2.0"}
|
{codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/.env.example
RENAMED
|
File without changes
|
|
File without changes
|
{codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/.gitignore
RENAMED
|
File without changes
|
{codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/CONTRIBUTING.md
RENAMED
|
File without changes
|
|
File without changes
|
{codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/README.backup.md
RENAMED
|
File without changes
|
|
File without changes
|
{codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/assets/logo.png
RENAMED
|
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
|
{codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/graph.json
RENAMED
|
File without changes
|
{codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/requirements.txt
RENAMED
|
File without changes
|
{codebase_retrieval_context_engine-2.0.5 → codebase_retrieval_context_engine-2.0.7}/test_regex.py
RENAMED
|
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
|