reproto 0.1.1__py3-none-any.whl → 0.1.2__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 (69) hide show
  1. .git/COMMIT_EDITMSG +30 -1
  2. .git/index +0 -0
  3. .git/logs/HEAD +1 -0
  4. .git/logs/refs/heads/iyue +1 -0
  5. .git/logs/refs/remotes/gitlab/iyue +1 -0
  6. .git/logs/refs/remotes/origin/iyue +1 -0
  7. .git/objects/03/3fab23ccc74b707a31f6f37dc5df42c100aac0 +0 -0
  8. .git/objects/07/b71df33935c14ddf99e3480c04eca4685028bc +0 -0
  9. .git/objects/0b/e20ea749c6ae1075ae98f9426e00b0a4a235af +0 -0
  10. .git/objects/13/5f50fea51c72f977f48d06a7584aba0f61e260 +0 -0
  11. .git/objects/1b/97584ebada3e93d7a2cfa4a1aae0b79c414d20 +0 -0
  12. .git/objects/1b/f0c1ad9586578e8332d061f7648dcb041ec063 +0 -0
  13. .git/objects/1e/46816d16e7c9db7575f1964403c3daa105be5c +0 -0
  14. .git/objects/27/24208ca2442e8ab9b453d0eb230fa41243b270 +0 -0
  15. .git/objects/2d/2b812ca27c477f9e1b2c2706a5eb795ffcf8eb +0 -0
  16. .git/objects/3f/b8830f516342a0ae1cb7c34b65016827cb9570 +4 -0
  17. .git/objects/41/f40c22247de377be99e30784229f3f128508a2 +0 -0
  18. .git/objects/48/cb11e75518a53be14146018214110986fade67 +0 -0
  19. .git/objects/4f/c6dc41f9c0a1a8e0eedd3ba49c43d78d0dbaba +0 -0
  20. .git/objects/59/4c23f158ccbd0a4288f9ea046d06160195afbf +0 -0
  21. .git/objects/5b/d4d87753b79e9157817f0c2e6964a731052854 +0 -0
  22. .git/objects/65/0189fe083bd711e45d463b229a72be619abad2 +0 -0
  23. .git/objects/66/663db35bfec8ef5f1a5b1c840fde1bb62a0eb8 +0 -0
  24. .git/objects/8a/0ed0ed8886fbc823e8d2258fa6d18699e94e25 +0 -0
  25. .git/objects/8d/d857b3d0ab3f5cd2e9173d532ef86e30df8eda +0 -0
  26. .git/objects/9e/23448ac58f907d9d123c32bdccedbb3d6741b5 +0 -0
  27. .git/objects/a0/d192999af7e2cbfa6a9ccd04d720a04e5a06d5 +0 -0
  28. .git/objects/a9/cc7923c34a4c97c5711d6309672f41d46c612a +0 -0
  29. .git/objects/af/c9cc15629847447063e86a82b8b56abb4fc08f +0 -0
  30. .git/objects/b1/db1c131cf32916028342c0037ce8eb57a8eb26 +0 -0
  31. .git/objects/b2/8334b94392b8af397a05ed702690fa6c9ab1ca +0 -0
  32. .git/objects/b8/7c89dcfce9e244ff5ef6a4bd394de12e8c8092 +0 -0
  33. .git/objects/d9/3bd435c8c7ad4efb83dff04d5450fabb9e3faf +0 -0
  34. .git/objects/e3/27755808d88c7ae5c06c229cf18bd0519646df +0 -0
  35. .git/objects/e5/83e7c40be934d16a1fa2e973487b395d930f42 +0 -0
  36. .git/objects/ed/1ae867d5e63195845afc58d88c38ecbdea97df +0 -0
  37. .git/objects/ef/f44e5099da27f7fb1ef14bb34902ccf4250b89 +0 -0
  38. .git/objects/f5/1be495b96272fa2e47f30071aed35ac1f0dd2c +0 -0
  39. .git/objects/fd/0bc07dc3c95e6168ab6d367d9eca139ac1e539 +0 -0
  40. .git/refs/heads/iyue +1 -1
  41. .git/refs/remotes/gitlab/iyue +1 -1
  42. .git/refs/remotes/origin/iyue +1 -1
  43. .gitignore +2 -1
  44. core/info_decoder.py +507 -6
  45. core/reconstructor.py +135 -6
  46. generation/proto_generator.py +51 -11
  47. include/google/protobuf/any.proto +162 -0
  48. include/google/protobuf/api.proto +207 -0
  49. include/google/protobuf/compiler/plugin.proto +180 -0
  50. include/google/protobuf/cpp_features.proto +67 -0
  51. include/google/protobuf/descriptor.proto +1417 -0
  52. include/google/protobuf/duration.proto +115 -0
  53. include/google/protobuf/empty.proto +51 -0
  54. include/google/protobuf/field_mask.proto +245 -0
  55. include/google/protobuf/go_features.proto +80 -0
  56. include/google/protobuf/java_features.proto +130 -0
  57. include/google/protobuf/source_context.proto +48 -0
  58. include/google/protobuf/struct.proto +95 -0
  59. include/google/protobuf/timestamp.proto +144 -0
  60. include/google/protobuf/type.proto +193 -0
  61. include/google/protobuf/wrappers.proto +157 -0
  62. parsing/java_parser.py +295 -12
  63. pyproject.toml +1 -1
  64. {reproto-0.1.1.dist-info → reproto-0.1.2.dist-info}/METADATA +1 -1
  65. {reproto-0.1.1.dist-info → reproto-0.1.2.dist-info}/RECORD +69 -20
  66. utils/builtin_proto.py +262 -0
  67. utils/type_utils.py +39 -6
  68. {reproto-0.1.1.dist-info → reproto-0.1.2.dist-info}/WHEEL +0 -0
  69. {reproto-0.1.1.dist-info → reproto-0.1.2.dist-info}/entry_points.txt +0 -0
parsing/java_parser.py CHANGED
@@ -27,12 +27,13 @@ class JavaParser:
27
27
  self.logger = get_logger("java_parser")
28
28
 
29
29
  # 匹配newMessageInfo调用的正则表达式
30
- # 格式:GeneratedMessageLite.newMessageInfo(DEFAULT_INSTANCE, "字节码", new Object[]{对象数组})
30
+ # 格式1:GeneratedMessageLite.newMessageInfo(DEFAULT_INSTANCE, "字节码", new Object[]{对象数组})
31
+ # 格式2:GeneratedMessageLite.newMessageInfo(DEFAULT_INSTANCE, "字节码", null)
31
32
  self.new_message_info_pattern = re.compile(
32
33
  r'GeneratedMessageLite\.newMessageInfo\(\s*'
33
34
  r'DEFAULT_INSTANCE\s*,\s*'
34
35
  r'"([^"]*)",\s*' # 捕获字节码字符串
35
- r'new\s+Object\[\]\s*\{([^}]*)\}', # 捕获对象数组
36
+ r'(?:new\s+Object\[\]\s*\{([^}]*)\}|null)', # 捕获对象数组或null
36
37
  re.DOTALL
37
38
  )
38
39
 
@@ -50,17 +51,26 @@ class JavaParser:
50
51
  # 读取Java文件内容
51
52
  content = java_file_path.read_text(encoding='utf-8')
52
53
 
