credsweeper 1.11.4__py3-none-any.whl → 1.11.5__py3-none-any.whl
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.
Potentially problematic release.
This version of credsweeper might be problematic. Click here for more details.
- credsweeper/__init__.py +1 -1
- credsweeper/deep_scanner/abstract_scanner.py +269 -14
- credsweeper/deep_scanner/deb_scanner.py +33 -26
- credsweeper/deep_scanner/deep_scanner.py +34 -247
- credsweeper/deep_scanner/jclass_scanner.py +74 -0
- credsweeper/deep_scanner/patch_scanner.py +48 -0
- credsweeper/deep_scanner/pkcs_scanner.py +41 -0
- credsweeper/deep_scanner/rpm_scanner.py +49 -0
- credsweeper/deep_scanner/sqlite3_scanner.py +79 -0
- credsweeper/file_handler/data_content_provider.py +1 -2
- credsweeper/file_handler/patches_provider.py +4 -1
- credsweeper/filters/__init__.py +1 -0
- credsweeper/filters/value_base64_key_check.py +9 -14
- credsweeper/filters/value_json_web_key_check.py +37 -0
- credsweeper/rules/config.yaml +48 -6
- credsweeper/scanner/scan_type/multi_pattern.py +1 -2
- credsweeper/secret/config.json +6 -6
- credsweeper/utils/pem_key_detector.py +2 -2
- credsweeper/utils/util.py +143 -75
- {credsweeper-1.11.4.dist-info → credsweeper-1.11.5.dist-info}/METADATA +3 -6
- {credsweeper-1.11.4.dist-info → credsweeper-1.11.5.dist-info}/RECORD +24 -19
- credsweeper/deep_scanner/pkcs12_scanner.py +0 -45
- {credsweeper-1.11.4.dist-info → credsweeper-1.11.5.dist-info}/WHEEL +0 -0
- {credsweeper-1.11.4.dist-info → credsweeper-1.11.5.dist-info}/entry_points.txt +0 -0
- {credsweeper-1.11.4.dist-info → credsweeper-1.11.5.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: credsweeper
|
|
3
|
-
Version: 1.11.
|
|
3
|
+
Version: 1.11.5
|
|
4
4
|
Summary: Credential Sweeper
|
|
5
5
|
Project-URL: Homepage, https://github.com/Samsung/CredSweeper
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/Samsung/CredSweeper/issues
|
|
@@ -37,6 +37,7 @@ Requires-Dist: python-dateutil
|
|
|
37
37
|
Requires-Dist: python-docx
|
|
38
38
|
Requires-Dist: python-pptx
|
|
39
39
|
Requires-Dist: pyyaml
|
|
40
|
+
Requires-Dist: rpmfile
|
|
40
41
|
Requires-Dist: whatthepatch
|
|
41
42
|
Requires-Dist: xlrd
|
|
42
43
|
Description-Content-Type: text/markdown
|
|
@@ -140,11 +141,7 @@ cat output.json
|
|
|
140
141
|
"value_start": 12,
|
|
141
142
|
"value_end": 19,
|
|
142
143
|
"variable": "password",
|
|
143
|
-
"
|
|
144
|
-
"iterator": "BASE64_CHARS",
|
|
145
|
-
"entropy": 2.120589933192232,
|
|
146
|
-
"valid": false
|
|
147
|
-
}
|
|
144
|
+
"entropy": 2.12059
|
|
148
145
|
}
|
|
149
146
|
]
|
|
150
147
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
credsweeper/__init__.py,sha256=
|
|
1
|
+
credsweeper/__init__.py,sha256=S6PVgyvVpXL4kDDCKSMW68iD69swkC7zB295w-9P8_U,632
|
|
2
2
|
credsweeper/__main__.py,sha256=W8T3LHhTjzdsn7tYXX9_cPRfgnNX1_Qr02Mw_s2IfQM,17221
|
|
3
3
|
credsweeper/app.py,sha256=GSKNb-sR7N4qTnZAyDsYVLmQm0zVMyQb4fQrxYLJfsk,20917
|
|
4
4
|
credsweeper/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -18,23 +18,27 @@ credsweeper/credentials/candidate_key.py,sha256=NsYGPqqjfm6z2MGtcQbiUGiWmKUCuzfl
|
|
|
18
18
|
credsweeper/credentials/credential_manager.py,sha256=cHEfIs2xb3n400D5Q6AC5CDM9jzzK_Fcb-VKVRh_H2U,4187
|
|
19
19
|
credsweeper/credentials/line_data.py,sha256=8-9sgK3n1gMg_L63Ked8f5PlIpimWTqnYCNCEmx6WZ0,20622
|
|
20
20
|
credsweeper/deep_scanner/__init__.py,sha256=Lp94BjQPZTgEa77E0v6xZaXZvQf2A-QTHsjqCzZxUFw,62
|
|
21
|
-
credsweeper/deep_scanner/abstract_scanner.py,sha256=
|
|
21
|
+
credsweeper/deep_scanner/abstract_scanner.py,sha256=oLT2bNof-5-sycXPHYpLKlfe2ULhU1lQCGk0BcD_6-s,15794
|
|
22
22
|
credsweeper/deep_scanner/byte_scanner.py,sha256=oHeA8mGe995SHqWvONhTDBIE5j50TQASHA9Mv6LHYuQ,1125
|
|
23
23
|
credsweeper/deep_scanner/bzip2_scanner.py,sha256=74RsjmeuffEuxmKl04lXIZt3q_Zvxj-gLHXACqVSU_o,1619
|
|
24
|
-
credsweeper/deep_scanner/deb_scanner.py,sha256=
|
|
25
|
-
credsweeper/deep_scanner/deep_scanner.py,sha256=
|
|
24
|
+
credsweeper/deep_scanner/deb_scanner.py,sha256=oX7xR_yl8JIno_n087RO1mD2mXrkKsOaFfkAqqiUFgg,2485
|
|
25
|
+
credsweeper/deep_scanner/deep_scanner.py,sha256=urWeFHeZrDgZmnNlSoFSPmtbDJowr1ukNUd9GiRcJ6s,6289
|
|
26
26
|
credsweeper/deep_scanner/docx_scanner.py,sha256=_xIuw5SkGU1wO_9C3fXVycM-iSmU9qUzWa53etuFvMI,4153
|
|
27
27
|
credsweeper/deep_scanner/eml_scanner.py,sha256=iRLr2yvBWGktT2oXxl-haqnhJN3tglO1Mej10hFk0as,3512
|
|
28
28
|
credsweeper/deep_scanner/encoder_scanner.py,sha256=ULv9AgfG_ZLCYYgyUeQicna9u1i-rlmOiE4euvqahmY,1315
|
|
29
29
|
credsweeper/deep_scanner/gzip_scanner.py,sha256=DwG3rSC2YxvE6aTiSKDXoqMSM1wCag_1AX2NYnDQYTM,1695
|
|
30
30
|
credsweeper/deep_scanner/html_scanner.py,sha256=Mh6gUxvlMnI4Kys7V8ZBBExQSsOYqYUbil7FYiXX4lc,1486
|
|
31
|
+
credsweeper/deep_scanner/jclass_scanner.py,sha256=yv1An74TYSLQPil3BAL7emc2rgE1zB6Kbb3NOo65eBk,2971
|
|
31
32
|
credsweeper/deep_scanner/jks_scanner.py,sha256=1BqHfOmqcznrhMN-9aH-L8yamIAj72OYr7_DBuuj0_c,1867
|
|
32
33
|
credsweeper/deep_scanner/lang_scanner.py,sha256=6d_n3Gjj8HPvNayalDn48QGbRMofmOwFUyS6V8JQsVU,1340
|
|
33
34
|
credsweeper/deep_scanner/lzma_scanner.py,sha256=RTx9AdIJNblKupXLtO-K6vz8RBO9z_vYc0A15Ij0db4,1693
|
|
34
35
|
credsweeper/deep_scanner/mxfile_scanner.py,sha256=Qq2-9nfqYr63chDzzKsMIyHKvagPcWIpF4ngLFGwLyM,2098
|
|
36
|
+
credsweeper/deep_scanner/patch_scanner.py,sha256=f371z_6-fxl5AESWB3BGU7_mozfHwTF3NdsaHFB8MME,2255
|
|
35
37
|
credsweeper/deep_scanner/pdf_scanner.py,sha256=LMyIoVJPNFOFnAfcZ5Akr7PTWSUBNPT6GtQB1U5hI0g,3048
|
|
36
|
-
credsweeper/deep_scanner/
|
|
38
|
+
credsweeper/deep_scanner/pkcs_scanner.py,sha256=nUdCUuCaYn5hGTFtcYhmFZSgLTw0UHaSTjh6UFz5l88,1734
|
|
37
39
|
credsweeper/deep_scanner/pptx_scanner.py,sha256=aMX6GgnUEShonHjlqhaI5w970b-2yxmKsld5kY1XdeQ,1828
|
|
40
|
+
credsweeper/deep_scanner/rpm_scanner.py,sha256=MyLQMBxdAatum5_zRNK9VFbqXJ9u16xqf3jmjUm4TUM,2288
|
|
41
|
+
credsweeper/deep_scanner/sqlite3_scanner.py,sha256=9XaFTtSZoiaKKPIrDpxDsFIh8m3wILR3c2927dWgXCQ,3510
|
|
38
42
|
credsweeper/deep_scanner/tar_scanner.py,sha256=L3a9OUhQQweDNLVbe_LNLhldtVeU8DlS0Ux3ip_KN2w,2425
|
|
39
43
|
credsweeper/deep_scanner/tmx_scanner.py,sha256=6BsMysSSSJrxtssh4bf1e4vwpps7yXDDvByFkyLhC_o,1946
|
|
40
44
|
credsweeper/deep_scanner/xlsx_scanner.py,sha256=Ck8j14OWy9LTXK0GBASCdPq9VhZe5ceUv0uZShFFpo8,2706
|
|
@@ -45,16 +49,16 @@ credsweeper/file_handler/abstract_provider.py,sha256=sl0XrlbRDak885UzD7HBruXAD9v
|
|
|
45
49
|
credsweeper/file_handler/analysis_target.py,sha256=FEznSNcUbTaqGa3ZKy8FusdqDR7CxFX1fwIrA_LdwoY,2752
|
|
46
50
|
credsweeper/file_handler/byte_content_provider.py,sha256=aqYndCeDSF1BLEYUzwcl3BASuuUr1vlU6l-Eo73eEw4,1930
|
|
47
51
|
credsweeper/file_handler/content_provider.py,sha256=HYlAL1wRZeQe49upKt4_Y00Gsja88jWKeIeNbkm2hR0,3888
|
|
48
|
-
credsweeper/file_handler/data_content_provider.py,sha256=
|
|
52
|
+
credsweeper/file_handler/data_content_provider.py,sha256=fKeScBiHxC4Fj4Ty48HoMFI3eK_t3RKYrBFCNUwkhDc,17662
|
|
49
53
|
credsweeper/file_handler/descriptor.py,sha256=LQHjzmRL0fl8mlKwA--Nl_D4mKFtg9VsUJnWZqtjFhU,185
|
|
50
54
|
credsweeper/file_handler/diff_content_provider.py,sha256=FtlHa7Y5LrXrzQNFOeRhVqQjtbWe0m82wmXHHjPXntw,3209
|
|
51
55
|
credsweeper/file_handler/file_path_extractor.py,sha256=lSwbl2Q4eTEo8U-SghzijoFL6H0q3W7LtE-iGF3Qkvg,6889
|
|
52
56
|
credsweeper/file_handler/files_provider.py,sha256=qpaIQw9JWGrxv-mQyD_1KPoWppyaZYaBoZJDt3DykFU,2569
|
|
53
|
-
credsweeper/file_handler/patches_provider.py,sha256=
|
|
57
|
+
credsweeper/file_handler/patches_provider.py,sha256=uI7UoN8R2DA1ZB4u-Y2bF2YcIU4-wA1g7eAQTavApE0,3121
|
|
54
58
|
credsweeper/file_handler/string_content_provider.py,sha256=e7mHLwa5bkHthI3hr5pP7ZlyoFfPeeVbmTAlZG2-xB4,2481
|
|
55
59
|
credsweeper/file_handler/struct_content_provider.py,sha256=H1ZhSosaWJEOtzWYC1rve0glrJUu2UDYjmOx-9DDNxs,1595
|
|
56
60
|
credsweeper/file_handler/text_content_provider.py,sha256=5Qg_4LIYB3O4MZo4Gqtno4o8rPU2hPy6tOR_7wS87Kw,3003
|
|
57
|
-
credsweeper/filters/__init__.py,sha256=
|
|
61
|
+
credsweeper/filters/__init__.py,sha256=PxkARBwh1n8dIi5vtAXn7INdxA0YlLbaAoYfoEwU_UA,3345
|
|
58
62
|
credsweeper/filters/filter.py,sha256=CqZbTsIDNVVwQyOjNekgNr_i1nPS4foutm0AvGAjM5M,826
|
|
59
63
|
credsweeper/filters/line_git_binary_check.py,sha256=G5N-woSLXC1mdiD80AhXbOpJCjGwtvFwFwMmRu87qlY,1595
|
|
60
64
|
credsweeper/filters/line_specific_key_check.py,sha256=rM66tPmUCXPaCUpNokIkJukOyxOL4FB8ig74ezYrbBs,1536
|
|
@@ -66,7 +70,7 @@ credsweeper/filters/value_azure_token_check.py,sha256=GlIqmzinjtQ4GU8-_ZyFTM2uo1
|
|
|
66
70
|
credsweeper/filters/value_base32_data_check.py,sha256=nS_X5vb5e0fXnjxGjyGE9wedmAj6B14AG8dEjRClREQ,1390
|
|
67
71
|
credsweeper/filters/value_base64_data_check.py,sha256=J5dMgJsfs13MxijOMqGLYU8PZz5eEDUBrWVKp0mE3T0,1449
|
|
68
72
|
credsweeper/filters/value_base64_encoded_pem_check.py,sha256=k7J6FY3SCdgnHRkoSCPMKcUgyTOOTl4t4tHZI6hvSiA,1600
|
|
69
|
-
credsweeper/filters/value_base64_key_check.py,sha256=
|
|
73
|
+
credsweeper/filters/value_base64_key_check.py,sha256=yu3j34TT5dv-ttRS5bGEqgl0AWS414O2Knqn9tKtTSE,1904
|
|
70
74
|
credsweeper/filters/value_base64_part_check.py,sha256=wV_qGv9xK4H8EB903Qw5xbVtjAQ19ZZKhhHFoQ53AT8,4958
|
|
71
75
|
credsweeper/filters/value_blocklist_check.py,sha256=CSsD68QRF1zFLM2MB5pGRRs95O8IepZ9AUZYdxlBf-c,1145
|
|
72
76
|
credsweeper/filters/value_camel_case_check.py,sha256=cCBogfL5X9ufAbkl5QwqN6qvHz4XYaeaENC6ew4m4Ac,1233
|
|
@@ -84,6 +88,7 @@ credsweeper/filters/value_grafana_check.py,sha256=4wagCuVCSDoO5Kc0-U4Y7eUvBlYUAJ
|
|
|
84
88
|
credsweeper/filters/value_grafana_service_check.py,sha256=fL8v4pXS-GopeE_WKNB6rlm9XFzdNapCxO5dH0Z14B4,1133
|
|
85
89
|
credsweeper/filters/value_hex_number_check.py,sha256=XuMw6zBQP4WQoH3Y7a4DZnKMVVVC09_bAfB21I8FBfA,976
|
|
86
90
|
credsweeper/filters/value_jfrog_token_check.py,sha256=jugEhQBRjd6Zb9VYoQqBlki1TyeNoupIrzXB-frpjho,1656
|
|
91
|
+
credsweeper/filters/value_json_web_key_check.py,sha256=KegWqDC3oSi5FgsBWd2kH_GrojBSWwV9NPqHiZxfh7A,1325
|
|
87
92
|
credsweeper/filters/value_json_web_token_check.py,sha256=Tvu0rsb8NJ2jnZc5EWZ_dbJCQZlSDdBoGpB0WM18n64,2829
|
|
88
93
|
credsweeper/filters/value_last_word_check.py,sha256=ZEJ-pqpMLSBQE_bCz325WZK5g_fXbfk6bv5Csz0J_MM,900
|
|
89
94
|
credsweeper/filters/value_method_check.py,sha256=mkTmSGnQBKtELTpNrKh6v_5VyORrVLVH8Zps7nJI4e4,1113
|
|
@@ -132,23 +137,23 @@ credsweeper/ml_model/features/word_in_transition.py,sha256=SgG8D37lXnDaFOKagi9lb
|
|
|
132
137
|
credsweeper/ml_model/features/word_in_value.py,sha256=QCVJRpcqEg-xC9a94fppqQbvReQLZSHNi0Zrtmr9Ul0,571
|
|
133
138
|
credsweeper/ml_model/features/word_in_variable.py,sha256=aETM5N2AF7FJhmrzLYDvMpKt-K1D8J0ZULxsgSRMXPU,534
|
|
134
139
|
credsweeper/rules/__init__.py,sha256=alXS8IivUs-AKKbVHiWvSjFpg1urJZLKItuFr61HHyg,40
|
|
135
|
-
credsweeper/rules/config.yaml,sha256=
|
|
140
|
+
credsweeper/rules/config.yaml,sha256=CkhTgmi97QSPT7ZyL1n_mJKg9rdJYXUBeMs5U3e9SVw,39122
|
|
136
141
|
credsweeper/rules/rule.py,sha256=JyK712m75E4ALxq7gEh_ex_b0MZvC0Bw2_2pzeAoLFY,10209
|
|
137
142
|
credsweeper/scanner/__init__.py,sha256=KUh1uUEgZOd12DiXV-TQP3OvByI9tsyqN1KCdw994h8,48
|
|
138
143
|
credsweeper/scanner/scanner.py,sha256=2znRjqV9Mx4D0z9elUslOQIoLbfDybu1hF1TEaRzTkc,10127
|
|
139
144
|
credsweeper/scanner/scan_type/__init__.py,sha256=JHOdDZv5bmGsj0dhIiApvjcFzQ8LYkCQdWmhxAs4lgI,288
|
|
140
|
-
credsweeper/scanner/scan_type/multi_pattern.py,sha256=
|
|
145
|
+
credsweeper/scanner/scan_type/multi_pattern.py,sha256=IArPTLKfi3FYNoHq9OYVUjrrT7wHZwSCTPrpl8SP1IQ,3816
|
|
141
146
|
credsweeper/scanner/scan_type/pem_key_pattern.py,sha256=R_rxKS-cx79g08BOdnhHUyDU9_je3qQuPsVPqEMPB18,1501
|
|
142
147
|
credsweeper/scanner/scan_type/scan_type.py,sha256=AtKfIsYgvxmHp508j3DfwiEDp0zD77YPzYjrrwKy1no,9396
|
|
143
148
|
credsweeper/scanner/scan_type/single_pattern.py,sha256=TCbjbeK0NrWzU6eBMZqHjYXo3xAfc0a7z3HDbbyHY-c,954
|
|
144
|
-
credsweeper/secret/config.json,sha256=
|
|
149
|
+
credsweeper/secret/config.json,sha256=X1sr2kXBfmr_9-6qZ1t3aCzg5Cv-rGQaZsZqxeVi99o,3501
|
|
145
150
|
credsweeper/secret/log.yaml,sha256=h29atN5Kvk68oKuTYG2Mi4f2uNO3dvwhOkzCRBKo1rg,952
|
|
146
151
|
credsweeper/utils/__init__.py,sha256=wPdTkrSBAkR3rppFZ68k6MiT_P7tIHuAb3AcwndJCWg,63
|
|
147
152
|
credsweeper/utils/hop_stat.py,sha256=vMd_1lcpDo4yaFhi61X0tJeeE83qUbzPckvxZcrgsgs,3010
|
|
148
|
-
credsweeper/utils/pem_key_detector.py,sha256=
|
|
149
|
-
credsweeper/utils/util.py,sha256=
|
|
150
|
-
credsweeper-1.11.
|
|
151
|
-
credsweeper-1.11.
|
|
152
|
-
credsweeper-1.11.
|
|
153
|
-
credsweeper-1.11.
|
|
154
|
-
credsweeper-1.11.
|
|
153
|
+
credsweeper/utils/pem_key_detector.py,sha256=Z0vFTF8pELCW2O4vgRH5rQhnM_XcndFxo_r4KVP3XA0,7566
|
|
154
|
+
credsweeper/utils/util.py,sha256=xyO4kZt99fAe3Ui5uCgo__rrOJkQbKTI94v8YdH5hhc,32625
|
|
155
|
+
credsweeper-1.11.5.dist-info/METADATA,sha256=lAAy2KsTBbtiXBHOXru5UPiF2NBu-xsZjzCpcuSgvHU,10371
|
|
156
|
+
credsweeper-1.11.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
157
|
+
credsweeper-1.11.5.dist-info/entry_points.txt,sha256=SLGNZshvi3zpWPhVmRP-oDXRMRPBS4tzRDy6xYOXwqA,58
|
|
158
|
+
credsweeper-1.11.5.dist-info/licenses/LICENSE,sha256=aU7mGjBKbmRHNLVXXzcPdKmTtBxRwDPtjflQRfN7fFg,1065
|
|
159
|
+
credsweeper-1.11.5.dist-info/RECORD,,
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from abc import ABC
|
|
3
|
-
from typing import List, Optional
|
|
4
|
-
|
|
5
|
-
import cryptography.hazmat.primitives.serialization.pkcs12
|
|
6
|
-
|
|
7
|
-
from credsweeper.credentials import Candidate
|
|
8
|
-
from credsweeper.deep_scanner.abstract_scanner import AbstractScanner
|
|
9
|
-
from credsweeper.file_handler.data_content_provider import DataContentProvider
|
|
10
|
-
|
|
11
|
-
logger = logging.getLogger(__name__)
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class Pkcs12Scanner(AbstractScanner, ABC):
|
|
15
|
-
"""Implements pkcs12 scanning"""
|
|
16
|
-
|
|
17
|
-
def data_scan(
|
|
18
|
-
self, #
|
|
19
|
-
data_provider: DataContentProvider, #
|
|
20
|
-
depth: int, #
|
|
21
|
-
recursive_limit_size: int) -> Optional[List[Candidate]]:
|
|
22
|
-
"""Tries to scan PKCS12 to open with standard password"""
|
|
23
|
-
for pw_probe in self.config.bruteforce_list:
|
|
24
|
-
try:
|
|
25
|
-
(private_key, _certificate, _additional_certificates) \
|
|
26
|
-
= cryptography.hazmat.primitives.serialization.pkcs12.load_key_and_certificates(data_provider.data,
|
|
27
|
-
pw_probe.encode())
|
|
28
|
-
# the password probe has passed, it will be the value
|
|
29
|
-
value = pw_probe or "<EMPTY PASSWORD>"
|
|
30
|
-
info = (f"{data_provider.info}|PKCS12:"
|
|
31
|
-
f"'{value}' {'sensitive data' if private_key else 'default password'}")
|
|
32
|
-
candidate = Candidate.get_dummy_candidate(
|
|
33
|
-
self.config, #
|
|
34
|
-
data_provider.file_path, #
|
|
35
|
-
data_provider.file_type, #
|
|
36
|
-
info, #
|
|
37
|
-
"PKCS12")
|
|
38
|
-
candidate.line_data_list[0].line = f"'{value}' is the password"
|
|
39
|
-
candidate.line_data_list[0].value = value
|
|
40
|
-
candidate.line_data_list[0].value_start = 1
|
|
41
|
-
candidate.line_data_list[0].value_end = 1 + len(candidate.line_data_list[0].value)
|
|
42
|
-
return [candidate]
|
|
43
|
-
except Exception as pkcs_exc:
|
|
44
|
-
logger.debug(f"{data_provider.file_path}:{pw_probe}:{pkcs_exc}")
|
|
45
|
-
return None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|