hoverpower 1.0.4__tar.gz → 1.2.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.
- {hoverpower-1.0.4 → hoverpower-1.2.0}/PKG-INFO +1 -1
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/data.py +20 -6
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/generator.py +2 -1
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/path.py +81 -20
- hoverpower-1.2.0/hoverpower/repo/__init__.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/secret.py +2 -3
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower.egg-info/PKG-INFO +1 -1
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower.egg-info/SOURCES.txt +2 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower.egg-info/entry_points.txt +1 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/pyproject.toml +45 -27
- {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_cli.py +2 -2
- hoverpower-1.2.0/tests/test_path.py +54 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/LICENSE +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/README +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/__init__.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/__main__.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/cli/__init__.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/cli/give.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/hard.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/info.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower/title.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower.egg-info/dependency_links.txt +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower.egg-info/requires.txt +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/hoverpower.egg-info/top_level.txt +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/setup.cfg +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_generator.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_give.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_hardcore.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_repository.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_resources.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_secret.py +0 -0
- {hoverpower-1.0.4 → hoverpower-1.2.0}/tests/test_title.py +0 -0
|
@@ -15,10 +15,24 @@ import utilo
|
|
|
15
15
|
import hoverpower
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
def collect_folder():
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
]
|
|
18
|
+
def collect_folder() -> list:
|
|
19
|
+
"""\
|
|
20
|
+
>>> collect_folder()
|
|
21
|
+
['bachelor', ...'paper', 'tech']
|
|
22
|
+
"""
|
|
23
|
+
files = os.scandir(hoverpower.STORE)
|
|
24
|
+
result = sorted(item.name for item in files if not no_folder(item))
|
|
25
|
+
return result
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def no_folder(item) -> bool:
|
|
29
|
+
if item.is_file():
|
|
30
|
+
return True
|
|
31
|
+
if item.name.startswith('.'):
|
|
32
|
+
return True
|
|
33
|
+
if item.name == '__pycache__':
|
|
34
|
+
return True
|
|
35
|
+
return False
|
|
22
36
|
|
|
23
37
|
|
|
24
38
|
def log_available_files(package: str):
|
|
@@ -34,7 +48,7 @@ def log_available_files(package: str):
|
|
|
34
48
|
if package not in collected:
|
|
35
49
|
utilo.error(f'package not available: {package}')
|
|
36
50
|
sys.exit(utilo.FAILURE)
|
|
37
|
-
featurepath = os.path.join(hoverpower.
|
|
51
|
+
featurepath = os.path.join(hoverpower.STORE, package)
|
|
38
52
|
# TODO: add recursive feature packages
|
|
39
53
|
for item in os.scandir(featurepath):
|
|
40
54
|
utilo.log(f' {item.name}')
|
|
@@ -63,7 +77,7 @@ def copy_packages(matched: list, dest: str, merge: bool = False):
|
|
|
63
77
|
def copy_package(package, dest):
|
|
64
78
|
"""If resource already exists and is unchanged, the file is not
|
|
65
79
|
touched."""
|
|
66
|
-
source = os.path.join(hoverpower.
|
|
80
|
+
source = os.path.join(hoverpower.STORE, package)
|
|
67
81
|
utilo.copy_content(
|
|
68
82
|
source,
|
|
69
83
|
dest,
|
|
@@ -112,7 +112,8 @@ def install():
|
|
|
112
112
|
if not package:
|
|
113
113
|
utilo.error('could not install, define tests.conftest.PACKAGE')
|
|
114
114
|
return
|
|
115
|
-
|
|
115
|
+
# TODO: ADD INSTALL STEP LATER?
|
|
116
|
+
# utilotest.clean_install(resinf.configure.PROJECT, package)
|
|
116
117
|
# run install hook after installing project
|
|
117
118
|
install_after = conftest.install if hasattr(conftest, 'install') else None
|
|
118
119
|
if not install_after:
|
|
@@ -7,18 +7,24 @@
|
|
|
7
7
|
# be prosecuted under federal law. Its content is company confidential.
|
|
8
8
|
# =============================================================================
|
|
9
9
|
|
|
10
|
+
import concurrent.futures
|
|
11
|
+
import importlib.metadata
|
|
12
|
+
import itertools
|
|
10
13
|
import os
|
|
11
14
|
import tarfile
|
|
15
|
+
import tomllib
|
|
12
16
|
|
|
13
17
|
import requests
|
|
14
18
|
import utilo
|
|
15
19
|
|
|
16
|
-
import hoverpower
|
|
17
|
-
|
|
18
20
|
# TMP = utilo.tmp(hoverpower.ROOT)
|
|
19
21
|
TMP = utilo.join('/tmp/power') #nosec B108
|
|
20
22
|
|
|
21
|
-
REPO = utilo.join(
|
|
23
|
+
REPO = utilo.join(
|
|
24
|
+
os.path.join(os.path.dirname(__file__), '..'),
|
|
25
|
+
'hoverpower/repo',
|
|
26
|
+
exist=True,
|
|
27
|
+
)
|
|
22
28
|
STORE = os.getenv('HOVERPOWER_STORE', REPO)
|
|
23
29
|
|
|
24
30
|
BACHELOR = utilo.join(STORE, 'bachelor')
|
|
@@ -32,8 +38,17 @@ ORDER = utilo.join(STORE, 'order')
|
|
|
32
38
|
PAPER = utilo.join(STORE, 'paper')
|
|
33
39
|
TECH = utilo.join(STORE, 'tech')
|
|
34
40
|
|
|
35
|
-
|
|
36
|
-
|
|
41
|
+
# https://github.com/anaticulae/hoverpower/releases/download/v1.0.2/master.tar.gz
|
|
42
|
+
SOURCE = 'https://github.com/anaticulae/hoverpower/releases/download/'+\
|
|
43
|
+
f'v{importlib.metadata.version("hoverpower")}/'
|
|
44
|
+
|
|
45
|
+
TIMEOUT_DOWNLOAD_SEC = 15
|
|
46
|
+
WORKER = utilo.parse_int(os.getenv('HOVERPOWER_DOWNLOAD_WORKER', '5'))
|
|
47
|
+
|
|
48
|
+
PACKAGES_DEFAULT = 'bachelor book diss docu habil home master order paper tech'
|
|
49
|
+
PACKAGES = os.getenv('HOVERPOWER_PACKAGES', PACKAGES_DEFAULT).strip().split()
|
|
50
|
+
|
|
51
|
+
PYPROJECT = 'pyproject.toml'
|
|
37
52
|
|
|
38
53
|
|
|
39
54
|
def download() -> list:
|
|
@@ -49,28 +64,57 @@ def download() -> list:
|
|
|
49
64
|
return result
|
|
50
65
|
|
|
51
66
|
|
|
52
|
-
def
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
67
|
+
def download_packages():
|
|
68
|
+
root = STORE
|
|
69
|
+
packages = PACKAGES
|
|
70
|
+
if utilo.exists(utilo.join(root, PYPROJECT)):
|
|
71
|
+
# determine packages by tool.hoverpower.packages in pyproject.toml
|
|
72
|
+
packages = requires(root)
|
|
73
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=WORKER) as executor:
|
|
74
|
+
executor.map(
|
|
75
|
+
download_and_extract,
|
|
76
|
+
packages,
|
|
77
|
+
itertools.repeat(root),
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def download_and_extract(package, root):
|
|
82
|
+
tar = download_package(package, root=root)
|
|
83
|
+
if not tar:
|
|
58
84
|
return
|
|
59
|
-
|
|
85
|
+
outpath = utilo.join(root, package)
|
|
86
|
+
utilo.log(f'untar: {tar} {outpath}')
|
|
87
|
+
untar(
|
|
88
|
+
source=tar,
|
|
89
|
+
outpath=outpath,
|
|
90
|
+
)
|
|
91
|
+
utilo.log()
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def download_package(package: str, root=TMP):
|
|
95
|
+
utilo.debug(f'store: {root}')
|
|
96
|
+
os.makedirs(root, exist_ok=True)
|
|
97
|
+
path = utilo.join(root, package)
|
|
98
|
+
dl = utilo.join(root, f'{package}.tar.gz')
|
|
99
|
+
if utilo.exists(path):
|
|
100
|
+
utilo.log(f'already downloaded: {path}\n')
|
|
101
|
+
return None
|
|
102
|
+
url = f'{SOURCE}{package}.tar.gz'
|
|
60
103
|
data = download_file(url)
|
|
61
104
|
if not data:
|
|
62
105
|
utilo.error(f'invalid download: {path}')
|
|
63
|
-
return
|
|
64
|
-
utilo.
|
|
106
|
+
return None
|
|
107
|
+
utilo.file_replace_binary(dl, content=data)
|
|
65
108
|
os.makedirs(path)
|
|
66
|
-
utilo.log(f'
|
|
109
|
+
utilo.log(f'downloaded: {package}')
|
|
110
|
+
return dl
|
|
67
111
|
|
|
68
112
|
|
|
69
|
-
def untar(
|
|
70
|
-
with tarfile.open(
|
|
113
|
+
def untar(source, outpath):
|
|
114
|
+
with tarfile.open(source, mode='r:gz') as tar:
|
|
71
115
|
tar.extractall( #nosec B202
|
|
72
|
-
path=
|
|
73
|
-
members=safe_members(tar,
|
|
116
|
+
path=outpath,
|
|
117
|
+
# members=safe_members(tar, outpath),
|
|
74
118
|
)
|
|
75
119
|
|
|
76
120
|
|
|
@@ -88,7 +132,7 @@ def download_file(url: str) -> bytes:
|
|
|
88
132
|
try:
|
|
89
133
|
response = requests.get(
|
|
90
134
|
url,
|
|
91
|
-
timeout=
|
|
135
|
+
timeout=TIMEOUT_DOWNLOAD_SEC,
|
|
92
136
|
)
|
|
93
137
|
except requests.HTTPError as msg:
|
|
94
138
|
utilo.error(msg)
|
|
@@ -102,6 +146,23 @@ def download_file(url: str) -> bytes:
|
|
|
102
146
|
return data
|
|
103
147
|
|
|
104
148
|
|
|
149
|
+
def requires(root: str) -> tuple:
|
|
150
|
+
project = utilo.join(root, PYPROJECT)
|
|
151
|
+
if not utilo.exists(project):
|
|
152
|
+
return tuple()
|
|
153
|
+
with open(project, "rb") as f:
|
|
154
|
+
data = tomllib.load(f)
|
|
155
|
+
try:
|
|
156
|
+
result = data['tool']['hoverpower']['packages']
|
|
157
|
+
except KeyError:
|
|
158
|
+
utilo.error(f'invalid tool.hoverpower.packages: {data}')
|
|
159
|
+
return ()
|
|
160
|
+
result = utilo.sort(*result)
|
|
161
|
+
result = utilo.lower(*result)
|
|
162
|
+
result: tuple = tuple(result)
|
|
163
|
+
return result
|
|
164
|
+
|
|
165
|
+
|
|
105
166
|
def bachelor(value: str, local: bool = True) -> str:
|
|
106
167
|
name = f'bachelor{value}.pdf'
|
|
107
168
|
if local:
|
|
File without changes
|
|
@@ -60,8 +60,7 @@ def make_private():
|
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
def make_public():
|
|
63
|
-
utilo.log(f'
|
|
64
|
-
utilo.log(f'write to public path: {hoverpower.path.TMP}')
|
|
63
|
+
utilo.log(f'store: {hoverpower.path.STORE}')
|
|
65
64
|
for source in hoverpower.path.RESOURCES:
|
|
66
65
|
if 'https://' in source:
|
|
67
66
|
continue
|
|
@@ -102,7 +101,7 @@ def ensure_parant(source: str):
|
|
|
102
101
|
fname = utilo.file_name(source, ext=True)
|
|
103
102
|
# bachelor124.pdfs => bachelor/bachelor124.pdf
|
|
104
103
|
base = utilo.join(
|
|
105
|
-
hoverpower.path.
|
|
104
|
+
hoverpower.path.STORE,
|
|
106
105
|
re.split(r'(?=\d)', fname)[0],
|
|
107
106
|
)
|
|
108
107
|
os.makedirs(base, exist_ok=True)
|
|
@@ -18,10 +18,12 @@ hoverpower.egg-info/requires.txt
|
|
|
18
18
|
hoverpower.egg-info/top_level.txt
|
|
19
19
|
hoverpower/cli/__init__.py
|
|
20
20
|
hoverpower/cli/give.py
|
|
21
|
+
hoverpower/repo/__init__.py
|
|
21
22
|
tests/test_cli.py
|
|
22
23
|
tests/test_generator.py
|
|
23
24
|
tests/test_give.py
|
|
24
25
|
tests/test_hardcore.py
|
|
26
|
+
tests/test_path.py
|
|
25
27
|
tests/test_repository.py
|
|
26
28
|
tests/test_resources.py
|
|
27
29
|
tests/test_secret.py
|
|
@@ -1,73 +1,91 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "hoverpower"
|
|
3
|
-
version = "1.0
|
|
3
|
+
version = "1.2.0"
|
|
4
4
|
description = ""
|
|
5
|
-
readme = {file = "README", content-type = "text/markdown"}
|
|
6
5
|
requires-python = ">=3.12"
|
|
7
6
|
authors = [
|
|
8
|
-
|
|
7
|
+
{ name = "Helmut Konrad Schewe", email = "helmutus@outlook.com" },
|
|
9
8
|
]
|
|
10
|
-
|
|
11
9
|
dependencies = [
|
|
12
10
|
"resinf>=1.0.2,<2.0.0",
|
|
13
11
|
"jamer>=1.0.0,<2.0.0",
|
|
14
12
|
"utilo>=2.107.4,<3.0.0",
|
|
15
13
|
"cryptography>=38.0.0,<47.0.0",
|
|
16
14
|
]
|
|
17
|
-
|
|
18
|
-
# Optional but recommended metadata
|
|
19
15
|
keywords = []
|
|
20
16
|
classifiers = [
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
"Programming Language :: Python :: 3.12",
|
|
18
|
+
"Programming Language :: Python :: 3.13",
|
|
19
|
+
"Programming Language :: Python :: 3.14",
|
|
24
20
|
]
|
|
25
21
|
license = "MIT"
|
|
26
|
-
license-files = [
|
|
22
|
+
license-files = [
|
|
23
|
+
"LICENSE",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[project.readme]
|
|
27
|
+
file = "README"
|
|
28
|
+
content-type = "text/markdown"
|
|
27
29
|
|
|
28
30
|
[project.optional-dependencies]
|
|
29
31
|
dev = [
|
|
30
32
|
"utilotest>=1.0.1,<2.0.0",
|
|
31
|
-
# hardcore==0.9.0
|
|
32
33
|
"pdflog==1.0.2",
|
|
33
|
-
# extract all pdf
|
|
34
|
-
# rawmaker>=2.40.2<3.0.0
|
|
35
34
|
]
|
|
36
35
|
|
|
37
36
|
[project.urls]
|
|
38
37
|
Homepage = "https://github.com/anaticulae/hoverpower"
|
|
39
38
|
Repository = "https://github.com/anaticulae/hoverpower"
|
|
40
39
|
|
|
40
|
+
[project.scripts]
|
|
41
|
+
give = "hoverpower.cli.give:main"
|
|
42
|
+
power = "hoverpower.cli:main"
|
|
43
|
+
powersecret = "hoverpower.secret:create_secret"
|
|
44
|
+
powerencrypt = "hoverpower.secret:make_private"
|
|
45
|
+
powerdecrypt = "hoverpower.secret:make_public"
|
|
46
|
+
powerdownload = "hoverpower.path:download_packages"
|
|
47
|
+
|
|
41
48
|
[build-system]
|
|
42
49
|
requires = [
|
|
43
50
|
"setuptools>=82.0.1",
|
|
44
|
-
"wheel>=0.46.3"
|
|
51
|
+
"wheel>=0.46.3",
|
|
45
52
|
]
|
|
46
53
|
build-backend = "setuptools.build_meta"
|
|
47
54
|
|
|
48
55
|
[tool.semantic_release]
|
|
49
|
-
version_toml = [
|
|
50
|
-
|
|
51
|
-
|
|
56
|
+
version_toml = [
|
|
57
|
+
"pyproject.toml:project.version",
|
|
58
|
+
]
|
|
59
|
+
|
|
52
60
|
[tool.semantic_release.changelog]
|
|
53
61
|
mode = "init"
|
|
54
62
|
output_format = "md"
|
|
55
|
-
[tool.semantic_release.commit_parser_options]
|
|
56
|
-
# allways generate a new version
|
|
57
|
-
patch_tags = ["fix", "perf", "build", "chore", "ci", "docs", "style", "refactor", "test", "deps"]
|
|
58
63
|
|
|
59
|
-
[
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
64
|
+
[tool.semantic_release.changelog.default_templates]
|
|
65
|
+
changelog_file = "CHANGELOG"
|
|
66
|
+
|
|
67
|
+
[tool.semantic_release.commit_parser_options]
|
|
68
|
+
patch_tags = [
|
|
69
|
+
"fix",
|
|
70
|
+
"perf",
|
|
71
|
+
"build",
|
|
72
|
+
"chore",
|
|
73
|
+
"ci",
|
|
74
|
+
"docs",
|
|
75
|
+
"style",
|
|
76
|
+
"refactor",
|
|
77
|
+
"test",
|
|
78
|
+
"deps",
|
|
79
|
+
]
|
|
65
80
|
|
|
66
81
|
[tool.setuptools.packages.find]
|
|
67
|
-
where = [
|
|
82
|
+
where = [
|
|
83
|
+
".",
|
|
84
|
+
]
|
|
68
85
|
include = [
|
|
69
86
|
"hoverpower",
|
|
70
87
|
"hoverpower.cli",
|
|
88
|
+
"hoverpower.repo",
|
|
71
89
|
]
|
|
72
90
|
exclude = [
|
|
73
91
|
"tests/*",
|
|
@@ -14,6 +14,7 @@ import utilotest
|
|
|
14
14
|
|
|
15
15
|
import hoverpower
|
|
16
16
|
import hoverpower.cli
|
|
17
|
+
import hoverpower.data
|
|
17
18
|
import tests
|
|
18
19
|
|
|
19
20
|
|
|
@@ -87,8 +88,7 @@ def test_cli_all(td, mp):
|
|
|
87
88
|
cmd='--all',
|
|
88
89
|
mp=mp,
|
|
89
90
|
)
|
|
90
|
-
|
|
91
|
-
expected = tests.foldersize(hoverpower.REPO) - 1
|
|
91
|
+
expected = len(hoverpower.data.collect_folder())
|
|
92
92
|
assert tests.foldersize(td.tmpdir) == expected, f'{td.tmpdir} is empty'
|
|
93
93
|
|
|
94
94
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import utilo
|
|
2
|
+
|
|
3
|
+
import hoverpower.path
|
|
4
|
+
|
|
5
|
+
PROJECT = """\
|
|
6
|
+
[build-system]
|
|
7
|
+
requires = [
|
|
8
|
+
"setuptools>=82.0.1",
|
|
9
|
+
"wheel>=0.47.0",
|
|
10
|
+
]
|
|
11
|
+
build-backend = "setuptools.build_meta"
|
|
12
|
+
|
|
13
|
+
[project]
|
|
14
|
+
name = "genex"
|
|
15
|
+
version = "0.40.0"
|
|
16
|
+
description = ""
|
|
17
|
+
requires-python = ">=3.12"
|
|
18
|
+
authors = [
|
|
19
|
+
{ name = "Helmut Konrad Schewe", email = "helmutus@outlook.com" },
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
[project.readme]
|
|
23
|
+
file = "README"
|
|
24
|
+
content-type = "text/markdown"
|
|
25
|
+
|
|
26
|
+
[project.optional-dependencies]
|
|
27
|
+
dev = [
|
|
28
|
+
"utilotest>=1.0.4,<2.0.0",
|
|
29
|
+
"hoverpower>=1.1.0,<2.0.0",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[tool.hoverpower]
|
|
33
|
+
packages = [
|
|
34
|
+
"BACHELOR",
|
|
35
|
+
"DOCU",
|
|
36
|
+
"HOME",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def test_project_requires(td):
|
|
43
|
+
project = utilo.join(td.tmpdir, 'pyproject.toml')
|
|
44
|
+
utilo.file_create(project, PROJECT)
|
|
45
|
+
requires = hoverpower.path.requires(root=td.tmpdir)
|
|
46
|
+
assert requires
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_project_requires_invalid_config(td):
|
|
50
|
+
project = utilo.join(td.tmpdir, 'pyproject.toml')
|
|
51
|
+
data = PROJECT.replace('packages = [', 'pack = [')
|
|
52
|
+
utilo.file_create(project, data)
|
|
53
|
+
requires = hoverpower.path.requires(root=td.tmpdir)
|
|
54
|
+
assert not requires
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|