53
- # 查找newMessageInfo调用
54
- match = self.new_message_info_pattern.search(content)
55
- if not match:
54
+ # 查找所有newMessageInfo调用
55
+ matches = self.new_message_info_pattern.findall(content)
56
+ if not matches:
56
57
  return None, None
57
58
 
58
- # 提取字节码字符串和对象数组字符串
59
- info_string = match.group(1)
60
- objects_str = match.group(2)
59
+ # 获取主类的字段标签
60
+ main_class_field_tags = self._extract_field_number_constants(content)
61
61
 
62
- # 解析对象数组
63
- objects_array = self._parse_objects_array(objects_str)
62
+ # 根据字段匹配选择正确的newMessageInfo调用
63
+ best_match = self._select_main_class_message_info(matches, main_class_field_tags)
64
+ if not best_match:
65
+ return None, None
66
+
67
+ info_string, objects_str = best_match
68
+
69
+ # 解析对象数组(允许null/空对象数组)
70
+ if objects_str and objects_str.strip():
71
+ objects_array = self._parse_objects_array(objects_str)
72
+ else:
73
+ objects_array = [] # 空消息的情况(null或空字符串)
64
74
 
65
75
  return info_string, objects_array
66
76
 
@@ -68,6 +78,142 @@ class JavaParser:
68
78
  self.logger.error(f"❌ 解析Java文件失败 {java_file_path}: {e}")
69
79
  return None, None
70
80
 
81
+ def parse_inner_class_from_file(self, java_file_path: Path, inner_class_name: str) -> Tuple[Optional[str], Optional[List[str]]]:
82
+ """
83
+ 从外部类文件中解析指定的内部类的protobuf信息
84
+
85
+ Args:
86
+ java_file_path: 外部类Java文件路径
87
+ inner_class_name: 内部类名(如"SkipRecovery")
88
+
89
+ Returns:
90
+ Tuple[字节码字符串, 对象数组] 或 (None, None) 如果解析失败
91
+ """
92
+ try:
93
+ # 读取Java文件内容
94
+ content = java_file_path.read_text(encoding='utf-8')
95
+
96
+ # 提取指定内部类的内容
97
+ inner_class_content = self._extract_inner_class_content(content, inner_class_name)
98
+ if not inner_class_content:
99
+ self.logger.error(f"❌ 在文件 {java_file_path} 中找不到内部类: {inner_class_name}")
100
+ return None, None
101
+
102
+ # 在内部类内容中查找newMessageInfo调用
103
+ matches = self.new_message_info_pattern.findall(inner_class_content)
104
+ if not matches:
105
+ self.logger.debug(f" 🔍 内部类 {inner_class_name} 中没有找到newMessageInfo调用")
106
+ return None, None
107
+
108
+ # 对于内部类,通常只有一个newMessageInfo调用
109
+ info_string, objects_str = matches[0]
110
+
111
+ # 解析对象数组(允许null/空对象数组)
112
+ if objects_str and objects_str.strip():
113
+ objects_array = self._parse_objects_array(objects_str)
114
+ else:
115
+ objects_array = [] # 空消息的情况(null或空字符串)
116
+
117
+ # 为内部类单独提取字段标签
118
+ self._extract_inner_class_field_tags(java_file_path, inner_class_name, inner_class_content)
119
+
120
+ self.logger.info(f" ✅ 成功解析内部类 {inner_class_name}: {len(objects_array)} 个对象")
121
+ return info_string, objects_array
122
+
123
+ except Exception as e:
124
+ self.logger.error(f"❌ 解析内部类失败 {inner_class_name} from {java_file_path}: {e}")
125
+ return None, None
126
+
127
+ def _extract_inner_class_content(self, content: str, inner_class_name: str) -> Optional[str]:
128
+ """
129
+ 从Java文件内容中提取指定内部类的内容
130
+
131
+ Args:
132
+ content: Java文件内容
133
+ inner_class_name: 内部类名
134
+
135
+ Returns:
136
+ 内部类的内容,如果找不到则返回None
137
+ """
138
+ # 查找内部类定义的开始
139
+ # 匹配模式:public static final class InnerClassName extends ...
140
+ class_pattern = rf'public\s+static\s+final\s+class\s+{re.escape(inner_class_name)}\s+extends\s+'
141
+ match = re.search(class_pattern, content)
142
+
143
+ if not match:
144
+ # 尝试更宽松的匹配
145
+ class_pattern = rf'class\s+{re.escape(inner_class_name)}\s+extends\s+'
146
+ match = re.search(class_pattern, content)
147
+
148
+ if not match:
149
+ return None
150
+
151
+ # 找到类定义的开始位置
152
+ class_start = match.start()
153
+
154
+ # 从类定义开始位置往前找到第一个'{'
155
+ content_from_class = content[class_start:]
156
+ brace_start = content_from_class.find('{')
157
+ if brace_start == -1:
158
+ return None
159
+
160
+ # 从第一个'{'开始,找到匹配的'}'
161
+ start_pos = class_start + brace_start + 1
162
+ brace_count = 1
163
+ pos = start_pos
164
+
165
+ while pos < len(content) and brace_count > 0:
166
+ if content[pos] == '{':
167
+ brace_count += 1
168
+ elif content[pos] == '}':
169
+ brace_count -= 1
170
+ pos += 1
171
+
172
+ if brace_count == 0:
173
+ # 找到了匹配的结束位置
174
+ inner_class_content = content[start_pos:pos-1]
175
+ return inner_class_content
176
+
177
+ return None
178
+
179
+ def _extract_inner_class_field_tags(self, java_file_path: Path, inner_class_name: str, inner_class_content: str) -> None:
180
+ """
181
+ 为内部类提取字段标签,并缓存到文件系统中
182
+
183
+ Args:
184
+ java_file_path: Java文件路径
185
+ inner_class_name: 内部类名
186
+ inner_class_content: 内部类的源码内容
187
+ """
188
+ # 从内部类内容中提取字段标签
189
+ field_tags = self._extract_field_tags_from_source(inner_class_content)
190
+
191
+ if field_tags:
192
+ # 创建内部类的虚拟文件路径,用于缓存字段标签
193
+ # 如:Service$CompleteOnboardingRequest.java -> Service$CompleteOnboardingRequest$InstallationInfo.java
194
+ virtual_file_path = java_file_path.parent / f"{java_file_path.stem}${inner_class_name}.java"
195
+
196
+ # 将字段标签缓存到虚拟文件路径
197
+ self._cache_field_tags(virtual_file_path, field_tags)
198
+
199
+ self.logger.debug(f" 🏷️ 为内部类 {inner_class_name} 提取了 {len(field_tags)} 个字段标签")
200
+ else:
201
+ self.logger.debug(f" 🔍 内部类 {inner_class_name} 没有字段标签")
202
+
203
+ def _cache_field_tags(self, file_path: Path, field_tags: dict) -> None:
204
+ """
205
+ 缓存字段标签到内存中,供后续使用
206
+
207
+ Args:
208
+ file_path: 文件路径(可能是虚拟路径)
209
+ field_tags: 字段标签字典
210
+ """
211
+ # 使用简单的内存缓存
212
+ if not hasattr(self, '_field_tags_cache'):
213
+ self._field_tags_cache = {}
214
+
215
+ self._field_tags_cache[str(file_path)] = field_tags
216
+
71
217
  def _parse_objects_array(self, objects_str: str) -> List[str]:
72
218
  """
73
219
  解析Java对象数组字符串
@@ -183,6 +329,85 @@ class JavaParser:
183
329
 
184
330
  return part if part else None
185
331
 
332
+ def _select_main_class_message_info(self, matches: List[tuple], main_class_field_tags: dict) -> Optional[tuple]:
333
+ """
334
+ 根据字段匹配选择主类的newMessageInfo调用
335
+
336
+ Args:
337
+ matches: 所有newMessageInfo匹配结果 [(info_string, objects_str), ...]
338
+ main_class_field_tags: 主类字段标签 {const_name: tag_value}
339
+
340
+ Returns:
341
+ 主类的newMessageInfo匹配结果或None
342
+ """
343
+ if not matches:
344
+ return None
345
+
346
+ if len(matches) == 1:
347
+ return matches[0]
348
+
349
+ # 从主类字段标签生成期望的字段名列表
350
+ expected_fields = set()
351
+ for const_name in main_class_field_tags.keys():
352
+ field_name = self._const_name_to_field_name(const_name)
353
+ expected_fields.add(field_name)
354
+
355
+ self.logger.debug(f" 🔍 主类期望字段: {expected_fields}")
356
+
357
+ best_match = None
358
+ best_score = 0
359
+
360
+ for info_string, objects_str in matches:
361
+ # 解析对象数组(允许null/空对象数组)
362
+ if objects_str and objects_str.strip():
363
+ objects_array = self._parse_objects_array(objects_str)
364
+ else:
365
+ objects_array = [] # 空消息的情况(null或空字符串)
366
+
367
+ # 计算匹配分数
368
+ score = self._calculate_field_match_score(objects_array, expected_fields)
369
+
370
+ self.logger.debug(f" 📊 对象数组 {objects_array[:3]}... 匹配分数: {score}")
371
+
372
+ if score > best_score:
373
+ best_score = score
374
+ best_match = (info_string, objects_str)
375
+
376
+ if best_match:
377
+ self.logger.info(f" ✅ 选择主类newMessageInfo,匹配分数: {best_score}")
378
+ else:
379
+ self.logger.warning(f" ⚠️ 无法找到匹配的主类newMessageInfo")
380
+
381
+ return best_match
382
+
383
+ def _calculate_field_match_score(self, objects_array: List[str], expected_fields: set) -> int:
384
+ """
385
+ 计算对象数组与期望字段的匹配分数
386
+
387
+ Args:
388
+ objects_array: 解析后的对象数组
389
+ expected_fields: 期望的字段名集合
390
+
391
+ Returns:
392
+ 匹配分数(匹配的字段数量)
393
+ """
394
+ if not objects_array or not expected_fields:
395
+ return 0
396
+
397
+ match_count = 0
398
+
399
+ for obj in objects_array:
400
+ # 检查是否是字段名(以_结尾的字符串)
401
+ if obj.endswith('_'):
402
+ if obj in expected_fields:
403
+ match_count += 1
404
+ # 检查是否是类引用(不以_结尾,可能是oneof字段的类型)
405
+ elif not obj.endswith('_'):
406
+ # 类引用也算作有效匹配,但权重较低
407
+ match_count += 0.5
408
+
409
+ return int(match_count)
410
+
186
411
  def parse_enum_file(self, java_file_path: Path) -> Optional[List[tuple]]:
187
412
  """
188
413
  解析Java枚举文件,提取枚举值和数值
@@ -369,6 +594,18 @@ class JavaParser:
369
594
  字段标签映射 {field_name: tag} 或 None 如果解析失败
370
595
  """
371
596
  try:
597
+ # 首先检查是否有缓存的字段标签(用于内部类)
598
+ if hasattr(self, '_field_tags_cache'):
599
+ cache_key = str(java_file_path)
600
+ if cache_key in self._field_tags_cache:
601
+ self.logger.debug(f" 🎯 使用缓存的字段标签: {java_file_path}")
602
+ return self._field_tags_cache[cache_key]
603
+
604
+ # 检查文件是否存在(虚拟文件路径不存在)
605
+ if not java_file_path.exists():
606
+ self.logger.debug(f" 📁 文件不存在,跳过字段标签提取: {java_file_path}")
607
+ return None
608
+
372
609
  # 读取Java文件内容
373
610
  content = java_file_path.read_text(encoding='utf-8')
374
611
 
@@ -451,7 +688,7 @@ class JavaParser:
451
688
 
452
689
  def _extract_field_number_constants(self, content: str) -> dict:
453
690
  """
454
- 提取所有FIELD_NUMBER常量
691
+ 提取主类的FIELD_NUMBER常量(排除内部类)
455
692
 
456
693
  Args:
457
694
  content: Java文件内容
@@ -459,19 +696,65 @@ class JavaParser:
459
696
  Returns:
460
697
  常量名到值的映射 {const_name: value}
461
698
  """
699
+ # 首先找到主类的定义范围
700
+ main_class_content = self._extract_main_class_content(content)
701
+
462
702
  field_tag_pattern = re.compile(
463
703
  r'\s*public\s+static\s+final\s+int\s+' # 允许行首有空白字符
464
704
  r'([A-Z0-9_]+)_FIELD_NUMBER\s*=\s*(\d+)\s*;' # 允许常量名包含数字
465
705
  )
466
706
 
467
707
  constants = {}
468
- for match in field_tag_pattern.finditer(content):
708
+ for match in field_tag_pattern.finditer(main_class_content):
469
709
  const_name = match.group(1)
470
710
  tag_value = int(match.group(2))
471
711
  constants[const_name] = tag_value
472
712
 
473
713
  return constants
474
714
 
715
+ def _extract_main_class_content(self, content: str) -> str:
716
+ """
717
+ 提取主类的内容,排除内部类定义
718
+
719
+ Args:
720
+ content: Java文件内容
721
+
722
+ Returns:
723
+ 主类内容(不包括内部类)
724
+ """
725
+ # 找到主类的开始位置
726
+ main_class_pattern = re.compile(
727
+ r'public\s+final\s+class\s+\w+(?:\$\w+)?\s+extends\s+GeneratedMessageLite.*?\{',
728
+ re.DOTALL
729
+ )
730
+
731
+ main_class_match = main_class_pattern.search(content)
732
+ if not main_class_match:
733
+ # 如果找不到主类定义,返回整个内容作为回退
734
+ return content
735
+
736
+ main_class_start = main_class_match.end()
737
+
738
+ # 找到第一个内部类的开始位置
739
+ inner_class_pattern = re.compile(
740
+ r'\n\s*public\s+(?:static\s+)?(?:final\s+)?class\s+\w+\s+extends\s+',
741
+ re.MULTILINE
742
+ )
743
+
744
+ # 从主类开始位置搜索内部类
745
+ content_from_main_class = content[main_class_start:]
746
+ inner_class_match = inner_class_pattern.search(content_from_main_class)
747
+
748
+ if inner_class_match:
749
+ # 如果找到内部类,只返回主类部分
750
+ inner_class_start = main_class_start + inner_class_match.start()
751
+ main_class_content = content[:inner_class_start]
752
+ else:
753
+ # 如果没有内部类,返回整个内容
754
+ main_class_content = content
755
+
756
+ return main_class_content
757
+
475
758
  def _generate_possible_constant_names(self, field_name: str) -> List[str]:
476
759
  """
477
760
  根据字段名生成可能的常量名
pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "reproto"
7
- version = "0.1.1"
7
+ version = "0.1.2"
8
8
  description = "一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构."
9
9
  readme = "README.md"
10
10
  license = "Proprietary"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: reproto
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: 一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构.
5
5
  License: Proprietary
6
6
  Keywords: protobuf,reverse-engineering,android,jadx,proto
@@ -1,4 +1,4 @@
1
- .git/COMMIT_EDITMSG,sha256=OJTijUraf8zRGEsGyQ_Q3EFxeT206AEhvBZe9ph_cdI,28
1
+ .git/COMMIT_EDITMSG,sha256=ZMxpH6pUokSXJnvPbcBeiLQoVYGBv8788wLQgPcFiNA,1448
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,26 +17,35 @@
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=1ZM4jn-WDgRjp1f-_9M6vBnK5C1UuidTQaIKeFiExKs,2255
20
+ .git/index,sha256=BER3aCt6YwpTb83kAomV29Y3J8N9jcywkFQVsXY1Xb8,4051
21
21
  .git/info/exclude,sha256=ZnH-g7egfIky7okWTR8nk7IxgFjri5jcXAbuClo7DsE,240
22
- .git/logs/HEAD,sha256=KQbF4Gvsf1mX1Oincff6xO_eckSlWyiiuaEuggXtB3c,2515
23
- .git/logs/refs/heads/iyue,sha256=KQbF4Gvsf1mX1Oincff6xO_eckSlWyiiuaEuggXtB3c,2515
24
- .git/logs/refs/remotes/gitlab/iyue,sha256=MXaTNGsoegnTSIVXcmAVD4v2x2eYUJ7mT_klhYK_POY,1768
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
25
25
  .git/logs/refs/remotes/origin/HEAD,sha256=4vCPTgC0N80jhmkFXNUlYvHtGllYJkQTGZEn6LlqZgs,163
26
- .git/logs/refs/remotes/origin/iyue,sha256=q1Kmpw0iGhVPUH8py7HBY_0VtLLXRvfzwoKBRx9JBbc,1768
26
+ .git/logs/refs/remotes/origin/iyue,sha256=uT9xHigXpK42G5YW12Vz_w51KYtge70zwBhUL0_mYtE,1904
27
+ .git/objects/03/3fab23ccc74b707a31f6f37dc5df42c100aac0,sha256=QeXQ9x_0kJVZzjaA6G8MSPxwkIdZxg3bQpOt3gPmUio,3536
28
+ .git/objects/07/b71df33935c14ddf99e3480c04eca4685028bc,sha256=jk2YdZfFLF0_L6dtC5g3NXzhkuPzW8x5n5F2pD-Ih4s,1032
27
29
  .git/objects/09/a92517fe9eeb33d2fd7c979e01d163665f7abc,sha256=wyFL5jJ16f0xCpL1MB5EiJvs2opieE0hMEmyDpUV3ps,9356
30
+ .git/objects/0b/e20ea749c6ae1075ae98f9426e00b0a4a235af,sha256=oRIrMdIqLj8tPUctDVp0A3INeadtii7UAn40HVOJQDY,19177
28
31
  .git/objects/0c/7b11b535a18f311aedadbe91e14fc9fe6b50d9,sha256=1nmf96foQAXQrObKn9gOPugLMlpj7soMif1MBARmKd8,427
32
+ .git/objects/13/5f50fea51c72f977f48d06a7584aba0f61e260,sha256=ecYtHQ_j-MSBN5YdAbHdDdfuJB4WJudHggEe9zUA0FY,1239
29
33
  .git/objects/14/d323d58fb90c209a730c17e23fd82a6c735fc1,sha256=rTCuhPM5LYusLIMDv7CLC557SlRFvvbBzgr4jwrjMVg,426
30
34
  .git/objects/15/eb3f02479e633439ec83c143e703f8448043a1,sha256=duJXtvq_NNhYKG7WdejXgoMlyHIaCUG5jv9SJpU_orc,14711
31
35
  .git/objects/18/89a4fb55eb3abdc528ce87f0cea039278c06fd,sha256=Uz8TPtDNnPWR5pfsIx7tMDCDFBdWLIkaPcnYPIJ12oM,2880
32
36
  .git/objects/1a/4435c23bdf5543e3270aa69361c9c68f205efb,sha256=iNhiztqM2EYiQYjGpjBWg9h0l6YNbQHYafclGl1DB5I,96
37
+ .git/objects/1b/97584ebada3e93d7a2cfa4a1aae0b79c414d20,sha256=iW2wr9kcCBpIXh_0s-7WifsBkzO4TLRB2X78Sw-2dqE,166
38
+ .git/objects/1b/f0c1ad9586578e8332d061f7648dcb041ec063,sha256=9xYaVwWrVnbs7fSO_yO6YTbAQ3aMkJXp97uQ6tX99cE,1767
39
+ .git/objects/1e/46816d16e7c9db7575f1964403c3daa105be5c,sha256=Wqo7uWsh11BefjHvh2CEqowaA6zmNR-TcvNJv6WYjr4,459
33
40
  .git/objects/20/cf56ec106bcd66420dd000279f983571b918b6,sha256=0dwZwG7CpR7yYYNvgYDxHLPj2P7eRLK7fTW_En419pk,166
34
41
  .git/objects/21/55b64d52922c88527c102d62f23e5c2abbae79,sha256=6LLW2HrSfqqVwvO59yc-EcUp6MHw6zfHwu8TB775dII,13853
35
42
  .git/objects/23/bfbca38e177bcbb423dd782c35b19d127a5ab0,sha256=hYW2b3t3bVGNh4pqyyA7DMlyF4LfNZco5NwedWMwwuI,3700
36
43
  .git/objects/26/1f67f3b731b32f6d77de9dd7be2d61e2a14ace,sha256=mcasCBpCulVy2N-X_d2hg8567PdhZRof4ea5nYoelJM,96
44
+ .git/objects/27/24208ca2442e8ab9b453d0eb230fa41243b270,sha256=3nPNI4PWt3CdzVHzOVuTD522nSv9SS1T2U1kPBBt40I,50
37
45
  .git/objects/29/4708b82b343e04e7a6685f5cd1287f3d17f7a9,sha256=YE3F4zucGeMHEw7bTEvQc0uJEUUCfEgw-mZTWupuNhA,96
38
46
  .git/objects/2b/64656ce2df6259c822733b03f26eb828fe9269,sha256=62hS2mVKecw3uXd8yGs7djzHNeouyhbP6KhR1gGYosg,166
39
47
  .git/objects/2c/fcddd7eebeb4eee0562dc384a79366bc7b04bb,sha256=FHxE2giqoo-1IB9Q8i_XQUypGvQbRlRnTK0sbsNDcJE,96
48
+ .git/objects/2d/2b812ca27c477f9e1b2c2706a5eb795ffcf8eb,sha256=hATm5xxgdr9nhfzRX98_KBaPYdY9BbWNuTmJO7__Oxk,5518
40
49
  .git/objects/2d/a515dbb88d31400d5b84d41caf270e9309232d,sha256=cP9jUGnu5pVr9ks-YJZSEjsgb7GKD2XEr8XvQosqs2s,122
41
50
  .git/objects/2e/2c1c42f5ac5d665cc672d3792078b756d9ab0e,sha256=5LG3jHGORJeswNw0lz5dc6QSsxztyMstbRDADhZDnZY,166
42
51
  .git/objects/33/181441ab38eded005db356da89b54c7d29f452,sha256=iIM6a2aGs_TGZjxHKnkYYyZj_hA77nAF7r2lMOtN1VA,2021
@@ -48,21 +57,29 @@
48
57
  .git/objects/3c/c3ca375694d43e35cdc88d4a5d067e510df427,sha256=A79FHqMtws8sYqMG9CmHWbEPaxF8htYc_E2wVuMi2u4,6570
49
58
  .git/objects/3d/3cc6aab4eefed46c77dda27503bebcce88962c,sha256=6NOdtY3stGMa7_trzPhvb2T21Ng0WqFIJhkPhsW-ACU,420
50
59
  .git/objects/3e/d953d5ed2c66722045f5e39d068696a0853b4f,sha256=GelU4l-EVo8Y5rXSksIEnewIasEr9N54pTJcgrY3VVk,166
60
+ .git/objects/3f/b8830f516342a0ae1cb7c34b65016827cb9570,sha256=j36c6Wtp0Lp9HVP1xvV-2c25opLFzd3kzuxRHirgb9Y,803
51
61
  .git/objects/40/84f4567d983a977c49598b7d886e46b13ff50b,sha256=R3w6EvxpJRcVuJvbCslrGDK07kcOjECGGosj5tO-JBo,426
62
+ .git/objects/41/f40c22247de377be99e30784229f3f128508a2,sha256=3k-QVtbIvbMHt2cHrPJ0oh4TckwD6Pux6_v5J-EJhvY,2189
52
63
  .git/objects/44/4af3a0d68ba81976f67c7b638c9b0db4640709,sha256=s__MvPzT4Ndsip8kgkfMh-Y0oZ28tv2kVqaz_ExQKvU,166
53
64
  .git/objects/48/369b05749e384be9be58e5f943f3a0040d0f37,sha256=KP9dXx-XniZuIEXESlrL_MWWi55zGiFr7xtmp3oD67o,8551
65
+ .git/objects/48/cb11e75518a53be14146018214110986fade67,sha256=08B_QIXJL2_dGh_r-GmudDgLAmT-Bia0eRYyIbOKvFw,2562
54
66
  .git/objects/4b/43f5f577e1cdc35f8e06d178d8f5c892034061,sha256=eawBjiWutNeKjIzvNonVMMKUVsz_-jn3Uew_NsKQJ-I,1150
55
67
  .git/objects/4b/442fccf86631bf5196ee5b48ab8d58228ab59c,sha256=5LFRUcM6cV7lW29hge4-op6hYtbn5SZ6Ouz_4tW6k8w,4842
56
68
  .git/objects/4c/16984be6ef7b24d01604821e9728cb579acd69,sha256=sy5h3rBsk0JcPlpA7L0WhJESaYjNZnTvrB1F1CRPSJQ,167
57
69
  .git/objects/4d/6d457bfabc4af842e5ddc2d56eb059d5dfdc9d,sha256=HLQ8aGvln8ZuhdINhhbr_aTt2BttkJOY8k6LhciAMLE,672
70
+ .git/objects/4f/c6dc41f9c0a1a8e0eedd3ba49c43d78d0dbaba,sha256=VpE09gk2-91HvTU-HX-eYwdTUVgUxwQn5YtroMt08Uo,1675
58
71
  .git/objects/55/6723fdd4f525eed41c52fa80defca3f0c81c47,sha256=vwGNz5lxU_wrrRWVPU64TccYo4Vo4uUGC3-GwVIs1xs,4520
59
72
  .git/objects/56/79064a3138031d3a92d60aa629b82009fd0d1d,sha256=4pQvc0ulzTZ9RQEVr5yy37dV-uhP1VU58UyKcCugHHw,426
60
73
  .git/objects/58/0d8f872aa869e42ba608f64888b1349f8b3ff4,sha256=sag83Y6gsy8I31WmM2lVeBM-AYKgo5su3H97fuDOj14,13984
74
+ .git/objects/59/4c23f158ccbd0a4288f9ea046d06160195afbf,sha256=exJLnFGpuGY_PAAr3VIy6Ez0fLQ4DdDTL8wMqImKh8Y,1160
61
75
  .git/objects/5a/11f9d70791e06a0570e01d3dcbbae39cde55db,sha256=wjd8hb5D03icknLFsPqMas6xAFfG30_Wg-PJJH03ezg,13722
76
+ .git/objects/5b/d4d87753b79e9157817f0c2e6964a731052854,sha256=PK8JbTxqE1VLYE1hCBt6rPI6nSmJKnVnVYbpo42DftU,57
62
77
  .git/objects/5c/715dcb05e32db7a7a3b030f07524bdd8a56849,sha256=wLXhy_1PP8n3Gd6NsvY1eFlK1pjkIjW35im_BD-0yMU,426
63
78
  .git/objects/5d/e2e9d536c2c0b78e8f9b3b61daa531a55332dc,sha256=Wiyz9xFF5A95FEnxZULmV9TSJf0-erTb_qIhLFIvmag,6558
64
79
  .git/objects/5e/9daac72a48ce60688ab2eeddcc3d9152329e20,sha256=7sVW8qTIBHufxZ3WCnNwmX33RpciuLTPritqr84UmKk,426
80
+ .git/objects/65/0189fe083bd711e45d463b229a72be619abad2,sha256=A_rjGnyEfF5LPXsd1JWYWya49pffPhLzU4Gkg7p9Fcs,506
65
81
  .git/objects/65/a4f0ada7519f8b1e6a7c7e287541b8effde9fd,sha256=jSGkVjAMcm2nrF6w_0U7lmzoBgwIJaf4P8POOlABxEQ,188
82
+ .git/objects/66/663db35bfec8ef5f1a5b1c840fde1bb62a0eb8,sha256=5xcSNodjk8EYRqTQHZIX7-0mG35aBsCzOkiqK2sIzRc,252
66
83
  .git/objects/66/7291e131d4769e7d028346a0cc7a0c05d500e5,sha256=3D6kzCQW7DkYuwARYA74Tlfzeaiaob9ux4YE6hYohas,4026
67
84
  .git/objects/67/f27f77274917580e687fd00ca18da0660215c1,sha256=dxM9_T9v3VBrSXF3dbH6zsmbGQJn43-_DnHiDYs8108,15542
68
85
  .git/objects/67/f54a4a3ede6749acc7c718ad97a86634215b5e,sha256=n0_tiP-u_DP9uhXCryaz98mNJYcUX8RYiS48FvxIxCA,744
@@ -72,24 +89,33 @@
72
89
  .git/objects/78/3e7e252c20e73e33615c703174766036546ff6,sha256=cQ-PXyvzEYjb2Lr24anO9aGui5IxBxZCYXL6zZRc0xc,810
73
90
  .git/objects/7c/00eec7ae9ef5f94fc337e5c8f9793a2a48810d,sha256=Ju-Yuy5EARcIThU4vkHrZuHQWu3MjXSZYGtBDTWR18c,96
