reproto 0.1.2__py3-none-any.whl → 0.1.3__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.
Files changed (77) hide show
  1. .git/COMMIT_EDITMSG +24 -25
  2. .git/index +0 -0
  3. .git/logs/HEAD +3 -0
  4. .git/logs/refs/heads/iyue +3 -0
  5. .git/logs/refs/remotes/gitlab/iyue +3 -0
  6. .git/logs/refs/remotes/origin/iyue +3 -0
  7. .git/objects/00/81a7e1ec3251cc192ed2b73d5be897593fb872 +0 -0
  8. .git/objects/00/885cebf557ff261574deb93cb96449d06db01c +0 -0
  9. .git/objects/02/33f5b60263e5dc6d041c0b223a0724eb650faa +0 -0
  10. .git/objects/07/557fbd1d149ce51af8e98e8ca8590757a89dfa +0 -0
  11. .git/objects/12/f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f +0 -0
  12. .git/objects/24/d78e796570a8572a03bc1dd26608a7cfb506f8 +2 -0
  13. .git/objects/2a/fe93d8bcbeab9e136d8b6766604c32b3610314 +0 -0
  14. .git/objects/2d/8a0da260a710010ae62be134ac1cea6ceecfd1 +0 -0
  15. .git/objects/2d/e8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8 +0 -0
  16. .git/objects/30/9347e5681d80bd3c7949882e27090dd9070d16 +0 -0
  17. .git/objects/33/633c9df669ff8cf38638717937a54990814268 +0 -0
  18. .git/objects/39/993e3600bf4ab82aa361b738ee97a108787450 +0 -0
  19. .git/objects/3b/ab663710fd6b43d9372313fced9043c4cb07dd +0 -0
  20. .git/objects/3e/b3f1273caf6814dfa69325ccbd9fd1340cf20a +0 -0
  21. .git/objects/45/fbc774dedb61c7c205ea732f59a8dca8d13555 +3 -0
  22. .git/objects/60/5cb6fd6a9f8894ad4d43a9b8e4785c1b3b0e17 +1 -0
  23. .git/objects/60/f61a0ea50091eac8d344c86597375cbdfc2785 +0 -0
  24. .git/objects/63/ddda2a403efaab3f4c6597b3a73a7b1147adb5 +0 -0
  25. .git/objects/66/6c5c5fc30435228116fa08c9d821bebaaa8926 +0 -0
  26. .git/objects/7c/ef0adfb28fd774bc78061c6f088e1ef9b050f6 +0 -0
  27. .git/objects/7d/dc129188a10c68ab756ef2cacb292c76920403 +0 -0
  28. .git/objects/80/17038e0f7818a44a742f77c86f4f88ed768fcd +0 -0
  29. .git/objects/87/c7db6c91c17a2df84b56d30bd24a0f6b9dbdd9 +0 -0
  30. .git/objects/92/984cf67b2c25d435468a8218daa26ba0466054 +0 -0
  31. .git/objects/93/140b54b1fb9116ee214afee8abf2c72a232487 +0 -0
  32. .git/objects/93/68f2c32f83054ab072b7c9686d8baa0bad7f12 +4 -0
  33. .git/objects/9a/5ad062be9f6e001f4237a598a08981aba731e6 +0 -0
  34. .git/objects/a1/655e0cb323c300562f97dcc67d5a446908c8ec +0 -0
  35. .git/objects/a5/38cc82cef7c49500d3522220f0f60a9ebc1ae6 +0 -0
  36. .git/objects/a9/41063a7ce89c353fa24378ec7c3f12f08f9df8 +0 -0
  37. .git/objects/ac/5c983d949d8c928bb022badf801e45e75e785e +0 -0
  38. .git/objects/b0/82ca2c1b5a03edff25da3c2b2b573d049877e9 +0 -0
  39. .git/objects/bc/e98bdb71c8681acb460195fdcbbe5d36290976 +0 -0
  40. .git/objects/c1/87d5e047eca86cfd8d444be2987aaa3f62c4d6 +0 -0
  41. .git/objects/c4/c2da96b0bb8db2acb0e6615cf340c7e51af26b +0 -0
  42. .git/objects/c5/13a96e7584636b20b12280c029750d5bc3da1e +0 -0
  43. .git/objects/c7/c34283697bd3cce07db53953eda25ee7cc371e +0 -0
  44. .git/objects/c9/d60d922a04b87587cd67b0abf9fe5a7b7b76cd +0 -0
  45. .git/objects/d2/69b1676dbf32f76a7c405d0b4ea6a70ac3a626 +0 -0
  46. .git/objects/d3/5a918b1d9125ad35d60e08b181323df3246f1a +0 -0
  47. .git/objects/d8/eaf86669fbfd10497570c1784db1ed2696b588 +0 -0
  48. .git/objects/d9/90e6d553577d37ebce8b28b3015ecbde038b42 +0 -0
  49. .git/objects/da/13cc15bcd8ee39c81f36dee7f179a569ecab0b +0 -0
  50. .git/objects/e4/4c1d8a90207ac082d8ab7ff0db66708e2ebc31 +0 -0
  51. .git/objects/f8/ed595d25bd9d500e765a792c513878f7ddb1f7 +0 -0
  52. .git/refs/heads/iyue +1 -1
  53. .git/refs/remotes/gitlab/iyue +1 -1
  54. .git/refs/remotes/origin/iyue +1 -1
  55. README.md +104 -190
  56. core/__init__.py +23 -0
  57. core/info_decoder.py +13 -4
  58. core/reconstructor.py +25 -16
  59. generation/__init__.py +17 -0
  60. generation/proto_generator.py +11 -5
  61. main.py +53 -56
  62. models/__init__.py +31 -24
  63. parsing/__init__.py +22 -0
  64. parsing/enum_parser.py +10 -2
  65. parsing/java_parser.py +7 -1
  66. pyproject.toml +1 -1
  67. reproto-0.1.3.dist-info/METADATA +209 -0
  68. {reproto-0.1.2.dist-info → reproto-0.1.3.dist-info}/RECORD +75 -30
  69. utils/__init__.py +40 -0
  70. utils/builtin_proto.py +8 -1
  71. utils/file_cache.py +8 -1
  72. utils/report_utils.py +71 -0
  73. utils/type_index.py +8 -1
  74. core/bytecode_parser.py +0 -274
  75. reproto-0.1.2.dist-info/METADATA +0 -295
  76. {reproto-0.1.2.dist-info → reproto-0.1.3.dist-info}/WHEEL +0 -0
  77. {reproto-0.1.2.dist-info → reproto-0.1.3.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,209 @@
1
+ Metadata-Version: 2.3
2
+ Name: reproto
3
+ Version: 0.1.3
4
+ Summary: 一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构.
5
+ License: Proprietary
6
+ Keywords: protobuf,reverse-engineering,android,jadx,proto
7
+ Author: iyue
8
+ Author-email: ys1231@126.com
9
+ Requires-Python: >=3.12,<4.0
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: Other/Proprietary License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Topic :: Software Development :: Code Generators
17
+ Classifier: Topic :: Software Development :: Disassemblers
18
+ Requires-Dist: loguru (>=0.7.3)
19
+ Project-URL: Homepage, https://github.com/ys1231/reproto
20
+ Project-URL: Repository, https://github.com/ys1231/reproto.git
21
+ Description-Content-Type: text/markdown
22
+
23
+ # Protobuf Reconstructor
24
+
25
+ 🔧 **从JADX反编译的Java源码自动重构Protobuf .proto文件**
26
+
27
+ 一个强大的逆向工程工具,能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构。
28
+
29
+ ## ✨ 特性
30
+
31
+ - 🎯 **精准解析**: 基于Google Protobuf Lite字节码的逆向工程
32
+ - 🔄 **递归依赖**: 自动发现和处理所有依赖的消息和枚举类型
33
+ - 📦 **完整支持**: 支持oneof、repeated、map、枚举等所有Protobuf特性
34
+ - 🌐 **通用性**: 适用于任何Android应用,无需硬编码映射
35
+ - 🧠 **智能推断**: 从Java源码直接读取类型信息,确保高准确性
36
+ - 📝 **标准输出**: 严格遵循Google Proto Style Guide
37
+
38
+ ## 🛠️ 安装
39
+
40
+ ### 方式一:拉取代码
41
+ ```bash
42
+ # 克隆项目
43
+ git clone <repository_url>
44
+ cd reproto
45
+
46
+ # 安装依赖
47
+ pip install -r requirements.txt
48
+ ```
49
+
50
+ ### 方式二:pip安装
51
+ ```bash
52
+ # 从本地构建安装
53
+ pip install .
54
+
55
+ # 在线安装
56
+ pip install reproto
57
+ ```
58
+
59
+ ## 📖 使用
60
+
61
+ ### 命令行使用
62
+ ```bash
63
+ # 基本用法 python main.py or 命令 reproto
64
+ reproto <java_sources_dir> <root_class> <output_dir> [--verbose]
65
+
66
+ # 示例:重构普通类
67
+ reproto ./out_jadx/sources com.example.messaging.v1.models.MessageData ./protos_generated
68
+
69
+ # 示例:重构内部类(注意:包含$的类名需要用单引号包裹)
70
+ reproto ./out_jadx/sources 'com.example.account.v1.Models$Onboarded' ./output
71
+
72
+ # 详细输出
73
+ reproto ./out_jadx/sources com.example.Model ./output --verbose
74
+ ```
75
+
76
+ ### 代码使用
77
+ ```python
78
+ # 作为包使用
79
+ from core import ProtoReconstructor
80
+ from utils.logger import setup_logger
81
+ from pathlib import Path
82
+
83
+ # 初始化
84
+ setup_logger("./logs")
85
+ sources_dir = Path("./out_jadx/sources")
86
+ output_dir = Path("./protos_generated")
87
+
88
+ # 创建重构器并执行
89
+ reconstructor = ProtoReconstructor(sources_dir, output_dir)
90
+ results = reconstructor.reconstruct_from_root("com.example.Model")
91
+
92
+ # 查看结果
93
+ for class_name, definition in results.items():
94
+ print(f"生成: {class_name} -> {definition.proto_filename}")
95
+ ```
96
+
97
+ ### 参数说明
98
+ - `java_sources_dir`: JADX反编译的Java源码目录路径
99
+ - `root_class`: 要重构的根类完整类名
100
+ - `output_dir`: 生成的proto文件输出目录路径
101
+ - `--verbose`: 显示详细处理信息
102
+
103
+ ## ⚠️ 注意事项
104
+
105
+ ### 重要提醒
106
+ - **内部类命名**: 包含`$`符号的类名(如内部类)必须用**单引号包裹**
107
+ ```bash
108
+ # ✅ 正确
109
+ reproto ./sources 'com.example.Outer$Inner' ./output
110
+
111
+ # ❌ 错误
112
+ reproto ./sources com.example.Outer$Inner ./output
113
+ ```
114
+
115
+ ### 使用建议
116
+ 1. **JADX反编译**: 先使用JADX反编译APK文件
117
+ ```bash
118
+ jadx -d out_jadx app.apk
119
+ ```
120
+
121
+ 2. **类名查找**: 在JADX GUI中找到目标Protobuf类的完整类名
122
+
123
+ 3. **输出目录**: 确保输出目录有写入权限
124
+
125
+ 4. **日志查看**: 使用`--verbose`参数查看详细处理过程
126
+
127
+ ## 📊 输出示例
128
+
129
+ ### 输入:Java源码
130
+ ```java
131
+ public final class SearchResult extends GeneratedMessageLite {
132
+ private MapFieldLite<String, Contact> contacts_;
133
+ private Internal.ProtobufList<String> phoneNumbers_;
134
+
135
+ public static final int CONTACTS_FIELD_NUMBER = 1;
136
+ public static final int PHONE_NUMBERS_FIELD_NUMBER = 2;
137
+ }
138
+ ```
139
+
140
+ ### 输出:Proto文件
141
+ ```protobuf
142
+ syntax = "proto3";
143
+
144
+ package com.example.search.v1.models;
145
+
146
+ option java_package = "com.example.search.v1.models";
147
+ option java_multiple_files = true;
148
+
149
+ message SearchResult {
150
+ map<string, Contact> contacts = 1;
151
+ repeated string phone_numbers = 2;
152
+ }
153
+ ```
154
+
155
+ ## 🛠️ 支持的特性
156
+
157
+ ### Protobuf类型支持
158
+ - ✅ 基础类型:`string`, `int32`, `int64`, `bool`, `float`, `double`
159
+ - ✅ 消息类型:嵌套消息和引用消息
160
+ - ✅ 枚举类型:完整的枚举值解析
161
+ - ✅ 重复字段:`repeated` 类型
162
+ - ✅ 映射字段:`map<key, value>` 类型
163
+ - ✅ Oneof字段:互斥字段组
164
+ - ✅ Google Well-Known Types
165
+
166
+ ### 特殊Java类型
167
+ - `MapFieldLite<K, V>` → `map<K, V>`
168
+ - `Internal.ProtobufList<T>` → `repeated T`
169
+ - `Internal.IntList` → `repeated enum` (枚举列表)
170
+
171
+ ## 📁 项目结构
172
+
173
+ ```
174
+ reproto/
175
+ ├── main.py # 主程序入口
176
+ ├── core/ # 核心组件
177
+ │ ├── reconstructor.py # 主协调器
178
+ │ └── info_decoder.py # 字节码解码器
179
+ ├── parsing/ # 解析模块
180
+ │ ├── java_parser.py # Java文件解析器
181
+ │ └── enum_parser.py # 枚举解析器
182
+ ├── generation/ # 生成模块
183
+ │ └── proto_generator.py # Proto文件生成器
184
+ ├── models/ # 数据模型
185
+ │ └── message_definition.py # 消息和枚举定义
186
+ ├── utils/ # 工具函数
187
+ │ ├── logger.py # 日志系统
188
+ │ ├── file_cache.py # 文件缓存系统
189
+ │ ├── type_utils.py # 类型处理工具
190
+ │ └── report_utils.py # 结果统计工具
191
+ └── include/ # Google Protobuf标准文件
192
+ └── google/protobuf/ # Well-Known Types
193
+ ```
194
+
195
+ ## 🔧 开发
196
+
197
+ ```bash
198
+ # 使用Poetry管理依赖
199
+ poetry install
200
+ poetry shell
201
+
202
+ # 运行测试
203
+ reproto ../out_jadx/sources com.example.TestClass ../test_output --verbose
204
+ ```
205
+
206
+ ---
207
+
208
+ **🚀 立即开始重构你的Protobuf文件!**
209
+
@@ -1,4 +1,4 @@
1
- .git/COMMIT_EDITMSG,sha256=ZMxpH6pUokSXJnvPbcBeiLQoVYGBv8788wLQgPcFiNA,1448
1
+ .git/COMMIT_EDITMSG,sha256=EwGSPDXcG7NYrPVVf9yXMFd9roBbDcpRt9JIhQTqlhw,982
2
2
  .git/FETCH_HEAD,sha256=1W_vttZCTHf9DXnCOhWjilD3kVx9WT2Xu85YBetV3ok,191
3
3
  .git/HEAD,sha256=ly8yuQLWQE8njkYAapHLPJ1xVg6_fMgQjCoHqKvFIdw,21
4
4
  .git/config,sha256=9ZAySfDWBdI-K9eOXyrEQOhiX68AiaP0Z4CLzH07H10,399
@@ -17,18 +17,23 @@
17
17
  .git/hooks/push-to-checkout.sample,sha256=pT0HQXmLKHxt16-mSu5HPzBeZdP0lGO7nXQI7DsSv18,2783
18
18
  .git/hooks/sendemail-validate.sample,sha256=ROv8kj3FRmvACWAvDs8Ge5xlRZq_6IaN3Em3jmztepI,2308
19
19
  .git/hooks/update.sample,sha256=jV8vqD4QPPCLV-qmdSHfkZT0XL28s32lKtWGCXoU0QY,3650
20
- .git/index,sha256=BER3aCt6YwpTb83kAomV29Y3J8N9jcywkFQVsXY1Xb8,4051
20
+ .git/index,sha256=duwg4sdUR_alJ5nxmVjRRMxG428rf-bBytr9LNrO1_0,4051
21
21
  .git/info/exclude,sha256=ZnH-g7egfIky7okWTR8nk7IxgFjri5jcXAbuClo7DsE,240
22
- .git/logs/HEAD,sha256=-CcVfS3LpVa-2MqX9JK7LnQRWoK7vCUcDLJeq3pM4uU,2713
23
- .git/logs/refs/heads/iyue,sha256=-CcVfS3LpVa-2MqX9JK7LnQRWoK7vCUcDLJeq3pM4uU,2713
24
- .git/logs/refs/remotes/gitlab/iyue,sha256=jeolLO8iLbjBoFjZN__vHDb7FKx23J926MSII56UAJ4,1904
22
+ .git/logs/HEAD,sha256=xSZx97kdcyJM7yzEX-YE16uicQjg_g7zN92fe7pgDXw,3237
23
+ .git/logs/refs/heads/iyue,sha256=xSZx97kdcyJM7yzEX-YE16uicQjg_g7zN92fe7pgDXw,3237
24
+ .git/logs/refs/remotes/gitlab/iyue,sha256=Iic8I88_Gr5u6r4Y_zbsnmidUOKFz43p3HdDu5Lo74k,2312
25
25
  .git/logs/refs/remotes/origin/HEAD,sha256=4vCPTgC0N80jhmkFXNUlYvHtGllYJkQTGZEn6LlqZgs,163
26
- .git/logs/refs/remotes/origin/iyue,sha256=uT9xHigXpK42G5YW12Vz_w51KYtge70zwBhUL0_mYtE,1904
26
+ .git/logs/refs/remotes/origin/iyue,sha256=GbAv5EUPHJKfS6YHcslLUSKoV6gFzBx2jv5HHppCxfM,2312
27
+ .git/objects/00/81a7e1ec3251cc192ed2b73d5be897593fb872,sha256=qvjEp_xD7FT8C2qIxFzoHETfgdG_Ilj-ZKMURK0woik,2268
28
+ .git/objects/00/885cebf557ff261574deb93cb96449d06db01c,sha256=AFzclJZweg-CmVNt99YI3Ho9dqghj1vsZrPI4Jy9mkI,288
29
+ .git/objects/02/33f5b60263e5dc6d041c0b223a0724eb650faa,sha256=M92vMZ87NltwEsn7mZuk87PtBP687n4-ET0qrPtk7Tg,507
27
30
  .git/objects/03/3fab23ccc74b707a31f6f37dc5df42c100aac0,sha256=QeXQ9x_0kJVZzjaA6G8MSPxwkIdZxg3bQpOt3gPmUio,3536
31
+ .git/objects/07/557fbd1d149ce51af8e98e8ca8590757a89dfa,sha256=JWG_MmB15Ez0qpSsbn7QUORFRbzUVxt7KpR7tlikJsQ,2257
28
32
  .git/objects/07/b71df33935c14ddf99e3480c04eca4685028bc,sha256=jk2YdZfFLF0_L6dtC5g3NXzhkuPzW8x5n5F2pD-Ih4s,1032
29
33
  .git/objects/09/a92517fe9eeb33d2fd7c979e01d163665f7abc,sha256=wyFL5jJ16f0xCpL1MB5EiJvs2opieE0hMEmyDpUV3ps,9356
30
34
  .git/objects/0b/e20ea749c6ae1075ae98f9426e00b0a4a235af,sha256=oRIrMdIqLj8tPUctDVp0A3INeadtii7UAn40HVOJQDY,19177
31
35
  .git/objects/0c/7b11b535a18f311aedadbe91e14fc9fe6b50d9,sha256=1nmf96foQAXQrObKn9gOPugLMlpj7soMif1MBARmKd8,427
36
+ .git/objects/12/f9cc4ad0b4f0af4f7bae379f281b2cebe7cc7f,sha256=eA2WMZnt5zYXRw6O8u_slLMZxbwvOoOR9EAX8I2iDM0,168
32
37
  .git/objects/13/5f50fea51c72f977f48d06a7584aba0f61e260,sha256=ecYtHQ_j-MSBN5YdAbHdDdfuJB4WJudHggEe9zUA0FY,1239
33
38
  .git/objects/14/d323d58fb90c209a730c17e23fd82a6c735fc1,sha256=rTCuhPM5LYusLIMDv7CLC557SlRFvvbBzgr4jwrjMVg,426
34
39
  .git/objects/15/eb3f02479e633439ec83c143e703f8448043a1,sha256=duJXtvq_NNhYKG7WdejXgoMlyHIaCUG5jv9SJpU_orc,14711
@@ -40,27 +45,37 @@
40
45
  .git/objects/20/cf56ec106bcd66420dd000279f983571b918b6,sha256=0dwZwG7CpR7yYYNvgYDxHLPj2P7eRLK7fTW_En419pk,166
41
46
  .git/objects/21/55b64d52922c88527c102d62f23e5c2abbae79,sha256=6LLW2HrSfqqVwvO59yc-EcUp6MHw6zfHwu8TB775dII,13853
42
47
  .git/objects/23/bfbca38e177bcbb423dd782c35b19d127a5ab0,sha256=hYW2b3t3bVGNh4pqyyA7DMlyF4LfNZco5NwedWMwwuI,3700
48
+ .git/objects/24/d78e796570a8572a03bc1dd26608a7cfb506f8,sha256=V9cd-XeITtK7Mq7ecpJpWGpi23_5Ny-qnsY4jRHWdDQ,606
43
49
  .git/objects/26/1f67f3b731b32f6d77de9dd7be2d61e2a14ace,sha256=mcasCBpCulVy2N-X_d2hg8567PdhZRof4ea5nYoelJM,96
44
50
  .git/objects/27/24208ca2442e8ab9b453d0eb230fa41243b270,sha256=3nPNI4PWt3CdzVHzOVuTD522nSv9SS1T2U1kPBBt40I,50
45
51
  .git/objects/29/4708b82b343e04e7a6685f5cd1287f3d17f7a9,sha256=YE3F4zucGeMHEw7bTEvQc0uJEUUCfEgw-mZTWupuNhA,96
52
+ .git/objects/2a/fe93d8bcbeab9e136d8b6766604c32b3610314,sha256=rG2er-EGko6WdUiYq106KxXwc-kQDXj8FAqt931D3nw,459
46
53
  .git/objects/2b/64656ce2df6259c822733b03f26eb828fe9269,sha256=62hS2mVKecw3uXd8yGs7djzHNeouyhbP6KhR1gGYosg,166
47
54
  .git/objects/2c/fcddd7eebeb4eee0562dc384a79366bc7b04bb,sha256=FHxE2giqoo-1IB9Q8i_XQUypGvQbRlRnTK0sbsNDcJE,96
48
55
  .git/objects/2d/2b812ca27c477f9e1b2c2706a5eb795ffcf8eb,sha256=hATm5xxgdr9nhfzRX98_KBaPYdY9BbWNuTmJO7__Oxk,5518
56
+ .git/objects/2d/8a0da260a710010ae62be134ac1cea6ceecfd1,sha256=4F5UqKkv_Lg1gt2nwo6_WklFZxldCeEGbmwpSOSVvrs,122
49
57
  .git/objects/2d/a515dbb88d31400d5b84d41caf270e9309232d,sha256=cP9jUGnu5pVr9ks-YJZSEjsgb7GKD2XEr8XvQosqs2s,122
58
+ .git/objects/2d/e8ecbb5ab5de1a032bef3f4606ce5fa7c6c4e8,sha256=TB1KNq7_JLKvNuYVyzJDi0sD8jvM3mmFqy4exWpiQxs,780
50
59
  .git/objects/2e/2c1c42f5ac5d665cc672d3792078b756d9ab0e,sha256=5LG3jHGORJeswNw0lz5dc6QSsxztyMstbRDADhZDnZY,166
60
+ .git/objects/30/9347e5681d80bd3c7949882e27090dd9070d16,sha256=8MrOQUbawLupyywR0LMr9ldryJuFnShbWE11kaI9Qsw,97
51
61
  .git/objects/33/181441ab38eded005db356da89b54c7d29f452,sha256=iIM6a2aGs_TGZjxHKnkYYyZj_hA77nAF7r2lMOtN1VA,2021
52
62
  .git/objects/33/52dfa8f5d9eb46cc98ea7ccecf02e4d9df95f7,sha256=KNAvQNdSalt8CxCZVVb8e6KBC4zqVtusT5MriFLPbIQ,4409
63
+ .git/objects/33/633c9df669ff8cf38638717937a54990814268,sha256=T-g8iQIgxPSszRTJtvY9SLL6b6PPTLFwI99ZRIxuODY,252
53
64
  .git/objects/34/192f0df5f5b694c881d086019eda349608d222,sha256=zcWIY4oDFz6n17MRjbwFrN1o-HEY0--gqK96dohmZfE,4901
54
65
  .git/objects/35/8bace20b731ff1bbb256d2a0158dfc84720978,sha256=hEPGT0bRzT1GlXErWRWJ7ogflTWj3SutlHRKCBH1TII,426
55
66
  .git/objects/38/907894973091f8e9b224a13fe596e1cb309cf5,sha256=XBdeTonV9fezxtk3kzI6DmEPb3WftSPaIWT30MKKw1E,802
67
+ .git/objects/39/993e3600bf4ab82aa361b738ee97a108787450,sha256=-hGYJt8FRCO90QesR_7HwxAo5gqkNWXOyOlKyVuctxc,17191
68
+ .git/objects/3b/ab663710fd6b43d9372313fced9043c4cb07dd,sha256=C2MsAjEcFMNDimrinw_yA4EvTmYGRkHkoTHOCv4dhf8,5608
56
69
  .git/objects/3c/6f0120229cc2cd8123efbeb7f186eb0a485f29,sha256=iyh7Xt-m7vou3slm58k8xSl3Cn2yYXTuv5WziSWHrW0,802
57
70
  .git/objects/3c/c3ca375694d43e35cdc88d4a5d067e510df427,sha256=A79FHqMtws8sYqMG9CmHWbEPaxF8htYc_E2wVuMi2u4,6570
58
71
  .git/objects/3d/3cc6aab4eefed46c77dda27503bebcce88962c,sha256=6NOdtY3stGMa7_trzPhvb2T21Ng0WqFIJhkPhsW-ACU,420
72
+ .git/objects/3e/b3f1273caf6814dfa69325ccbd9fd1340cf20a,sha256=kBQ8krCCjNFnKOXS4OPkX60C7wQdUWtNJB1zs-LrPVc,2656
59
73
  .git/objects/3e/d953d5ed2c66722045f5e39d068696a0853b4f,sha256=GelU4l-EVo8Y5rXSksIEnewIasEr9N54pTJcgrY3VVk,166
60
74
  .git/objects/3f/b8830f516342a0ae1cb7c34b65016827cb9570,sha256=j36c6Wtp0Lp9HVP1xvV-2c25opLFzd3kzuxRHirgb9Y,803
61
75
  .git/objects/40/84f4567d983a977c49598b7d886e46b13ff50b,sha256=R3w6EvxpJRcVuJvbCslrGDK07kcOjECGGosj5tO-JBo,426
62
76
  .git/objects/41/f40c22247de377be99e30784229f3f128508a2,sha256=3k-QVtbIvbMHt2cHrPJ0oh4TckwD6Pux6_v5J-EJhvY,2189
63
77
  .git/objects/44/4af3a0d68ba81976f67c7b638c9b0db4640709,sha256=s__MvPzT4Ndsip8kgkfMh-Y0oZ28tv2kVqaz_ExQKvU,166
78
+ .git/objects/45/fbc774dedb61c7c205ea732f59a8dca8d13555,sha256=4AN9Jlc9SttC8DK9ADUjw9wTEYnASrz4HubQCpVgXVc,417
64
79
  .git/objects/48/369b05749e384be9be58e5f943f3a0040d0f37,sha256=KP9dXx-XniZuIEXESlrL_MWWi55zGiFr7xtmp3oD67o,8551
65
80
  .git/objects/48/cb11e75518a53be14146018214110986fade67,sha256=08B_QIXJL2_dGh_r-GmudDgLAmT-Bia0eRYyIbOKvFw,2562
66
81
  .git/objects/4b/43f5f577e1cdc35f8e06d178d8f5c892034061,sha256=eawBjiWutNeKjIzvNonVMMKUVsz_-jn3Uew_NsKQJ-I,1150
@@ -77,9 +92,13 @@
77
92
  .git/objects/5c/715dcb05e32db7a7a3b030f07524bdd8a56849,sha256=wLXhy_1PP8n3Gd6NsvY1eFlK1pjkIjW35im_BD-0yMU,426
78
93
  .git/objects/5d/e2e9d536c2c0b78e8f9b3b61daa531a55332dc,sha256=Wiyz9xFF5A95FEnxZULmV9TSJf0-erTb_qIhLFIvmag,6558
79
94
  .git/objects/5e/9daac72a48ce60688ab2eeddcc3d9152329e20,sha256=7sVW8qTIBHufxZ3WCnNwmX33RpciuLTPritqr84UmKk,426
95
+ .git/objects/60/5cb6fd6a9f8894ad4d43a9b8e4785c1b3b0e17,sha256=zmGY1G58wmmZq2KD_Bu3Sy4-9iKKFiYMK52xOHbYfA0,343
96
+ .git/objects/60/f61a0ea50091eac8d344c86597375cbdfc2785,sha256=q08wTKfTUrWaDDDEIiQMxG0rfLK5LyogjwXQTQ88QQI,1986
97
+ .git/objects/63/ddda2a403efaab3f4c6597b3a73a7b1147adb5,sha256=r4ZyBKnna37wrE8JwnYWK84WB1OVsnXGU3N8vGnP5mg,18987
80
98
  .git/objects/65/0189fe083bd711e45d463b229a72be619abad2,sha256=A_rjGnyEfF5LPXsd1JWYWya49pffPhLzU4Gkg7p9Fcs,506
81
99
  .git/objects/65/a4f0ada7519f8b1e6a7c7e287541b8effde9fd,sha256=jSGkVjAMcm2nrF6w_0U7lmzoBgwIJaf4P8POOlABxEQ,188
82
100
  .git/objects/66/663db35bfec8ef5f1a5b1c840fde1bb62a0eb8,sha256=5xcSNodjk8EYRqTQHZIX7-0mG35aBsCzOkiqK2sIzRc,252
101
+ .git/objects/66/6c5c5fc30435228116fa08c9d821bebaaa8926,sha256=dym8X8VQl5GHh61t4umiy4z0oA_ATiKybPr4jIRjJk4,1165
83
102
  .git/objects/66/7291e131d4769e7d028346a0cc7a0c05d500e5,sha256=3D6kzCQW7DkYuwARYA74Tlfzeaiaob9ux4YE6hYohas,4026
84
103
  .git/objects/67/f27f77274917580e687fd00ca18da0660215c1,sha256=dxM9_T9v3VBrSXF3dbH6zsmbGQJn43-_DnHiDYs8108,15542
85
104
  .git/objects/67/f54a4a3ede6749acc7c718ad97a86634215b5e,sha256=n0_tiP-u_DP9uhXCryaz98mNJYcUX8RYiS48FvxIxCA,744
@@ -88,49 +107,74 @@
88
107
  .git/objects/76/311aa8e59d780763e0d66787067cc5d9613a67,sha256=J9Xy8ESXbWUbC_4sA0KumGVKm09tzlqA8C5oJ63a_b4,2167
89
108
  .git/objects/78/3e7e252c20e73e33615c703174766036546ff6,sha256=cQ-PXyvzEYjb2Lr24anO9aGui5IxBxZCYXL6zZRc0xc,810
90
109
  .git/objects/7c/00eec7ae9ef5f94fc337e5c8f9793a2a48810d,sha256=Ju-Yuy5EARcIThU4vkHrZuHQWu3MjXSZYGtBDTWR18c,96
110
+ .git/objects/7c/ef0adfb28fd774bc78061c6f088e1ef9b050f6,sha256=d9SniNMBerFoLZP7nlahqG6nPtrR6YVMjSSiJm5RRXs,2887
111
+ .git/objects/7d/dc129188a10c68ab756ef2cacb292c76920403,sha256=7jgXb9blUSWiQVPh8rpVxhpRQg9RyQS3zUSC1n7oGbY,17336
91
112
  .git/objects/7e/5935774ee7a85f2523427c9100f9c578ac172f,sha256=ywEI3w5JgIOgFDJ6cxc6NJnLfEr2Cjynke78KmwJhSE,165
113
+ .git/objects/80/17038e0f7818a44a742f77c86f4f88ed768fcd,sha256=ZCTiAwFMKB3R7tU1zMGM-WZNU3Fy_DeAM2r-ukPIwdQ,284
114
+ .git/objects/87/c7db6c91c17a2df84b56d30bd24a0f6b9dbdd9,sha256=073he9D2S-4EPQh6cBs0Xm2dEOxPTwZrGstzcSkJGCE,3897
92
115
  .git/objects/8a/0ed0ed8886fbc823e8d2258fa6d18699e94e25,sha256=VpidpA9wUduTJVrffzMKo4KL6HAhkBBxZEaNdGX9Ejw,122
93
116
  .git/objects/8c/809c42c7ae13007fd885ee7bcffae7acf2c520,sha256=HYoU3_cZUGur3rWrgRvzHRAv0JfrXgc34R8UeGbC5Bc,14180
94
117
  .git/objects/8d/44142ae2d6dbb59d4ebed8587bccd051e5766b,sha256=l1G5ZzQBQW8Lxd3WvGLRcY6quM6dBL4zdNT5ovjv3Dc,802
95
118
  .git/objects/8d/4a5767bef0c342f1660526f9671c0944922c40,sha256=kP0nfEnyNmuEJ4wLQabhPPx60OIa5Dxqn7R9Ni89CqY,1900
96
119
  .git/objects/8d/d857b3d0ab3f5cd2e9173d532ef86e30df8eda,sha256=dTFdFA8EPaLpDuJ4X-hfXjbwiAfKBY-EvFJ77H2mRxY,18883
120
+ .git/objects/92/984cf67b2c25d435468a8218daa26ba0466054,sha256=EyDEXseNoUivqR25-icLPWkaKt2pimwOucf7u4TyAIw,130
97
121
  .git/objects/92/c6018b4fb8e3b6c2f3f3054a56f2bfaca27470,sha256=Oox2busLjPpkXw6To9NfgDMXHuknlICbhyhyTWUT1lU,96
122
+ .git/objects/93/140b54b1fb9116ee214afee8abf2c72a232487,sha256=7VYYZiscg3mWnC4xmuQViLHakgctCXCTAonqA_76BAw,283
123
+ .git/objects/93/68f2c32f83054ab072b7c9686d8baa0bad7f12,sha256=GEtc_eOpbXXtFY1zj1dOlStEULevK-Lxr8O7PhjbvOg,431
98
124
  .git/objects/94/ce01b61b90d1fb21d2d339fbeb22e821b6f413,sha256=oSSA97T7TGnstzHDjUrdwzwZO4d1qIUyjo6lz_EbNbM,122
99
125
  .git/objects/95/295a15779ebefd563ec777c3d3cced7e8d0209,sha256=IIN8_K0K-3LAkUI4Ra3DS8yUsfpsqteSDGhgvRpSfZ4,426
100
126
  .git/objects/97/56fe0931216a7c40cbf250e1ab8a6dfd589f13,sha256=Su7Q-bXO0K9QKEGC249NVuUS62xmQs5TgWfEmdbauaI,97
101
127
  .git/objects/97/71dd4958faa94d3db229c129f6af35b508905a,sha256=Tc_ZkUqvJ4rk0QG5Bvwkp4DkMM9DlsmjdMIyDaO1S2k,756
128
+ .git/objects/9a/5ad062be9f6e001f4237a598a08981aba731e6,sha256=K1HnCs6nMYhqr8xsnBRqv6rRibDz4wPp8CoMT00hGOc,381
102
129
  .git/objects/9a/e313cdf64cd82416c1238eb493e6396f799f12,sha256=9bPRhebwMVqtGqJUxfVq-TEUxceuOdSvicWe1H8F7Ks,876
103
130
  .git/objects/9e/23448ac58f907d9d123c32bdccedbb3d6741b5,sha256=iqH9u5FAMzeSJ8QgFQnE1D2jPxIWx7b66Vd0RrqetvI,96
104
131
  .git/objects/9e/9978522bc8ca79133d7c11ef8ca3fe3c7eed0a,sha256=FkHx7Pp6DCZ5e4bRo2RjRU875YBgl9tEw7Z_9Rii8cE,13109
105
132
  .git/objects/9f/b57064e0c53ed80af8507acaab718a1e80184e,sha256=DGx0Ie-bppvghrmiV5w7mn24c6YlvHvYLIQsm-_jzsQ,635
106
133
  .git/objects/a0/d192999af7e2cbfa6a9ccd04d720a04e5a06d5,sha256=Zd6l-w5TxqsdgCZqkDz_pr9BWPJGb5bmbDrFlMl2Qx8,882
107
134
  .git/objects/a0/d630c3f6024b196d4ee933ab13a32905efdaaa,sha256=nNyB1T2FVU2vm3f-aAjEl-vBLbxYsKHibRIPhqCX9jQ,426
135
+ .git/objects/a1/655e0cb323c300562f97dcc67d5a446908c8ec,sha256=_b3Xk8IbERvYune9G8gOgOxFqc2o33xxzzAB_bZNIWM,806
108
136
  .git/objects/a3/cedc28e563a1845a7860161b39b0fe58d5f0d3,sha256=Vee0H8dhSj4ERNDSAnRU6vebs0tbY1-lgYr1Nz5X7bc,122
137
+ .git/objects/a5/38cc82cef7c49500d3522220f0f60a9ebc1ae6,sha256=hgFU3fWeozpZCBrngHHTeUYH3C6lqKBSSz15-OuI_jM,9716
109
138
  .git/objects/a5/b7e4e1b63bfb65288f6553687aaabcfb4d51b1,sha256=9tl9xb48EdvQk9GIg6mEzXSwqUgD6yEVZx-sVxaQVKw,1064
139
+ .git/objects/a9/41063a7ce89c353fa24378ec7c3f12f08f9df8,sha256=j-hYLtVwUhhYEY4BLe7J6m51GlpKdbZWUgKJwsEUt1M,389
110
140
  .git/objects/a9/cc7923c34a4c97c5711d6309672f41d46c612a,sha256=NvxVg0v7oBl27tQ8feThD45Gw97gZ6ZbbqVUZbp3CYQ,1041
141
+ .git/objects/ac/5c983d949d8c928bb022badf801e45e75e785e,sha256=eji1dZ5VSnUSuD_KuyL2kD5ZqVTmxl6QzKh37HhFhPI,1068
111
142
  .git/objects/ae/046e08176523e8a98dc7294436319f724db13c,sha256=9hdXV7BKRhfFTOz3FSuoYwGrcjvk2uTPo3CD1czuKcU,803
112
143
  .git/objects/af/c9cc15629847447063e86a82b8b56abb4fc08f,sha256=dzjzk6kncEmUtMbBEhkOuThFWDb4-2AyaFmKHpGU_RI,3155
113
144
  .git/objects/b0/7a43f0462bf25a8b1f4c0ca60c1b533dae1dde,sha256=JWzlC7nXy3RXBUxEcge1_ciMw6q3C5phffVck9MVlJk,404
145
+ .git/objects/b0/82ca2c1b5a03edff25da3c2b2b573d049877e9,sha256=Tn8y8C287Wd8ZZsQ4FgduAQMlD-ANm8l0i6XeA0J9mc,476
114
146
  .git/objects/b1/db1c131cf32916028342c0037ce8eb57a8eb26,sha256=bgcHj-13lalI3KZLo4PS1xneLz-E1oSxp1qIfCiqSH0,17243
115
147
  .git/objects/b2/8334b94392b8af397a05ed702690fa6c9ab1ca,sha256=QnXhDj4XDoGwytea6h_RgeaoWX3jXffxX6S7DcMzRZo,3461
116
148
  .git/objects/b3/28dc445ee33220db9359370fc0089a77174101,sha256=cipG_34_tKM5VPfYW2wRCmBYOqlmTBIUjakeph9sfl4,3652
117
149
  .git/objects/b3/d2b3037bede44e7e4d18dc99419f8c712c9c62,sha256=OIWo7wvTTKYZkYkxcZrOtnvfqgGlPezaE6sglITaF_Y,1156
118
150
  .git/objects/b8/7c89dcfce9e244ff5ef6a4bd394de12e8c8092,sha256=kE2ed_VMlop9lFeD9xXhrmql0ybRkMT6SbgWSP-0f7I,1249
151
+ .git/objects/bc/e98bdb71c8681acb460195fdcbbe5d36290976,sha256=o-hyZsAo9YH-jq5u10qF9Ub07ttduIWahRk7XC15Huo,96
152
+ .git/objects/c1/87d5e047eca86cfd8d444be2987aaa3f62c4d6,sha256=NL3ke3EzpuAgSXzGAaSX6IyTxnnTtbx-_4PRxUYVnRM,122
119
153
  .git/objects/c3/93db4841dbbb8acf54e9af12b6705c9f5ecde9,sha256=g36XyKIObniMsMBcIzsoG7f82SzOgn_Bdx-V9Rezjbg,3864
120
154
  .git/objects/c3/c8594874dd9ff9c21662fd06cac9b5baadbba0,sha256=5YUWDZ-BMZvyOJksaoiKeZC0N-eRcOJemLb_jNUHcC4,14309
155
+ .git/objects/c4/c2da96b0bb8db2acb0e6615cf340c7e51af26b,sha256=CiygqPJlDIOMLlTCLtqGjX1-0nLuibvSqApdkzgx_Dk,130
156
+ .git/objects/c5/13a96e7584636b20b12280c029750d5bc3da1e,sha256=VLZ8PjQLeTsUdf5hJgRYEVffMMDcVPaND5S6p_G0QQ4,507
157
+ .git/objects/c7/c34283697bd3cce07db53953eda25ee7cc371e,sha256=Dml4LNMu14Kq4DUCqcD7PhPdwxCnnVe77BqS9bZYJr8,170
121
158
  .git/objects/c8/2a656fe6b5d479b327cdf5fe3bf60db987a2a2,sha256=YNf8mWKTqJHeBDQCTfOU8b0ZDDSfbAb1fBGGDsySrHk,426
122
159
  .git/objects/c8/cb3bb9552dcf6a368a1418996c4b925db2d8ab,sha256=3AlcdjxamfHKOBmAuectuKNLwOYa1BovnOmVElfwPb4,13097
123
160
  .git/objects/c9/a6ca8f8efee4a5632e9a655ced29f1b708f35e,sha256=IOmxZbePi1cWHt2HzdDNtWy0SYR2XvigDkGK2fyNbWU,4957
124
161
  .git/objects/c9/cdef9ab627b874ffe6455a47583a75bf16496d,sha256=7y908SUa7dmWJyNXDKS_tOdrcfmI6OjZc7zvtL38M5Y,428
162
+ .git/objects/c9/d60d922a04b87587cd67b0abf9fe5a7b7b76cd,sha256=__y7gpz4_Vp-4bf0WIBORv-fmu9OFyi42u7lE5mbpbU,2868
125
163
  .git/objects/cd/2d6c229438c6b1c694b9392a85888d89ef49c1,sha256=IW9iGk3Eb-i_Ht64HQcltVp27ziQHz5IP6k5p57YFtY,122
126
164
  .git/objects/d0/9c84ad2142a187bf26a1714b7041b62e404c8f,sha256=twhhaZbfU_mgu5LIlt9ZeGjp_PT_gri_9H231H5nrNc,2172
165
+ .git/objects/d2/69b1676dbf32f76a7c405d0b4ea6a70ac3a626,sha256=m7rrmOVyAvhOIaRUmhbOzSTY5WKs47KUo7wFsM4XR90,2368
166
+ .git/objects/d3/5a918b1d9125ad35d60e08b181323df3246f1a,sha256=XiS705YKH6IJsELw5ZgbSeLdKH2qw96denj85BNEJJY,284
167
+ .git/objects/d8/eaf86669fbfd10497570c1784db1ed2696b588,sha256=YLEdJmuYNQDi1sYzQr0H1gFdExgTKIsY_Ugosmnzf3Q,314
127
168
  .git/objects/d9/3bd435c8c7ad4efb83dff04d5450fabb9e3faf,sha256=Dfce7XnTEPSLCJamlY36SeWUBiScdITejT2zhr9xwbg,2816
128
169
  .git/objects/d9/6d7456245232b3e159dcf691f11e51224c557a,sha256=3w45hxiT2rn6ljSdgo36fHMMWZt30r5C1FPvbnjq9tc,597
170
+ .git/objects/d9/90e6d553577d37ebce8b28b3015ecbde038b42,sha256=KAWFa4xuE56xukGPMlcOjxQ6xh1FlSrTYvgGyMypTX0,96
171
+ .git/objects/da/13cc15bcd8ee39c81f36dee7f179a569ecab0b,sha256=j1qdeViwHsSkT6l8xwFVDZ82wa2y638a6LsvVrUQnho,2154
129
172
  .git/objects/db/beedb30613f79ae3ff67df1428cf8ade223711,sha256=tTGayiwSvdy-uBiXQKRhNnToZ_dc1BmeXZ2mltuRfxY,3812
130
173
  .git/objects/df/f8f64cee2b97df7d86f73207c5e690f98f0208,sha256=eRT2hUSKxaIPfQVnE9NaRGxbAvBVCSreSOGzVGtd7As,213
131
174
  .git/objects/e2/b7433fbfbfac5bc800a962be2f4adbed145b42,sha256=eqX17kz7wSegBgSYS8q4oMPsZVvNWoDbpCRw7oI5PmE,15527
132
175
  .git/objects/e3/27755808d88c7ae5c06c229cf18bd0519646df,sha256=GQJi0cnGbjOZLiK8-PyTZlVupBaT6g-ar2N-RJp0NN4,9619
133
176
  .git/objects/e4/1e5aa2bc3074c2014d01ab1f603f69c327a83f,sha256=5daI7Vb9ehvOwoqgaBAKilm6Z6YdA4Rk4MFjJChbWpA,379
177
+ .git/objects/e4/4c1d8a90207ac082d8ab7ff0db66708e2ebc31,sha256=YJmX3vsaaoauuSFWAJqD3wriTdWueanhd_r5zroQqY8,232
134
178
  .git/objects/e5/83e7c40be934d16a1fa2e973487b395d930f42,sha256=BLXKgjdPyjn2Y-x-OQfbdg5JXCq3Nrnvwh5PfGMpmxQ,1848
135
179
  .git/objects/e8/1433b6ad92206cdadbee1f474b4f99383314cb,sha256=mRMdmx6wCs6b-63QL72Iutm2AUVCOIYs7J5XbAsLluc,426
136
180
  .git/objects/e8/2f42ea26b8bf4f0bc92c0648ac8f190f14226d,sha256=xtbEwloZnqXdNdViAevzyprosfPQ1P--xAu6URGlaYI,155
@@ -144,6 +188,7 @@
144
188
  .git/objects/f5/18c69a6e1bf3052b79da01502b2837ea58f0f4,sha256=r98SFbCvw7yeAYTjzkw-2VMhOVbpm79FLZQiC5A1-pw,123
145
189
  .git/objects/f5/1be495b96272fa2e47f30071aed35ac1f0dd2c,sha256=xjweeKCHsLUlfdROM1YxycVfwVexy-_1VhEA8Ki4Rfc,5050
146
190
  .git/objects/f7/25a430eb3364460ba854dbc8809edc21dc6c70,sha256=LdyMmAWGLWbn5G5fC7eAPi4NFOboKcJ6iJJdxENSUCk,2505
191
+ .git/objects/f8/ed595d25bd9d500e765a792c513878f7ddb1f7,sha256=yI_zqHGWaq_FUbEiqDWJcqrceTz2TNfSGcOjk7UeZ3c,97
147
192
  .git/objects/fa/fc981b0d80d8d0323c04365785f66996ed5211,sha256=t9N37kVA7j_i4nz0dDMHOQpvziBu5MUpDlG06Hdj77c,4395
148
193
  .git/objects/fc/e15b9dbffd9f37b1f2d46944ee2d0394df6565,sha256=81qdzKkVZ5C_1oej2Mm0q2RLifilVFolIs95mrUfpg4,163
149
194
  .git/objects/fd/0bc07dc3c95e6168ab6d367d9eca139ac1e539,sha256=29lnkRe3MYSLwu997QipK5TLUYzZuOKhQmO3usm17H0,3002
@@ -152,20 +197,19 @@
152
197
  .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.pack,sha256=R4oMXhr-NcPAUBXStCbAaUvGUDW_SBECmPIbiB9Gy48,42003
153
198
  .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.rev,sha256=22_3sqyTNB5IbwAK5oCqNz0UxDDqoZ5jcF7p_44Lalo,244
154
199
  .git/packed-refs,sha256=4H0m4wd6q98wZkBk7WfvVeTBuuxQdTE65XxsswYP-oQ,112
155
- .git/refs/heads/iyue,sha256=A74qY_Q8QJmxyPExo7cXoAyl0J2WZtnXu-hfgucjN4E,41
156
- .git/refs/remotes/gitlab/iyue,sha256=A74qY_Q8QJmxyPExo7cXoAyl0J2WZtnXu-hfgucjN4E,41
200
+ .git/refs/heads/iyue,sha256=UKeAS3b7ttvVhUvr-gyA4_GMYKp_xV5sAPccBx2q1kw,41
201
+ .git/refs/remotes/gitlab/iyue,sha256=UKeAS3b7ttvVhUvr-gyA4_GMYKp_xV5sAPccBx2q1kw,41
157
202
  .git/refs/remotes/origin/HEAD,sha256=G8pFPTbCqnJ2IkCzz9J-STqOXWU6TrlXfpt1wx5bUWE,30
158
- .git/refs/remotes/origin/iyue,sha256=A74qY_Q8QJmxyPExo7cXoAyl0J2WZtnXu-hfgucjN4E,41
203
+ .git/refs/remotes/origin/iyue,sha256=UKeAS3b7ttvVhUvr-gyA4_GMYKp_xV5sAPccBx2q1kw,41
159
204
  .gitignore,sha256=HHs2RDf54i9UJ3Z-pqWWCy8wyQLN7FCvz8Zm-RGN65s,2091
160
205
  .python-version,sha256=NxOs_9lT1XG8y-FjlRru-YinX5RcBJt_ulPwgDESZ_o,7
161
206
  ARCHITECTURE.md,sha256=HiUhP4wGzy4lD01MpHjOgAhuAUwpNsEac3tZaE65kos,12047
162
- README.md,sha256=khO65a7VGeyjyUxxXpu1W_EosoPLzJyWCol6jDVzw9k,8484
163
- core/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
164
- core/bytecode_parser.py,sha256=bv01quLoLeKHjswLU86g4w3MeZR9uh7WIJsnV2sGE2g,11399
165
- core/info_decoder.py,sha256=vQtB7JvJ9letQCovGuwmSo6g8Npkpy-W5UCZk5PzIFE,73318
166
- core/reconstructor.py,sha256=9uIbo69iPvuFqfArokf_BwadA2Cd6fZBiqEfITKrgEw,62211
167
- generation/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
168
- generation/proto_generator.py,sha256=DPPng-Nna3sW5d200D-P7vbOE8vx7X3R6cBwhq7cjqY,21958
207
+ README.md,sha256=CNBsu4ulQZ5JiU2aqlU3FsLof6DmpKfMtbhhjdGfp60,5399
208
+ core/__init__.py,sha256=PetkS7P_cuz8h9SSQmEJEQKUaaWf6geQnLKRq9uQzjY,688
209
+ core/info_decoder.py,sha256=WgvTTiVr2_bTtH7ip0Pf0C5OKNn-qeSELYOT10r04Aw,73764
210
+ core/reconstructor.py,sha256=LdSH6Z90xR3XdfOP27t-JMbbKU1RKKKwgL6K3WboMm4,62820
211
+ generation/__init__.py,sha256=fqZNYz3HzZb0TeF9KMiQ-Q0BdWuzKkSJ8hEXF4kzHuQ,427
212
+ generation/proto_generator.py,sha256=QTh2-b4rbY3sQZQFBAunL3rCiumvxzOHEvQ4tCEqSkM,22254
169
213
  include/google/protobuf/any.proto,sha256=vPXebORjsaOP92t3lVqn5YC07BKvNKknsdRcnvsPr2Y,6154
170
214
  include/google/protobuf/api.proto,sha256=naqFihxSn0f51O0bwt8Nq2FUrUL5nPA1Gz2p1Nr_jrA,7729
171
215
  include/google/protobuf/compiler/plugin.proto,sha256=fjnlljCh8BGNcVv9D-NIHBYN4hRP9ZUsXj7SCizk-oI,8556
@@ -181,22 +225,23 @@ include/google/protobuf/struct.proto,sha256=G_B7qLmiTjoDkN3aw60NtBxjKH0lJ4iwI5gi
181
225
  include/google/protobuf/timestamp.proto,sha256=FAUsYELB3S0LUCRfKBLqq26vgtsLbozkg-rlJ_c7bug,6449
182
226
  include/google/protobuf/type.proto,sha256=4jDg5K64fJXp8casv8DHE9s_iAlPFJsVRxelHQIPdQs,6367
183
227
  include/google/protobuf/wrappers.proto,sha256=aHjcdTTPmAXu5WNFzcOLXpyjneziRnEMZjxwB6Z_70k,5392
184
- main.py,sha256=3G649-aTByEjMS4tb1A9wcO9NVUxXVSvdwGTq9hXxBI,7081
185
- models/__init__.py,sha256=WScv63rvEl65y5CWjpb6__hvjNvjpCkl6lz1Z2u0IYc,811
228
+ main.py,sha256=EnjOjWcpCoK6JrblcLXPvkS-RiXwbkBjs8gL7QP8jG4,5933
229
+ models/__init__.py,sha256=KVthXPEPwpKg45LaaX5EIHu6UMY8eLXMnx4rfJB84Xs,825
186
230
  models/message_definition.py,sha256=AszUZnNPSBn9SMXne5ORDBiGZz1W2pcYmU8ftGC3Mks,4873
187
- parsing/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
188
- parsing/enum_parser.py,sha256=4BjMk1NIYgt2FDZUjTZyOvFfC1uJp_MBZipVdk1tqes,6175
189
- parsing/java_parser.py,sha256=yPUAugI_7x_doQhmAu61OGg1m7-UsHMZLyJKDQ9D8bk,33542
190
- pyproject.toml,sha256=YwQ1oFwF1s_H0hPMqy0JHmqTPuG-z-DFCg05kKLYF-8,1378
231
+ parsing/__init__.py,sha256=WBrRACzmxAN4_k7uUo3KSeywvlTJYp5iVSOnU2gNoF8,596
232
+ parsing/enum_parser.py,sha256=Yf59cDLTwIbPRQsuj0tgYUmmtpjY02llmSZ3XlsCqUk,6492
233
+ parsing/java_parser.py,sha256=PZ5gs2aJqcX8sRlC29QIOsrbI-OCRtaHsxkMyvYnkCA,33774
234
+ pyproject.toml,sha256=WSHU6modzAkZB__A3-T2NdhK1Kcyfn371uLL2TeIgR4,1378
191
235
  requirements.txt,sha256=cQGj3IS6Kj88jbwj_jeKkokMnG-fEezWve91mfW4CJs,96
192
- utils/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
193
- utils/builtin_proto.py,sha256=6KnwpTaI4vdydrEeotPf3NSC4Q0kNxT8a9IALxPnt4E,9117
194
- utils/file_cache.py,sha256=eOBkfrumWg0EU1EfLESnRN1kcidi_MocxV_EWP8lEhQ,5207
236
+ utils/__init__.py,sha256=QTPe5H6T5qiqVRlhI7UJzIJrnerHvsGN38xEa-8V5is,1369
237
+ utils/builtin_proto.py,sha256=PiRdcJGKr02d8NbbedS14mjl6khtTbUzmlpso4q-NHA,9339
238
+ utils/file_cache.py,sha256=m6-fAQsSBVn8-BodjPsmA2C_OqWjnt6mjUyGhT1pFno,5433
195
239
  utils/file_utils.py,sha256=N1Ei7hmyeOkIyZJFEXyNbtTrfeVF2hP-U8evXAVW2MA,4085
196
240
  utils/logger.py,sha256=473DfzFVXzdGpiRTJGY6bBd-V5G80_P07gQqcvDChpQ,2447
197
- utils/type_index.py,sha256=So8FYyGtR0ff-ZhVHjXUdhXiXQEujlcCEJlj7OPQMsg,12128
241
+ utils/report_utils.py,sha256=ftXU27nscrKUPMVWRnjLwckrt4NVBkKAc4zGmgNHwbc,2873
242
+ utils/type_index.py,sha256=ni9hhR321unTQ9kfgsTum59VEh9nJMlUG0ca3V4rSHk,12354
198
243
  utils/type_utils.py,sha256=H32JSIvq1TmZkAZZesEs4VQVc1VXQuJlSLTINTBVkK4,15947
199
- reproto-0.1.2.dist-info/METADATA,sha256=iO1XYicmF4VNspL0JYzw6J_AqNjsXnIu2OR7UDAdYnE,9433
200
- reproto-0.1.2.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
201
- reproto-0.1.2.dist-info/entry_points.txt,sha256=6Oro9lK_2DXDgHiB3andNuIE78wxfooqacqp8yY1C-g,37
202
- reproto-0.1.2.dist-info/RECORD,,
244
+ reproto-0.1.3.dist-info/METADATA,sha256=ph3duIhum8nQPtVURrh9SSx8sA0WuET5qi1Zl3pGplg,6348
245
+ reproto-0.1.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
246
+ reproto-0.1.3.dist-info/entry_points.txt,sha256=6Oro9lK_2DXDgHiB3andNuIE78wxfooqacqp8yY1C-g,37
247
+ reproto-0.1.3.dist-info/RECORD,,
utils/__init__.py CHANGED
@@ -1,3 +1,43 @@
1
+ """
2
+ 工具模块
3
+
4
+ 包含各种辅助工具和实用程序:
5
+ - 日志系统:统一的日志管理
6
+ - 文件缓存:优化文件I/O性能
7
+ - 类型工具:类型转换和命名规范处理
8
+ - 内置Proto:Google Protobuf标准类型支持
9
+ - 报告工具:重构结果统计和展示
10
+ """
11
+
12
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
13
+ try:
14
+ # 相对导入(包环境)
15
+ from .logger import setup_logger, get_logger
16
+ from .file_cache import get_file_cache
17
+ from .type_utils import type_mapper, naming_converter, field_name_processor
18
+ from .builtin_proto import get_builtin_manager
19
+ from .type_index import get_type_index
20
+ from .report_utils import print_results_summary
21
+ except ImportError:
22
+ # 绝对导入(开发环境)
23
+ from utils.logger import setup_logger, get_logger
24
+ from utils.file_cache import get_file_cache
25
+ from utils.type_utils import type_mapper, naming_converter, field_name_processor
26
+ from utils.builtin_proto import get_builtin_manager
27
+ from utils.type_index import get_type_index
28
+ from utils.report_utils import print_results_summary
29
+
30
+ __all__ = [
31
+ 'setup_logger',
32
+ 'get_logger',
33
+ 'get_file_cache',
34
+ 'type_mapper',
35
+ 'naming_converter',
36
+ 'field_name_processor',
37
+ 'get_builtin_manager',
38
+ 'get_type_index',
39
+ 'print_results_summary'
40
+ ]
1
41
 
2
42
 
3
43
 
utils/builtin_proto.py CHANGED
@@ -7,7 +7,14 @@ import os
7
7
  import shutil
8
8
  from pathlib import Path
9
9
  from typing import Dict, Set, Optional
10
- from utils.logger import logger
10
+
11
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
12
+ try:
13
+ # 相对导入(包环境)
14
+ from .logger import logger
15
+ except ImportError:
16
+ # 绝对导入(开发环境)
17
+ from utils.logger import logger
11
18
 
12
19
 
13
20
  def find_include_directory() -> Optional[Path]:
utils/file_cache.py CHANGED
@@ -10,7 +10,14 @@ Author: AI Assistant
10
10
  from pathlib import Path
11
11
  from typing import Optional, Dict
12
12
  import threading
13
- from utils.logger import get_logger
13
+
14
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
15
+ try:
16
+ # 相对导入(包环境)
17
+ from .logger import get_logger
18
+ except ImportError:
19
+ # 绝对导入(开发环境)
20
+ from utils.logger import get_logger
14
21
 
15
22
 
16
23
  class FileContentCache:
utils/report_utils.py ADDED
@@ -0,0 +1,71 @@
1
+ """
2
+ 结果报告工具模块
3
+
4
+ 提供重构结果的统计、报告和展示功能
5
+ """
6
+
7
+ import sys
8
+ from typing import Dict, Any, TYPE_CHECKING
9
+
10
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
11
+ if TYPE_CHECKING:
12
+ try:
13
+ # 相对导入(包环境)
14
+ from ..core.reconstructor import ProtoReconstructor
15
+ except ImportError:
16
+ # 绝对导入(开发环境)
17
+ from core.reconstructor import ProtoReconstructor
18
+
19
+
20
+ def print_results_summary(reconstructor: 'ProtoReconstructor', results: Dict[str, Any], logger, verbose: bool) -> None:
21
+ """
22
+ 打印重构结果的详细统计信息
23
+
24
+ Args:
25
+ reconstructor: 重构器实例
26
+ results: 重构结果字典
27
+ logger: 日志记录器
28
+ verbose: 是否显示详细信息
29
+ """
30
+ if not results:
31
+ logger.error("❌ 没有生成任何proto文件!")
32
+ logger.error("请检查:")
33
+ logger.error(" 1. 根类名是否正确")
34
+ logger.error(" 2. Java源码目录是否包含对应的文件")
35
+ logger.error(" 3. 类是否为protobuf消息类")
36
+
37
+ # 显示详细的失败信息
38
+ if hasattr(reconstructor, 'failed_classes') and reconstructor.failed_classes:
39
+ logger.error("失败的类:")
40
+ for failed_class, reason in reconstructor.failed_classes.items():
41
+ logger.error(f" • {failed_class}: {reason}")
42
+
43
+ sys.exit(1)
44
+
45
+ # 统计成功和失败的数量
46
+ success_count = len(results)
47
+ failed_count = len(reconstructor.failed_classes) if hasattr(reconstructor, 'failed_classes') else 0
48
+ total_attempted = success_count + failed_count
49
+
50
+ logger.success("✅ 重构完成!")
51
+ logger.info(f"📊 处理统计: 共尝试处理 {total_attempted} 个类型")
52
+
53
+ # 统计消息和枚举数量
54
+ message_count = sum(1 for r in results.values() if hasattr(r, 'fields'))
55
+ enum_count = sum(1 for r in results.values() if hasattr(r, 'values'))
56
+
57
+ logger.info(f" - ✅ 成功: {success_count} 个 (消息: {message_count}, 枚举: {enum_count})")
58
+
59
+ # 显示失败的类
60
+ if hasattr(reconstructor, 'failed_classes') and reconstructor.failed_classes:
61
+ logger.warning(f" - ❌ 失败: {failed_count} 个")
62
+ for failed_class, reason in reconstructor.failed_classes.items():
63
+ logger.warning(f" • {failed_class}: {reason}")
64
+
65
+ # 显示跳过的类
66
+ if hasattr(reconstructor, 'skipped_classes') and reconstructor.skipped_classes:
67
+ skipped_count = len(reconstructor.skipped_classes)
68
+ logger.info(f" - ⏭️ 跳过: {skipped_count} 个 (基础类型或已处理)")
69
+ if verbose:
70
+ for skipped_class, reason in reconstructor.skipped_classes.items():
71
+ logger.info(f" • {skipped_class}: {reason}")
utils/type_index.py CHANGED
@@ -10,7 +10,14 @@ Author: AI Assistant
10
10
  from pathlib import Path
11
11
  from typing import Dict, List, Optional, Set
12
12
  import threading
13
- from utils.logger import get_logger
13
+
14
+ # 智能导入:同时支持相对导入(包环境)和绝对导入(开发环境)
15
+ try:
16
+ # 相对导入(包环境)
17
+ from .logger import get_logger
18
+ except ImportError:
19
+ # 绝对导入(开发环境)
20
+ from utils.logger import get_logger
14
21
 
15
22
 
16
23
  class TypeMatchingIndex: