weeb-cli 2.9.4__tar.gz → 2.10.0__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.
- {weeb_cli-2.9.4/weeb_cli.egg-info → weeb_cli-2.10.0}/PKG-INFO +1 -1
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/pyproject.toml +1 -1
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_providers.py +94 -0
- weeb_cli-2.10.0/weeb_cli/__init__.py +1 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/__init__.py +1 -0
- weeb_cli-2.10.0/weeb_cli/providers/weeb.py +113 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0/weeb_cli.egg-info}/PKG-INFO +1 -1
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli.egg-info/SOURCES.txt +1 -0
- weeb_cli-2.9.4/weeb_cli/__init__.py +0 -1
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/LICENSE +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/README.md +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/setup.cfg +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_anilist_tracker.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_api.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_cache.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_exceptions.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_kitsu_tracker.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_mal_tracker.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_sanitizer.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/tests/test_sanitizer_security.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/__main__.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/api.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/downloads.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/library.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/__init__.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/anime_details.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/download_flow.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/episode_utils.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/search_handlers.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/stream_utils.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search/watch_flow.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/search.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/serve.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/__init__.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_backup.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_cache.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_config.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_download.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_drives.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_menu.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_shortcuts.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings/settings_trackers.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/settings.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/setup.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/commands/watchlist.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/config.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/exceptions.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/i18n.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/locales/en.json +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/locales/tr.json +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/main.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/allanime.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/animecix.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/anizle.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/base.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/extractors/__init__.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/extractors/megacloud.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/hianime.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/registry.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/providers/turkanime.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/__init__.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/_base.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/_tracker_base.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/cache.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/database.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/dependency_manager.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/details.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/discord_rpc.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/downloader.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/error_handler.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/headless_downloader.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/local_library.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/logger.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/notifier.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/player.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/progress.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/scraper.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/search.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/shortcuts.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/stream_validator.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/tracker.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/updater.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/services/watch.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/templates/anilist_error.html +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/templates/anilist_success.html +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/templates/mal_error.html +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/templates/mal_success.html +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/ui/__init__.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/ui/header.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/ui/menu.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/ui/prompt.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/utils/__init__.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli/utils/sanitizer.py +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli.egg-info/dependency_links.txt +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli.egg-info/entry_points.txt +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli.egg-info/requires.txt +0 -0
- {weeb_cli-2.9.4 → weeb_cli-2.10.0}/weeb_cli.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "weeb-cli"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.10.0"
|
|
8
8
|
description = "Tarayıcı yok, reklam yok, dikkat dağıtıcı unsur yok. Sadece siz ve eşsiz bir anime izleme deneyimi."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [{ name = "ewgsta", email = "ewgst@proton.me" }]
|
|
@@ -5,7 +5,9 @@ from weeb_cli.providers.turkanime import TurkAnimeProvider
|
|
|
5
5
|
from weeb_cli.providers.anizle import AnizleProvider
|
|
6
6
|
from weeb_cli.providers.hianime import HiAnimeProvider
|
|
7
7
|
from weeb_cli.providers.allanime import AllAnimeProvider
|
|
8
|
+
from weeb_cli.providers.weeb import WeebProvider
|
|
8
9
|
from weeb_cli.providers.base import AnimeResult, AnimeDetails, Episode, StreamLink
|
|
10
|
+
import json
|
|
9
11
|
|
|
10
12
|
|
|
11
13
|
class TestAnimeCixProvider:
|
|
@@ -331,3 +333,95 @@ class TestAllAnimeProvider:
|
|
|
331
333
|
if episodes:
|
|
332
334
|
assert isinstance(episodes[0], Episode)
|
|
333
335
|
assert episodes[0].number == 1
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
class TestWeebProvider:
|
|
339
|
+
|
|
340
|
+
@pytest.fixture
|
|
341
|
+
def provider(self):
|
|
342
|
+
return WeebProvider()
|
|
343
|
+
|
|
344
|
+
def test_search(self, provider):
|
|
345
|
+
with patch.object(WeebProvider, '_request') as mock_request:
|
|
346
|
+
mock_request.return_value = {
|
|
347
|
+
"data": [
|
|
348
|
+
{
|
|
349
|
+
"id": "1",
|
|
350
|
+
"name": "Ubel Blatt",
|
|
351
|
+
"slug": "ubel-blatt",
|
|
352
|
+
"first_image": "https://test.com/image.jpg"
|
|
353
|
+
}
|
|
354
|
+
]
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
results = provider.search("Ubel Blatt")
|
|
358
|
+
|
|
359
|
+
assert len(results) == 1
|
|
360
|
+
assert isinstance(results[0], AnimeResult)
|
|
361
|
+
assert results[0].title == "Ubel Blatt"
|
|
362
|
+
assert results[0].id == "ubel-blatt"
|
|
363
|
+
assert results[0].cover == "https://test.com/image.jpg"
|
|
364
|
+
|
|
365
|
+
def test_get_details(self, provider):
|
|
366
|
+
with patch.object(WeebProvider, '_request') as mock_request:
|
|
367
|
+
mock_request.return_value = {
|
|
368
|
+
"data": {
|
|
369
|
+
"id": "1",
|
|
370
|
+
"name": "Ubel Blatt",
|
|
371
|
+
"slug": "ubel-blatt",
|
|
372
|
+
"description": "Test description",
|
|
373
|
+
"categories": ["Aksiyon", "Macera"],
|
|
374
|
+
"season_number": 1,
|
|
375
|
+
"episodes": [
|
|
376
|
+
{
|
|
377
|
+
"episode_number": 1,
|
|
378
|
+
"sources": [
|
|
379
|
+
{"label": "Primary", "watch_url": "/watch/token1"}
|
|
380
|
+
]
|
|
381
|
+
}
|
|
382
|
+
]
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
details = provider.get_details("ubel-blatt")
|
|
387
|
+
|
|
388
|
+
assert details is not None
|
|
389
|
+
assert isinstance(details, AnimeDetails)
|
|
390
|
+
assert details.title == "Ubel Blatt"
|
|
391
|
+
assert len(details.episodes) == 1
|
|
392
|
+
assert details.episodes[0].number == 1
|
|
393
|
+
|
|
394
|
+
sources = json.loads(details.episodes[0].id)
|
|
395
|
+
assert sources[0]["label"] == "Primary"
|
|
396
|
+
|
|
397
|
+
def test_get_streams_from_json_id(self, provider):
|
|
398
|
+
sources = [{"label": "Primary", "watch_url": "/watch/token1"}]
|
|
399
|
+
episode_id = json.dumps(sources)
|
|
400
|
+
|
|
401
|
+
streams = provider.get_streams("ubel-blatt", episode_id)
|
|
402
|
+
|
|
403
|
+
assert len(streams) == 1
|
|
404
|
+
assert isinstance(streams[0], StreamLink)
|
|
405
|
+
assert streams[0].url == "https://anime-api.ewgsta.workers.dev/watch/token1"
|
|
406
|
+
assert streams[0].server == "Primary"
|
|
407
|
+
|
|
408
|
+
def test_get_streams_fallback(self, provider):
|
|
409
|
+
with patch.object(WeebProvider, '_request') as mock_request:
|
|
410
|
+
mock_request.return_value = {
|
|
411
|
+
"data": {
|
|
412
|
+
"episodes": [
|
|
413
|
+
{
|
|
414
|
+
"episode_number": 1,
|
|
415
|
+
"sources": [
|
|
416
|
+
{"label": "Primary", "watch_url": "/watch/token1"}
|
|
417
|
+
]
|
|
418
|
+
}
|
|
419
|
+
]
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
streams = provider.get_streams("ubel-blatt", "1")
|
|
424
|
+
|
|
425
|
+
assert len(streams) == 1
|
|
426
|
+
assert streams[0].url == "https://anime-api.ewgsta.workers.dev/watch/token1"
|
|
427
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.10.0"
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from typing import List, Optional
|
|
3
|
+
|
|
4
|
+
from weeb_cli.providers.base import (
|
|
5
|
+
AnimeDetails,
|
|
6
|
+
AnimeResult,
|
|
7
|
+
BaseProvider,
|
|
8
|
+
Episode,
|
|
9
|
+
StreamLink,
|
|
10
|
+
)
|
|
11
|
+
from weeb_cli.providers.registry import register_provider
|
|
12
|
+
|
|
13
|
+
BASE_URL = "https://anime-api.ewgsta.workers.dev"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@register_provider("weeb", lang="tr", region="TR")
|
|
17
|
+
class WeebProvider(BaseProvider):
|
|
18
|
+
def __init__(self):
|
|
19
|
+
super().__init__()
|
|
20
|
+
self.headers.update({"Accept": "application/json"})
|
|
21
|
+
|
|
22
|
+
def search(self, query: str) -> List[AnimeResult]:
|
|
23
|
+
if not query or len(query) < 2:
|
|
24
|
+
return []
|
|
25
|
+
|
|
26
|
+
data = self._request(f"{BASE_URL}/search", params={"q": query})
|
|
27
|
+
if not data or "data" not in data:
|
|
28
|
+
return []
|
|
29
|
+
|
|
30
|
+
results = []
|
|
31
|
+
for item in data["data"]:
|
|
32
|
+
results.append(
|
|
33
|
+
AnimeResult(
|
|
34
|
+
id=item["slug"], title=item["name"], cover=item.get("first_image")
|
|
35
|
+
)
|
|
36
|
+
)
|
|
37
|
+
return results
|
|
38
|
+
|
|
39
|
+
def get_details(self, anime_id: str) -> Optional[AnimeDetails]:
|
|
40
|
+
data = self._request(f"{BASE_URL}/animes/{anime_id}")
|
|
41
|
+
if not data or "data" not in data:
|
|
42
|
+
return None
|
|
43
|
+
|
|
44
|
+
anime_data = data["data"]
|
|
45
|
+
episodes = []
|
|
46
|
+
|
|
47
|
+
for ep in anime_data.get("episodes", []):
|
|
48
|
+
sources_json = json.dumps(ep.get("sources", []))
|
|
49
|
+
ep_num = ep.get("episode_number", 0)
|
|
50
|
+
episodes.append(
|
|
51
|
+
Episode(
|
|
52
|
+
id=sources_json,
|
|
53
|
+
number=ep_num,
|
|
54
|
+
title=f"Bölüm {ep_num}",
|
|
55
|
+
season=anime_data.get("season_number", 1),
|
|
56
|
+
)
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
return AnimeDetails(
|
|
60
|
+
id=anime_id,
|
|
61
|
+
title=anime_data.get("name", anime_id),
|
|
62
|
+
description=anime_data.get("description"),
|
|
63
|
+
cover=anime_data.get("first_image"),
|
|
64
|
+
genres=anime_data.get("categories", []),
|
|
65
|
+
episodes=episodes,
|
|
66
|
+
total_episodes=len(episodes),
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def get_episodes(self, anime_id: str) -> List[Episode]:
|
|
70
|
+
details = self.get_details(anime_id)
|
|
71
|
+
return details.episodes if details else []
|
|
72
|
+
|
|
73
|
+
def get_streams(self, anime_id: str, episode_id: str) -> List[StreamLink]:
|
|
74
|
+
try:
|
|
75
|
+
sources = json.loads(episode_id)
|
|
76
|
+
if isinstance(sources, list):
|
|
77
|
+
streams = []
|
|
78
|
+
for src in sources:
|
|
79
|
+
watch_url = src.get("watch_url", "")
|
|
80
|
+
if watch_url:
|
|
81
|
+
streams.append(
|
|
82
|
+
StreamLink(
|
|
83
|
+
url=f"{BASE_URL}{watch_url}",
|
|
84
|
+
quality="auto",
|
|
85
|
+
server=src.get("label", "default"),
|
|
86
|
+
)
|
|
87
|
+
)
|
|
88
|
+
if streams:
|
|
89
|
+
return streams
|
|
90
|
+
except (json.JSONDecodeError, ValueError, TypeError):
|
|
91
|
+
pass
|
|
92
|
+
|
|
93
|
+
data = self._request(f"{BASE_URL}/animes/{anime_id}")
|
|
94
|
+
if not data or "data" not in data:
|
|
95
|
+
return []
|
|
96
|
+
|
|
97
|
+
anime_data = data["data"]
|
|
98
|
+
for ep in anime_data.get("episodes", []):
|
|
99
|
+
if str(ep.get("episode_number")) == str(episode_id):
|
|
100
|
+
streams = []
|
|
101
|
+
for src in ep.get("sources", []):
|
|
102
|
+
watch_url = src.get("watch_url", "")
|
|
103
|
+
if watch_url:
|
|
104
|
+
streams.append(
|
|
105
|
+
StreamLink(
|
|
106
|
+
url=f"{BASE_URL}{watch_url}",
|
|
107
|
+
quality="auto",
|
|
108
|
+
server=src.get("label", "default"),
|
|
109
|
+
)
|
|
110
|
+
)
|
|
111
|
+
return streams
|
|
112
|
+
|
|
113
|
+
return []
|
|
@@ -56,6 +56,7 @@ weeb_cli/providers/base.py
|
|
|
56
56
|
weeb_cli/providers/hianime.py
|
|
57
57
|
weeb_cli/providers/registry.py
|
|
58
58
|
weeb_cli/providers/turkanime.py
|
|
59
|
+
weeb_cli/providers/weeb.py
|
|
59
60
|
weeb_cli/providers/extractors/__init__.py
|
|
60
61
|
weeb_cli/providers/extractors/megacloud.py
|
|
61
62
|
weeb_cli/services/__init__.py
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.9.4"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|