74
91
  .git/objects/7e/5935774ee7a85f2523427c9100f9c578ac172f,sha256=ywEI3w5JgIOgFDJ6cxc6NJnLfEr2Cjynke78KmwJhSE,165
92
+ .git/objects/8a/0ed0ed8886fbc823e8d2258fa6d18699e94e25,sha256=VpidpA9wUduTJVrffzMKo4KL6HAhkBBxZEaNdGX9Ejw,122
75
93
  .git/objects/8c/809c42c7ae13007fd885ee7bcffae7acf2c520,sha256=HYoU3_cZUGur3rWrgRvzHRAv0JfrXgc34R8UeGbC5Bc,14180
76
94
  .git/objects/8d/44142ae2d6dbb59d4ebed8587bccd051e5766b,sha256=l1G5ZzQBQW8Lxd3WvGLRcY6quM6dBL4zdNT5ovjv3Dc,802
77
95
  .git/objects/8d/4a5767bef0c342f1660526f9671c0944922c40,sha256=kP0nfEnyNmuEJ4wLQabhPPx60OIa5Dxqn7R9Ni89CqY,1900
96
+ .git/objects/8d/d857b3d0ab3f5cd2e9173d532ef86e30df8eda,sha256=dTFdFA8EPaLpDuJ4X-hfXjbwiAfKBY-EvFJ77H2mRxY,18883
78
97
  .git/objects/92/c6018b4fb8e3b6c2f3f3054a56f2bfaca27470,sha256=Oox2busLjPpkXw6To9NfgDMXHuknlICbhyhyTWUT1lU,96
79
98
  .git/objects/94/ce01b61b90d1fb21d2d339fbeb22e821b6f413,sha256=oSSA97T7TGnstzHDjUrdwzwZO4d1qIUyjo6lz_EbNbM,122
80
99
  .git/objects/95/295a15779ebefd563ec777c3d3cced7e8d0209,sha256=IIN8_K0K-3LAkUI4Ra3DS8yUsfpsqteSDGhgvRpSfZ4,426
81
100
  .git/objects/97/56fe0931216a7c40cbf250e1ab8a6dfd589f13,sha256=Su7Q-bXO0K9QKEGC249NVuUS62xmQs5TgWfEmdbauaI,97
82
101
  .git/objects/97/71dd4958faa94d3db229c129f6af35b508905a,sha256=Tc_ZkUqvJ4rk0QG5Bvwkp4DkMM9DlsmjdMIyDaO1S2k,756
83
102
  .git/objects/9a/e313cdf64cd82416c1238eb493e6396f799f12,sha256=9bPRhebwMVqtGqJUxfVq-TEUxceuOdSvicWe1H8F7Ks,876
103
+ .git/objects/9e/23448ac58f907d9d123c32bdccedbb3d6741b5,sha256=iqH9u5FAMzeSJ8QgFQnE1D2jPxIWx7b66Vd0RrqetvI,96
84
104
  .git/objects/9e/9978522bc8ca79133d7c11ef8ca3fe3c7eed0a,sha256=FkHx7Pp6DCZ5e4bRo2RjRU875YBgl9tEw7Z_9Rii8cE,13109
85
105
  .git/objects/9f/b57064e0c53ed80af8507acaab718a1e80184e,sha256=DGx0Ie-bppvghrmiV5w7mn24c6YlvHvYLIQsm-_jzsQ,635
106
+ .git/objects/a0/d192999af7e2cbfa6a9ccd04d720a04e5a06d5,sha256=Zd6l-w5TxqsdgCZqkDz_pr9BWPJGb5bmbDrFlMl2Qx8,882
86
107
  .git/objects/a0/d630c3f6024b196d4ee933ab13a32905efdaaa,sha256=nNyB1T2FVU2vm3f-aAjEl-vBLbxYsKHibRIPhqCX9jQ,426
87
108
  .git/objects/a3/cedc28e563a1845a7860161b39b0fe58d5f0d3,sha256=Vee0H8dhSj4ERNDSAnRU6vebs0tbY1-lgYr1Nz5X7bc,122
88
109
  .git/objects/a5/b7e4e1b63bfb65288f6553687aaabcfb4d51b1,sha256=9tl9xb48EdvQk9GIg6mEzXSwqUgD6yEVZx-sVxaQVKw,1064
110
+ .git/objects/a9/cc7923c34a4c97c5711d6309672f41d46c612a,sha256=NvxVg0v7oBl27tQ8feThD45Gw97gZ6ZbbqVUZbp3CYQ,1041
89
111
  .git/objects/ae/046e08176523e8a98dc7294436319f724db13c,sha256=9hdXV7BKRhfFTOz3FSuoYwGrcjvk2uTPo3CD1czuKcU,803
112
+ .git/objects/af/c9cc15629847447063e86a82b8b56abb4fc08f,sha256=dzjzk6kncEmUtMbBEhkOuThFWDb4-2AyaFmKHpGU_RI,3155
90
113
  .git/objects/b0/7a43f0462bf25a8b1f4c0ca60c1b533dae1dde,sha256=JWzlC7nXy3RXBUxEcge1_ciMw6q3C5phffVck9MVlJk,404
114
+ .git/objects/b1/db1c131cf32916028342c0037ce8eb57a8eb26,sha256=bgcHj-13lalI3KZLo4PS1xneLz-E1oSxp1qIfCiqSH0,17243
115
+ .git/objects/b2/8334b94392b8af397a05ed702690fa6c9ab1ca,sha256=QnXhDj4XDoGwytea6h_RgeaoWX3jXffxX6S7DcMzRZo,3461
91
116
  .git/objects/b3/28dc445ee33220db9359370fc0089a77174101,sha256=cipG_34_tKM5VPfYW2wRCmBYOqlmTBIUjakeph9sfl4,3652
92
117
  .git/objects/b3/d2b3037bede44e7e4d18dc99419f8c712c9c62,sha256=OIWo7wvTTKYZkYkxcZrOtnvfqgGlPezaE6sglITaF_Y,1156
118
+ .git/objects/b8/7c89dcfce9e244ff5ef6a4bd394de12e8c8092,sha256=kE2ed_VMlop9lFeD9xXhrmql0ybRkMT6SbgWSP-0f7I,1249
93
119
  .git/objects/c3/93db4841dbbb8acf54e9af12b6705c9f5ecde9,sha256=g36XyKIObniMsMBcIzsoG7f82SzOgn_Bdx-V9Rezjbg,3864
94
120
  .git/objects/c3/c8594874dd9ff9c21662fd06cac9b5baadbba0,sha256=5YUWDZ-BMZvyOJksaoiKeZC0N-eRcOJemLb_jNUHcC4,14309
95
121
  .git/objects/c8/2a656fe6b5d479b327cdf5fe3bf60db987a2a2,sha256=YNf8mWKTqJHeBDQCTfOU8b0ZDDSfbAb1fBGGDsySrHk,426
@@ -98,56 +124,79 @@
98
124
  .git/objects/c9/cdef9ab627b874ffe6455a47583a75bf16496d,sha256=7y908SUa7dmWJyNXDKS_tOdrcfmI6OjZc7zvtL38M5Y,428
99
125
  .git/objects/cd/2d6c229438c6b1c694b9392a85888d89ef49c1,sha256=IW9iGk3Eb-i_Ht64HQcltVp27ziQHz5IP6k5p57YFtY,122
100
126
  .git/objects/d0/9c84ad2142a187bf26a1714b7041b62e404c8f,sha256=twhhaZbfU_mgu5LIlt9ZeGjp_PT_gri_9H231H5nrNc,2172
127
+ .git/objects/d9/3bd435c8c7ad4efb83dff04d5450fabb9e3faf,sha256=Dfce7XnTEPSLCJamlY36SeWUBiScdITejT2zhr9xwbg,2816
101
128
  .git/objects/d9/6d7456245232b3e159dcf691f11e51224c557a,sha256=3w45hxiT2rn6ljSdgo36fHMMWZt30r5C1FPvbnjq9tc,597
102
129
  .git/objects/db/beedb30613f79ae3ff67df1428cf8ade223711,sha256=tTGayiwSvdy-uBiXQKRhNnToZ_dc1BmeXZ2mltuRfxY,3812
103
130
  .git/objects/df/f8f64cee2b97df7d86f73207c5e690f98f0208,sha256=eRT2hUSKxaIPfQVnE9NaRGxbAvBVCSreSOGzVGtd7As,213
104
131
  .git/objects/e2/b7433fbfbfac5bc800a962be2f4adbed145b42,sha256=eqX17kz7wSegBgSYS8q4oMPsZVvNWoDbpCRw7oI5PmE,15527
132
+ .git/objects/e3/27755808d88c7ae5c06c229cf18bd0519646df,sha256=GQJi0cnGbjOZLiK8-PyTZlVupBaT6g-ar2N-RJp0NN4,9619
105
133
  .git/objects/e4/1e5aa2bc3074c2014d01ab1f603f69c327a83f,sha256=5daI7Vb9ehvOwoqgaBAKilm6Z6YdA4Rk4MFjJChbWpA,379
134
+ .git/objects/e5/83e7c40be934d16a1fa2e973487b395d930f42,sha256=BLXKgjdPyjn2Y-x-OQfbdg5JXCq3Nrnvwh5PfGMpmxQ,1848
106
135
  .git/objects/e8/1433b6ad92206cdadbee1f474b4f99383314cb,sha256=mRMdmx6wCs6b-63QL72Iutm2AUVCOIYs7J5XbAsLluc,426
107
136
  .git/objects/e8/2f42ea26b8bf4f0bc92c0648ac8f190f14226d,sha256=xtbEwloZnqXdNdViAevzyprosfPQ1P--xAu6URGlaYI,155
108
137
  .git/objects/e9/a15996cb55ac72aeb6611d26e8d22246589943,sha256=sTn6X3xMp3_WYpj1CmP2hDqviX86aJHTCzzi_ZTpBKw,4643
109
138
  .git/objects/eb/528f06c622d54e411e9e05b3a200b4ac624a90,sha256=i9b0c6j5KYuoPAR_-5923QJwBZM2_aq2Y-CElPjRT0M,4596
139
+ .git/objects/ed/1ae867d5e63195845afc58d88c38ecbdea97df,sha256=Qo5oowjv4LCkhCgdr9UwcDCzcOQdkWxWuY-gL9zD78k,48
110
140
  .git/objects/ed/fb5bbf938de738d1f658f80e23c675bb8b3fae,sha256=MOYiuXKTxnd9YcqU3-HUVUq2g9fPU1-AKZOQ-3xsWCk,4237
111
141
  .git/objects/ef/4844af55f7f64b8dd24b81b5a8322a8c80208e,sha256=hO8yllVMOtIE4HeOvwKSqQUByH6lvaA4L-RYrSU4vlg,167
142
+ .git/objects/ef/f44e5099da27f7fb1ef14bb34902ccf4250b89,sha256=-QgSwHLJXN1UHaeMpGc8blhSm0nm_4GuSCdC-h_IM0o,2816
112
143
  .git/objects/f2/2bfffda9fb6a7f37bed04b7c40c9466ef09454,sha256=goQNyEV3NqzS28mMXuus1SWzwb8yXnvEPef14Ugzh5Q,750
113
144
  .git/objects/f5/18c69a6e1bf3052b79da01502b2837ea58f0f4,sha256=r98SFbCvw7yeAYTjzkw-2VMhOVbpm79FLZQiC5A1-pw,123
145
+ .git/objects/f5/1be495b96272fa2e47f30071aed35ac1f0dd2c,sha256=xjweeKCHsLUlfdROM1YxycVfwVexy-_1VhEA8Ki4Rfc,5050
114
146
  .git/objects/f7/25a430eb3364460ba854dbc8809edc21dc6c70,sha256=LdyMmAWGLWbn5G5fC7eAPi4NFOboKcJ6iJJdxENSUCk,2505
115
147
  .git/objects/fa/fc981b0d80d8d0323c04365785f66996ed5211,sha256=t9N37kVA7j_i4nz0dDMHOQpvziBu5MUpDlG06Hdj77c,4395
116
148
  .git/objects/fc/e15b9dbffd9f37b1f2d46944ee2d0394df6565,sha256=81qdzKkVZ5C_1oej2Mm0q2RLifilVFolIs95mrUfpg4,163
149
+ .git/objects/fd/0bc07dc3c95e6168ab6d367d9eca139ac1e539,sha256=29lnkRe3MYSLwu997QipK5TLUYzZuOKhQmO3usm17H0,3002
117
150
  .git/objects/fd/267d9de63212db235135fa6834f62572224fc6,sha256=vzhjdZvcXQ8Fgja_XwvbBkuLuRhzSYf_3mckDyZEoso,426
118
151
  .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.idx,sha256=KRv1SBEe9bYL9d5V301LwPOBqFs3tMnB0dl4PriMMIw,2416
119
152
  .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.pack,sha256=R4oMXhr-NcPAUBXStCbAaUvGUDW_SBECmPIbiB9Gy48,42003
120
153
  .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.rev,sha256=22_3sqyTNB5IbwAK5oCqNz0UxDDqoZ5jcF7p_44Lalo,244
121
154
  .git/packed-refs,sha256=4H0m4wd6q98wZkBk7WfvVeTBuuxQdTE65XxsswYP-oQ,112
122
- .git/refs/heads/iyue,sha256=R9_PlsRLn-c1Boht7Ouun-MAQQj_9PDIfKr5H-8LOmc,41
123
- .git/refs/remotes/gitlab/iyue,sha256=R9_PlsRLn-c1Boht7Ouun-MAQQj_9PDIfKr5H-8LOmc,41
155
+ .git/refs/heads/iyue,sha256=A74qY_Q8QJmxyPExo7cXoAyl0J2WZtnXu-hfgucjN4E,41
156
+ .git/refs/remotes/gitlab/iyue,sha256=A74qY_Q8QJmxyPExo7cXoAyl0J2WZtnXu-hfgucjN4E,41
124
157
  .git/refs/remotes/origin/HEAD,sha256=G8pFPTbCqnJ2IkCzz9J-STqOXWU6TrlXfpt1wx5bUWE,30
125
- .git/refs/remotes/origin/iyue,sha256=R9_PlsRLn-c1Boht7Ouun-MAQQj_9PDIfKr5H-8LOmc,41
126
- .gitignore,sha256=7KBWk3hOUkvfJh1A-RNk5jHepGKp71qPlktu8nyEptI,2085
158
+ .git/refs/remotes/origin/iyue,sha256=A74qY_Q8QJmxyPExo7cXoAyl0J2WZtnXu-hfgucjN4E,41
159
+ .gitignore,sha256=HHs2RDf54i9UJ3Z-pqWWCy8wyQLN7FCvz8Zm-RGN65s,2091
127
160
  .python-version,sha256=NxOs_9lT1XG8y-FjlRru-YinX5RcBJt_ulPwgDESZ_o,7
128
161
  ARCHITECTURE.md,sha256=HiUhP4wGzy4lD01MpHjOgAhuAUwpNsEac3tZaE65kos,12047
129
162
  README.md,sha256=khO65a7VGeyjyUxxXpu1W_EosoPLzJyWCol6jDVzw9k,8484
130
163
  core/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
131
164
  core/bytecode_parser.py,sha256=bv01quLoLeKHjswLU86g4w3MeZR9uh7WIJsnV2sGE2g,11399
132
- core/info_decoder.py,sha256=n4A6U9jxzRLdzP48QBxBpJ6AKsccR2PWfbG8wKKqwl0,49802
133
- core/reconstructor.py,sha256=_Kym2_gqDi76MgOK7E7DiQX447Dm8fwnPtHKpN631dM,55500
165
+ core/info_decoder.py,sha256=vQtB7JvJ9letQCovGuwmSo6g8Npkpy-W5UCZk5PzIFE,73318
166
+ core/reconstructor.py,sha256=9uIbo69iPvuFqfArokf_BwadA2Cd6fZBiqEfITKrgEw,62211
134
167
  generation/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
135
- generation/proto_generator.py,sha256=8Pfgr8gFw6-UodVX5JBQk6OrRbGUEQHCZ120euqN8Pg,19715
168
+ generation/proto_generator.py,sha256=DPPng-Nna3sW5d200D-P7vbOE8vx7X3R6cBwhq7cjqY,21958
169
+ include/google/protobuf/any.proto,sha256=vPXebORjsaOP92t3lVqn5YC07BKvNKknsdRcnvsPr2Y,6154
170
+ include/google/protobuf/api.proto,sha256=naqFihxSn0f51O0bwt8Nq2FUrUL5nPA1Gz2p1Nr_jrA,7729
171
+ include/google/protobuf/compiler/plugin.proto,sha256=fjnlljCh8BGNcVv9D-NIHBYN4hRP9ZUsXj7SCizk-oI,8556
172
+ include/google/protobuf/cpp_features.proto,sha256=wM9-hphZYrcNfiAeZGrRCXBxfyLI3TOK-0F95Dd0_5U,2185
173
+ include/google/protobuf/descriptor.proto,sha256=QovXz8dMTlPcqwbTcICqWJRSwvkzYLy6zNXR14pQ6LE,57489
174
+ include/google/protobuf/duration.proto,sha256=o_cwH_KVbsLjDCJB7OBxl-SobHUjSNVgciSBnUkhyf4,4892
175
+ include/google/protobuf/empty.proto,sha256=7O89VMyeB5ZzuYFsZ7rHcPfzv22totRZa6adcdqpceY,2363
176
+ include/google/protobuf/field_mask.proto,sha256=F7DzQsw6Ji4xfVaITz9XWvv6xRKtBXk0nMdFDkHyaJE,8185
177
+ include/google/protobuf/go_features.proto,sha256=LszrrwacFcejrI113S_c0PEwe_mUlp_NbRt9Y6WrVIU,2521
178
+ include/google/protobuf/java_features.proto,sha256=pkYTdwIlZ4HcTT8IpOCnjJMjcAknQH4ltsYNsv9j-kc,4835
179
+ include/google/protobuf/source_context.proto,sha256=N9NAHeia8dFJb8lJkkpfIBG9L6376w2hyqJ3FZqWd20,2341
180
+ include/google/protobuf/struct.proto,sha256=G_B7qLmiTjoDkN3aw60NtBxjKH0lJ4iwI5giC5q8kA8,3778
181
+ include/google/protobuf/timestamp.proto,sha256=FAUsYELB3S0LUCRfKBLqq26vgtsLbozkg-rlJ_c7bug,6449
182
+ include/google/protobuf/type.proto,sha256=4jDg5K64fJXp8casv8DHE9s_iAlPFJsVRxelHQIPdQs,6367
183
+ include/google/protobuf/wrappers.proto,sha256=aHjcdTTPmAXu5WNFzcOLXpyjneziRnEMZjxwB6Z_70k,5392
136
184
  main.py,sha256=3G649-aTByEjMS4tb1A9wcO9NVUxXVSvdwGTq9hXxBI,7081
137
185
  models/__init__.py,sha256=WScv63rvEl65y5CWjpb6__hvjNvjpCkl6lz1Z2u0IYc,811
138
186
  models/message_definition.py,sha256=AszUZnNPSBn9SMXne5ORDBiGZz1W2pcYmU8ftGC3Mks,4873
139
187
  parsing/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
140
188
  parsing/enum_parser.py,sha256=4BjMk1NIYgt2FDZUjTZyOvFfC1uJp_MBZipVdk1tqes,6175
141
- parsing/java_parser.py,sha256=lFdnTzG0OeMlpzUkFDy4_mhOfW0B6gDEKO-3GfAvlVQ,21786
142
- pyproject.toml,sha256=7pAFQe6zD5eqAkTInATLVoUlGjhfjsTtdrTJYZO1c0E,1378
189
+ parsing/java_parser.py,sha256=yPUAugI_7x_doQhmAu61OGg1m7-UsHMZLyJKDQ9D8bk,33542
190
+ pyproject.toml,sha256=YwQ1oFwF1s_H0hPMqy0JHmqTPuG-z-DFCg05kKLYF-8,1378
143
191
  requirements.txt,sha256=cQGj3IS6Kj88jbwj_jeKkokMnG-fEezWve91mfW4CJs,96
144
192
  utils/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
193
+ utils/builtin_proto.py,sha256=6KnwpTaI4vdydrEeotPf3NSC4Q0kNxT8a9IALxPnt4E,9117
145
194
  utils/file_cache.py,sha256=eOBkfrumWg0EU1EfLESnRN1kcidi_MocxV_EWP8lEhQ,5207
146
195
  utils/file_utils.py,sha256=N1Ei7hmyeOkIyZJFEXyNbtTrfeVF2hP-U8evXAVW2MA,4085
147
196
  utils/logger.py,sha256=473DfzFVXzdGpiRTJGY6bBd-V5G80_P07gQqcvDChpQ,2447
148
197
  utils/type_index.py,sha256=So8FYyGtR0ff-ZhVHjXUdhXiXQEujlcCEJlj7OPQMsg,12128
149
- utils/type_utils.py,sha256=M3eB7GavxQYAVFOf3E1pO1vK9VD6_lKrutnSH1tx_Gs,14695
150
- reproto-0.1.1.dist-info/METADATA,sha256=pIVlOz9VFGwSkENYwX2B2VdzHHvhkxotl1SL9iI1Rpw,9433
151
- reproto-0.1.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
152
- reproto-0.1.1.dist-info/entry_points.txt,sha256=6Oro9lK_2DXDgHiB3andNuIE78wxfooqacqp8yY1C-g,37
153
- reproto-0.1.1.dist-info/RECORD,,
198
+ 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,,