witbitz-code 1.6.3__tar.gz → 1.6.4__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.
- {witbitz_code-1.6.3/src/witbitz_code.egg-info → witbitz_code-1.6.4}/PKG-INFO +1 -1
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/pyproject.toml +1 -1
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/__init__.py +1 -1
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/auto.py +23 -1
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/auto_runner.py +4 -3
- {witbitz_code-1.6.3 → witbitz_code-1.6.4/src/witbitz_code.egg-info}/PKG-INFO +1 -1
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_auto.py +49 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/LICENSE +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/README.md +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/setup.cfg +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/__main__.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/_js.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/account.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/asks.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/attachments.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/cli.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/codekeys.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/codetools.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/compress.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/computers.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/confidential.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/confidential_models.json +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/connector.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/devicelink.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/dirs.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/folders.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/gateway.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/icons/witbitz-code-wsl.ico +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/icons/witbitz-code.ico +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/keys.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/link.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/mkdir.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/models.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/net.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/offered_models.json +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/opencode_plugins/notes-init.md +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/opencode_plugins/witbitz-media-server.mjs +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/opencode_plugins/witbitz-notes.js +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/opencode_plugins/witbitz-progress.js +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/outputs.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/pair.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/pairings.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/payers.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/plugins.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/policy.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/ports.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/qr.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/receipt.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/relay.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/seen.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/tinfoil_read.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/tools_catalog.json +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/tools_probe.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/toolsetup.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/ui.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/ui_static/app.css +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/ui_static/app.js +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/ui_static/index.html +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/uitools.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/uninstall.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/winagent.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/winbg.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/winconsole.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/wizard.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/wslstart.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code.egg-info/SOURCES.txt +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code.egg-info/dependency_links.txt +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code.egg-info/entry_points.txt +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code.egg-info/requires.txt +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code.egg-info/top_level.txt +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_asks.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_attachments.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_cli.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_codekeys.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_codetools.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_confidential.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_connector_e2e.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_devicelink.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_dirs.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_files_and_compress.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_folders.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_outputs.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_pair_flows.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_plugins.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_policy.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_ports.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_ports_win.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_registry.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_relay_codec.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_setup.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_tools_probe.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_toolsetup.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_ui.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_uitools.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_uninstall.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_winagent.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_winbg.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_winconsole.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_windows_files.py +0 -0
- {witbitz_code-1.6.3 → witbitz_code-1.6.4}/tests/test_wslstart.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "witbitz-code"
|
|
7
|
-
version = "1.6.
|
|
7
|
+
version = "1.6.4"
|
|
8
8
|
description = "Reach OpenCode on this computer from the Witbitz Spaces Code section, through an end-to-end sealed relay."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -206,6 +206,25 @@ _KEY_FILE = re.compile(r"\.(pem|key|p12|pfx|jks|keystore)\Z", re.ASCII | re.IGNO
|
|
|
206
206
|
_SECRETISH = re.compile(r"secret|credential", re.ASCII | re.IGNORECASE)
|
|
207
207
|
|
|
208
208
|
|
|
209
|
+
_WIN_ABS = re.compile(r"\A(?:\\\\\?\\)?([A-Za-z]):[\\/]")
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def windows_to_posix(path: Any) -> Any:
|
|
213
|
+
"""A Windows path in the form every rule here reads: C:\\Users\\x, C:/Users/x → /c/Users/x (Git Bash's own spelling).
|
|
214
|
+
Every rule tests "absolute" as a leading / — so on Windows (the owner, 2026-10-09: "The auto mode is not working
|
|
215
|
+
(windows)") the project folder was never absolute and Auto would not switch on, and C:/… in a command read as a path
|
|
216
|
+
INSIDE the project. Anything else is returned as it came."""
|
|
217
|
+
if not isinstance(path, str):
|
|
218
|
+
return path
|
|
219
|
+
m = _WIN_ABS.match(path)
|
|
220
|
+
return "/" + m.group(1).lower() + "/" + path[m.end():].replace("\\", "/") if m else path
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def _windows_project(ctx: dict) -> bool:
|
|
224
|
+
"""A project on Windows: there a backslash separates folders too (..\\..\\x climbs out exactly as ../../x does)."""
|
|
225
|
+
return bool(_WIN_ABS.match(str(ctx.get("directory") or "")))
|
|
226
|
+
|
|
227
|
+
|
|
209
228
|
def _sensitive_path(abs_path: str) -> bool:
|
|
210
229
|
parts = abs_path.split("/")
|
|
211
230
|
base = parts[-1] or ""
|
|
@@ -219,7 +238,7 @@ def _sensitive_path(abs_path: str) -> bool:
|
|
|
219
238
|
|
|
220
239
|
|
|
221
240
|
def _project_dir(directory: Any) -> str:
|
|
222
|
-
d = _js.js_string(directory) if _js.truthy(directory) else ""
|
|
241
|
+
d = windows_to_posix(_js.js_string(directory)) if _js.truthy(directory) else ""
|
|
223
242
|
return re.sub(r"/+\Z", "", posix_normalize(d))
|
|
224
243
|
|
|
225
244
|
|
|
@@ -246,6 +265,7 @@ def _word_stays_in_project(w: str, ctx: dict) -> bool:
|
|
|
246
265
|
v = v[eq + 1:]
|
|
247
266
|
if not v:
|
|
248
267
|
return True
|
|
268
|
+
v = windows_to_posix(v.replace("\\", "/") if _windows_project(ctx) and not v.startswith("~") else v)
|
|
249
269
|
if "$" in v or re.search(r"(^|/)\.\.(/|\Z)", v):
|
|
250
270
|
return False
|
|
251
271
|
if v.startswith("~"):
|
|
@@ -333,6 +353,8 @@ def _edit_inside_project(patterns: Any, ctx: dict) -> bool:
|
|
|
333
353
|
for p in patterns:
|
|
334
354
|
if not isinstance(p, str) or not p or re.search(r"[*?\[\]{}]", p):
|
|
335
355
|
return False # a glob is not a precise target
|
|
356
|
+
if _windows_project(ctx):
|
|
357
|
+
p = windows_to_posix(p.replace("\\", "/") if not _WIN_ABS.match(p) else p)
|
|
336
358
|
a = posix_normalize(p if p.startswith("/") else d + "/" + p)
|
|
337
359
|
r = next((x for x in roots if a.startswith(x + "/")), "")
|
|
338
360
|
if not (r and not _sensitive_path(a[len(r):])):
|
|
@@ -33,7 +33,7 @@ import httpx
|
|
|
33
33
|
|
|
34
34
|
from . import _js
|
|
35
35
|
from .folders import allowed_folders
|
|
36
|
-
from .auto import SCRATCH_DIR, action_for, classify_deterministic, log_record, parse_verdict, reviewer_prompt, scratch_paths
|
|
36
|
+
from .auto import SCRATCH_DIR, windows_to_posix, action_for, classify_deterministic, log_record, parse_verdict, reviewer_prompt, scratch_paths
|
|
37
37
|
from .policy import SUBAGENT_GATED
|
|
38
38
|
|
|
39
39
|
REVIEW_TITLE = "witbitz-auto-review" # the page never lists a session with this title
|
|
@@ -146,7 +146,7 @@ class AutoRunner:
|
|
|
146
146
|
doc = _js.parse(self._state_path.read_text(encoding="utf-8"))
|
|
147
147
|
sessions = doc.get("sessions") if isinstance(doc, dict) else None
|
|
148
148
|
for sid, v in (sessions.items() if isinstance(sessions, dict) else []):
|
|
149
|
-
if sid.startswith("ses") and isinstance(v, dict) and isinstance(v.get("dir"), str) and v["dir"].startswith("/"):
|
|
149
|
+
if sid.startswith("ses") and isinstance(v, dict) and isinstance(v.get("dir"), str) and windows_to_posix(v["dir"]).startswith("/"):
|
|
150
150
|
at = _js.to_number(v.get("at", _js.UNDEFINED))
|
|
151
151
|
self._auto[sid] = {"dir": v["dir"], "at": _js.clean_number(at) if _js.truthy(at) else 0}
|
|
152
152
|
except Exception as e:
|
|
@@ -470,7 +470,8 @@ class AutoRunner:
|
|
|
470
470
|
if not isinstance(session_id, str) or not _SESSION_ID.fullmatch(session_id):
|
|
471
471
|
return False
|
|
472
472
|
if on:
|
|
473
|
-
|
|
473
|
+
# Windows: C:\\Users\\… is absolute too (auto.windows_to_posix); the folder is kept as given for OpenCode's API.
|
|
474
|
+
if not isinstance(directory, str) or not windows_to_posix(directory).startswith("/") or _js.utf16_len(directory) > 1024:
|
|
474
475
|
return False
|
|
475
476
|
self._auto[session_id] = {"dir": directory, "at": self._now()} # an existing key keeps its place, as Map.set does
|
|
476
477
|
else:
|
|
@@ -629,3 +629,52 @@ def test_wiring_the_page_switches_auto_and_the_verdict_comes_back(make, tmp_path
|
|
|
629
629
|
await connector.stop()
|
|
630
630
|
|
|
631
631
|
run(go())
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
# ── WINDOWS (the owner, 2026-10-09: "The auto mode is not working (windows)") ────────────────────────────────────────────
|
|
635
|
+
# Every rule read "absolute" as a leading /: Auto would not switch on for C:\…, and C:/… in a command read as INSIDE the
|
|
636
|
+
# project. A Windows request now gets exactly the decision its Linux twin gets.
|
|
637
|
+
_WIN_TWINS = [
|
|
638
|
+
("ls src", "ls src"),
|
|
639
|
+
("cat /etc/hosts", "cat C:/Windows/win.ini"),
|
|
640
|
+
("cat /home/u/repo/src/a.py", "cat C:/Users/u/repo/src/a.py"),
|
|
641
|
+
("cat /home/u/repo/.git/config", "cat /c/Users/u/repo/.git/config"),
|
|
642
|
+
]
|
|
643
|
+
_WIN_EDITS = [("src/a.py", "src\\a.py"), ("../../x", "..\\..\\x"), ("/home/u/repo/src/a.py", "C:\\Users\\u\\repo\\src\\a.py"),
|
|
644
|
+
("/home/u/other/a.py", "C:\\Users\\u\\other\\a.py")]
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
def _stage(req, directory, home):
|
|
648
|
+
r = classify_deterministic({"id": "per_x", "sessionID": "ses_x", "always": [], **req}, directory=directory, home=home)
|
|
649
|
+
return r["stage"] if r else "review"
|
|
650
|
+
|
|
651
|
+
|
|
652
|
+
@pytest.mark.parametrize("lin,win", _WIN_TWINS)
|
|
653
|
+
def test_a_windows_command_is_judged_like_its_linux_twin(lin, win):
|
|
654
|
+
b = lambda c: {"permission": "bash", "patterns": [c], "metadata": {"command": c}} # noqa: E731
|
|
655
|
+
assert _stage(b(win), "C:\\Users\\u\\repo", "C:\\Users\\u") == _stage(b(lin), "/home/u/repo", "/home/u")
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
@pytest.mark.parametrize("lin,win", _WIN_EDITS)
|
|
659
|
+
def test_a_windows_edit_is_judged_like_its_linux_twin(lin, win):
|
|
660
|
+
e = lambda p: {"permission": "edit", "patterns": [p], "metadata": {}} # noqa: E731
|
|
661
|
+
assert _stage(e(win), "C:\\Users\\u\\repo", "C:\\Users\\u") == _stage(e(lin), "/home/u/repo", "/home/u")
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
def test_outside_the_project_on_windows_is_never_allowed_by_itself():
|
|
665
|
+
assert _stage({"permission": "bash", "patterns": ["cat C:/Windows/win.ini"], "metadata": {"command": "cat C:/Windows/win.ini"}},
|
|
666
|
+
"C:\\Users\\u\\repo", "C:\\Users\\u") != "fast-allow"
|
|
667
|
+
assert _stage({"permission": "edit", "patterns": ["..\\..\\x"], "metadata": {}}, "C:\\Users\\u\\repo", "C:\\Users\\u") != "fast-allow"
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
def test_auto_switches_on_for_a_windows_folder_and_talks_to_opencode_with_it_as_given(tmp_path):
|
|
671
|
+
win = "C:\\Users\\u\\repo"
|
|
672
|
+
|
|
673
|
+
async def body(oc, runner, verdicts, make, client):
|
|
674
|
+
assert runner.set_auto("ses_main", win, True), "C:\\… is a project folder (it was refused: Auto never ran on Windows)"
|
|
675
|
+
assert runner.set_auto("ses_main", "relative\\dir", True) is False
|
|
676
|
+
assert runner.set_auto("ses_main", win, True)
|
|
677
|
+
oc.ask(permission="bash", patterns=["rm -rf ~"], metadata={"command": "rm -rf ~"})
|
|
678
|
+
assert await until(lambda: oc.replies(), 4)
|
|
679
|
+
assert oc.replies()[0]["dir"] == win, "OpenCode is asked with the folder exactly as it named it"
|
|
680
|
+
with_runner(tmp_path, body)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/opencode_plugins/witbitz-media-server.mjs
RENAMED
|
File without changes
|
{witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/opencode_plugins/witbitz-notes.js
RENAMED
|
File without changes
|
{witbitz_code-1.6.3 → witbitz_code-1.6.4}/src/witbitz_code/opencode_plugins/witbitz-progress.js
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|