dimples 1.6.3__tar.gz → 1.6.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. {dimples-1.6.3 → dimples-1.6.4}/PKG-INFO +1 -1
  2. {dimples-1.6.3 → dimples-1.6.4}/dimples/utils/conf_item.py +30 -18
  3. {dimples-1.6.3 → dimples-1.6.4}/dimples.egg-info/PKG-INFO +1 -1
  4. {dimples-1.6.3 → dimples-1.6.4}/setup.py +1 -1
  5. {dimples-1.6.3 → dimples-1.6.4}/LICENSE +0 -0
  6. {dimples-1.6.3 → dimples-1.6.4}/README.md +0 -0
  7. {dimples-1.6.3 → dimples-1.6.4}/dimples/__init__.py +0 -0
  8. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/__init__.py +0 -0
  9. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/checker.py +0 -0
  10. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/checkpoint.py +0 -0
  11. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/compat/__init__.py +0 -0
  12. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/compat/loader.py +0 -0
  13. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/__init__.py +0 -0
  14. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/app/__init__.py +0 -0
  15. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/app/filter.py +0 -0
  16. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/app/group.py +0 -0
  17. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/app/handler.py +0 -0
  18. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/commands.py +0 -0
  19. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/creator.py +0 -0
  20. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/customized.py +0 -0
  21. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/group.py +0 -0
  22. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/grp_expel.py +0 -0
  23. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/grp_invite.py +0 -0
  24. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/grp_join.py +0 -0
  25. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/grp_query.py +0 -0
  26. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/grp_quit.py +0 -0
  27. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/grp_reset.py +0 -0
  28. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/grp_resign.py +0 -0
  29. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/cpu/handshake.py +0 -0
  30. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/facebook.py +0 -0
  31. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/messenger.py +0 -0
  32. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/network/__init__.py +0 -0
  33. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/network/session.py +0 -0
  34. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/network/state.py +0 -0
  35. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/network/transition.py +0 -0
  36. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/packer.py +0 -0
  37. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/processor.py +0 -0
  38. {dimples-1.6.3 → dimples-1.6.4}/dimples/client/terminal.py +0 -0
  39. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/__init__.py +0 -0
  40. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/anonymous.py +0 -0
  41. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/ans.py +0 -0
  42. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/archivist.py +0 -0
  43. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/checker.py +0 -0
  44. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/compat/__init__.py +0 -0
  45. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/compat/address.py +0 -0
  46. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/compat/compatible.py +0 -0
  47. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/compat/compressor.py +0 -0
  48. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/compat/entity.py +0 -0
  49. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/compat/loader.py +0 -0
  50. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/compat/meta.py +0 -0
  51. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/compat/network.py +0 -0
  52. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/dbi/__init__.py +0 -0
  53. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/dbi/account.py +0 -0
  54. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/dbi/message.py +0 -0
  55. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/dbi/session.py +0 -0
  56. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/facebook.py +0 -0
  57. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/messenger.py +0 -0
  58. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/mkm/__init__.py +0 -0
  59. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/mkm/bot.py +0 -0
  60. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/mkm/station.py +0 -0
  61. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/mkm/utils.py +0 -0
  62. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/packer.py +0 -0
  63. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/processer.py +0 -0
  64. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/__init__.py +0 -0
  65. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/ans.py +0 -0
  66. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/app.py +0 -0
  67. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/block.py +0 -0
  68. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/groups.py +0 -0
  69. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/grp_admin.py +0 -0
  70. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/handshake.py +0 -0
  71. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/login.py +0 -0
  72. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/mute.py +0 -0
  73. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/password.py +0 -0
  74. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/report.py +0 -0
  75. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/roles.py +0 -0
  76. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/utils.py +0 -0
  77. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/protocol/version.py +0 -0
  78. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/queue.py +0 -0
  79. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/register.py +0 -0
  80. {dimples-1.6.3 → dimples-1.6.4}/dimples/common/session.py +0 -0
  81. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/__init__.py +0 -0
  82. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/flexible.py +0 -0
  83. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/gate.py +0 -0
  84. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/gatekeeper.py +0 -0
  85. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/mars.py +0 -0
  86. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/mtp.py +0 -0
  87. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/protocol/__init__.py +0 -0
  88. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/protocol/mars.py +0 -0
  89. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/protocol/ws.py +0 -0
  90. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/queue.py +0 -0
  91. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/seeker.py +0 -0
  92. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/session.py +0 -0
  93. {dimples-1.6.3 → dimples-1.6.4}/dimples/conn/ws.py +0 -0
  94. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/__init__.py +0 -0
  95. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/account.py +0 -0
  96. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/dos/__init__.py +0 -0
  97. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/dos/base.py +0 -0
  98. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/dos/document.py +0 -0
  99. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/dos/group.py +0 -0
  100. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/dos/group_history.py +0 -0
  101. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/dos/group_keys.py +0 -0
  102. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/dos/login.py +0 -0
  103. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/dos/meta.py +0 -0
  104. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/dos/private.py +0 -0
  105. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/dos/station.py +0 -0
  106. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/dos/user.py +0 -0
  107. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/message.py +0 -0
  108. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/redis/__init__.py +0 -0
  109. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/redis/base.py +0 -0
  110. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/redis/document.py +0 -0
  111. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/redis/group.py +0 -0
  112. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/redis/grp_history.py +0 -0
  113. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/redis/grp_keys.py +0 -0
  114. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/redis/login.py +0 -0
  115. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/redis/message.py +0 -0
  116. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/redis/meta.py +0 -0
  117. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/redis/station.py +0 -0
  118. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/redis/user.py +0 -0
  119. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/session.py +0 -0
  120. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/t_base.py +0 -0
  121. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/t_cipherkey.py +0 -0
  122. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/t_document.py +0 -0
  123. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/t_group.py +0 -0
  124. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/t_group_history.py +0 -0
  125. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/t_group_keys.py +0 -0
  126. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/t_login.py +0 -0
  127. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/t_message.py +0 -0
  128. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/t_meta.py +0 -0
  129. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/t_private.py +0 -0
  130. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/t_station.py +0 -0
  131. {dimples-1.6.3 → dimples-1.6.4}/dimples/database/t_user.py +0 -0
  132. {dimples-1.6.3 → dimples-1.6.4}/dimples/edge/__init__.py +0 -0
  133. {dimples-1.6.3 → dimples-1.6.4}/dimples/edge/messenger.py +0 -0
  134. {dimples-1.6.3 → dimples-1.6.4}/dimples/edge/octopus.py +0 -0
  135. {dimples-1.6.3 → dimples-1.6.4}/dimples/edge/shared.py +0 -0
  136. {dimples-1.6.3 → dimples-1.6.4}/dimples/edge/start.py +0 -0
  137. {dimples-1.6.3 → dimples-1.6.4}/dimples/emitter.py +0 -0
  138. {dimples-1.6.3 → dimples-1.6.4}/dimples/group/__init__.py +0 -0
  139. {dimples-1.6.3 → dimples-1.6.4}/dimples/group/admin.py +0 -0
  140. {dimples-1.6.3 → dimples-1.6.4}/dimples/group/builder.py +0 -0
  141. {dimples-1.6.3 → dimples-1.6.4}/dimples/group/delegate.py +0 -0
  142. {dimples-1.6.3 → dimples-1.6.4}/dimples/group/emitter.py +0 -0
  143. {dimples-1.6.3 → dimples-1.6.4}/dimples/group/helper.py +0 -0
  144. {dimples-1.6.3 → dimples-1.6.4}/dimples/group/manager.py +0 -0
  145. {dimples-1.6.3 → dimples-1.6.4}/dimples/group/packer.py +0 -0
  146. {dimples-1.6.3 → dimples-1.6.4}/dimples/group/shared.py +0 -0
  147. {dimples-1.6.3 → dimples-1.6.4}/dimples/register/__init__.py +0 -0
  148. {dimples-1.6.3 → dimples-1.6.4}/dimples/register/base.py +0 -0
  149. {dimples-1.6.3 → dimples-1.6.4}/dimples/register/ext.py +0 -0
  150. {dimples-1.6.3 → dimples-1.6.4}/dimples/register/run.py +0 -0
  151. {dimples-1.6.3 → dimples-1.6.4}/dimples/register/shared.py +0 -0
  152. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/__init__.py +0 -0
  153. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/checker.py +0 -0
  154. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/cpu/__init__.py +0 -0
  155. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/cpu/ans.py +0 -0
  156. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/cpu/creator.py +0 -0
  157. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/cpu/document.py +0 -0
  158. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/cpu/handshake.py +0 -0
  159. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/cpu/login.py +0 -0
  160. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/cpu/report.py +0 -0
  161. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/deliver.py +0 -0
  162. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/dis_roamer.py +0 -0
  163. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/dispatcher.py +0 -0
  164. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/facebook.py +0 -0
  165. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/messenger.py +0 -0
  166. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/packer.py +0 -0
  167. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/processor.py +0 -0
  168. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/push.py +0 -0
  169. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/session.py +0 -0
  170. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/session_center.py +0 -0
  171. {dimples-1.6.3 → dimples-1.6.4}/dimples/server/trace.py +0 -0
  172. {dimples-1.6.3 → dimples-1.6.4}/dimples/station/__init__.py +0 -0
  173. {dimples-1.6.3 → dimples-1.6.4}/dimples/station/handler.py +0 -0
  174. {dimples-1.6.3 → dimples-1.6.4}/dimples/station/shared.py +0 -0
  175. {dimples-1.6.3 → dimples-1.6.4}/dimples/station/start.py +0 -0
  176. {dimples-1.6.3 → dimples-1.6.4}/dimples/utils/__init__.py +0 -0
  177. {dimples-1.6.3 → dimples-1.6.4}/dimples/utils/cache.py +0 -0
  178. {dimples-1.6.3 → dimples-1.6.4}/dimples/utils/checker.py +0 -0
  179. {dimples-1.6.3 → dimples-1.6.4}/dimples/utils/config.py +0 -0
  180. {dimples-1.6.3 → dimples-1.6.4}/dimples/utils/digest.py +0 -0
  181. {dimples-1.6.3 → dimples-1.6.4}/dimples/utils/http.py +0 -0
  182. {dimples-1.6.3 → dimples-1.6.4}/dimples/utils/log.py +0 -0
  183. {dimples-1.6.3 → dimples-1.6.4}/dimples.egg-info/SOURCES.txt +0 -0
  184. {dimples-1.6.3 → dimples-1.6.4}/dimples.egg-info/dependency_links.txt +0 -0
  185. {dimples-1.6.3 → dimples-1.6.4}/dimples.egg-info/entry_points.txt +0 -0
  186. {dimples-1.6.3 → dimples-1.6.4}/dimples.egg-info/requires.txt +0 -0
  187. {dimples-1.6.3 → dimples-1.6.4}/dimples.egg-info/top_level.txt +0 -0
  188. {dimples-1.6.3 → dimples-1.6.4}/setup.cfg +0 -0
  189. {dimples-1.6.3 → dimples-1.6.4}/tests/test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dimples
3
- Version: 1.6.3
3
+ Version: 1.6.4
4
4
  Summary: DIMP Library for Edges and Stations
5
5
  Home-page: https://github.com/dimchat/demo-py
6
6
  Author: Albert Moky
@@ -32,7 +32,7 @@ from aiou import JSONFile
32
32
 
33
33
  from dimsdk import JSON
34
34
  from dimsdk import Dictionary
35
- from dimsdk import ID
35
+ from dimsdk import EntityType, ID
36
36
  from dimsdk import Facebook
37
37
 
38
38
  from .log import Logging
@@ -58,7 +58,7 @@ class IConfig(ABC):
58
58
  raise NotImplementedError('NotImplemented')
59
59
 
60
60
  @abstractmethod
61
- def get_list(self, section: str, option: str, separator: str = ',') -> List[str]:
61
+ def get_list(self, section: str, option: str, separator: str = ',') -> Optional[List[str]]:
62
62
  raise NotImplementedError('NotImplemented')
63
63
 
64
64
 
@@ -123,6 +123,7 @@ class MessageTransferAgent(Dictionary):
123
123
 
124
124
 
125
125
  class Supervisor(Logging):
126
+ """ System Administrators """
126
127
 
127
128
  def __init__(self, facebook: Facebook):
128
129
  super().__init__()
@@ -135,32 +136,43 @@ class Supervisor(Logging):
135
136
  return ref()
136
137
 
137
138
  # noinspection PyMethodMayBeStatic
138
- def get_identifiers(self, config: IConfig, section: str, option: str = 'supervisors') -> Optional[List[ID]]:
139
+ def check_user(self, identifier: ID) -> bool:
140
+ """ Filter user """
141
+ return identifier.type == EntityType.USER
142
+
143
+ # noinspection PyMethodMayBeStatic
144
+ def get_identifiers(self, config: IConfig, section: str, option: str) -> List[ID]:
145
+ """ Get ID list from config """
139
146
  array = config.get_list(section=section, option=option)
140
- if array is None:
141
- return None
142
- else:
143
- return ID.convert(array=array)
147
+ return [] if array is None else ID.convert(array=array)
144
148
 
145
- async def get_users(self, config: IConfig, section: str, option: str = 'supervisors') -> Optional[Set[ID]]:
149
+ async def get_users(self, config: IConfig, section: str = 'system', option: str = 'supervisors') -> Set[ID]:
150
+ """ Get system administrators from config """
151
+ all_users = set()
146
152
  array = self.get_identifiers(config=config, section=section, option=option)
147
- if array is None:
148
- return None
153
+ if array is None or len(array) == 0:
154
+ return all_users
149
155
  facebook = self.facebook
150
156
  if facebook is None:
151
- return set(array)
152
- # extract all users
153
- all_users = set()
157
+ # only filter user
158
+ for item in array:
159
+ if self.check_user(identifier=item):
160
+ all_users.add(item)
161
+ return all_users
162
+ # extract group members
154
163
  for item in array:
155
164
  if item.is_user:
156
- all_users.add(item)
165
+ if self.check_user(identifier=item):
166
+ all_users.add(item)
157
167
  continue
158
168
  assert item.is_group, 'group ID error: %s' % item
159
- members = await facebook.get_members(identifier=item)
160
- if members is None or len(members) == 0:
169
+ group_members = await facebook.get_members(identifier=item)
170
+ if group_members is None or len(group_members) == 0:
161
171
  self.warning(msg='failed to get members for group: %s' % item)
162
- else:
163
- all_users.update(members)
172
+ continue
173
+ for member in group_members:
174
+ if self.check_user(identifier=member):
175
+ all_users.add(member)
164
176
  return all_users
165
177
 
166
178
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dimples
3
- Version: 1.6.3
3
+ Version: 1.6.4
4
4
  Summary: DIMP Library for Edges and Stations
5
5
  Home-page: https://github.com/dimchat/demo-py
6
6
  Author: Albert Moky
@@ -14,7 +14,7 @@ import io
14
14
 
15
15
  from setuptools import setup, find_packages
16
16
 
17
- __version__ = '1.6.3'
17
+ __version__ = '1.6.4'
18
18
  __author__ = 'Albert Moky'
19
19
  __contact__ = 'albert.moky@gmail.com'
20
20
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes