@cloudbase/js-sdk 3.3.14-beta.2 → 3.3.14-beta.4

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 (717) hide show
  1. package/dist/index.cjs.js +1 -1
  2. package/miniprogram_dist/index.js +1 -1
  3. package/node_modules/@cloudbase/ai/.eslintrc.js +15 -0
  4. package/node_modules/@cloudbase/ai/dist/cjs/AI.d.ts +27 -0
  5. package/node_modules/@cloudbase/ai/dist/cjs/AI.js +224 -0
  6. package/node_modules/@cloudbase/ai/dist/cjs/bot/index.d.ts +41 -0
  7. package/node_modules/@cloudbase/ai/dist/cjs/bot/index.js +376 -0
  8. package/node_modules/@cloudbase/ai/dist/cjs/bot/types.d.ts +144 -0
  9. package/node_modules/@cloudbase/ai/dist/cjs/bot/types.js +3 -0
  10. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/index.d.ts +2 -0
  11. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/index.js +6 -0
  12. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/parse.d.ts +2 -0
  13. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/parse.js +126 -0
  14. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/stream.d.ts +5 -0
  15. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/stream.js +40 -0
  16. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/types.d.ts +16 -0
  17. package/node_modules/@cloudbase/ai/dist/cjs/eventsource_parser/types.js +3 -0
  18. package/node_modules/@cloudbase/ai/dist/cjs/index.d.ts +40 -0
  19. package/node_modules/@cloudbase/ai/dist/cjs/index.js +187 -0
  20. package/node_modules/@cloudbase/ai/dist/cjs/models/Ark/index.d.ts +10 -0
  21. package/node_modules/@cloudbase/ai/dist/cjs/models/Ark/index.js +130 -0
  22. package/node_modules/@cloudbase/ai/dist/cjs/models/Ark/type.d.ts +71 -0
  23. package/node_modules/@cloudbase/ai/dist/cjs/models/Ark/type.js +3 -0
  24. package/node_modules/@cloudbase/ai/dist/cjs/models/DashScope/index.d.ts +10 -0
  25. package/node_modules/@cloudbase/ai/dist/cjs/models/DashScope/index.js +130 -0
  26. package/node_modules/@cloudbase/ai/dist/cjs/models/DashScope/type.d.ts +74 -0
  27. package/node_modules/@cloudbase/ai/dist/cjs/models/DashScope/type.js +3 -0
  28. package/node_modules/@cloudbase/ai/dist/cjs/models/DeepSeek/index.d.ts +10 -0
  29. package/node_modules/@cloudbase/ai/dist/cjs/models/DeepSeek/index.js +126 -0
  30. package/node_modules/@cloudbase/ai/dist/cjs/models/Default/index.d.ts +10 -0
  31. package/node_modules/@cloudbase/ai/dist/cjs/models/Default/index.js +122 -0
  32. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/index.d.ts +10 -0
  33. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/index.js +135 -0
  34. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/type.d.ts +74 -0
  35. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/type.js +3 -0
  36. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/util.d.ts +4 -0
  37. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuan/util.js +56 -0
  38. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanBeta/index.d.ts +10 -0
  39. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanBeta/index.js +127 -0
  40. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanExp/index.d.ts +10 -0
  41. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanExp/index.js +125 -0
  42. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanOpen/index.d.ts +10 -0
  43. package/node_modules/@cloudbase/ai/dist/cjs/models/HunYuanOpen/index.js +127 -0
  44. package/node_modules/@cloudbase/ai/dist/cjs/models/Moonshot/index.d.ts +10 -0
  45. package/node_modules/@cloudbase/ai/dist/cjs/models/Moonshot/index.js +130 -0
  46. package/node_modules/@cloudbase/ai/dist/cjs/models/Moonshot/type.d.ts +85 -0
  47. package/node_modules/@cloudbase/ai/dist/cjs/models/Moonshot/type.js +3 -0
  48. package/node_modules/@cloudbase/ai/dist/cjs/models/Yi/index.d.ts +10 -0
  49. package/node_modules/@cloudbase/ai/dist/cjs/models/Yi/index.js +133 -0
  50. package/node_modules/@cloudbase/ai/dist/cjs/models/Yi/type.d.ts +75 -0
  51. package/node_modules/@cloudbase/ai/dist/cjs/models/Yi/type.js +3 -0
  52. package/node_modules/@cloudbase/ai/dist/cjs/models/ZhiPu/index.d.ts +10 -0
  53. package/node_modules/@cloudbase/ai/dist/cjs/models/ZhiPu/index.js +139 -0
  54. package/node_modules/@cloudbase/ai/dist/cjs/models/ZhiPu/type.d.ts +71 -0
  55. package/node_modules/@cloudbase/ai/dist/cjs/models/ZhiPu/type.js +3 -0
  56. package/node_modules/@cloudbase/ai/dist/cjs/models/image-model.d.ts +18 -0
  57. package/node_modules/@cloudbase/ai/dist/cjs/models/image-model.js +85 -0
  58. package/node_modules/@cloudbase/ai/dist/cjs/models/index.d.ts +26 -0
  59. package/node_modules/@cloudbase/ai/dist/cjs/models/index.js +42 -0
  60. package/node_modules/@cloudbase/ai/dist/cjs/models/model.d.ts +40 -0
  61. package/node_modules/@cloudbase/ai/dist/cjs/models/model.js +481 -0
  62. package/node_modules/@cloudbase/ai/dist/cjs/type.d.ts +190 -0
  63. package/node_modules/@cloudbase/ai/dist/cjs/type.js +10 -0
  64. package/node_modules/@cloudbase/ai/dist/cjs/utils.d.ts +38 -0
  65. package/node_modules/@cloudbase/ai/dist/cjs/utils.js +263 -0
  66. package/node_modules/@cloudbase/ai/dist/esm/AI.d.ts +27 -0
  67. package/node_modules/@cloudbase/ai/dist/esm/AI.js +198 -0
  68. package/node_modules/@cloudbase/ai/dist/esm/bot/index.d.ts +41 -0
  69. package/node_modules/@cloudbase/ai/dist/esm/bot/index.js +373 -0
  70. package/node_modules/@cloudbase/ai/dist/esm/bot/types.d.ts +144 -0
  71. package/node_modules/@cloudbase/ai/dist/esm/bot/types.js +2 -0
  72. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/index.d.ts +2 -0
  73. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/index.js +2 -0
  74. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/parse.d.ts +2 -0
  75. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/parse.js +122 -0
  76. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/stream.d.ts +5 -0
  77. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/stream.js +37 -0
  78. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/types.d.ts +16 -0
  79. package/node_modules/@cloudbase/ai/dist/esm/eventsource_parser/types.js +2 -0
  80. package/node_modules/@cloudbase/ai/dist/esm/index.d.ts +40 -0
  81. package/node_modules/@cloudbase/ai/dist/esm/index.js +152 -0
  82. package/node_modules/@cloudbase/ai/dist/esm/models/Ark/index.d.ts +10 -0
  83. package/node_modules/@cloudbase/ai/dist/esm/models/Ark/index.js +127 -0
  84. package/node_modules/@cloudbase/ai/dist/esm/models/Ark/type.d.ts +71 -0
  85. package/node_modules/@cloudbase/ai/dist/esm/models/Ark/type.js +2 -0
  86. package/node_modules/@cloudbase/ai/dist/esm/models/DashScope/index.d.ts +10 -0
  87. package/node_modules/@cloudbase/ai/dist/esm/models/DashScope/index.js +127 -0
  88. package/node_modules/@cloudbase/ai/dist/esm/models/DashScope/type.d.ts +74 -0
  89. package/node_modules/@cloudbase/ai/dist/esm/models/DashScope/type.js +2 -0
  90. package/node_modules/@cloudbase/ai/dist/esm/models/DeepSeek/index.d.ts +10 -0
  91. package/node_modules/@cloudbase/ai/dist/esm/models/DeepSeek/index.js +123 -0
  92. package/node_modules/@cloudbase/ai/dist/esm/models/Default/index.d.ts +10 -0
  93. package/node_modules/@cloudbase/ai/dist/esm/models/Default/index.js +119 -0
  94. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/index.d.ts +10 -0
  95. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/index.js +132 -0
  96. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/type.d.ts +74 -0
  97. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/type.js +2 -0
  98. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/util.d.ts +4 -0
  99. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuan/util.js +51 -0
  100. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanBeta/index.d.ts +10 -0
  101. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanBeta/index.js +124 -0
  102. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanExp/index.d.ts +10 -0
  103. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanExp/index.js +122 -0
  104. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanOpen/index.d.ts +10 -0
  105. package/node_modules/@cloudbase/ai/dist/esm/models/HunYuanOpen/index.js +124 -0
  106. package/node_modules/@cloudbase/ai/dist/esm/models/Moonshot/index.d.ts +10 -0
  107. package/node_modules/@cloudbase/ai/dist/esm/models/Moonshot/index.js +127 -0
  108. package/node_modules/@cloudbase/ai/dist/esm/models/Moonshot/type.d.ts +85 -0
  109. package/node_modules/@cloudbase/ai/dist/esm/models/Moonshot/type.js +2 -0
  110. package/node_modules/@cloudbase/ai/dist/esm/models/Yi/index.d.ts +10 -0
  111. package/node_modules/@cloudbase/ai/dist/esm/models/Yi/index.js +130 -0
  112. package/node_modules/@cloudbase/ai/dist/esm/models/Yi/type.d.ts +75 -0
  113. package/node_modules/@cloudbase/ai/dist/esm/models/Yi/type.js +2 -0
  114. package/node_modules/@cloudbase/ai/dist/esm/models/ZhiPu/index.d.ts +10 -0
  115. package/node_modules/@cloudbase/ai/dist/esm/models/ZhiPu/index.js +136 -0
  116. package/node_modules/@cloudbase/ai/dist/esm/models/ZhiPu/type.d.ts +71 -0
  117. package/node_modules/@cloudbase/ai/dist/esm/models/ZhiPu/type.js +2 -0
  118. package/node_modules/@cloudbase/ai/dist/esm/models/image-model.d.ts +18 -0
  119. package/node_modules/@cloudbase/ai/dist/esm/models/image-model.js +82 -0
  120. package/node_modules/@cloudbase/ai/dist/esm/models/index.d.ts +26 -0
  121. package/node_modules/@cloudbase/ai/dist/esm/models/index.js +27 -0
  122. package/node_modules/@cloudbase/ai/dist/esm/models/model.d.ts +40 -0
  123. package/node_modules/@cloudbase/ai/dist/esm/models/model.js +478 -0
  124. package/node_modules/@cloudbase/ai/dist/esm/type.d.ts +190 -0
  125. package/node_modules/@cloudbase/ai/dist/esm/type.js +7 -0
  126. package/node_modules/@cloudbase/ai/dist/esm/utils.d.ts +38 -0
  127. package/node_modules/@cloudbase/ai/dist/esm/utils.js +252 -0
  128. package/node_modules/@cloudbase/ai/dist/miniprogram/index.js +2 -0
  129. package/node_modules/@cloudbase/ai/dist/miniprogram/index.js.LICENSE.txt +22 -0
  130. package/node_modules/@cloudbase/ai/package.json +32 -0
  131. package/node_modules/@cloudbase/analytics/.eslintrc.js +15 -0
  132. package/node_modules/@cloudbase/analytics/dist/cjs/index.d.ts +2 -0
  133. package/node_modules/@cloudbase/analytics/dist/cjs/index.js +144 -0
  134. package/node_modules/@cloudbase/analytics/dist/esm/index.d.ts +2 -0
  135. package/node_modules/@cloudbase/analytics/dist/esm/index.js +140 -0
  136. package/node_modules/@cloudbase/analytics/package.json +22 -0
  137. package/node_modules/@cloudbase/apis/.eslintrc.js +15 -0
  138. package/node_modules/@cloudbase/apis/dist/cjs/callApis.d.ts +20 -0
  139. package/node_modules/@cloudbase/apis/dist/cjs/callApis.js +154 -0
  140. package/node_modules/@cloudbase/apis/dist/cjs/index.d.ts +5 -0
  141. package/node_modules/@cloudbase/apis/dist/cjs/index.js +53 -0
  142. package/node_modules/@cloudbase/apis/dist/cjs/type.d.ts +14 -0
  143. package/node_modules/@cloudbase/apis/dist/cjs/type.js +3 -0
  144. package/node_modules/@cloudbase/apis/dist/esm/callApis.d.ts +20 -0
  145. package/node_modules/@cloudbase/apis/dist/esm/callApis.js +148 -0
  146. package/node_modules/@cloudbase/apis/dist/esm/index.d.ts +5 -0
  147. package/node_modules/@cloudbase/apis/dist/esm/index.js +35 -0
  148. package/node_modules/@cloudbase/apis/dist/esm/type.d.ts +14 -0
  149. package/node_modules/@cloudbase/apis/dist/esm/type.js +2 -0
  150. package/node_modules/@cloudbase/apis/dist/miniprogram/index.js +1 -0
  151. package/node_modules/@cloudbase/apis/package.json +28 -0
  152. package/node_modules/@cloudbase/app/.eslintrc.js +12 -0
  153. package/node_modules/@cloudbase/app/dist/cjs/constants/common.d.ts +38 -0
  154. package/node_modules/@cloudbase/app/dist/cjs/constants/common.js +103 -0
  155. package/node_modules/@cloudbase/app/dist/cjs/index.d.ts +65 -0
  156. package/node_modules/@cloudbase/app/dist/cjs/index.js +340 -0
  157. package/node_modules/@cloudbase/app/dist/cjs/index.node.d.ts +6 -0
  158. package/node_modules/@cloudbase/app/dist/cjs/index.node.js +20 -0
  159. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/constants.d.ts +33 -0
  160. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/constants.js +38 -0
  161. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/context.d.ts +13 -0
  162. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/context.js +162 -0
  163. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/index.d.ts +23 -0
  164. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/index.js +124 -0
  165. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/metadata.d.ts +14 -0
  166. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/metadata.js +130 -0
  167. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/request.d.ts +38 -0
  168. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/request.js +445 -0
  169. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/tool.d.ts +2 -0
  170. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/tool.js +228 -0
  171. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/types.d.ts +78 -0
  172. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/types.js +3 -0
  173. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/utils.d.ts +17 -0
  174. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter-node/utils.js +221 -0
  175. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter.d.ts +3 -0
  176. package/node_modules/@cloudbase/app/dist/cjs/libs/adapter.js +163 -0
  177. package/node_modules/@cloudbase/app/dist/cjs/libs/cache.d.ts +6 -0
  178. package/node_modules/@cloudbase/app/dist/cjs/libs/cache.js +38 -0
  179. package/node_modules/@cloudbase/app/dist/cjs/libs/component.d.ts +3 -0
  180. package/node_modules/@cloudbase/app/dist/cjs/libs/component.js +126 -0
  181. package/node_modules/@cloudbase/app/dist/cjs/libs/lang.d.ts +23 -0
  182. package/node_modules/@cloudbase/app/dist/cjs/libs/lang.js +59 -0
  183. package/node_modules/@cloudbase/app/dist/cjs/libs/request.d.ts +62 -0
  184. package/node_modules/@cloudbase/app/dist/cjs/libs/request.js +480 -0
  185. package/node_modules/@cloudbase/app/dist/esm/constants/common.d.ts +38 -0
  186. package/node_modules/@cloudbase/app/dist/esm/constants/common.js +91 -0
  187. package/node_modules/@cloudbase/app/dist/esm/index.d.ts +65 -0
  188. package/node_modules/@cloudbase/app/dist/esm/index.js +335 -0
  189. package/node_modules/@cloudbase/app/dist/esm/index.node.d.ts +6 -0
  190. package/node_modules/@cloudbase/app/dist/esm/index.node.js +12 -0
  191. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/constants.d.ts +33 -0
  192. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/constants.js +35 -0
  193. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/context.d.ts +13 -0
  194. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/context.js +156 -0
  195. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/index.d.ts +23 -0
  196. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/index.js +118 -0
  197. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/metadata.d.ts +14 -0
  198. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/metadata.js +123 -0
  199. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/request.d.ts +38 -0
  200. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/request.js +442 -0
  201. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/tool.d.ts +2 -0
  202. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/tool.js +224 -0
  203. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/types.d.ts +78 -0
  204. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/types.js +2 -0
  205. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/utils.d.ts +17 -0
  206. package/node_modules/@cloudbase/app/dist/esm/libs/adapter-node/utils.js +205 -0
  207. package/node_modules/@cloudbase/app/dist/esm/libs/adapter.d.ts +3 -0
  208. package/node_modules/@cloudbase/app/dist/esm/libs/adapter.js +136 -0
  209. package/node_modules/@cloudbase/app/dist/esm/libs/cache.d.ts +6 -0
  210. package/node_modules/@cloudbase/app/dist/esm/libs/cache.js +32 -0
  211. package/node_modules/@cloudbase/app/dist/esm/libs/component.d.ts +3 -0
  212. package/node_modules/@cloudbase/app/dist/esm/libs/component.js +121 -0
  213. package/node_modules/@cloudbase/app/dist/esm/libs/lang.d.ts +23 -0
  214. package/node_modules/@cloudbase/app/dist/esm/libs/lang.js +54 -0
  215. package/node_modules/@cloudbase/app/dist/esm/libs/request.d.ts +62 -0
  216. package/node_modules/@cloudbase/app/dist/esm/libs/request.js +475 -0
  217. package/node_modules/@cloudbase/app/dist/miniprogram/index.js +2 -0
  218. package/node_modules/@cloudbase/app/dist/miniprogram/index.js.LICENSE.txt +7 -0
  219. package/node_modules/@cloudbase/app/package.json +59 -0
  220. package/node_modules/@cloudbase/auth/.eslintrc.js +15 -0
  221. package/node_modules/@cloudbase/auth/dist/cjs/adapter.d.ts +2 -0
  222. package/node_modules/@cloudbase/auth/dist/cjs/adapter.js +272 -0
  223. package/node_modules/@cloudbase/auth/dist/cjs/index.d.ts +283 -0
  224. package/node_modules/@cloudbase/auth/dist/cjs/index.js +3018 -0
  225. package/node_modules/@cloudbase/auth/dist/cjs/type.d.ts +258 -0
  226. package/node_modules/@cloudbase/auth/dist/cjs/type.js +6 -0
  227. package/node_modules/@cloudbase/auth/dist/cjs/utilities.d.ts +7 -0
  228. package/node_modules/@cloudbase/auth/dist/cjs/utilities.js +23 -0
  229. package/node_modules/@cloudbase/auth/dist/cjs/utils.d.ts +5 -0
  230. package/node_modules/@cloudbase/auth/dist/cjs/utils.js +60 -0
  231. package/node_modules/@cloudbase/auth/dist/cjs/v1-compat.d.ts +77 -0
  232. package/node_modules/@cloudbase/auth/dist/cjs/v1-compat.js +423 -0
  233. package/node_modules/@cloudbase/auth/dist/esm/adapter.d.ts +2 -0
  234. package/node_modules/@cloudbase/auth/dist/esm/adapter.js +268 -0
  235. package/node_modules/@cloudbase/auth/dist/esm/index.d.ts +283 -0
  236. package/node_modules/@cloudbase/auth/dist/esm/index.js +3008 -0
  237. package/node_modules/@cloudbase/auth/dist/esm/type.d.ts +258 -0
  238. package/node_modules/@cloudbase/auth/dist/esm/type.js +3 -0
  239. package/node_modules/@cloudbase/auth/dist/esm/utilities.d.ts +7 -0
  240. package/node_modules/@cloudbase/auth/dist/esm/utilities.js +8 -0
  241. package/node_modules/@cloudbase/auth/dist/esm/utils.d.ts +5 -0
  242. package/node_modules/@cloudbase/auth/dist/esm/utils.js +52 -0
  243. package/node_modules/@cloudbase/auth/dist/esm/v1-compat.d.ts +77 -0
  244. package/node_modules/@cloudbase/auth/dist/esm/v1-compat.js +419 -0
  245. package/node_modules/@cloudbase/auth/dist/miniprogram/index.js +1 -0
  246. package/node_modules/@cloudbase/auth/package.json +31 -0
  247. package/node_modules/@cloudbase/cloudrun/.eslintrc.js +15 -0
  248. package/node_modules/@cloudbase/cloudrun/dist/cjs/index.d.ts +4 -0
  249. package/node_modules/@cloudbase/cloudrun/dist/cjs/index.js +154 -0
  250. package/node_modules/@cloudbase/cloudrun/dist/esm/index.d.ts +4 -0
  251. package/node_modules/@cloudbase/cloudrun/dist/esm/index.js +149 -0
  252. package/node_modules/@cloudbase/cloudrun/package.json +30 -0
  253. package/node_modules/@cloudbase/container/.eslintrc.js +15 -0
  254. package/node_modules/@cloudbase/container/.prettierrc.js +41 -0
  255. package/node_modules/@cloudbase/container/dist/cjs/constants/index.d.ts +1 -0
  256. package/node_modules/@cloudbase/container/dist/cjs/constants/index.js +5 -0
  257. package/node_modules/@cloudbase/container/dist/cjs/go_wams_exec.d.ts +2 -0
  258. package/node_modules/@cloudbase/container/dist/cjs/go_wams_exec.js +538 -0
  259. package/node_modules/@cloudbase/container/dist/cjs/index.d.ts +13 -0
  260. package/node_modules/@cloudbase/container/dist/cjs/index.js +343 -0
  261. package/node_modules/@cloudbase/container/dist/cjs/utils/index.d.ts +3 -0
  262. package/node_modules/@cloudbase/container/dist/cjs/utils/index.js +83 -0
  263. package/node_modules/@cloudbase/container/dist/cjs/utils/loader.d.ts +8 -0
  264. package/node_modules/@cloudbase/container/dist/cjs/utils/loader.js +186 -0
  265. package/node_modules/@cloudbase/container/dist/cjs/utils/request.d.ts +12 -0
  266. package/node_modules/@cloudbase/container/dist/cjs/utils/request.js +106 -0
  267. package/node_modules/@cloudbase/container/dist/esm/constants/index.d.ts +1 -0
  268. package/node_modules/@cloudbase/container/dist/esm/constants/index.js +2 -0
  269. package/node_modules/@cloudbase/container/dist/esm/go_wams_exec.d.ts +2 -0
  270. package/node_modules/@cloudbase/container/dist/esm/go_wams_exec.js +536 -0
  271. package/node_modules/@cloudbase/container/dist/esm/index.d.ts +13 -0
  272. package/node_modules/@cloudbase/container/dist/esm/index.js +338 -0
  273. package/node_modules/@cloudbase/container/dist/esm/utils/index.d.ts +3 -0
  274. package/node_modules/@cloudbase/container/dist/esm/utils/index.js +77 -0
  275. package/node_modules/@cloudbase/container/dist/esm/utils/loader.d.ts +8 -0
  276. package/node_modules/@cloudbase/container/dist/esm/utils/loader.js +178 -0
  277. package/node_modules/@cloudbase/container/dist/esm/utils/request.d.ts +12 -0
  278. package/node_modules/@cloudbase/container/dist/esm/utils/request.js +102 -0
  279. package/node_modules/@cloudbase/container/package.json +30 -0
  280. package/node_modules/@cloudbase/database/README.md +119 -0
  281. package/node_modules/@cloudbase/database/dist/commonjs/aggregate.d.ts +29 -0
  282. package/node_modules/@cloudbase/database/dist/commonjs/aggregate.js +156 -0
  283. package/node_modules/@cloudbase/database/dist/commonjs/collection.d.ts +9 -0
  284. package/node_modules/@cloudbase/database/dist/commonjs/collection.js +49 -0
  285. package/node_modules/@cloudbase/database/dist/commonjs/command.d.ts +175 -0
  286. package/node_modules/@cloudbase/database/dist/commonjs/command.js +299 -0
  287. package/node_modules/@cloudbase/database/dist/commonjs/commands/logic.d.ts +24 -0
  288. package/node_modules/@cloudbase/database/dist/commonjs/commands/logic.js +89 -0
  289. package/node_modules/@cloudbase/database/dist/commonjs/commands/query.d.ts +68 -0
  290. package/node_modules/@cloudbase/database/dist/commonjs/commands/query.js +160 -0
  291. package/node_modules/@cloudbase/database/dist/commonjs/commands/update.d.ts +29 -0
  292. package/node_modules/@cloudbase/database/dist/commonjs/commands/update.js +51 -0
  293. package/node_modules/@cloudbase/database/dist/commonjs/config/app.config.d.ts +6 -0
  294. package/node_modules/@cloudbase/database/dist/commonjs/config/app.config.js +7 -0
  295. package/node_modules/@cloudbase/database/dist/commonjs/config/error.config.d.ts +3 -0
  296. package/node_modules/@cloudbase/database/dist/commonjs/config/error.config.js +16 -0
  297. package/node_modules/@cloudbase/database/dist/commonjs/const/code.d.ts +30 -0
  298. package/node_modules/@cloudbase/database/dist/commonjs/const/code.js +33 -0
  299. package/node_modules/@cloudbase/database/dist/commonjs/constant.d.ts +51 -0
  300. package/node_modules/@cloudbase/database/dist/commonjs/constant.js +75 -0
  301. package/node_modules/@cloudbase/database/dist/commonjs/document.d.ts +11 -0
  302. package/node_modules/@cloudbase/database/dist/commonjs/document.js +260 -0
  303. package/node_modules/@cloudbase/database/dist/commonjs/geo/index.d.ts +6 -0
  304. package/{ai/dist → node_modules/@cloudbase/database/dist/commonjs/geo}/index.js +6 -5
  305. package/node_modules/@cloudbase/database/dist/commonjs/geo/interface.d.ts +24 -0
  306. package/node_modules/@cloudbase/database/dist/commonjs/geo/interface.js +2 -0
  307. package/node_modules/@cloudbase/database/dist/commonjs/geo/lineString.d.ts +19 -0
  308. package/node_modules/@cloudbase/database/dist/commonjs/geo/lineString.js +86 -0
  309. package/node_modules/@cloudbase/database/dist/commonjs/geo/multiLineString.d.ts +18 -0
  310. package/node_modules/@cloudbase/database/dist/commonjs/geo/multiLineString.js +95 -0
  311. package/node_modules/@cloudbase/database/dist/commonjs/geo/multiPoint.d.ts +18 -0
  312. package/node_modules/@cloudbase/database/dist/commonjs/geo/multiPoint.js +79 -0
  313. package/node_modules/@cloudbase/database/dist/commonjs/geo/multiPolygon.d.ts +18 -0
  314. package/node_modules/@cloudbase/database/dist/commonjs/geo/multiPolygon.js +122 -0
  315. package/node_modules/@cloudbase/database/dist/commonjs/geo/point.d.ts +19 -0
  316. package/node_modules/@cloudbase/database/dist/commonjs/geo/point.js +50 -0
  317. package/node_modules/@cloudbase/database/dist/commonjs/geo/polygon.d.ts +19 -0
  318. package/node_modules/@cloudbase/database/dist/commonjs/geo/polygon.js +109 -0
  319. package/node_modules/@cloudbase/database/dist/commonjs/helper/symbol.d.ts +14 -0
  320. package/node_modules/@cloudbase/database/dist/commonjs/helper/symbol.js +31 -0
  321. package/node_modules/@cloudbase/database/dist/commonjs/index.d.ts +40 -0
  322. package/node_modules/@cloudbase/database/dist/commonjs/index.js +61 -0
  323. package/node_modules/@cloudbase/database/dist/commonjs/lib/util.d.ts +1 -0
  324. package/node_modules/@cloudbase/database/dist/commonjs/lib/util.js +26 -0
  325. package/node_modules/@cloudbase/database/dist/commonjs/operator-map.d.ts +4 -0
  326. package/node_modules/@cloudbase/database/dist/commonjs/operator-map.js +24 -0
  327. package/node_modules/@cloudbase/database/dist/commonjs/query.d.ts +22 -0
  328. package/node_modules/@cloudbase/database/dist/commonjs/query.js +252 -0
  329. package/node_modules/@cloudbase/database/dist/commonjs/regexp/index.d.ts +14 -0
  330. package/node_modules/@cloudbase/database/dist/commonjs/regexp/index.js +33 -0
  331. package/node_modules/@cloudbase/database/dist/commonjs/serializer/common.d.ts +11 -0
  332. package/node_modules/@cloudbase/database/dist/commonjs/serializer/common.js +127 -0
  333. package/node_modules/@cloudbase/database/dist/commonjs/serializer/datatype.d.ts +7 -0
  334. package/node_modules/@cloudbase/database/dist/commonjs/serializer/datatype.js +132 -0
  335. package/node_modules/@cloudbase/database/dist/commonjs/serializer/query.d.ts +7 -0
  336. package/node_modules/@cloudbase/database/dist/commonjs/serializer/query.js +232 -0
  337. package/node_modules/@cloudbase/database/dist/commonjs/serializer/update.d.ts +15 -0
  338. package/node_modules/@cloudbase/database/dist/commonjs/serializer/update.js +142 -0
  339. package/node_modules/@cloudbase/database/dist/commonjs/serverDate/index.d.ts +13 -0
  340. package/node_modules/@cloudbase/database/dist/commonjs/serverDate/index.js +30 -0
  341. package/node_modules/@cloudbase/database/dist/commonjs/transaction/collection.d.ts +7 -0
  342. package/node_modules/@cloudbase/database/dist/commonjs/transaction/collection.js +49 -0
  343. package/node_modules/@cloudbase/database/dist/commonjs/transaction/document.d.ts +27 -0
  344. package/node_modules/@cloudbase/database/dist/commonjs/transaction/document.js +205 -0
  345. package/node_modules/@cloudbase/database/dist/commonjs/transaction/index.d.ts +30 -0
  346. package/node_modules/@cloudbase/database/dist/commonjs/transaction/index.js +215 -0
  347. package/node_modules/@cloudbase/database/dist/commonjs/transaction/query.d.ts +43 -0
  348. package/node_modules/@cloudbase/database/dist/commonjs/transaction/query.js +261 -0
  349. package/node_modules/@cloudbase/database/dist/commonjs/typings/index.d.ts +40 -0
  350. package/node_modules/@cloudbase/database/dist/commonjs/typings/index.js +2 -0
  351. package/node_modules/@cloudbase/database/dist/commonjs/typings/realtime.d.ts +219 -0
  352. package/node_modules/@cloudbase/database/dist/commonjs/typings/realtime.js +2 -0
  353. package/node_modules/@cloudbase/database/dist/commonjs/util.d.ts +9 -0
  354. package/node_modules/@cloudbase/database/dist/commonjs/util.js +145 -0
  355. package/node_modules/@cloudbase/database/dist/commonjs/utils/error.d.ts +38 -0
  356. package/node_modules/@cloudbase/database/dist/commonjs/utils/error.js +91 -0
  357. package/node_modules/@cloudbase/database/dist/commonjs/utils/msg.d.ts +0 -0
  358. package/node_modules/@cloudbase/database/dist/commonjs/utils/msg.js +0 -0
  359. package/node_modules/@cloudbase/database/dist/commonjs/utils/symbol.d.ts +8 -0
  360. package/node_modules/@cloudbase/database/dist/commonjs/utils/symbol.js +58 -0
  361. package/node_modules/@cloudbase/database/dist/commonjs/utils/type.d.ts +13 -0
  362. package/node_modules/@cloudbase/database/dist/commonjs/utils/type.js +34 -0
  363. package/node_modules/@cloudbase/database/dist/commonjs/utils/utils.d.ts +4 -0
  364. package/node_modules/@cloudbase/database/dist/commonjs/utils/utils.js +39 -0
  365. package/node_modules/@cloudbase/database/dist/commonjs/validate.d.ts +1 -0
  366. package/node_modules/@cloudbase/database/dist/commonjs/validate.js +60 -0
  367. package/node_modules/@cloudbase/database/dist/esm/aggregate.d.ts +29 -0
  368. package/node_modules/@cloudbase/database/dist/esm/aggregate.js +154 -0
  369. package/node_modules/@cloudbase/database/dist/esm/collection.d.ts +9 -0
  370. package/node_modules/@cloudbase/database/dist/esm/collection.js +46 -0
  371. package/node_modules/@cloudbase/database/dist/esm/command.d.ts +175 -0
  372. package/node_modules/@cloudbase/database/dist/esm/command.js +296 -0
  373. package/node_modules/@cloudbase/database/dist/esm/commands/logic.d.ts +24 -0
  374. package/node_modules/@cloudbase/database/dist/esm/commands/logic.js +84 -0
  375. package/node_modules/@cloudbase/database/dist/esm/commands/query.d.ts +68 -0
  376. package/node_modules/@cloudbase/database/dist/esm/commands/query.js +154 -0
  377. package/node_modules/@cloudbase/database/dist/esm/commands/update.d.ts +29 -0
  378. package/node_modules/@cloudbase/database/dist/esm/commands/update.js +46 -0
  379. package/node_modules/@cloudbase/database/dist/esm/config/app.config.d.ts +6 -0
  380. package/node_modules/@cloudbase/database/dist/esm/config/app.config.js +5 -0
  381. package/node_modules/@cloudbase/database/dist/esm/config/error.config.d.ts +3 -0
  382. package/node_modules/@cloudbase/database/dist/esm/config/error.config.js +13 -0
  383. package/node_modules/@cloudbase/database/dist/esm/const/code.d.ts +30 -0
  384. package/node_modules/@cloudbase/database/dist/esm/const/code.js +30 -0
  385. package/node_modules/@cloudbase/database/dist/esm/constant.d.ts +51 -0
  386. package/node_modules/@cloudbase/database/dist/esm/constant.js +65 -0
  387. package/node_modules/@cloudbase/database/dist/esm/document.d.ts +11 -0
  388. package/node_modules/@cloudbase/database/dist/esm/document.js +257 -0
  389. package/node_modules/@cloudbase/database/dist/esm/geo/index.d.ts +6 -0
  390. package/node_modules/@cloudbase/database/dist/esm/geo/index.js +6 -0
  391. package/node_modules/@cloudbase/database/dist/esm/geo/interface.d.ts +24 -0
  392. package/node_modules/@cloudbase/database/dist/esm/geo/interface.js +1 -0
  393. package/node_modules/@cloudbase/database/dist/esm/geo/lineString.d.ts +19 -0
  394. package/node_modules/@cloudbase/database/dist/esm/geo/lineString.js +83 -0
  395. package/node_modules/@cloudbase/database/dist/esm/geo/multiLineString.d.ts +18 -0
  396. package/node_modules/@cloudbase/database/dist/esm/geo/multiLineString.js +92 -0
  397. package/node_modules/@cloudbase/database/dist/esm/geo/multiPoint.d.ts +18 -0
  398. package/node_modules/@cloudbase/database/dist/esm/geo/multiPoint.js +76 -0
  399. package/node_modules/@cloudbase/database/dist/esm/geo/multiPolygon.d.ts +18 -0
  400. package/node_modules/@cloudbase/database/dist/esm/geo/multiPolygon.js +119 -0
  401. package/node_modules/@cloudbase/database/dist/esm/geo/point.d.ts +19 -0
  402. package/node_modules/@cloudbase/database/dist/esm/geo/point.js +47 -0
  403. package/node_modules/@cloudbase/database/dist/esm/geo/polygon.d.ts +19 -0
  404. package/node_modules/@cloudbase/database/dist/esm/geo/polygon.js +106 -0
  405. package/node_modules/@cloudbase/database/dist/esm/helper/symbol.d.ts +14 -0
  406. package/node_modules/@cloudbase/database/dist/esm/helper/symbol.js +14 -0
  407. package/node_modules/@cloudbase/database/dist/esm/index.d.ts +40 -0
  408. package/node_modules/@cloudbase/database/dist/esm/index.js +55 -0
  409. package/node_modules/@cloudbase/database/dist/esm/lib/util.d.ts +1 -0
  410. package/node_modules/@cloudbase/database/dist/esm/lib/util.js +22 -0
  411. package/node_modules/@cloudbase/database/dist/esm/operator-map.d.ts +4 -0
  412. package/node_modules/@cloudbase/database/dist/esm/operator-map.js +20 -0
  413. package/node_modules/@cloudbase/database/dist/esm/query.d.ts +22 -0
  414. package/node_modules/@cloudbase/database/dist/esm/query.js +249 -0
  415. package/node_modules/@cloudbase/database/dist/esm/regexp/index.d.ts +14 -0
  416. package/node_modules/@cloudbase/database/dist/esm/regexp/index.js +29 -0
  417. package/node_modules/@cloudbase/database/dist/esm/serializer/common.d.ts +11 -0
  418. package/node_modules/@cloudbase/database/dist/esm/serializer/common.js +118 -0
  419. package/node_modules/@cloudbase/database/dist/esm/serializer/datatype.d.ts +7 -0
  420. package/node_modules/@cloudbase/database/dist/esm/serializer/datatype.js +127 -0
  421. package/node_modules/@cloudbase/database/dist/esm/serializer/query.d.ts +7 -0
  422. package/node_modules/@cloudbase/database/dist/esm/serializer/query.js +229 -0
  423. package/node_modules/@cloudbase/database/dist/esm/serializer/update.d.ts +15 -0
  424. package/node_modules/@cloudbase/database/dist/esm/serializer/update.js +139 -0
  425. package/node_modules/@cloudbase/database/dist/esm/serverDate/index.d.ts +13 -0
  426. package/node_modules/@cloudbase/database/dist/esm/serverDate/index.js +26 -0
  427. package/node_modules/@cloudbase/database/dist/esm/transaction/collection.d.ts +7 -0
  428. package/node_modules/@cloudbase/database/dist/esm/transaction/collection.js +46 -0
  429. package/node_modules/@cloudbase/database/dist/esm/transaction/document.d.ts +27 -0
  430. package/node_modules/@cloudbase/database/dist/esm/transaction/document.js +202 -0
  431. package/node_modules/@cloudbase/database/dist/esm/transaction/index.d.ts +30 -0
  432. package/node_modules/@cloudbase/database/dist/esm/transaction/index.js +210 -0
  433. package/node_modules/@cloudbase/database/dist/esm/transaction/query.d.ts +43 -0
  434. package/node_modules/@cloudbase/database/dist/esm/transaction/query.js +258 -0
  435. package/node_modules/@cloudbase/database/dist/esm/typings/index.d.ts +40 -0
  436. package/node_modules/@cloudbase/database/dist/esm/typings/index.js +1 -0
  437. package/node_modules/@cloudbase/database/dist/esm/typings/realtime.d.ts +219 -0
  438. package/node_modules/@cloudbase/database/dist/esm/typings/realtime.js +1 -0
  439. package/node_modules/@cloudbase/database/dist/esm/util.d.ts +9 -0
  440. package/node_modules/@cloudbase/database/dist/esm/util.js +142 -0
  441. package/node_modules/@cloudbase/database/dist/esm/utils/error.d.ts +38 -0
  442. package/node_modules/@cloudbase/database/dist/esm/utils/error.js +84 -0
  443. package/node_modules/@cloudbase/database/dist/esm/utils/msg.d.ts +0 -0
  444. package/node_modules/@cloudbase/database/dist/esm/utils/msg.js +0 -0
  445. package/node_modules/@cloudbase/database/dist/esm/utils/symbol.d.ts +8 -0
  446. package/node_modules/@cloudbase/database/dist/esm/utils/symbol.js +55 -0
  447. package/node_modules/@cloudbase/database/dist/esm/utils/type.d.ts +13 -0
  448. package/node_modules/@cloudbase/database/dist/esm/utils/type.js +20 -0
  449. package/node_modules/@cloudbase/database/dist/esm/utils/utils.d.ts +4 -0
  450. package/node_modules/@cloudbase/database/dist/esm/utils/utils.js +33 -0
  451. package/node_modules/@cloudbase/database/dist/esm/validate.d.ts +1 -0
  452. package/node_modules/@cloudbase/database/dist/esm/validate.js +57 -0
  453. package/node_modules/@cloudbase/database/package.json +36 -0
  454. package/node_modules/@cloudbase/database/tsconfig.test.json +15 -0
  455. package/node_modules/@cloudbase/functions/.eslintrc.js +15 -0
  456. package/node_modules/@cloudbase/functions/dist/cjs/index.d.ts +2 -0
  457. package/node_modules/@cloudbase/functions/dist/cjs/index.js +223 -0
  458. package/node_modules/@cloudbase/functions/dist/esm/index.d.ts +2 -0
  459. package/node_modules/@cloudbase/functions/dist/esm/index.js +219 -0
  460. package/node_modules/@cloudbase/functions/package.json +32 -0
  461. package/node_modules/@cloudbase/model/.eslintrc.js +15 -0
  462. package/node_modules/@cloudbase/model/dist/cjs/index.d.ts +5 -0
  463. package/node_modules/@cloudbase/model/dist/cjs/index.js +144 -0
  464. package/node_modules/@cloudbase/model/dist/esm/index.d.ts +5 -0
  465. package/node_modules/@cloudbase/model/dist/esm/index.js +125 -0
  466. package/node_modules/@cloudbase/model/package.json +29 -0
  467. package/node_modules/@cloudbase/mysql/.eslintrc.js +6 -0
  468. package/node_modules/@cloudbase/mysql/dist/cjs/index.d.ts +4 -0
  469. package/node_modules/@cloudbase/mysql/dist/cjs/index.d.ts.map +1 -0
  470. package/node_modules/@cloudbase/mysql/dist/cjs/index.js +173 -0
  471. package/node_modules/@cloudbase/mysql/dist/esm/index.d.ts +3 -0
  472. package/node_modules/@cloudbase/mysql/dist/esm/index.js +155 -0
  473. package/node_modules/@cloudbase/mysql/package.json +30 -0
  474. package/node_modules/@cloudbase/oauth/.eslintrc.js +15 -0
  475. package/node_modules/@cloudbase/oauth/dist/cjs/auth/apis.d.ts +142 -0
  476. package/node_modules/@cloudbase/oauth/dist/cjs/auth/apis.js +1280 -0
  477. package/node_modules/@cloudbase/oauth/dist/cjs/auth/auth-error.d.ts +22 -0
  478. package/node_modules/@cloudbase/oauth/dist/cjs/auth/auth-error.js +278 -0
  479. package/node_modules/@cloudbase/oauth/dist/cjs/auth/consts.d.ts +139 -0
  480. package/node_modules/@cloudbase/oauth/dist/cjs/auth/consts.js +147 -0
  481. package/node_modules/@cloudbase/oauth/dist/cjs/auth/models.d.ts +557 -0
  482. package/node_modules/@cloudbase/oauth/dist/cjs/auth/models.js +3 -0
  483. package/node_modules/@cloudbase/oauth/dist/cjs/captcha/captcha-dom.d.ts +3 -0
  484. package/node_modules/@cloudbase/oauth/dist/cjs/captcha/captcha-dom.js +223 -0
  485. package/node_modules/@cloudbase/oauth/dist/cjs/captcha/captcha.d.ts +42 -0
  486. package/node_modules/@cloudbase/oauth/dist/cjs/captcha/captcha.js +205 -0
  487. package/node_modules/@cloudbase/oauth/dist/cjs/index.d.ts +22 -0
  488. package/node_modules/@cloudbase/oauth/dist/cjs/index.js +107 -0
  489. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/consts.d.ts +20 -0
  490. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/consts.js +26 -0
  491. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/interface.d.ts +15 -0
  492. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/interface.js +10 -0
  493. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/models.d.ts +74 -0
  494. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/models.js +3 -0
  495. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/oauth2client.d.ts +129 -0
  496. package/node_modules/@cloudbase/oauth/dist/cjs/oauth2client/oauth2client.js +1174 -0
  497. package/node_modules/@cloudbase/oauth/dist/cjs/utils/base64.d.ts +9 -0
  498. package/node_modules/@cloudbase/oauth/dist/cjs/utils/base64.js +112 -0
  499. package/node_modules/@cloudbase/oauth/dist/cjs/utils/encrypt.d.ts +4 -0
  500. package/node_modules/@cloudbase/oauth/dist/cjs/utils/encrypt.js +26 -0
  501. package/node_modules/@cloudbase/oauth/dist/cjs/utils/encryptlong/index.d.ts +546 -0
  502. package/node_modules/@cloudbase/oauth/dist/cjs/utils/encryptlong/index.js +2982 -0
  503. package/node_modules/@cloudbase/oauth/dist/cjs/utils/function/single-promise.d.ts +6 -0
  504. package/node_modules/@cloudbase/oauth/dist/cjs/utils/function/single-promise.js +94 -0
  505. package/node_modules/@cloudbase/oauth/dist/cjs/utils/index.d.ts +2 -0
  506. package/node_modules/@cloudbase/oauth/dist/cjs/utils/index.js +56 -0
  507. package/node_modules/@cloudbase/oauth/dist/cjs/utils/mp.d.ts +2 -0
  508. package/node_modules/@cloudbase/oauth/dist/cjs/utils/mp.js +66 -0
  509. package/node_modules/@cloudbase/oauth/dist/cjs/utils/urlSearchParams.d.ts +13 -0
  510. package/node_modules/@cloudbase/oauth/dist/cjs/utils/urlSearchParams.js +66 -0
  511. package/node_modules/@cloudbase/oauth/dist/cjs/utils/uuid.d.ts +1 -0
  512. package/node_modules/@cloudbase/oauth/dist/cjs/utils/uuid.js +12 -0
  513. package/node_modules/@cloudbase/oauth/dist/esm/auth/apis.d.ts +142 -0
  514. package/node_modules/@cloudbase/oauth/dist/esm/auth/apis.js +768 -0
  515. package/node_modules/@cloudbase/oauth/dist/esm/auth/auth-error.d.ts +22 -0
  516. package/node_modules/@cloudbase/oauth/dist/esm/auth/auth-error.js +255 -0
  517. package/node_modules/@cloudbase/oauth/dist/esm/auth/consts.d.ts +139 -0
  518. package/node_modules/@cloudbase/oauth/dist/esm/auth/consts.js +144 -0
  519. package/node_modules/@cloudbase/oauth/dist/esm/auth/models.d.ts +557 -0
  520. package/node_modules/@cloudbase/oauth/dist/esm/auth/models.js +2 -0
  521. package/node_modules/@cloudbase/oauth/dist/esm/captcha/captcha-dom.d.ts +3 -0
  522. package/node_modules/@cloudbase/oauth/dist/esm/captcha/captcha-dom.js +130 -0
  523. package/node_modules/@cloudbase/oauth/dist/esm/captcha/captcha.d.ts +42 -0
  524. package/node_modules/@cloudbase/oauth/dist/esm/captcha/captcha.js +104 -0
  525. package/node_modules/@cloudbase/oauth/dist/esm/index.d.ts +22 -0
  526. package/node_modules/@cloudbase/oauth/dist/esm/index.js +64 -0
  527. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/consts.d.ts +20 -0
  528. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/consts.js +22 -0
  529. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/interface.d.ts +15 -0
  530. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/interface.js +3 -0
  531. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/models.d.ts +74 -0
  532. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/models.js +2 -0
  533. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/oauth2client.d.ts +129 -0
  534. package/node_modules/@cloudbase/oauth/dist/esm/oauth2client/oauth2client.js +711 -0
  535. package/node_modules/@cloudbase/oauth/dist/esm/utils/base64.d.ts +9 -0
  536. package/node_modules/@cloudbase/oauth/dist/esm/utils/base64.js +104 -0
  537. package/node_modules/@cloudbase/oauth/dist/esm/utils/encrypt.d.ts +4 -0
  538. package/node_modules/@cloudbase/oauth/dist/esm/utils/encrypt.js +18 -0
  539. package/node_modules/@cloudbase/oauth/dist/esm/utils/encryptlong/index.d.ts +546 -0
  540. package/node_modules/@cloudbase/oauth/dist/esm/utils/encryptlong/index.js +2953 -0
  541. package/node_modules/@cloudbase/oauth/dist/esm/utils/function/single-promise.d.ts +6 -0
  542. package/node_modules/@cloudbase/oauth/dist/esm/utils/function/single-promise.js +34 -0
  543. package/node_modules/@cloudbase/oauth/dist/esm/utils/index.d.ts +2 -0
  544. package/node_modules/@cloudbase/oauth/dist/esm/utils/index.js +51 -0
  545. package/node_modules/@cloudbase/oauth/dist/esm/utils/mp.d.ts +2 -0
  546. package/node_modules/@cloudbase/oauth/dist/esm/utils/mp.js +61 -0
  547. package/node_modules/@cloudbase/oauth/dist/esm/utils/urlSearchParams.d.ts +13 -0
  548. package/node_modules/@cloudbase/oauth/dist/esm/utils/urlSearchParams.js +58 -0
  549. package/node_modules/@cloudbase/oauth/dist/esm/utils/uuid.d.ts +1 -0
  550. package/node_modules/@cloudbase/oauth/dist/esm/utils/uuid.js +8 -0
  551. package/node_modules/@cloudbase/oauth/dist/miniprogram/index.js +1 -0
  552. package/node_modules/@cloudbase/oauth/package.json +20 -0
  553. package/node_modules/@cloudbase/realtime/.eslintrc.js +15 -0
  554. package/node_modules/@cloudbase/realtime/dist/cjs/common.d.ts +4 -0
  555. package/node_modules/@cloudbase/realtime/dist/cjs/common.js +22 -0
  556. package/node_modules/@cloudbase/realtime/dist/cjs/error.d.ts +36 -0
  557. package/node_modules/@cloudbase/realtime/dist/cjs/error.js +106 -0
  558. package/node_modules/@cloudbase/realtime/dist/cjs/index.d.ts +2 -0
  559. package/node_modules/@cloudbase/realtime/dist/cjs/index.js +36 -0
  560. package/node_modules/@cloudbase/realtime/dist/cjs/listener.d.ts +14 -0
  561. package/node_modules/@cloudbase/realtime/dist/cjs/listener.js +18 -0
  562. package/node_modules/@cloudbase/realtime/dist/cjs/message.d.ts +3 -0
  563. package/node_modules/@cloudbase/realtime/dist/cjs/message.js +13 -0
  564. package/node_modules/@cloudbase/realtime/dist/cjs/snapshot.d.ts +17 -0
  565. package/node_modules/@cloudbase/realtime/dist/cjs/snapshot.js +45 -0
  566. package/node_modules/@cloudbase/realtime/dist/cjs/utils.d.ts +1 -0
  567. package/node_modules/@cloudbase/realtime/dist/cjs/utils.js +9 -0
  568. package/node_modules/@cloudbase/realtime/dist/cjs/virtual-websocket-client.d.ts +62 -0
  569. package/node_modules/@cloudbase/realtime/dist/cjs/virtual-websocket-client.js +960 -0
  570. package/node_modules/@cloudbase/realtime/dist/cjs/websocket-client.d.ts +78 -0
  571. package/node_modules/@cloudbase/realtime/dist/cjs/websocket-client.js +750 -0
  572. package/node_modules/@cloudbase/realtime/dist/cjs/ws-event.d.ts +126 -0
  573. package/node_modules/@cloudbase/realtime/dist/cjs/ws-event.js +141 -0
  574. package/node_modules/@cloudbase/realtime/dist/esm/common.d.ts +4 -0
  575. package/node_modules/@cloudbase/realtime/dist/esm/common.js +15 -0
  576. package/node_modules/@cloudbase/realtime/dist/esm/error.d.ts +36 -0
  577. package/node_modules/@cloudbase/realtime/dist/esm/error.js +100 -0
  578. package/node_modules/@cloudbase/realtime/dist/esm/index.d.ts +2 -0
  579. package/node_modules/@cloudbase/realtime/dist/esm/index.js +32 -0
  580. package/node_modules/@cloudbase/realtime/dist/esm/listener.d.ts +14 -0
  581. package/node_modules/@cloudbase/realtime/dist/esm/listener.js +15 -0
  582. package/node_modules/@cloudbase/realtime/dist/esm/message.d.ts +3 -0
  583. package/node_modules/@cloudbase/realtime/dist/esm/message.js +8 -0
  584. package/node_modules/@cloudbase/realtime/dist/esm/snapshot.d.ts +17 -0
  585. package/node_modules/@cloudbase/realtime/dist/esm/snapshot.js +42 -0
  586. package/node_modules/@cloudbase/realtime/dist/esm/utils.d.ts +1 -0
  587. package/node_modules/@cloudbase/realtime/dist/esm/utils.js +5 -0
  588. package/node_modules/@cloudbase/realtime/dist/esm/virtual-websocket-client.d.ts +62 -0
  589. package/node_modules/@cloudbase/realtime/dist/esm/virtual-websocket-client.js +954 -0
  590. package/node_modules/@cloudbase/realtime/dist/esm/websocket-client.d.ts +78 -0
  591. package/node_modules/@cloudbase/realtime/dist/esm/websocket-client.js +747 -0
  592. package/node_modules/@cloudbase/realtime/dist/esm/ws-event.d.ts +126 -0
  593. package/node_modules/@cloudbase/realtime/dist/esm/ws-event.js +137 -0
  594. package/node_modules/@cloudbase/realtime/package.json +29 -0
  595. package/node_modules/@cloudbase/storage/.eslintrc.js +15 -0
  596. package/node_modules/@cloudbase/storage/dist/cjs/index.d.ts +195 -0
  597. package/node_modules/@cloudbase/storage/dist/cjs/index.js +1426 -0
  598. package/node_modules/@cloudbase/storage/dist/cjs/supabase/errors.d.ts +20 -0
  599. package/node_modules/@cloudbase/storage/dist/cjs/supabase/errors.js +65 -0
  600. package/node_modules/@cloudbase/storage/dist/cjs/supabase/types.d.ts +64 -0
  601. package/node_modules/@cloudbase/storage/dist/cjs/supabase/types.js +3 -0
  602. package/node_modules/@cloudbase/storage/dist/esm/index.d.ts +195 -0
  603. package/node_modules/@cloudbase/storage/dist/esm/index.js +1422 -0
  604. package/node_modules/@cloudbase/storage/dist/esm/supabase/errors.d.ts +20 -0
  605. package/node_modules/@cloudbase/storage/dist/esm/supabase/errors.js +61 -0
  606. package/node_modules/@cloudbase/storage/dist/esm/supabase/types.d.ts +64 -0
  607. package/node_modules/@cloudbase/storage/dist/esm/supabase/types.js +2 -0
  608. package/node_modules/@cloudbase/storage/package.json +28 -0
  609. package/node_modules/@cloudbase/types/auth.d.ts +99 -0
  610. package/node_modules/@cloudbase/types/cache.d.ts +26 -0
  611. package/node_modules/@cloudbase/types/cloudrun.d.ts +9 -0
  612. package/node_modules/@cloudbase/types/component.d.ts +17 -0
  613. package/node_modules/@cloudbase/types/database.d.ts +31 -0
  614. package/node_modules/@cloudbase/types/events.d.ts +13 -0
  615. package/node_modules/@cloudbase/types/functions.d.ts +40 -0
  616. package/node_modules/@cloudbase/types/index.d.ts +211 -0
  617. package/node_modules/@cloudbase/types/index.js +1 -0
  618. package/node_modules/@cloudbase/types/package.json +43 -0
  619. package/node_modules/@cloudbase/types/realtime.d.ts +350 -0
  620. package/node_modules/@cloudbase/types/request.d.ts +30 -0
  621. package/node_modules/@cloudbase/types/storage.d.ts +126 -0
  622. package/node_modules/@cloudbase/utilities/.eslintrc.js +15 -0
  623. package/node_modules/@cloudbase/utilities/dist/cjs/adapters/index.d.ts +45 -0
  624. package/node_modules/@cloudbase/utilities/dist/cjs/adapters/index.js +68 -0
  625. package/node_modules/@cloudbase/utilities/dist/cjs/adapters/platforms/web.d.ts +20 -0
  626. package/node_modules/@cloudbase/utilities/dist/cjs/adapters/platforms/web.js +278 -0
  627. package/node_modules/@cloudbase/utilities/dist/cjs/constants/common.d.ts +6 -0
  628. package/node_modules/@cloudbase/utilities/dist/cjs/constants/common.js +24 -0
  629. package/node_modules/@cloudbase/utilities/dist/cjs/constants/errors.d.ts +8 -0
  630. package/node_modules/@cloudbase/utilities/dist/cjs/constants/errors.js +12 -0
  631. package/node_modules/@cloudbase/utilities/dist/cjs/constants/index.d.ts +3 -0
  632. package/{model/dist → node_modules/@cloudbase/utilities/dist/cjs/constants}/index.js +5 -5
  633. package/node_modules/@cloudbase/utilities/dist/cjs/helpers/decorators.d.ts +11 -0
  634. package/node_modules/@cloudbase/utilities/dist/cjs/helpers/decorators.js +238 -0
  635. package/node_modules/@cloudbase/utilities/dist/cjs/helpers/index.d.ts +1 -0
  636. package/{apis/dist → node_modules/@cloudbase/utilities/dist/cjs/helpers}/index.js +2 -5
  637. package/node_modules/@cloudbase/utilities/dist/cjs/index.d.ts +13 -0
  638. package/node_modules/@cloudbase/utilities/dist/cjs/index.js +51 -0
  639. package/node_modules/@cloudbase/utilities/dist/cjs/libs/abortController.d.ts +9 -0
  640. package/node_modules/@cloudbase/utilities/dist/cjs/libs/abortController.js +25 -0
  641. package/node_modules/@cloudbase/utilities/dist/cjs/libs/cache.d.ts +17 -0
  642. package/node_modules/@cloudbase/utilities/dist/cjs/libs/cache.js +261 -0
  643. package/node_modules/@cloudbase/utilities/dist/cjs/libs/events.d.ts +27 -0
  644. package/node_modules/@cloudbase/utilities/dist/cjs/libs/events.js +108 -0
  645. package/node_modules/@cloudbase/utilities/dist/cjs/libs/langEvent.d.ts +3 -0
  646. package/node_modules/@cloudbase/utilities/dist/cjs/libs/langEvent.js +7 -0
  647. package/node_modules/@cloudbase/utilities/dist/cjs/libs/util.d.ts +49 -0
  648. package/node_modules/@cloudbase/utilities/dist/cjs/libs/util.js +282 -0
  649. package/node_modules/@cloudbase/utilities/dist/esm/adapters/index.d.ts +45 -0
  650. package/node_modules/@cloudbase/utilities/dist/esm/adapters/index.js +40 -0
  651. package/node_modules/@cloudbase/utilities/dist/esm/adapters/platforms/web.d.ts +20 -0
  652. package/node_modules/@cloudbase/utilities/dist/esm/adapters/platforms/web.js +274 -0
  653. package/node_modules/@cloudbase/utilities/dist/esm/constants/common.d.ts +6 -0
  654. package/node_modules/@cloudbase/utilities/dist/esm/constants/common.js +17 -0
  655. package/node_modules/@cloudbase/utilities/dist/esm/constants/errors.d.ts +8 -0
  656. package/node_modules/@cloudbase/utilities/dist/esm/constants/errors.js +9 -0
  657. package/node_modules/@cloudbase/utilities/dist/esm/constants/index.d.ts +3 -0
  658. package/node_modules/@cloudbase/utilities/dist/esm/constants/index.js +4 -0
  659. package/node_modules/@cloudbase/utilities/dist/esm/helpers/decorators.d.ts +11 -0
  660. package/node_modules/@cloudbase/utilities/dist/esm/helpers/decorators.js +234 -0
  661. package/node_modules/@cloudbase/utilities/dist/esm/helpers/index.d.ts +1 -0
  662. package/node_modules/@cloudbase/utilities/dist/esm/helpers/index.js +2 -0
  663. package/node_modules/@cloudbase/utilities/dist/esm/index.d.ts +13 -0
  664. package/node_modules/@cloudbase/utilities/dist/esm/index.js +14 -0
  665. package/node_modules/@cloudbase/utilities/dist/esm/libs/abortController.d.ts +9 -0
  666. package/node_modules/@cloudbase/utilities/dist/esm/libs/abortController.js +23 -0
  667. package/node_modules/@cloudbase/utilities/dist/esm/libs/cache.d.ts +17 -0
  668. package/node_modules/@cloudbase/utilities/dist/esm/libs/cache.js +258 -0
  669. package/node_modules/@cloudbase/utilities/dist/esm/libs/events.d.ts +27 -0
  670. package/node_modules/@cloudbase/utilities/dist/esm/libs/events.js +102 -0
  671. package/node_modules/@cloudbase/utilities/dist/esm/libs/langEvent.d.ts +3 -0
  672. package/node_modules/@cloudbase/utilities/dist/esm/libs/langEvent.js +4 -0
  673. package/node_modules/@cloudbase/utilities/dist/esm/libs/util.d.ts +49 -0
  674. package/node_modules/@cloudbase/utilities/dist/esm/libs/util.js +254 -0
  675. package/node_modules/@cloudbase/utilities/dist/miniprogram/index.js +1 -0
  676. package/node_modules/@cloudbase/utilities/package.json +26 -0
  677. package/package.json +2 -2
  678. package/ai/dist/index.d.ts +0 -1
  679. package/ai/dist/index.esm.js +0 -3
  680. package/analytics/dist/index.d.ts +0 -2
  681. package/analytics/dist/index.esm.js +0 -4
  682. package/analytics/dist/index.js +0 -9
  683. package/apis/dist/index.d.ts +0 -1
  684. package/apis/dist/index.esm.js +0 -3
  685. package/app/dist/index.d.ts +0 -9
  686. package/app/dist/index.esm.js +0 -11
  687. package/app/dist/index.js +0 -18
  688. package/auth/dist/index.d.ts +0 -2
  689. package/auth/dist/index.esm.js +0 -8
  690. package/auth/dist/index.js +0 -13
  691. package/cloudrun/dist/index.d.ts +0 -1
  692. package/cloudrun/dist/index.esm.js +0 -3
  693. package/cloudrun/dist/index.js +0 -21
  694. package/container/dist/index.d.ts +0 -2
  695. package/container/dist/index.esm.js +0 -8
  696. package/container/dist/index.js +0 -13
  697. package/database/dist/index.d.ts +0 -3
  698. package/database/dist/index.esm.js +0 -503
  699. package/database/dist/index.js +0 -509
  700. package/dist/index.esm.js +0 -35
  701. package/functions/dist/index.d.ts +0 -2
  702. package/functions/dist/index.esm.js +0 -8
  703. package/functions/dist/index.js +0 -13
  704. package/model/dist/index.d.ts +0 -1
  705. package/model/dist/index.esm.js +0 -3
  706. package/mysql/dist/index.d.ts +0 -1
  707. package/mysql/dist/index.esm.js +0 -3
  708. package/mysql/dist/index.js +0 -21
  709. package/oauth/dist/index.d.ts +0 -1
  710. package/oauth/dist/index.esm.js +0 -3
  711. package/oauth/dist/index.js +0 -21
  712. package/realtime/dist/index.d.ts +0 -2
  713. package/realtime/dist/index.esm.js +0 -8
  714. package/realtime/dist/index.js +0 -13
  715. package/storage/dist/index.d.ts +0 -2
  716. package/storage/dist/index.esm.js +0 -4
  717. package/storage/dist/index.js +0 -9
@@ -0,0 +1,960 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
39
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
40
+ if (ar || !(i in from)) {
41
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
42
+ ar[i] = from[i];
43
+ }
44
+ }
45
+ return to.concat(ar || Array.prototype.slice.call(from));
46
+ };
47
+ var __importDefault = (this && this.__importDefault) || function (mod) {
48
+ return (mod && mod.__esModule) ? mod : { "default": mod };
49
+ };
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.VirtualWebSocketClient = void 0;
52
+ var set_1 = __importDefault(require("lodash/set"));
53
+ var unset_1 = __importDefault(require("lodash/unset"));
54
+ var cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
55
+ var message_1 = require("./message");
56
+ var listener_1 = require("./listener");
57
+ var snapshot_1 = require("./snapshot");
58
+ var error_1 = require("./error");
59
+ var utils_1 = require("./utils");
60
+ var WatchStatus;
61
+ (function (WatchStatus) {
62
+ WatchStatus["LOGGINGIN"] = "LOGGINGIN";
63
+ WatchStatus["INITING"] = "INITING";
64
+ WatchStatus["REBUILDING"] = "REBUILDING";
65
+ WatchStatus["ACTIVE"] = "ACTIVE";
66
+ WatchStatus["ERRORED"] = "ERRORED";
67
+ WatchStatus["CLOSING"] = "CLOSING";
68
+ WatchStatus["CLOSED"] = "CLOSED";
69
+ WatchStatus["PAUSED"] = "PAUSED";
70
+ WatchStatus["RESUMING"] = "RESUMING";
71
+ })(WatchStatus || (WatchStatus = {}));
72
+ var DEFAULT_WAIT_TIME_ON_UNKNOWN_ERROR = 100;
73
+ var DEFAULT_MAX_AUTO_RETRY_ON_ERROR = 2;
74
+ var DEFAULT_MAX_SEND_ACK_AUTO_RETRY_ON_ERROR = 2;
75
+ var DEFAULT_SEND_ACK_DEBOUNCE_TIMEOUT = 10 * 1000;
76
+ var DEFAULT_INIT_WATCH_TIMEOUT = 10 * 1000;
77
+ var DEFAULT_REBUILD_WATCH_TIMEOUT = 10 * 1000;
78
+ var VirtualWebSocketClient = (function () {
79
+ function VirtualWebSocketClient(options) {
80
+ var _this = this;
81
+ this.watchStatus = WatchStatus.INITING;
82
+ this.wsLogin = function (envId, refresh) { return __awaiter(_this, void 0, void 0, function () {
83
+ var loginResult;
84
+ return __generator(this, function (_a) {
85
+ switch (_a.label) {
86
+ case 0:
87
+ this.watchStatus = WatchStatus.LOGGINGIN;
88
+ return [4, this.login(envId, refresh)];
89
+ case 1:
90
+ loginResult = _a.sent();
91
+ if (!this.envId) {
92
+ this.envId = loginResult.envId;
93
+ }
94
+ return [2, loginResult];
95
+ }
96
+ });
97
+ }); };
98
+ this.initWatch = function (forceRefreshLogin) { return __awaiter(_this, void 0, void 0, function () {
99
+ var success;
100
+ var _this = this;
101
+ return __generator(this, function (_a) {
102
+ switch (_a.label) {
103
+ case 0:
104
+ if (this.initWatchPromise !== null && this.initWatchPromise !== undefined) {
105
+ return [2, this.initWatchPromise];
106
+ }
107
+ this.initWatchPromise = new Promise(function (resolve, reject) {
108
+ void (function () { return __awaiter(_this, void 0, void 0, function () {
109
+ var envId, initWatchMsg, initEventMsg, _a, events, currEvent, _i, events_1, e, snapshot, e_1;
110
+ return __generator(this, function (_b) {
111
+ switch (_b.label) {
112
+ case 0:
113
+ _b.trys.push([0, 3, , 4]);
114
+ if (this.watchStatus === WatchStatus.PAUSED) {
115
+ console.log('[realtime] initWatch cancelled on pause');
116
+ return [2, resolve()];
117
+ }
118
+ return [4, this.wsLogin(this.envId, forceRefreshLogin)];
119
+ case 1:
120
+ envId = (_b.sent()).envId;
121
+ if (this.watchStatus === WatchStatus.PAUSED) {
122
+ console.log('[realtime] initWatch cancelled on pause');
123
+ return [2, resolve()];
124
+ }
125
+ this.watchStatus = WatchStatus.INITING;
126
+ initWatchMsg = {
127
+ watchId: this.watchId,
128
+ requestId: (0, message_1.genRequestId)(),
129
+ msgType: 'INIT_WATCH',
130
+ msgData: {
131
+ envId: envId,
132
+ collName: this.collectionName,
133
+ query: this.query,
134
+ limit: this.limit,
135
+ orderBy: this.orderBy,
136
+ },
137
+ };
138
+ return [4, this.send({
139
+ msg: initWatchMsg,
140
+ waitResponse: true,
141
+ skipOnMessage: true,
142
+ timeout: DEFAULT_INIT_WATCH_TIMEOUT,
143
+ })];
144
+ case 2:
145
+ initEventMsg = _b.sent();
146
+ _a = initEventMsg.msgData, events = _a.events, currEvent = _a.currEvent;
147
+ this.sessionInfo = {
148
+ queryID: initEventMsg.msgData.queryID,
149
+ currentEventId: currEvent - 1,
150
+ currentDocs: [],
151
+ };
152
+ if (events.length > 0) {
153
+ for (_i = 0, events_1 = events; _i < events_1.length; _i++) {
154
+ e = events_1[_i];
155
+ e.ID = currEvent;
156
+ }
157
+ this.handleServerEvents(initEventMsg);
158
+ }
159
+ else {
160
+ this.sessionInfo.currentEventId = currEvent;
161
+ snapshot = new snapshot_1.Snapshot({
162
+ id: currEvent,
163
+ docChanges: [],
164
+ docs: [],
165
+ type: 'init',
166
+ });
167
+ this.listener.onChange(snapshot);
168
+ this.scheduleSendACK();
169
+ }
170
+ this.onWatchStart(this, this.sessionInfo.queryID);
171
+ this.watchStatus = WatchStatus.ACTIVE;
172
+ this.availableRetries.INIT_WATCH = DEFAULT_MAX_AUTO_RETRY_ON_ERROR;
173
+ resolve();
174
+ return [3, 4];
175
+ case 3:
176
+ e_1 = _b.sent();
177
+ this.handleWatchEstablishmentError(e_1, {
178
+ operationName: 'INIT_WATCH',
179
+ resolve: resolve,
180
+ reject: reject,
181
+ });
182
+ return [3, 4];
183
+ case 4: return [2];
184
+ }
185
+ });
186
+ }); })();
187
+ });
188
+ success = false;
189
+ _a.label = 1;
190
+ case 1:
191
+ _a.trys.push([1, , 3, 4]);
192
+ return [4, this.initWatchPromise];
193
+ case 2:
194
+ _a.sent();
195
+ success = true;
196
+ return [3, 4];
197
+ case 3:
198
+ this.initWatchPromise = undefined;
199
+ return [7];
200
+ case 4:
201
+ console.log("[realtime] initWatch ".concat(success ? 'success' : 'fail'));
202
+ return [2];
203
+ }
204
+ });
205
+ }); };
206
+ this.rebuildWatch = function (forceRefreshLogin) { return __awaiter(_this, void 0, void 0, function () {
207
+ var success;
208
+ var _this = this;
209
+ return __generator(this, function (_a) {
210
+ switch (_a.label) {
211
+ case 0:
212
+ if (this.rebuildWatchPromise !== null && this.rebuildWatchPromise !== undefined) {
213
+ return [2, this.rebuildWatchPromise];
214
+ }
215
+ this.rebuildWatchPromise = new Promise(function (resolve, reject) {
216
+ void (function () { return __awaiter(_this, void 0, void 0, function () {
217
+ var envId, rebuildWatchMsg, nextEventMsg, e_2;
218
+ return __generator(this, function (_a) {
219
+ switch (_a.label) {
220
+ case 0:
221
+ _a.trys.push([0, 3, , 4]);
222
+ if (this.watchStatus === WatchStatus.PAUSED) {
223
+ console.log('[realtime] rebuildWatch cancelled on pause');
224
+ return [2, resolve()];
225
+ }
226
+ return [4, this.wsLogin(this.envId, forceRefreshLogin)];
227
+ case 1:
228
+ envId = (_a.sent()).envId;
229
+ if (!this.sessionInfo) {
230
+ throw new Error('can not rebuildWatch without a successful initWatch (lack of sessionInfo)');
231
+ }
232
+ if (this.watchStatus === WatchStatus.PAUSED) {
233
+ console.log('[realtime] rebuildWatch cancelled on pause');
234
+ return [2, resolve()];
235
+ }
236
+ this.watchStatus = WatchStatus.REBUILDING;
237
+ rebuildWatchMsg = {
238
+ watchId: this.watchId,
239
+ requestId: (0, message_1.genRequestId)(),
240
+ msgType: 'REBUILD_WATCH',
241
+ msgData: {
242
+ envId: envId,
243
+ collName: this.collectionName,
244
+ queryID: this.sessionInfo.queryID,
245
+ eventID: this.sessionInfo.currentEventId,
246
+ },
247
+ };
248
+ return [4, this.send({
249
+ msg: rebuildWatchMsg,
250
+ waitResponse: true,
251
+ skipOnMessage: false,
252
+ timeout: DEFAULT_REBUILD_WATCH_TIMEOUT,
253
+ })];
254
+ case 2:
255
+ nextEventMsg = _a.sent();
256
+ this.handleServerEvents(nextEventMsg);
257
+ this.watchStatus = WatchStatus.ACTIVE;
258
+ this.availableRetries.REBUILD_WATCH = DEFAULT_MAX_AUTO_RETRY_ON_ERROR;
259
+ resolve();
260
+ return [3, 4];
261
+ case 3:
262
+ e_2 = _a.sent();
263
+ this.handleWatchEstablishmentError(e_2, {
264
+ operationName: 'REBUILD_WATCH',
265
+ resolve: resolve,
266
+ reject: reject,
267
+ });
268
+ return [3, 4];
269
+ case 4: return [2];
270
+ }
271
+ });
272
+ }); })();
273
+ });
274
+ success = false;
275
+ _a.label = 1;
276
+ case 1:
277
+ _a.trys.push([1, , 3, 4]);
278
+ return [4, this.rebuildWatchPromise];
279
+ case 2:
280
+ _a.sent();
281
+ success = true;
282
+ return [3, 4];
283
+ case 3:
284
+ this.rebuildWatchPromise = undefined;
285
+ return [7];
286
+ case 4:
287
+ console.log("[realtime] rebuildWatch ".concat(success ? 'success' : 'fail'));
288
+ return [2];
289
+ }
290
+ });
291
+ }); };
292
+ this.handleWatchEstablishmentError = function (e, options) { return __awaiter(_this, void 0, void 0, function () {
293
+ var isInitWatch, abortWatch, retry;
294
+ var _this = this;
295
+ return __generator(this, function (_a) {
296
+ isInitWatch = options.operationName === 'INIT_WATCH';
297
+ abortWatch = function () {
298
+ _this.closeWithError(new error_1.CloudSDKError({
299
+ errCode: isInitWatch
300
+ ? error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_INIT_WATCH_FAIL
301
+ : error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_REBUILD_WATCH_FAIL,
302
+ errMsg: e,
303
+ }));
304
+ options.reject(e);
305
+ };
306
+ retry = function (refreshLogin) {
307
+ if (_this.useRetryTicket(options.operationName)) {
308
+ if (isInitWatch) {
309
+ _this.initWatchPromise = undefined;
310
+ options.resolve(_this.initWatch(refreshLogin));
311
+ }
312
+ else {
313
+ _this.rebuildWatchPromise = undefined;
314
+ options.resolve(_this.rebuildWatch(refreshLogin));
315
+ }
316
+ }
317
+ else {
318
+ abortWatch();
319
+ }
320
+ };
321
+ this.handleCommonError(e, {
322
+ onSignError: function () { return retry(true); },
323
+ onTimeoutError: function () { return retry(false); },
324
+ onNotRetryableError: abortWatch,
325
+ onCancelledError: options.reject,
326
+ onUnknownError: function () {
327
+ (function () { return __awaiter(_this, void 0, void 0, function () {
328
+ var onWSDisconnected, e_3;
329
+ var _this = this;
330
+ return __generator(this, function (_a) {
331
+ switch (_a.label) {
332
+ case 0:
333
+ _a.trys.push([0, 8, , 9]);
334
+ onWSDisconnected = function () { return __awaiter(_this, void 0, void 0, function () {
335
+ return __generator(this, function (_a) {
336
+ switch (_a.label) {
337
+ case 0:
338
+ this.pause();
339
+ return [4, this.onceWSConnected()];
340
+ case 1:
341
+ _a.sent();
342
+ retry(true);
343
+ return [2];
344
+ }
345
+ });
346
+ }); };
347
+ if (!!this.isWSConnected()) return [3, 2];
348
+ return [4, onWSDisconnected()];
349
+ case 1:
350
+ _a.sent();
351
+ return [3, 7];
352
+ case 2: return [4, (0, utils_1.sleep)(DEFAULT_WAIT_TIME_ON_UNKNOWN_ERROR)];
353
+ case 3:
354
+ _a.sent();
355
+ if (!(this.watchStatus === WatchStatus.PAUSED)) return [3, 4];
356
+ options.reject(new error_1.CancelledError("".concat(options.operationName, " cancelled due to pause after unknownError")));
357
+ return [3, 7];
358
+ case 4:
359
+ if (!!this.isWSConnected()) return [3, 6];
360
+ return [4, onWSDisconnected()];
361
+ case 5:
362
+ _a.sent();
363
+ return [3, 7];
364
+ case 6:
365
+ retry(false);
366
+ _a.label = 7;
367
+ case 7: return [3, 9];
368
+ case 8:
369
+ e_3 = _a.sent();
370
+ retry(true);
371
+ return [3, 9];
372
+ case 9: return [2];
373
+ }
374
+ });
375
+ }); })();
376
+ },
377
+ });
378
+ return [2];
379
+ });
380
+ }); };
381
+ this.closeWatch = function () { return __awaiter(_this, void 0, void 0, function () {
382
+ var queryId, closeWatchMsg, e_4;
383
+ return __generator(this, function (_a) {
384
+ switch (_a.label) {
385
+ case 0:
386
+ queryId = this.sessionInfo ? this.sessionInfo.queryID : '';
387
+ if (this.watchStatus !== WatchStatus.ACTIVE) {
388
+ this.watchStatus = WatchStatus.CLOSED;
389
+ this.onWatchClose(this, queryId);
390
+ return [2];
391
+ }
392
+ _a.label = 1;
393
+ case 1:
394
+ _a.trys.push([1, 3, 4, 5]);
395
+ this.watchStatus = WatchStatus.CLOSING;
396
+ closeWatchMsg = {
397
+ watchId: this.watchId,
398
+ requestId: (0, message_1.genRequestId)(),
399
+ msgType: 'CLOSE_WATCH',
400
+ msgData: null,
401
+ };
402
+ return [4, this.send({
403
+ msg: closeWatchMsg,
404
+ })];
405
+ case 2:
406
+ _a.sent();
407
+ this.sessionInfo = undefined;
408
+ this.watchStatus = WatchStatus.CLOSED;
409
+ return [3, 5];
410
+ case 3:
411
+ e_4 = _a.sent();
412
+ this.closeWithError(new error_1.CloudSDKError({
413
+ errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_CLOSE_WATCH_FAIL,
414
+ errMsg: e_4,
415
+ }));
416
+ return [3, 5];
417
+ case 4:
418
+ this.onWatchClose(this, queryId);
419
+ return [7];
420
+ case 5: return [2];
421
+ }
422
+ });
423
+ }); };
424
+ this.scheduleSendACK = function () {
425
+ _this.clearACKSchedule();
426
+ _this.ackTimeoutId = setTimeout(function () {
427
+ if (_this.waitExpectedTimeoutId) {
428
+ _this.scheduleSendACK();
429
+ }
430
+ else {
431
+ _this.sendACK();
432
+ }
433
+ }, DEFAULT_SEND_ACK_DEBOUNCE_TIMEOUT);
434
+ };
435
+ this.clearACKSchedule = function () {
436
+ if (_this.ackTimeoutId) {
437
+ clearTimeout(_this.ackTimeoutId);
438
+ }
439
+ };
440
+ this.sendACK = function () { return __awaiter(_this, void 0, void 0, function () {
441
+ var ackMsg, e_5, msg;
442
+ return __generator(this, function (_a) {
443
+ switch (_a.label) {
444
+ case 0:
445
+ _a.trys.push([0, 2, , 3]);
446
+ if (this.watchStatus !== WatchStatus.ACTIVE) {
447
+ this.scheduleSendACK();
448
+ return [2];
449
+ }
450
+ if (!this.sessionInfo) {
451
+ console.warn('[realtime listener] can not send ack without a successful initWatch (lack of sessionInfo)');
452
+ return [2];
453
+ }
454
+ ackMsg = {
455
+ watchId: this.watchId,
456
+ requestId: (0, message_1.genRequestId)(),
457
+ msgType: 'CHECK_LAST',
458
+ msgData: {
459
+ queryID: this.sessionInfo.queryID,
460
+ eventID: this.sessionInfo.currentEventId,
461
+ },
462
+ };
463
+ return [4, this.send({
464
+ msg: ackMsg,
465
+ })];
466
+ case 1:
467
+ _a.sent();
468
+ this.scheduleSendACK();
469
+ return [3, 3];
470
+ case 2:
471
+ e_5 = _a.sent();
472
+ if ((0, error_1.isRealtimeErrorMessageError)(e_5)) {
473
+ msg = e_5.payload;
474
+ switch (msg.msgData.code) {
475
+ case 'CHECK_LOGIN_FAILED':
476
+ case 'SIGN_EXPIRED_ERROR':
477
+ case 'SIGN_INVALID_ERROR':
478
+ case 'SIGN_PARAM_INVALID': {
479
+ this.rebuildWatch();
480
+ return [2];
481
+ }
482
+ case 'QUERYID_INVALID_ERROR':
483
+ case 'SYS_ERR':
484
+ case 'INVALIID_ENV':
485
+ case 'COLLECTION_PERMISSION_DENIED': {
486
+ this.closeWithError(new error_1.CloudSDKError({
487
+ errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_CHECK_LAST_FAIL,
488
+ errMsg: msg.msgData.code,
489
+ }));
490
+ return [2];
491
+ }
492
+ default: {
493
+ break;
494
+ }
495
+ }
496
+ }
497
+ if (this.availableRetries.CHECK_LAST
498
+ && this.availableRetries.CHECK_LAST > 0) {
499
+ this.availableRetries.CHECK_LAST -= 1;
500
+ this.scheduleSendACK();
501
+ }
502
+ else {
503
+ this.closeWithError(new error_1.CloudSDKError({
504
+ errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_CHECK_LAST_FAIL,
505
+ errMsg: e_5,
506
+ }));
507
+ }
508
+ return [3, 3];
509
+ case 3: return [2];
510
+ }
511
+ });
512
+ }); };
513
+ this.handleCommonError = function (e, options) {
514
+ if ((0, error_1.isRealtimeErrorMessageError)(e)) {
515
+ var msg = e.payload;
516
+ switch (msg.msgData.code) {
517
+ case 'CHECK_LOGIN_FAILED':
518
+ case 'SIGN_EXPIRED_ERROR':
519
+ case 'SIGN_INVALID_ERROR':
520
+ case 'SIGN_PARAM_INVALID': {
521
+ options.onSignError(e);
522
+ return;
523
+ }
524
+ case 'QUERYID_INVALID_ERROR':
525
+ case 'SYS_ERR':
526
+ case 'INVALIID_ENV':
527
+ case 'COLLECTION_PERMISSION_DENIED': {
528
+ options.onNotRetryableError(e);
529
+ return;
530
+ }
531
+ default: {
532
+ options.onNotRetryableError(e);
533
+ return;
534
+ }
535
+ }
536
+ }
537
+ else if ((0, error_1.isTimeoutError)(e)) {
538
+ options.onTimeoutError(e);
539
+ return;
540
+ }
541
+ else if ((0, error_1.isCancelledError)(e)) {
542
+ options.onCancelledError(e);
543
+ return;
544
+ }
545
+ options.onUnknownError(e);
546
+ };
547
+ this.watchId = "watchid_".concat(+new Date(), "_").concat(Math.random());
548
+ this.envId = options.envId;
549
+ this.collectionName = options.collectionName;
550
+ this.query = options.query;
551
+ this.limit = options.limit;
552
+ this.orderBy = options.orderBy;
553
+ this.send = options.send;
554
+ this.login = options.login;
555
+ this.isWSConnected = options.isWSConnected;
556
+ this.onceWSConnected = options.onceWSConnected;
557
+ this.getWaitExpectedTimeoutLength = options.getWaitExpectedTimeoutLength;
558
+ this.onWatchStart = options.onWatchStart;
559
+ this.onWatchClose = options.onWatchClose;
560
+ this.debug = options.debug;
561
+ this.availableRetries = {
562
+ INIT_WATCH: DEFAULT_MAX_AUTO_RETRY_ON_ERROR,
563
+ REBUILD_WATCH: DEFAULT_MAX_AUTO_RETRY_ON_ERROR,
564
+ CHECK_LAST: DEFAULT_MAX_SEND_ACK_AUTO_RETRY_ON_ERROR,
565
+ };
566
+ this.listener = new listener_1.RealtimeListener({
567
+ close: function () {
568
+ _this.closeWatch();
569
+ },
570
+ onChange: options.onChange,
571
+ onError: options.onError,
572
+ debug: this.debug,
573
+ virtualClient: this,
574
+ });
575
+ this.initWatch();
576
+ }
577
+ VirtualWebSocketClient.prototype.onMessage = function (msg) {
578
+ var _this = this;
579
+ switch (this.watchStatus) {
580
+ case WatchStatus.PAUSED: {
581
+ if (msg.msgType !== 'ERROR') {
582
+ return;
583
+ }
584
+ break;
585
+ }
586
+ case WatchStatus.LOGGINGIN:
587
+ case WatchStatus.INITING:
588
+ case WatchStatus.REBUILDING: {
589
+ console.warn("[realtime listener] internal non-fatal error: unexpected message received while ".concat(this.watchStatus));
590
+ return;
591
+ }
592
+ case WatchStatus.CLOSED: {
593
+ console.warn('[realtime listener] internal non-fatal error: unexpected message received when the watch has closed');
594
+ return;
595
+ }
596
+ case WatchStatus.ERRORED: {
597
+ console.warn('[realtime listener] internal non-fatal error: unexpected message received when the watch has ended with error');
598
+ return;
599
+ }
600
+ }
601
+ if (!this.sessionInfo) {
602
+ console.warn('[realtime listener] internal non-fatal error: sessionInfo not found while message is received.');
603
+ return;
604
+ }
605
+ this.scheduleSendACK();
606
+ switch (msg.msgType) {
607
+ case 'NEXT_EVENT': {
608
+ console.warn("nextevent ".concat(msg.msgData.currEvent, " ignored"), msg);
609
+ this.handleServerEvents(msg);
610
+ break;
611
+ }
612
+ case 'CHECK_EVENT': {
613
+ if (this.sessionInfo.currentEventId < msg.msgData.currEvent) {
614
+ this.sessionInfo.expectEventId = msg.msgData.currEvent;
615
+ this.clearWaitExpectedEvent();
616
+ this.waitExpectedTimeoutId = setTimeout(function () {
617
+ _this.rebuildWatch();
618
+ }, this.getWaitExpectedTimeoutLength());
619
+ console.log("[realtime] waitExpectedTimeoutLength ".concat(this.getWaitExpectedTimeoutLength()));
620
+ }
621
+ break;
622
+ }
623
+ case 'ERROR': {
624
+ this.closeWithError(new error_1.CloudSDKError({
625
+ errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_SERVER_ERROR_MSG,
626
+ errMsg: "".concat(msg.msgData.code, " - ").concat(msg.msgData.message),
627
+ }));
628
+ break;
629
+ }
630
+ default: {
631
+ console.warn("[realtime listener] virtual client receive unexpected msg ".concat(msg.msgType, ": "), msg);
632
+ break;
633
+ }
634
+ }
635
+ };
636
+ VirtualWebSocketClient.prototype.closeWithError = function (error) {
637
+ var _a;
638
+ this.watchStatus = WatchStatus.ERRORED;
639
+ this.clearACKSchedule();
640
+ this.listener.onError(error);
641
+ this.onWatchClose(this, ((_a = this.sessionInfo) === null || _a === void 0 ? void 0 : _a.queryID) || '');
642
+ console.log("[realtime] client closed (".concat(this.collectionName, " ").concat(this.query, ") (watchId ").concat(this.watchId, ")"));
643
+ };
644
+ VirtualWebSocketClient.prototype.pause = function () {
645
+ this.watchStatus = WatchStatus.PAUSED;
646
+ console.log("[realtime] client paused (".concat(this.collectionName, " ").concat(this.query, ") (watchId ").concat(this.watchId, ")"));
647
+ };
648
+ VirtualWebSocketClient.prototype.resume = function () {
649
+ return __awaiter(this, void 0, void 0, function () {
650
+ var e_6;
651
+ return __generator(this, function (_a) {
652
+ switch (_a.label) {
653
+ case 0:
654
+ this.watchStatus = WatchStatus.RESUMING;
655
+ console.log("[realtime] client resuming with ".concat(this.sessionInfo ? 'REBUILD_WATCH' : 'INIT_WATCH', " (").concat(this.collectionName, " ").concat(this.query, ") (").concat(this.watchId, ")"));
656
+ _a.label = 1;
657
+ case 1:
658
+ _a.trys.push([1, 3, , 4]);
659
+ return [4, (this.sessionInfo ? this.rebuildWatch() : this.initWatch())];
660
+ case 2:
661
+ _a.sent();
662
+ console.log("[realtime] client successfully resumed (".concat(this.collectionName, " ").concat(this.query, ") (").concat(this.watchId, ")"));
663
+ return [3, 4];
664
+ case 3:
665
+ e_6 = _a.sent();
666
+ console.error("[realtime] client resume failed (".concat(this.collectionName, " ").concat(this.query, ") (").concat(this.watchId, ")"), e_6);
667
+ return [3, 4];
668
+ case 4: return [2];
669
+ }
670
+ });
671
+ });
672
+ };
673
+ VirtualWebSocketClient.prototype.useRetryTicket = function (operationName) {
674
+ if (this.availableRetries[operationName]
675
+ && this.availableRetries[operationName] > 0) {
676
+ this.availableRetries[operationName] -= 1;
677
+ console.log("[realtime] ".concat(operationName, " use a retry ticket, now only ").concat(this.availableRetries[operationName], " retry left"));
678
+ return true;
679
+ }
680
+ return false;
681
+ };
682
+ VirtualWebSocketClient.prototype.handleServerEvents = function (msg) {
683
+ return __awaiter(this, void 0, void 0, function () {
684
+ var e_7;
685
+ return __generator(this, function (_a) {
686
+ switch (_a.label) {
687
+ case 0:
688
+ _a.trys.push([0, 2, , 3]);
689
+ this.scheduleSendACK();
690
+ return [4, this.handleServerEventsInternel(msg)];
691
+ case 1:
692
+ _a.sent();
693
+ this.postHandleServerEventsValidityCheck(msg);
694
+ return [3, 3];
695
+ case 2:
696
+ e_7 = _a.sent();
697
+ console.error('[realtime listener] internal non-fatal error: handle server events failed with error: ', e_7);
698
+ throw e_7;
699
+ case 3: return [2];
700
+ }
701
+ });
702
+ });
703
+ };
704
+ VirtualWebSocketClient.prototype.handleServerEventsInternel = function (msg) {
705
+ return __awaiter(this, void 0, void 0, function () {
706
+ var requestId, events, msgType, sessionInfo, allChangeEvents, docs, initEncountered, _loop_1, this_1, i, len, state_1;
707
+ return __generator(this, function (_a) {
708
+ switch (_a.label) {
709
+ case 0:
710
+ requestId = msg.requestId;
711
+ events = msg.msgData.events;
712
+ msgType = msg.msgType;
713
+ if (!events.length || !this.sessionInfo) {
714
+ return [2];
715
+ }
716
+ sessionInfo = this.sessionInfo;
717
+ try {
718
+ allChangeEvents = events.map(getPublicEvent);
719
+ }
720
+ catch (e) {
721
+ this.closeWithError(new error_1.CloudSDKError({
722
+ errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_RECEIVE_INVALID_SERVER_DATA,
723
+ errMsg: e,
724
+ }));
725
+ return [2];
726
+ }
727
+ docs = __spreadArray([], sessionInfo.currentDocs, true);
728
+ initEncountered = false;
729
+ _loop_1 = function (i, len) {
730
+ var change, localDoc, doc_1, _i, _b, fieldPath, err, err, doc, doc, err, ind, ind, docsSnapshot, docChanges, snapshot;
731
+ return __generator(this, function (_c) {
732
+ switch (_c.label) {
733
+ case 0:
734
+ change = allChangeEvents[i];
735
+ if (!(sessionInfo.currentEventId >= change.id)) return [3, 1];
736
+ if (!allChangeEvents[i - 1] || change.id > allChangeEvents[i - 1].id) {
737
+ console.warn("[realtime] duplicate event received, cur ".concat(sessionInfo.currentEventId, " but got ").concat(change.id));
738
+ }
739
+ else {
740
+ console.error("[realtime listener] server non-fatal error: events out of order (the latter event's id is smaller than that of the former) (requestId ".concat(requestId, ")"));
741
+ }
742
+ return [2, "continue"];
743
+ case 1:
744
+ if (!(sessionInfo.currentEventId === change.id - 1)) return [3, 2];
745
+ switch (change.dataType) {
746
+ case 'update': {
747
+ if (!change.doc) {
748
+ switch (change.queueType) {
749
+ case 'update':
750
+ case 'dequeue': {
751
+ localDoc = docs.find(function (doc) { return doc._id === change.docId; });
752
+ if (localDoc) {
753
+ doc_1 = (0, cloneDeep_1.default)(localDoc);
754
+ if (change.updatedFields) {
755
+ Object.keys(change.updatedFields).forEach(function (fieldPath) {
756
+ (0, set_1.default)(doc_1, fieldPath, change.updatedFields[fieldPath]);
757
+ });
758
+ }
759
+ if (change.removedFields) {
760
+ for (_i = 0, _b = change.removedFields; _i < _b.length; _i++) {
761
+ fieldPath = _b[_i];
762
+ (0, unset_1.default)(doc_1, fieldPath);
763
+ }
764
+ }
765
+ change.doc = doc_1;
766
+ }
767
+ else {
768
+ console.error('[realtime listener] internal non-fatal server error: unexpected update dataType event where no doc is associated.');
769
+ }
770
+ break;
771
+ }
772
+ case 'enqueue': {
773
+ err = new error_1.CloudSDKError({
774
+ errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_UNEXPECTED_FATAL_ERROR,
775
+ errMsg: "HandleServerEvents: full doc is not provided with dataType=\"update\" and queueType=\"enqueue\" (requestId ".concat(msg.requestId, ")"),
776
+ });
777
+ this_1.closeWithError(err);
778
+ throw err;
779
+ }
780
+ default: {
781
+ break;
782
+ }
783
+ }
784
+ }
785
+ break;
786
+ }
787
+ case 'replace': {
788
+ if (!change.doc) {
789
+ err = new error_1.CloudSDKError({
790
+ errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_UNEXPECTED_FATAL_ERROR,
791
+ errMsg: "HandleServerEvents: full doc is not provided with dataType=\"replace\" (requestId ".concat(msg.requestId, ")"),
792
+ });
793
+ this_1.closeWithError(err);
794
+ throw err;
795
+ }
796
+ break;
797
+ }
798
+ case 'remove': {
799
+ doc = docs.find(function (doc) { return doc._id === change.docId; });
800
+ if (doc) {
801
+ change.doc = doc;
802
+ }
803
+ else {
804
+ console.error('[realtime listener] internal non-fatal server error: unexpected remove event where no doc is associated.');
805
+ }
806
+ break;
807
+ }
808
+ case 'limit': {
809
+ if (!change.doc) {
810
+ switch (change.queueType) {
811
+ case 'dequeue': {
812
+ doc = docs.find(function (doc) { return doc._id === change.docId; });
813
+ if (doc) {
814
+ change.doc = doc;
815
+ }
816
+ else {
817
+ console.error('[realtime listener] internal non-fatal server error: unexpected limit dataType event where no doc is associated.');
818
+ }
819
+ break;
820
+ }
821
+ case 'enqueue': {
822
+ err = new error_1.CloudSDKError({
823
+ errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_UNEXPECTED_FATAL_ERROR,
824
+ errMsg: "HandleServerEvents: full doc is not provided with dataType=\"limit\" and queueType=\"enqueue\" (requestId ".concat(msg.requestId, ")"),
825
+ });
826
+ this_1.closeWithError(err);
827
+ throw err;
828
+ }
829
+ default: {
830
+ break;
831
+ }
832
+ }
833
+ }
834
+ break;
835
+ }
836
+ }
837
+ switch (change.queueType) {
838
+ case 'init': {
839
+ if (!initEncountered) {
840
+ initEncountered = true;
841
+ docs = [change.doc];
842
+ }
843
+ else {
844
+ docs.push(change.doc);
845
+ }
846
+ break;
847
+ }
848
+ case 'enqueue': {
849
+ docs.push(change.doc);
850
+ break;
851
+ }
852
+ case 'dequeue': {
853
+ ind = docs.findIndex(function (doc) { return doc._id === change.docId; });
854
+ if (ind > -1) {
855
+ docs.splice(ind, 1);
856
+ }
857
+ else {
858
+ console.error('[realtime listener] internal non-fatal server error: unexpected dequeue event where no doc is associated.');
859
+ }
860
+ break;
861
+ }
862
+ case 'update': {
863
+ ind = docs.findIndex(function (doc) { return doc._id === change.docId; });
864
+ if (ind > -1) {
865
+ docs[ind] = change.doc;
866
+ }
867
+ else {
868
+ console.error('[realtime listener] internal non-fatal server error: unexpected queueType update event where no doc is associated.');
869
+ }
870
+ break;
871
+ }
872
+ }
873
+ if (i === len - 1
874
+ || (allChangeEvents[i + 1] && allChangeEvents[i + 1].id !== change.id)) {
875
+ docsSnapshot = __spreadArray([], docs, true);
876
+ docChanges = allChangeEvents
877
+ .slice(0, i + 1)
878
+ .filter(function (c) { return c.id === change.id; });
879
+ this_1.sessionInfo.currentEventId = change.id;
880
+ this_1.sessionInfo.currentDocs = docs;
881
+ snapshot = new snapshot_1.Snapshot({
882
+ id: change.id,
883
+ docChanges: docChanges,
884
+ docs: docsSnapshot,
885
+ msgType: msgType,
886
+ });
887
+ this_1.listener.onChange(snapshot);
888
+ }
889
+ return [3, 4];
890
+ case 2:
891
+ console.warn("[realtime listener] event received is out of order, cur ".concat(this_1.sessionInfo.currentEventId, " but got ").concat(change.id));
892
+ return [4, this_1.rebuildWatch()];
893
+ case 3:
894
+ _c.sent();
895
+ return [2, { value: void 0 }];
896
+ case 4: return [2];
897
+ }
898
+ });
899
+ };
900
+ this_1 = this;
901
+ i = 0, len = allChangeEvents.length;
902
+ _a.label = 1;
903
+ case 1:
904
+ if (!(i < len)) return [3, 4];
905
+ return [5, _loop_1(i, len)];
906
+ case 2:
907
+ state_1 = _a.sent();
908
+ if (typeof state_1 === "object")
909
+ return [2, state_1.value];
910
+ _a.label = 3;
911
+ case 3:
912
+ i++;
913
+ return [3, 1];
914
+ case 4: return [2];
915
+ }
916
+ });
917
+ });
918
+ };
919
+ VirtualWebSocketClient.prototype.postHandleServerEventsValidityCheck = function (msg) {
920
+ if (!this.sessionInfo) {
921
+ console.error('[realtime listener] internal non-fatal error: sessionInfo lost after server event handling, this should never occur');
922
+ return;
923
+ }
924
+ if (this.sessionInfo.expectEventId
925
+ && this.sessionInfo.currentEventId >= this.sessionInfo.expectEventId) {
926
+ this.clearWaitExpectedEvent();
927
+ }
928
+ if (this.sessionInfo.currentEventId < msg.msgData.currEvent) {
929
+ console.warn('[realtime listener] internal non-fatal error: client eventId does not match with server event id after server event handling');
930
+ return;
931
+ }
932
+ };
933
+ VirtualWebSocketClient.prototype.clearWaitExpectedEvent = function () {
934
+ if (this.waitExpectedTimeoutId) {
935
+ clearTimeout(this.waitExpectedTimeoutId);
936
+ this.waitExpectedTimeoutId = undefined;
937
+ }
938
+ };
939
+ return VirtualWebSocketClient;
940
+ }());
941
+ exports.VirtualWebSocketClient = VirtualWebSocketClient;
942
+ function getPublicEvent(event) {
943
+ var e = {
944
+ id: event.ID,
945
+ dataType: event.DataType,
946
+ queueType: event.QueueType,
947
+ docId: event.DocID,
948
+ doc: event.Doc && event.Doc !== '{}' ? JSON.parse(event.Doc) : undefined,
949
+ };
950
+ if (event.DataType === 'update') {
951
+ if (event.UpdatedFields) {
952
+ e.updatedFields = JSON.parse(event.UpdatedFields);
953
+ }
954
+ if (event.removedFields || event.RemovedFields) {
955
+ e.removedFields = JSON.parse(event.removedFields);
956
+ }
957
+ }
958
+ return e;
959
+ }
960
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC13ZWJzb2NrZXQtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtREFBNEI7QUFDNUIsdURBQWdDO0FBQ2hDLCtEQUF3QztBQUN4QyxxQ0FBd0M7QUFnQnhDLHVDQUE2QztBQUM3Qyx1Q0FBcUM7QUFFckMsaUNBU2dCO0FBQ2hCLGlDQUErQjtBQXlDL0IsSUFBSyxXQVVKO0FBVkQsV0FBSyxXQUFXO0lBQ2Qsc0NBQXVCLENBQUE7SUFDdkIsa0NBQW1CLENBQUE7SUFDbkIsd0NBQXlCLENBQUE7SUFDekIsZ0NBQWlCLENBQUE7SUFDakIsa0NBQW1CLENBQUE7SUFDbkIsa0NBQW1CLENBQUE7SUFDbkIsZ0NBQWlCLENBQUE7SUFDakIsZ0NBQWlCLENBQUE7SUFDakIsb0NBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVZJLFdBQVcsS0FBWCxXQUFXLFFBVWY7QUFFRCxJQUFNLGtDQUFrQyxHQUFHLEdBQUcsQ0FBQTtBQUM5QyxJQUFNLCtCQUErQixHQUFHLENBQUMsQ0FBQTtBQUN6QyxJQUFNLHdDQUF3QyxHQUFHLENBQUMsQ0FBQTtBQUNsRCxJQUFNLGlDQUFpQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUE7QUFDbkQsSUFBTSwwQkFBMEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFBO0FBQzVDLElBQU0sNkJBQTZCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQTtBQUUvQztJQXFDRSxnQ0FBWSxPQUFrRDtRQUE5RCxpQkFpQ0M7UUE3Q08sZ0JBQVcsR0FBZ0IsV0FBVyxDQUFDLE9BQU8sQ0FBQTtRQXNLOUMsWUFBTyxHQUFHLFVBQ2hCLEtBQWMsRUFDZCxPQUFpQjs7Ozs7d0JBRWpCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FB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OTJCWSx3REFBc0I7QUFnM0JuQyxTQUFTLGNBQWMsQ0FBQyxLQUFlO0lBQ3JDLElBQU0sQ0FBQyxHQUFtQjtRQUN4QixFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7UUFDWixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7UUFDeEIsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1FBQzFCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztRQUNsQixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDekUsQ0FBQTtJQUVELElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFFL0IsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLENBQUMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7U0FDbEQ7UUFHRCxJQUFJLEtBQUssQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUs5QyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1NBQ2xEO0tBQ0Y7SUFFRCxPQUFPLENBQUMsQ0FBQTtBQUNWLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2V0IGZyb20gJ2xvZGFzaC9zZXQnXG5pbXBvcnQgdW5zZXQgZnJvbSAnbG9kYXNoL3Vuc2V0J1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJ1xuaW1wb3J0IHsgZ2VuUmVxdWVzdElkIH0gZnJvbSAnLi9tZXNzYWdlJ1xuaW1wb3J0IHtcbiAgSVJlc3BvbnNlTWVzc2FnZSxcbiAgSVJlcXVlc3RNZXNzYWdlSW5pdFdhdGNoTXNnLFxuICBJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnLFxuICBJREJFdmVudCxcbiAgSVJlcXVlc3RNZXNzYWdlUmVidWlsZFdhdGNoTXNnLFxuICBJUmVxdWVzdE1lc3NhZ2VDbG9zZVdhdGNoTXNnLFxuICBJUmVxdWVzdE1zZ1R5cGUsXG4gIElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUNoZWNrTGFzdE1zZyxcbiAgSVdhdGNoT3B0aW9ucyxcbn0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9yZWFsdGltZSdcbmltcG9ydCB7XG4gIElTaW5nbGVEQkV2ZW50LFxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2RhdGFiYXNlJ1xuaW1wb3J0IHsgUmVhbHRpbWVMaXN0ZW5lciB9IGZyb20gJy4vbGlzdGVuZXInXG5pbXBvcnQgeyBTbmFwc2hvdCB9IGZyb20gJy4vc25hcHNob3QnXG5pbXBvcnQgeyBJV1NTZW5kT3B0aW9ucywgSUxvZ2luUmVzdWx0IH0gZnJvbSAnLi93ZWJzb2NrZXQtY2xpZW50J1xuaW1wb3J0IHtcbiAgRVJSX0NPREUsXG4gIENsb3VkU0RLRXJyb3IsXG4gIGlzVGltZW91dEVycm9yLFxuICBDYW5jZWxsZWRFcnJvcixcbiAgaXNDYW5jZWxsZWRFcnJvcixcbiAgaXNSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yLFxuICBSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yLFxuICBUaW1lb3V0RXJyb3IsXG59IGZyb20gJy4vZXJyb3InXG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vdXRpbHMnXG5cbi8vID09PT09PT09PT09PT09PSBSZWFsdGltZSBWaXJ0dWFsIFdlYlNvY2tldCBDbGllbnQgKEludGVybmFsKSA9PT09PT09PT09PT09PT09PT09PVxuXG5pbnRlcmZhY2UgSVZpcnR1YWxXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBJV2F0Y2hPcHRpb25zIHtcbiAgZW52SWQ/OiBzdHJpbmdcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZ1xuICBxdWVyeTogc3RyaW5nXG4gIGxpbWl0PzogbnVtYmVyXG4gIG9yZGVyQnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHNlbmQ6IDxUID0gYW55PihvcHRzOiBJV1NTZW5kT3B0aW9ucykgPT4gUHJvbWlzZTxUPlxuICBsb2dpbjogKGVudklkPzogc3RyaW5nLCByZWZyZXNoPzogYm9vbGVhbikgPT4gUHJvbWlzZTxhbnk+XG4gIGlzV1NDb25uZWN0ZWQ6ICgpID0+IGJvb2xlYW5cbiAgb25jZVdTQ29ubmVjdGVkOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIGdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGg6ICgpID0+IG51bWJlclxuICBvbldhdGNoU3RhcnQ6IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4gdm9pZFxuICBvbldhdGNoQ2xvc2U6IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4gdm9pZFxuICBkZWJ1Zz86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIElXYXRjaFNlc3Npb25JbmZvIHtcbiAgcXVlcnlJRDogc3RyaW5nXG4gIGN1cnJlbnRFdmVudElkOiBudW1iZXJcbiAgY3VycmVudERvY3M6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICBleHBlY3RFdmVudElkPzogbnVtYmVyXG59XG5cbmludGVyZmFjZSBJSGFuZGxlQ29tbW9uRXJyb3JPcHRpb25zIHtcbiAgb25TaWduRXJyb3I6IChlOiBSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yKSA9PiB2b2lkXG4gIG9uVGltZW91dEVycm9yOiAoZTogVGltZW91dEVycm9yKSA9PiB2b2lkXG4gIG9uQ2FuY2VsbGVkRXJyb3I6IChlOiBDYW5jZWxsZWRFcnJvcikgPT4gdm9pZFxuICBvbk5vdFJldHJ5YWJsZUVycm9yOiAoZTogUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcikgPT4gdm9pZFxuICBvblVua25vd25FcnJvcjogKGU6IGFueSkgPT4gdm9pZFxufVxuXG5pbnRlcmZhY2UgSUhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yT3B0aW9ucyB7XG4gIG9wZXJhdGlvbk5hbWU6ICdJTklUX1dBVENIJyB8ICdSRUJVSUxEX1dBVENIJ1xuICByZXNvbHZlOiAodmFsdWU/OiBQcm9taXNlTGlrZTx2b2lkPiB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICByZWplY3Q6IChlOiBhbnkpID0+IHZvaWRcbn1cblxuZW51bSBXYXRjaFN0YXR1cyB7XG4gIExPR0dJTkdJTiA9ICdMT0dHSU5HSU4nLFxuICBJTklUSU5HID0gJ0lOSVRJTkcnLFxuICBSRUJVSUxESU5HID0gJ1JFQlVJTERJTkcnLFxuICBBQ1RJVkUgPSAnQUNUSVZFJyxcbiAgRVJST1JFRCA9ICdFUlJPUkVEJyxcbiAgQ0xPU0lORyA9ICdDTE9TSU5HJyxcbiAgQ0xPU0VEID0gJ0NMT1NFRCcsXG4gIFBBVVNFRCA9ICdQQVVTRUQnLFxuICBSRVNVTUlORyA9ICdSRVNVTUlORydcbn1cblxuY29uc3QgREVGQVVMVF9XQUlUX1RJTUVfT05fVU5LTk9XTl9FUlJPUiA9IDEwMFxuY29uc3QgREVGQVVMVF9NQVhfQVVUT19SRVRSWV9PTl9FUlJPUiA9IDJcbmNvbnN0IERFRkFVTFRfTUFYX1NFTkRfQUNLX0FVVE9fUkVUUllfT05fRVJST1IgPSAyXG5jb25zdCBERUZBVUxUX1NFTkRfQUNLX0RFQk9VTkNFX1RJTUVPVVQgPSAxMCAqIDEwMDBcbmNvbnN0IERFRkFVTFRfSU5JVF9XQVRDSF9USU1FT1VUID0gMTAgKiAxMDAwXG5jb25zdCBERUZBVUxUX1JFQlVJTERfV0FUQ0hfVElNRU9VVCA9IDEwICogMTAwMFxuXG5leHBvcnQgY2xhc3MgVmlydHVhbFdlYlNvY2tldENsaWVudCB7XG4gIC8vIHBhc3NlZCBvdmVyXG4gIHdhdGNoSWQ6IHN0cmluZ1xuICAvLyBvd25cbiAgbGlzdGVuZXI6IFJlYWx0aW1lTGlzdGVuZXJcbiAgcHJpdmF0ZSBlbnZJZD86IHN0cmluZ1xuICBwcml2YXRlIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmdcbiAgcHJpdmF0ZSBxdWVyeTogc3RyaW5nXG4gIHByaXZhdGUgbGltaXQ6IG51bWJlclxuICBwcml2YXRlIG9yZGVyQnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgcHJpdmF0ZSBzZW5kOiA8VCA9IGFueT4ob3B0czogSVdTU2VuZE9wdGlvbnMpID0+IFByb21pc2U8VD5cbiAgcHJpdmF0ZSBsb2dpbjogKGVudklkPzogc3RyaW5nLCByZWZyZXNoPzogYm9vbGVhbikgPT4gUHJvbWlzZTxhbnk+XG4gIHByaXZhdGUgaXNXU0Nvbm5lY3RlZDogKCkgPT4gYm9vbGVhblxuICBwcml2YXRlIG9uY2VXU0Nvbm5lY3RlZDogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICBwcml2YXRlIGdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGg6ICgpID0+IG51bWJlclxuICBwcml2YXRlIG9uV2F0Y2hTdGFydDogKFxuICAgIGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCxcbiAgICBxdWVyeUlEOiBzdHJpbmdcbiAgKSA9PiB2b2lkXG4gIHByaXZhdGUgb25XYXRjaENsb3NlOiAoXG4gICAgY2xpZW50OiBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50LFxuICAgIHF1ZXJ5SUQ6IHN0cmluZ1xuICApID0+IHZvaWRcbiAgcHJpdmF0ZSBkZWJ1Zz86IGJvb2xlYW5cblxuICBwcml2YXRlIHdhdGNoU3RhdHVzOiBXYXRjaFN0YXR1cyA9IFdhdGNoU3RhdHVzLklOSVRJTkdcbiAgcHJpdmF0ZSBhdmFpbGFibGVSZXRyaWVzOiBQYXJ0aWFsPFJlY29yZDxJUmVxdWVzdE1zZ1R5cGUsIG51bWJlcj4+XG4gIHByaXZhdGUgYWNrVGltZW91dElkPzogbnVtYmVyXG4gIHByaXZhdGUgaW5pdFdhdGNoUHJvbWlzZT86IFByb21pc2U8dm9pZD5cbiAgcHJpdmF0ZSByZWJ1aWxkV2F0Y2hQcm9taXNlPzogUHJvbWlzZTx2b2lkPlxuXG4gIC8vIG9idGFpbmVkXG4gIHByaXZhdGUgc2Vzc2lvbkluZm8/OiBJV2F0Y2hTZXNzaW9uSW5mb1xuXG4gIC8vIGludGVybmFsXG4gIHByaXZhdGUgd2FpdEV4cGVjdGVkVGltZW91dElkPzogbnVtYmVyXG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVZpcnR1YWxXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLndhdGNoSWQgPSBgd2F0Y2hpZF8keytuZXcgRGF0ZSgpfV8ke01hdGgucmFuZG9tKCl9YFxuICAgIHRoaXMuZW52SWQgPSBvcHRpb25zLmVudklkXG4gICAgdGhpcy5jb2xsZWN0aW9uTmFtZSA9IG9wdGlvbnMuY29sbGVjdGlvbk5hbWVcbiAgICB0aGlzLnF1ZXJ5ID0gb3B0aW9ucy5xdWVyeVxuICAgIHRoaXMubGltaXQgPSBvcHRpb25zLmxpbWl0XG4gICAgdGhpcy5vcmRlckJ5ID0gb3B0aW9ucy5vcmRlckJ5XG4gICAgdGhpcy5zZW5kID0gb3B0aW9ucy5zZW5kXG4gICAgdGhpcy5sb2dpbiA9IG9wdGlvbnMubG9naW5cbiAgICB0aGlzLmlzV1NDb25uZWN0ZWQgPSBvcHRpb25zLmlzV1NDb25uZWN0ZWRcbiAgICB0aGlzLm9uY2VXU0Nvbm5lY3RlZCA9IG9wdGlvbnMub25jZVdTQ29ubmVjdGVkXG4gICAgdGhpcy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoID0gb3B0aW9ucy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoXG4gICAgdGhpcy5vbldhdGNoU3RhcnQgPSBvcHRpb25zLm9uV2F0Y2hTdGFydFxuICAgIHRoaXMub25XYXRjaENsb3NlID0gb3B0aW9ucy5vbldhdGNoQ2xvc2VcbiAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1Z1xuXG4gICAgdGhpcy5hdmFpbGFibGVSZXRyaWVzID0ge1xuICAgICAgSU5JVF9XQVRDSDogREVGQVVMVF9NQVhfQVVUT19SRVRSWV9PTl9FUlJPUixcbiAgICAgIFJFQlVJTERfV0FUQ0g6IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1IsXG4gICAgICBDSEVDS19MQVNUOiBERUZBVUxUX01BWF9TRU5EX0FDS19BVVRPX1JFVFJZX09OX0VSUk9SLFxuICAgIH1cblxuICAgIHRoaXMubGlzdGVuZXIgPSBuZXcgUmVhbHRpbWVMaXN0ZW5lcih7XG4gICAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmNsb3NlV2F0Y2goKVxuICAgICAgfSxcbiAgICAgIG9uQ2hhbmdlOiBvcHRpb25zLm9uQ2hhbmdlLFxuICAgICAgb25FcnJvcjogb3B0aW9ucy5vbkVycm9yLFxuICAgICAgZGVidWc6IHRoaXMuZGVidWcsXG4gICAgICB2aXJ0dWFsQ2xpZW50OiB0aGlzLFxuICAgIH0pXG5cbiAgICB0aGlzLmluaXRXYXRjaCgpXG4gIH1cblxuICBvbk1lc3NhZ2UobXNnOiBJUmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgLy8gd2F0Y2hTdGF0dXMgc2FuaXR5IGNoZWNrXG4gICAgc3dpdGNoICh0aGlzLndhdGNoU3RhdHVzKSB7XG4gICAgICBjYXNlIFdhdGNoU3RhdHVzLlBBVVNFRDoge1xuICAgICAgICAvLyBpZ25vcmUgYWxsIGJ1dCBlcnJvciBtZXNzYWdlXG4gICAgICAgIGlmIChtc2cubXNnVHlwZSAhPT0gJ0VSUk9SJykge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIFdhdGNoU3RhdHVzLkxPR0dJTkdJTjpcbiAgICAgIGNhc2UgV2F0Y2hTdGF0dXMuSU5JVElORzpcbiAgICAgIGNhc2UgV2F0Y2hTdGF0dXMuUkVCVUlMRElORzoge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiB1bmV4cGVjdGVkIG1lc3NhZ2UgcmVjZWl2ZWQgd2hpbGUgJHt0aGlzLndhdGNoU3RhdHVzfWApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY2FzZSBXYXRjaFN0YXR1cy5DTE9TRUQ6IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogdW5leHBlY3RlZCBtZXNzYWdlIHJlY2VpdmVkIHdoZW4gdGhlIHdhdGNoIGhhcyBjbG9zZWQnKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNhc2UgV2F0Y2hTdGF0dXMuRVJST1JFRDoge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiB1bmV4cGVjdGVkIG1lc3NhZ2UgcmVjZWl2ZWQgd2hlbiB0aGUgd2F0Y2ggaGFzIGVuZGVkIHdpdGggZXJyb3InKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2Vzc2lvbkluZm8pIHtcbiAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHNlc3Npb25JbmZvIG5vdCBmb3VuZCB3aGlsZSBtZXNzYWdlIGlzIHJlY2VpdmVkLicpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG5cbiAgICBzd2l0Y2ggKG1zZy5tc2dUeXBlKSB7XG4gICAgICBjYXNlICdORVhUX0VWRU5UJzoge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAod3guX2lnbm9yZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYG5leHRldmVudCAke21zZy5tc2dEYXRhLmN1cnJFdmVudH0gaWdub3JlZGAsIG1zZylcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyB3eC5faWdub3JlID0gZmFsc2VcbiAgICAgICAgLy8gcmV0dXJuXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuaGFuZGxlU2VydmVyRXZlbnRzKG1zZylcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0NIRUNLX0VWRU5UJzoge1xuICAgICAgICBpZiAodGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA8IG1zZy5tc2dEYXRhLmN1cnJFdmVudCkge1xuICAgICAgICAgIC8vIGNsaWVudCBldmVudElEIDwgc2VydmVyIGV2ZW50SUQ6XG4gICAgICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgb25lIG9yIG1vcmUgcGVuZGluZyBldmVudHMgbm90IHlldCByZWNlaXZlZCBidXQgc2VudCBieSB0aGUgc2VydmVyXG4gICAgICAgICAgdGhpcy5zZXNzaW9uSW5mby5leHBlY3RFdmVudElkID0gbXNnLm1zZ0RhdGEuY3VyckV2ZW50XG4gICAgICAgICAgdGhpcy5jbGVhcldhaXRFeHBlY3RlZEV2ZW50KClcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgdGhpcy53YWl0RXhwZWN0ZWRUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vIG11c3QgcmVidWlsZCB3YXRjaFxuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkV2F0Y2goKVxuICAgICAgICAgIH0sIHRoaXMuZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aCgpKVxuXG4gICAgICAgICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gd2FpdEV4cGVjdGVkVGltZW91dExlbmd0aCAke3RoaXMuZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aCgpfWApXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VSUk9SJzoge1xuICAgICAgICAvLyByZWNlaXZlIHNlcnZlciBlcnJvclxuICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfU0VSVkVSX0VSUk9SX01TRyBhcyBzdHJpbmcsXG4gICAgICAgICAgZXJyTXNnOiBgJHttc2cubXNnRGF0YS5jb2RlfSAtICR7bXNnLm1zZ0RhdGEubWVzc2FnZX1gLFxuICAgICAgICB9KSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIHZpcnR1YWwgY2xpZW50IHJlY2VpdmUgdW5leHBlY3RlZCBtc2cgJHttc2cubXNnVHlwZX06IGAsXG4gICAgICAgICAgbXNnXG4gICAgICAgIClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbG9zZVdpdGhFcnJvcihlcnJvcjogYW55KSB7XG4gICAgdGhpcy53YXRjaFN0YXR1cyA9IFdhdGNoU3RhdHVzLkVSUk9SRURcbiAgICB0aGlzLmNsZWFyQUNLU2NoZWR1bGUoKVxuICAgIHRoaXMubGlzdGVuZXIub25FcnJvcihlcnJvcilcbiAgICB0aGlzLm9uV2F0Y2hDbG9zZShcbiAgICAgIHRoaXMsXG4gICAgICAodGhpcy5zZXNzaW9uSW5mbz8ucXVlcnlJRCkgfHwgJydcbiAgICApXG5cbiAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSBjbGllbnQgY2xvc2VkICgke3RoaXMuY29sbGVjdGlvbk5hbWV9ICR7dGhpcy5xdWVyeX0pICh3YXRjaElkICR7dGhpcy53YXRjaElkfSlgKVxuICB9XG5cbiAgcGF1c2UoKSB7XG4gICAgdGhpcy53YXRjaFN0YXR1cyA9IFdhdGNoU3RhdHVzLlBBVVNFRFxuICAgIGNvbnNvbGUubG9nKGBbcmVhbHRpbWVdIGNsaWVudCBwYXVzZWQgKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKHdhdGNoSWQgJHt0aGlzLndhdGNoSWR9KWApXG4gIH1cblxuXG4gIGFzeW5jIHJlc3VtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLndhdGNoU3RhdHVzID0gV2F0Y2hTdGF0dXMuUkVTVU1JTkdcblxuICAgIGNvbnNvbGUubG9nKGBbcmVhbHRpbWVdIGNsaWVudCByZXN1bWluZyB3aXRoICR7XG4gICAgICB0aGlzLnNlc3Npb25JbmZvID8gJ1JFQlVJTERfV0FUQ0gnIDogJ0lOSVRfV0FUQ0gnXG4gICAgfSAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSAke3RoaXMucXVlcnl9KSAoJHt0aGlzLndhdGNoSWR9KWApXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgKHRoaXMuc2Vzc2lvbkluZm8gPyB0aGlzLnJlYnVpbGRXYXRjaCgpIDogdGhpcy5pbml0V2F0Y2goKSlcblxuICAgICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gY2xpZW50IHN1Y2Nlc3NmdWxseSByZXN1bWVkICgke3RoaXMuY29sbGVjdGlvbk5hbWV9ICR7dGhpcy5xdWVyeX0pICgke3RoaXMud2F0Y2hJZH0pYClcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW3JlYWx0aW1lXSBjbGllbnQgcmVzdW1lIGZhaWxlZCAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSAke3RoaXMucXVlcnl9KSAoJHt0aGlzLndhdGNoSWR9KWAsXG4gICAgICAgIGVcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHdzTG9naW4gPSBhc3luYyAoXG4gICAgZW52SWQ/OiBzdHJpbmcsXG4gICAgcmVmcmVzaD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxJTG9naW5SZXN1bHQ+ID0+IHtcbiAgICB0aGlzLndhdGNoU3RhdHVzID0gV2F0Y2hTdGF0dXMuTE9HR0lOR0lOXG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCB0aGlzLmxvZ2luKGVudklkLCByZWZyZXNoKVxuICAgIGlmICghdGhpcy5lbnZJZCkge1xuICAgICAgdGhpcy5lbnZJZCA9IGxvZ2luUmVzdWx0LmVudklkXG4gICAgfVxuICAgIHJldHVybiBsb2dpblJlc3VsdFxuICB9XG5cbiAgcHJpdmF0ZSBpbml0V2F0Y2ggPSBhc3luYyAoZm9yY2VSZWZyZXNoTG9naW4/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMuaW5pdFdhdGNoUHJvbWlzZSAhPT0gbnVsbCAmJiB0aGlzLmluaXRXYXRjaFByb21pc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdFdhdGNoUHJvbWlzZVxuICAgIH1cblxuICAgIHRoaXMuaW5pdFdhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodGhpcy53YXRjaFN0YXR1cyA9PT0gV2F0Y2hTdGF0dXMuUEFVU0VEKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSBpbml0V2F0Y2ggY2FuY2VsbGVkIG9uIHBhdXNlJylcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB7IGVudklkIH0gPSBhd2FpdCB0aGlzLndzTG9naW4odGhpcy5lbnZJZCwgZm9yY2VSZWZyZXNoTG9naW4pXG4gICAgICAgICAgaWYgKCh0aGlzLndhdGNoU3RhdHVzIGFzIFdhdGNoU3RhdHVzKSA9PT0gV2F0Y2hTdGF0dXMuUEFVU0VEKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSBpbml0V2F0Y2ggY2FuY2VsbGVkIG9uIHBhdXNlJylcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLndhdGNoU3RhdHVzID0gV2F0Y2hTdGF0dXMuSU5JVElOR1xuXG4gICAgICAgICAgY29uc3QgaW5pdFdhdGNoTXNnOiBJUmVxdWVzdE1lc3NhZ2VJbml0V2F0Y2hNc2cgPSB7XG4gICAgICAgICAgICB3YXRjaElkOiB0aGlzLndhdGNoSWQsXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICAgICAgbXNnVHlwZTogJ0lOSVRfV0FUQ0gnLFxuICAgICAgICAgICAgbXNnRGF0YToge1xuICAgICAgICAgICAgICBlbnZJZCxcbiAgICAgICAgICAgICAgY29sbE5hbWU6IHRoaXMuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgICBsaW1pdDogdGhpcy5saW1pdCxcbiAgICAgICAgICAgICAgb3JkZXJCeTogdGhpcy5vcmRlckJ5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbml0RXZlbnRNc2cgPSBhd2FpdCB0aGlzLnNlbmQ8SVJlc3BvbnNlTWVzc2FnZUluaXRFdmVudE1zZz4oe1xuICAgICAgICAgICAgbXNnOiBpbml0V2F0Y2hNc2csXG4gICAgICAgICAgICB3YWl0UmVzcG9uc2U6IHRydWUsXG4gICAgICAgICAgICBza2lwT25NZXNzYWdlOiB0cnVlLFxuICAgICAgICAgICAgdGltZW91dDogREVGQVVMVF9JTklUX1dBVENIX1RJTUVPVVQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGNvbnN0IHsgZXZlbnRzLCBjdXJyRXZlbnQgfSA9IGluaXRFdmVudE1zZy5tc2dEYXRhXG5cbiAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvID0ge1xuICAgICAgICAgICAgcXVlcnlJRDogaW5pdEV2ZW50TXNnLm1zZ0RhdGEucXVlcnlJRCxcbiAgICAgICAgICAgIGN1cnJlbnRFdmVudElkOiBjdXJyRXZlbnQgLSAxLFxuICAgICAgICAgICAgY3VycmVudERvY3M6IFtdLFxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZJWDogaW4gaW5pdEV2ZW50IG1lc3NhZ2UsIGFsbCBldmVudHMgaGF2ZSBpZCAwLCB3aGljaCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBjdXJyRXZlbnRcbiAgICAgICAgICBpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICAgICAgICAgICAgZS5JRCA9IGN1cnJFdmVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJFdmVudHMoaW5pdEV2ZW50TXNnKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID0gY3VyckV2ZW50XG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IG5ldyBTbmFwc2hvdCh7XG4gICAgICAgICAgICAgIGlkOiBjdXJyRXZlbnQsXG4gICAgICAgICAgICAgIGRvY0NoYW5nZXM6IFtdLFxuICAgICAgICAgICAgICBkb2NzOiBbXSxcbiAgICAgICAgICAgICAgdHlwZTogJ2luaXQnLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIub25DaGFuZ2Uoc25hcHNob3QpXG4gICAgICAgICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMub25XYXRjaFN0YXJ0KHRoaXMsIHRoaXMuc2Vzc2lvbkluZm8ucXVlcnlJRClcbiAgICAgICAgICB0aGlzLndhdGNoU3RhdHVzID0gV2F0Y2hTdGF0dXMuQUNUSVZFXG4gICAgICAgICAgdGhpcy5hdmFpbGFibGVSZXRyaWVzLklOSVRfV0FUQ0ggPSBERUZBVUxUX01BWF9BVVRPX1JFVFJZX09OX0VSUk9SXG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yKGUsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdJTklUX1dBVENIJyxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgIH0pXG5cbiAgICBsZXQgc3VjY2VzcyA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0V2F0Y2hQcm9taXNlXG4gICAgICBzdWNjZXNzID0gdHJ1ZVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmluaXRXYXRjaFByb21pc2UgPSB1bmRlZmluZWRcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gaW5pdFdhdGNoICR7c3VjY2VzcyA/ICdzdWNjZXNzJyA6ICdmYWlsJ31gKVxuICB9XG5cbiAgcHJpdmF0ZSByZWJ1aWxkV2F0Y2ggPSBhc3luYyAoZm9yY2VSZWZyZXNoTG9naW4/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMucmVidWlsZFdhdGNoUHJvbWlzZSAhPT0gbnVsbCAmJiB0aGlzLnJlYnVpbGRXYXRjaFByb21pc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVidWlsZFdhdGNoUHJvbWlzZVxuICAgIH1cblxuICAgIHRoaXMucmVidWlsZFdhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodGhpcy53YXRjaFN0YXR1cyA9PT0gV2F0Y2hTdGF0dXMuUEFVU0VEKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSByZWJ1aWxkV2F0Y2ggY2FuY2VsbGVkIG9uIHBhdXNlJylcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeyBlbnZJZCB9ID0gYXdhaXQgdGhpcy53c0xvZ2luKHRoaXMuZW52SWQsIGZvcmNlUmVmcmVzaExvZ2luKVxuXG4gICAgICAgICAgaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgcmVidWlsZFdhdGNoIHdpdGhvdXQgYSBzdWNjZXNzZnVsIGluaXRXYXRjaCAobGFjayBvZiBzZXNzaW9uSW5mbyknKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgodGhpcy53YXRjaFN0YXR1cyBhcyBXYXRjaFN0YXR1cykgPT09IFdhdGNoU3RhdHVzLlBBVVNFRCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tyZWFsdGltZV0gcmVidWlsZFdhdGNoIGNhbmNlbGxlZCBvbiBwYXVzZScpXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdhdGNoU3RhdHVzLlJFQlVJTERJTkdcblxuICAgICAgICAgIGNvbnN0IHJlYnVpbGRXYXRjaE1zZzogSVJlcXVlc3RNZXNzYWdlUmVidWlsZFdhdGNoTXNnID0ge1xuICAgICAgICAgICAgd2F0Y2hJZDogdGhpcy53YXRjaElkLFxuICAgICAgICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgICAgICAgIG1zZ1R5cGU6ICdSRUJVSUxEX1dBVENIJyxcbiAgICAgICAgICAgIG1zZ0RhdGE6IHtcbiAgICAgICAgICAgICAgZW52SWQsXG4gICAgICAgICAgICAgIGNvbGxOYW1lOiB0aGlzLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgICAgICBxdWVyeUlEOiB0aGlzLnNlc3Npb25JbmZvLnF1ZXJ5SUQsXG4gICAgICAgICAgICAgIGV2ZW50SUQ6IHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG5leHRFdmVudE1zZyA9IGF3YWl0IHRoaXMuc2VuZDxJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnPih7XG4gICAgICAgICAgICBtc2c6IHJlYnVpbGRXYXRjaE1zZyxcbiAgICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IGZhbHNlLFxuICAgICAgICAgICAgdGltZW91dDogREVGQVVMVF9SRUJVSUxEX1dBVENIX1RJTUVPVVQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHRoaXMuaGFuZGxlU2VydmVyRXZlbnRzKG5leHRFdmVudE1zZylcblxuICAgICAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXYXRjaFN0YXR1cy5BQ1RJVkVcbiAgICAgICAgICB0aGlzLmF2YWlsYWJsZVJldHJpZXMuUkVCVUlMRF9XQVRDSCA9IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1JcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlV2F0Y2hFc3RhYmxpc2htZW50RXJyb3IoZSwge1xuICAgICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ1JFQlVJTERfV0FUQ0gnLFxuICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgfSlcblxuICAgIGxldCBzdWNjZXNzID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJlYnVpbGRXYXRjaFByb21pc2VcbiAgICAgIHN1Y2Nlc3MgPSB0cnVlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucmVidWlsZFdhdGNoUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBbcmVhbHRpbWVdIHJlYnVpbGRXYXRjaCAke3N1Y2Nlc3MgPyAnc3VjY2VzcycgOiAnZmFpbCd9YClcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlV2F0Y2hFc3RhYmxpc2htZW50RXJyb3IgPSBhc3luYyAoXG4gICAgZTogYW55LFxuICAgIG9wdGlvbnM6IElIYW5kbGVXYXRjaEVzdGFibGlzaG1lbnRFcnJvck9wdGlvbnNcbiAgKSA9PiB7XG4gICAgY29uc3QgaXNJbml0V2F0Y2ggPSBvcHRpb25zLm9wZXJhdGlvbk5hbWUgPT09ICdJTklUX1dBVENIJ1xuXG4gICAgY29uc3QgYWJvcnRXYXRjaCA9ICgpID0+IHtcbiAgICAgIC8vIG1vY2sgdGVtcCBjb21tZW50XG4gICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgZXJyQ29kZTogaXNJbml0V2F0Y2hcbiAgICAgICAgICA/IChFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfSU5JVF9XQVRDSF9GQUlMIGFzIHN0cmluZylcbiAgICAgICAgICA6IChFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfUkVCVUlMRF9XQVRDSF9GQUlMIGFzIHN0cmluZyksXG4gICAgICAgIGVyck1zZzogZSxcbiAgICAgIH0pKVxuICAgICAgb3B0aW9ucy5yZWplY3QoZSlcbiAgICB9XG5cbiAgICBjb25zdCByZXRyeSA9IChyZWZyZXNoTG9naW4/OiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAodGhpcy51c2VSZXRyeVRpY2tldChvcHRpb25zLm9wZXJhdGlvbk5hbWUpKSB7XG4gICAgICAgIGlmIChpc0luaXRXYXRjaCkge1xuICAgICAgICAgIHRoaXMuaW5pdFdhdGNoUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgICAgIG9wdGlvbnMucmVzb2x2ZSh0aGlzLmluaXRXYXRjaChyZWZyZXNoTG9naW4pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVidWlsZFdhdGNoUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgICAgIG9wdGlvbnMucmVzb2x2ZSh0aGlzLnJlYnVpbGRXYXRjaChyZWZyZXNoTG9naW4pKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhYm9ydFdhdGNoKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZUNvbW1vbkVycm9yKGUsIHtcbiAgICAgIG9uU2lnbkVycm9yOiAoKSA9PiByZXRyeSh0cnVlKSxcbiAgICAgIG9uVGltZW91dEVycm9yOiAoKSA9PiByZXRyeShmYWxzZSksXG4gICAgICBvbk5vdFJldHJ5YWJsZUVycm9yOiBhYm9ydFdhdGNoLFxuICAgICAgb25DYW5jZWxsZWRFcnJvcjogb3B0aW9ucy5yZWplY3QsXG4gICAgICBvblVua25vd25FcnJvcjogKCkgPT4ge1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBvbldTRGlzY29ubmVjdGVkID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnBhdXNlKClcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vbmNlV1NDb25uZWN0ZWQoKVxuICAgICAgICAgICAgICByZXRyeSh0cnVlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNXU0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgIGF3YWl0IG9uV1NEaXNjb25uZWN0ZWQoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoREVGQVVMVF9XQUlUX1RJTUVfT05fVU5LTk9XTl9FUlJPUilcbiAgICAgICAgICAgICAgaWYgKHRoaXMud2F0Y2hTdGF0dXMgPT09IFdhdGNoU3RhdHVzLlBBVVNFRCkge1xuICAgICAgICAgICAgICAgIC8vIGNhbmNlbFxuICAgICAgICAgICAgICAgIG9wdGlvbnMucmVqZWN0KG5ldyBDYW5jZWxsZWRFcnJvcihgJHtvcHRpb25zLm9wZXJhdGlvbk5hbWV9IGNhbmNlbGxlZCBkdWUgdG8gcGF1c2UgYWZ0ZXIgdW5rbm93bkVycm9yYCkpXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNXU0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgb25XU0Rpc2Nvbm5lY3RlZCgpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0cnkoZmFsc2UpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB1bmV4cGVjdGVkIGVycm9yIHdoaWxlIGhhbmRsaW5nIGVycm9yLCBpbiBvcmRlciB0byBwcm92aWRlIG1heGltdW0gZWZmb3J0IG9uIFNFQU1JTkdMRVNTIEZBVUxUIFRPTEVSQU5DRSwganVzdCByZXRyeVxuICAgICAgICAgICAgcmV0cnkodHJ1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pKClcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgY2xvc2VXYXRjaCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBxdWVyeUlkID0gdGhpcy5zZXNzaW9uSW5mbyA/IHRoaXMuc2Vzc2lvbkluZm8ucXVlcnlJRCA6ICcnXG5cbiAgICBpZiAodGhpcy53YXRjaFN0YXR1cyAhPT0gV2F0Y2hTdGF0dXMuQUNUSVZFKSB7XG4gICAgICB0aGlzLndhdGNoU3RhdHVzID0gV2F0Y2hTdGF0dXMuQ0xPU0VEXG4gICAgICB0aGlzLm9uV2F0Y2hDbG9zZSh0aGlzLCBxdWVyeUlkKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXYXRjaFN0YXR1cy5DTE9TSU5HXG5cbiAgICAgIGNvbnN0IGNsb3NlV2F0Y2hNc2c6IElSZXF1ZXN0TWVzc2FnZUNsb3NlV2F0Y2hNc2cgPSB7XG4gICAgICAgIHdhdGNoSWQ6IHRoaXMud2F0Y2hJZCxcbiAgICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgICAgbXNnVHlwZTogJ0NMT1NFX1dBVENIJyxcbiAgICAgICAgbXNnRGF0YTogbnVsbCxcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgICAgbXNnOiBjbG9zZVdhdGNoTXNnLFxuICAgICAgfSlcblxuICAgICAgdGhpcy5zZXNzaW9uSW5mbyA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdhdGNoU3RhdHVzLkNMT1NFRFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfQ0xPU0VfV0FUQ0hfRkFJTCBhcyBzdHJpbmcsXG4gICAgICAgIGVyck1zZzogZSxcbiAgICAgIH0pKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLm9uV2F0Y2hDbG9zZSh0aGlzLCBxdWVyeUlkKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVTZW5kQUNLID0gKCkgPT4ge1xuICAgIHRoaXMuY2xlYXJBQ0tTY2hlZHVsZSgpXG5cbiAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2hlY2sgc3RhdHVzIGFmdGVyIHRpbWVvdXRcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5hY2tUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLndhaXRFeHBlY3RlZFRpbWVvdXRJZCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbmRBQ0soKVxuICAgICAgfVxuICAgIH0sIERFRkFVTFRfU0VORF9BQ0tfREVCT1VOQ0VfVElNRU9VVClcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJBQ0tTY2hlZHVsZSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5hY2tUaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmFja1RpbWVvdXRJZClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbmRBQ0sgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLndhdGNoU3RhdHVzICE9PSBXYXRjaFN0YXR1cy5BQ1RJVkUpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lIGxpc3RlbmVyXSBjYW4gbm90IHNlbmQgYWNrIHdpdGhvdXQgYSBzdWNjZXNzZnVsIGluaXRXYXRjaCAobGFjayBvZiBzZXNzaW9uSW5mbyknKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgYWNrTXNnOiBJUmVxdWVzdE1lc3NhZ2VDaGVja0xhc3RNc2cgPSB7XG4gICAgICAgIHdhdGNoSWQ6IHRoaXMud2F0Y2hJZCxcbiAgICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgICAgbXNnVHlwZTogJ0NIRUNLX0xBU1QnLFxuICAgICAgICBtc2dEYXRhOiB7XG4gICAgICAgICAgcXVlcnlJRDogdGhpcy5zZXNzaW9uSW5mby5xdWVyeUlELFxuICAgICAgICAgIGV2ZW50SUQ6IHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQsXG4gICAgICAgIH0sXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICAgIG1zZzogYWNrTXNnLFxuICAgICAgfSlcblxuICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFRPRE86IHJlZmFjdG9yXG4gICAgICBpZiAoaXNSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yKGUpKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGUucGF5bG9hZFxuICAgICAgICBzd2l0Y2ggKG1zZy5tc2dEYXRhLmNvZGUpIHtcbiAgICAgICAgICAvLyBzaWduYXR1cmUgZXJyb3IgLT4gcmV0cnkgd2l0aCByZWZyZXNoZWQgc2lnbmF0dXJlXG4gICAgICAgICAgY2FzZSAnQ0hFQ0tfTE9HSU5fRkFJTEVEJzpcbiAgICAgICAgICBjYXNlICdTSUdOX0VYUElSRURfRVJST1InOlxuICAgICAgICAgIGNhc2UgJ1NJR05fSU5WQUxJRF9FUlJPUic6XG4gICAgICAgICAgY2FzZSAnU0lHTl9QQVJBTV9JTlZBTElEJzoge1xuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkV2F0Y2goKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIG90aGVyIC0+IHRocm93XG4gICAgICAgICAgY2FzZSAnUVVFUllJRF9JTlZBTElEX0VSUk9SJzpcbiAgICAgICAgICBjYXNlICdTWVNfRVJSJzpcbiAgICAgICAgICBjYXNlICdJTlZBTElJRF9FTlYnOlxuICAgICAgICAgIGNhc2UgJ0NPTExFQ1RJT05fUEVSTUlTU0lPTl9ERU5JRUQnOiB7XG4gICAgICAgICAgICAvLyBtdXN0IHRocm93XG4gICAgICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX0NIRUNLX0xBU1RfRkFJTCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgIGVyck1zZzogbXNnLm1zZ0RhdGEuY29kZSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG1heWJlIHJldHJ5YWJsZVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmF2YWlsYWJsZVJldHJpZXMuQ0hFQ0tfTEFTVFxuICAgICAgICAmJiB0aGlzLmF2YWlsYWJsZVJldHJpZXMuQ0hFQ0tfTEFTVCA+IDBcbiAgICAgICkge1xuICAgICAgICB0aGlzLmF2YWlsYWJsZVJldHJpZXMuQ0hFQ0tfTEFTVCAtPSAxXG4gICAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9DSEVDS19MQVNUX0ZBSUwgYXMgc3RyaW5nLFxuICAgICAgICAgIGVyck1zZzogZSxcbiAgICAgICAgfSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDb21tb25FcnJvciA9IChcbiAgICBlOiBhbnksXG4gICAgb3B0aW9uczogSUhhbmRsZUNvbW1vbkVycm9yT3B0aW9uc1xuICApOiB2b2lkID0+IHtcbiAgICBpZiAoaXNSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yKGUpKSB7XG4gICAgICBjb25zdCBtc2cgPSBlLnBheWxvYWRcbiAgICAgIHN3aXRjaCAobXNnLm1zZ0RhdGEuY29kZSkge1xuICAgICAgICAvLyBzaWduYXR1cmUgZXJyb3IgLT4gcmV0cnkgd2l0aCByZWZyZXNoZWQgc2lnbmF0dXJlXG4gICAgICAgIGNhc2UgJ0NIRUNLX0xPR0lOX0ZBSUxFRCc6XG4gICAgICAgIGNhc2UgJ1NJR05fRVhQSVJFRF9FUlJPUic6XG4gICAgICAgIGNhc2UgJ1NJR05fSU5WQUxJRF9FUlJPUic6XG4gICAgICAgIGNhc2UgJ1NJR05fUEFSQU1fSU5WQUxJRCc6IHtcbiAgICAgICAgICBvcHRpb25zLm9uU2lnbkVycm9yKGUpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgLy8gbm90LXJldHJ5YWJsZSBlcnJvciAtPiB0aHJvd1xuICAgICAgICBjYXNlICdRVUVSWUlEX0lOVkFMSURfRVJST1InOlxuICAgICAgICBjYXNlICdTWVNfRVJSJzpcbiAgICAgICAgY2FzZSAnSU5WQUxJSURfRU5WJzpcbiAgICAgICAgY2FzZSAnQ09MTEVDVElPTl9QRVJNSVNTSU9OX0RFTklFRCc6IHtcbiAgICAgICAgICBvcHRpb25zLm9uTm90UmV0cnlhYmxlRXJyb3IoZSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgb3B0aW9ucy5vbk5vdFJldHJ5YWJsZUVycm9yKGUpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVGltZW91dEVycm9yKGUpKSB7XG4gICAgICAvLyB0aW1lb3V0IGVycm9yXG4gICAgICBvcHRpb25zLm9uVGltZW91dEVycm9yKGUpXG4gICAgICByZXR1cm5cbiAgICB9IGVsc2UgaWYgKGlzQ2FuY2VsbGVkRXJyb3IoZSkpIHtcbiAgICAgIC8vIGNhbmNlbGxlZCBlcnJvclxuICAgICAgb3B0aW9ucy5vbkNhbmNlbGxlZEVycm9yKGUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyB1bmtub3duIGVycm9yXG4gICAgb3B0aW9ucy5vblVua25vd25FcnJvcihlKVxuICB9XG5cbiAgLy8gY3JlZGl0IGEgcmV0cnkgY2hhbmNlIGZyb20gYXZhaWxhYmxlUmV0cmllc1xuICBwcml2YXRlIHVzZVJldHJ5VGlja2V0KG9wZXJhdGlvbk5hbWU6IElSZXF1ZXN0TXNnVHlwZSk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHRoaXMuYXZhaWxhYmxlUmV0cmllc1tvcGVyYXRpb25OYW1lXVxuICAgICAgJiYgdGhpcy5hdmFpbGFibGVSZXRyaWVzW29wZXJhdGlvbk5hbWVdISA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMuYXZhaWxhYmxlUmV0cmllc1tvcGVyYXRpb25OYW1lXSEgLT0gMVxuICAgICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gJHtvcGVyYXRpb25OYW1lfSB1c2UgYSByZXRyeSB0aWNrZXQsIG5vdyBvbmx5ICR7dGhpcy5hdmFpbGFibGVSZXRyaWVzW29wZXJhdGlvbk5hbWVdfSByZXRyeSBsZWZ0YClcblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlcnZlckV2ZW50cyhtc2c6IElSZXNwb25zZU1lc3NhZ2VJbml0RXZlbnRNc2cgfCBJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKClcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VydmVyRXZlbnRzSW50ZXJuZWwobXNnKVxuICAgICAgdGhpcy5wb3N0SGFuZGxlU2VydmVyRXZlbnRzVmFsaWRpdHlDaGVjayhtc2cpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gVE9ETzogcmVwb3J0XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IGhhbmRsZSBzZXJ2ZXIgZXZlbnRzIGZhaWxlZCB3aXRoIGVycm9yOiAnLFxuICAgICAgICBlXG4gICAgICApXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTZXJ2ZXJFdmVudHNJbnRlcm5lbChtc2c6IElSZXNwb25zZU1lc3NhZ2VJbml0RXZlbnRNc2cgfCBJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnKSB7XG4gICAgY29uc3QgeyByZXF1ZXN0SWQgfSA9IG1zZ1xuXG4gICAgY29uc3QgeyBldmVudHMgfSA9IG1zZy5tc2dEYXRhXG4gICAgY29uc3QgeyBtc2dUeXBlIH0gPSBtc2dcblxuICAgIGlmICghZXZlbnRzLmxlbmd0aCB8fCAhdGhpcy5zZXNzaW9uSW5mbykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgeyBzZXNzaW9uSW5mbyB9ID0gdGhpc1xuXG4gICAgbGV0IGFsbENoYW5nZUV2ZW50czogSVNpbmdsZURCRXZlbnRbXVxuICAgIHRyeSB7XG4gICAgICBhbGxDaGFuZ2VFdmVudHMgPSBldmVudHMubWFwKGdldFB1YmxpY0V2ZW50KVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfUkVDRUlWRV9JTlZBTElEX1NFUlZFUl9EQVRBIGFzIHN0cmluZyxcbiAgICAgICAgZXJyTXNnOiBlLFxuICAgICAgfSkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBhZ2dyZWdhdGUgZG9jc1xuICAgIGxldCBkb2NzID0gWy4uLnNlc3Npb25JbmZvLmN1cnJlbnREb2NzXVxuICAgIGxldCBpbml0RW5jb3VudGVyZWQgPSBmYWxzZVxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhbGxDaGFuZ2VFdmVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoYW5nZSA9IGFsbENoYW5nZUV2ZW50c1tpXVxuXG4gICAgICBpZiAoc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPj0gY2hhbmdlLmlkKSB7XG4gICAgICAgIGlmICghYWxsQ2hhbmdlRXZlbnRzW2kgLSAxXSB8fCBjaGFuZ2UuaWQgPiBhbGxDaGFuZ2VFdmVudHNbaSAtIDFdLmlkKSB7XG4gICAgICAgICAgLy8gZHVwbGljYXRlIGV2ZW50LCBkcm9wYWJsZVxuICAgICAgICAgIC8vIFRPRE86IHJlcG9ydFxuICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3JlYWx0aW1lXSBkdXBsaWNhdGUgZXZlbnQgcmVjZWl2ZWQsIGN1ciAke3Nlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkfSBidXQgZ290ICR7Y2hhbmdlLmlkfWApXG4gICAgICAgICAgLy8gfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGFsbENoYW5nZUV2ZW50cyBzaG91bGQgYmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byBldmVudElkLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW5zLCBtdXN0IHJlcG9ydCBhIG5vbi1mYXRhbCBlcnJvclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtyZWFsdGltZSBsaXN0ZW5lcl0gc2VydmVyIG5vbi1mYXRhbCBlcnJvcjogZXZlbnRzIG91dCBvZiBvcmRlciAodGhlIGxhdHRlciBldmVudCdzIGlkIGlzIHNtYWxsZXIgdGhhbiB0aGF0IG9mIHRoZSBmb3JtZXIpIChyZXF1ZXN0SWQgJHtyZXF1ZXN0SWR9KWApXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPT09IGNoYW5nZS5pZCAtIDEpIHtcbiAgICAgICAgLy8gY29ycmVjdCBzZXF1ZW5jZVxuICAgICAgICAvLyBmaXJzdCBoYW5kbGUgZGF0YVR5cGUgdGhlbiBxdWV1ZVR5cGU6XG4gICAgICAgIC8vIDEuIGRhdGFUeXBlOiB3ZSBPTkxZIHBvcHVsYXRlIGNoYW5nZS5kb2MgaWYgbmVjY2Vzc2FyeVxuICAgICAgICAvLyAyLiBxdWV1ZVR5cGU6IHdlIGJ1aWxkIHRoZSBkYXRhIHNuYXBzaG90XG5cbiAgICAgICAgc3dpdGNoIChjaGFuZ2UuZGF0YVR5cGUpIHtcbiAgICAgICAgICBjYXNlICd1cGRhdGUnOiB7XG4gICAgICAgICAgICAvLyBvbmx5IG5lZWQgdG8gcG9wdWxhdGUgY2hhbmdlLmRvYyB3aGVuIGl0IGlzIG5vdCBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKCFjaGFuZ2UuZG9jKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLnF1ZXVlVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVxdWV1ZSc6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsRG9jID0gZG9jcy5maW5kKGRvYyA9PiBkb2MuX2lkID09PSBjaGFuZ2UuZG9jSWQpXG4gICAgICAgICAgICAgICAgICBpZiAobG9jYWxEb2MpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBwYXJ0aWFsIHVwZGF0ZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkb2MgPSBjbG9uZURlZXAobG9jYWxEb2MpXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZS51cGRhdGVkRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY2hhbmdlLnVwZGF0ZWRGaWVsZHMpLmZvckVhY2goKGZpZWxkUGF0aCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0KGRvYywgZmllbGRQYXRoLCBjaGFuZ2UudXBkYXRlZEZpZWxkc1tmaWVsZFBhdGhdKVxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLnJlbW92ZWRGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkUGF0aCBvZiBjaGFuZ2UucmVtb3ZlZEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoZG9jLCBmaWVsZFBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlLmRvYyA9IGRvY1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyByZXBvcnRcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIHVwZGF0ZSBkYXRhVHlwZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4nKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZW5xdWV1ZSc6IHtcbiAgICAgICAgICAgICAgICAgIC8vIGRvYyBpcyBwcm92aWRlZCBieSBzZXJ2ZXIsIHRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyXG4gICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9VTkVYUEVDVEVEX0ZBVEFMX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiBgSGFuZGxlU2VydmVyRXZlbnRzOiBmdWxsIGRvYyBpcyBub3QgcHJvdmlkZWQgd2l0aCBkYXRhVHlwZT1cInVwZGF0ZVwiIGFuZCBxdWV1ZVR5cGU9XCJlbnF1ZXVlXCIgKHJlcXVlc3RJZCAke21zZy5yZXF1ZXN0SWR9KWAsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3JlcGxhY2UnOiB7XG4gICAgICAgICAgICAvLyB2YWxpZGF0aW9uXG4gICAgICAgICAgICBpZiAoIWNoYW5nZS5kb2MpIHtcbiAgICAgICAgICAgICAgLy8gZG9jIGlzIHByb3ZpZGVkIGJ5IHNlcnZlciwgdGhpcyBzaG91bGQgbmV2ZXIgb2NjdXJcbiAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9VTkVYUEVDVEVEX0ZBVEFMX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlcnJNc2c6IGBIYW5kbGVTZXJ2ZXJFdmVudHM6IGZ1bGwgZG9jIGlzIG5vdCBwcm92aWRlZCB3aXRoIGRhdGFUeXBlPVwicmVwbGFjZVwiIChyZXF1ZXN0SWQgJHttc2cucmVxdWVzdElkfSlgLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKGVycilcbiAgICAgICAgICAgICAgdGhyb3cgZXJyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdyZW1vdmUnOiB7XG4gICAgICAgICAgICBjb25zdCBkb2MgPSBkb2NzLmZpbmQoZG9jID0+IGRvYy5faWQgPT09IGNoYW5nZS5kb2NJZClcbiAgICAgICAgICAgIGlmIChkb2MpIHtcbiAgICAgICAgICAgICAgY2hhbmdlLmRvYyA9IGRvY1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVE9ETyByZXBvcnRcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIHJlbW92ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnbGltaXQnOiB7XG4gICAgICAgICAgICBpZiAoIWNoYW5nZS5kb2MpIHtcbiAgICAgICAgICAgICAgc3dpdGNoIChjaGFuZ2UucXVldWVUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVxdWV1ZSc6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRvYyA9IGRvY3MuZmluZChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKVxuICAgICAgICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuZG9jID0gZG9jXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgbGltaXQgZGF0YVR5cGUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJylcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2VucXVldWUnOiB7XG4gICAgICAgICAgICAgICAgICAvLyBkb2MgaXMgcHJvdmlkZWQgYnkgc2VydmVyLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1clxuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfVU5FWFBFQ1RFRF9GQVRBTF9FUlJPUiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogYEhhbmRsZVNlcnZlckV2ZW50czogZnVsbCBkb2MgaXMgbm90IHByb3ZpZGVkIHdpdGggZGF0YVR5cGU9XCJsaW1pdFwiIGFuZCBxdWV1ZVR5cGU9XCJlbnF1ZXVlXCIgKHJlcXVlc3RJZCAke21zZy5yZXF1ZXN0SWR9KWAsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChjaGFuZ2UucXVldWVUeXBlKSB7XG4gICAgICAgICAgY2FzZSAnaW5pdCc6IHtcbiAgICAgICAgICAgIGlmICghaW5pdEVuY291bnRlcmVkKSB7XG4gICAgICAgICAgICAgIGluaXRFbmNvdW50ZXJlZCA9IHRydWVcbiAgICAgICAgICAgICAgZG9jcyA9IFtjaGFuZ2UuZG9jXVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZG9jcy5wdXNoKGNoYW5nZS5kb2MpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdlbnF1ZXVlJzoge1xuICAgICAgICAgICAgZG9jcy5wdXNoKGNoYW5nZS5kb2MpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdkZXF1ZXVlJzoge1xuICAgICAgICAgICAgY29uc3QgaW5kID0gZG9jcy5maW5kSW5kZXgoZG9jID0+IGRvYy5faWQgPT09IGNoYW5nZS5kb2NJZClcbiAgICAgICAgICAgIGlmIChpbmQgPiAtMSkge1xuICAgICAgICAgICAgICBkb2NzLnNwbGljZShpbmQsIDEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPIHJlcG9ydFxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgZGVxdWV1ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAndXBkYXRlJzoge1xuICAgICAgICAgICAgY29uc3QgaW5kID0gZG9jcy5maW5kSW5kZXgoZG9jID0+IGRvYy5faWQgPT09IGNoYW5nZS5kb2NJZClcbiAgICAgICAgICAgIGlmIChpbmQgPiAtMSkge1xuICAgICAgICAgICAgICBkb2NzW2luZF0gPSBjaGFuZ2UuZG9jXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPIHJlcG9ydFxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgcXVldWVUeXBlIHVwZGF0ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgaSA9PT0gbGVuIC0gMVxuICAgICAgICAgIHx8IChhbGxDaGFuZ2VFdmVudHNbaSArIDFdICYmIGFsbENoYW5nZUV2ZW50c1tpICsgMV0uaWQgIT09IGNoYW5nZS5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gYSBzaGFsbG93IHNsaWNlIGNyZWF0ZXMgYSBzaGFsbG93IHNuYXBzaG90XG4gICAgICAgICAgY29uc3QgZG9jc1NuYXBzaG90ID0gWy4uLmRvY3NdXG5cbiAgICAgICAgICAvLyB3ZSBzbGljZSBmaXJzdCBjYXVzZScgaWYgdGhlcmUncmUgYWxsQ2hhbmdlRXZlbnRzIHRoYXQgYXJlIG9mIHRoZSBzYW1lIGlkIGFmdGVyIHRoaXMgY2hhbmdlLCB3ZSBkb24ndCB3YW50IHRvIGludm9sdmUgaXQgZm9yIGl0IGlzIHVuZXhwZWN0ZWQgaW52YWxpZCBvcmRlclxuICAgICAgICAgIGNvbnN0IGRvY0NoYW5nZXMgPSBhbGxDaGFuZ2VFdmVudHNcbiAgICAgICAgICAgIC5zbGljZSgwLCBpICsgMSlcbiAgICAgICAgICAgIC5maWx0ZXIoYyA9PiBjLmlkID09PSBjaGFuZ2UuaWQpXG5cbiAgICAgICAgICAvLyBhbGwgY2hhbmdlcyBvZiB0aGlzIGV2ZW50IGhhcyBiZWVuIGhhbmRsZSwgd2UgY291bGQgZGlzcGF0Y2ggdGhlIGV2ZW50IG5vd1xuICAgICAgICAgIHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPSBjaGFuZ2UuaWRcbiAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnREb2NzID0gZG9jc1xuXG4gICAgICAgICAgY29uc3Qgc25hcHNob3QgPSBuZXcgU25hcHNob3Qoe1xuICAgICAgICAgICAgaWQ6IGNoYW5nZS5pZCxcbiAgICAgICAgICAgIGRvY0NoYW5nZXMsXG4gICAgICAgICAgICBkb2NzOiBkb2NzU25hcHNob3QsXG4gICAgICAgICAgICBtc2dUeXBlLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9uQ2hhbmdlKHNuYXBzaG90KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvdXQtb2Ytb3JkZXIgZXZlbnRcbiAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgIC8vIFRPRE86IHJlcG9ydFxuICAgICAgICBjb25zb2xlLndhcm4oYFtyZWFsdGltZSBsaXN0ZW5lcl0gZXZlbnQgcmVjZWl2ZWQgaXMgb3V0IG9mIG9yZGVyLCBjdXIgJHt0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkfSBidXQgZ290ICR7Y2hhbmdlLmlkfWApXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gcmVidWlsZCB3YXRjaFxuICAgICAgICBhd2FpdCB0aGlzLnJlYnVpbGRXYXRjaCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcG9zdEhhbmRsZVNlcnZlckV2ZW50c1ZhbGlkaXR5Q2hlY2sobXNnOiBJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnIHwgSVJlc3BvbnNlTWVzc2FnZU5leHRFdmVudE1zZykge1xuICAgIGlmICghdGhpcy5zZXNzaW9uSW5mbykge1xuICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHNlc3Npb25JbmZvIGxvc3QgYWZ0ZXIgc2VydmVyIGV2ZW50IGhhbmRsaW5nLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1cicpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnNlc3Npb25JbmZvLmV4cGVjdEV2ZW50SWRcbiAgICAgICYmIHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPj0gdGhpcy5zZXNzaW9uSW5mby5leHBlY3RFdmVudElkXG4gICAgKSB7XG4gICAgICB0aGlzLmNsZWFyV2FpdEV4cGVjdGVkRXZlbnQoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkIDwgbXNnLm1zZ0RhdGEuY3VyckV2ZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiBjbGllbnQgZXZlbnRJZCBkb2VzIG5vdCBtYXRjaCB3aXRoIHNlcnZlciBldmVudCBpZCBhZnRlciBzZXJ2ZXIgZXZlbnQgaGFuZGxpbmcnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhcldhaXRFeHBlY3RlZEV2ZW50KCkge1xuICAgIGlmICh0aGlzLndhaXRFeHBlY3RlZFRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2FpdEV4cGVjdGVkVGltZW91dElkKVxuICAgICAgdGhpcy53YWl0RXhwZWN0ZWRUaW1lb3V0SWQgPSB1bmRlZmluZWRcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHVibGljRXZlbnQoZXZlbnQ6IElEQkV2ZW50KTogSVNpbmdsZURCRXZlbnQge1xuICBjb25zdCBlOiBJU2luZ2xlREJFdmVudCA9IHtcbiAgICBpZDogZXZlbnQuSUQsXG4gICAgZGF0YVR5cGU6IGV2ZW50LkRhdGFUeXBlLFxuICAgIHF1ZXVlVHlwZTogZXZlbnQuUXVldWVUeXBlLFxuICAgIGRvY0lkOiBldmVudC5Eb2NJRCxcbiAgICBkb2M6IGV2ZW50LkRvYyAmJiBldmVudC5Eb2MgIT09ICd7fScgPyBKU09OLnBhcnNlKGV2ZW50LkRvYykgOiB1bmRlZmluZWQsXG4gIH1cblxuICBpZiAoZXZlbnQuRGF0YVR5cGUgPT09ICd1cGRhdGUnKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChldmVudC5VcGRhdGVkRmllbGRzKSB7XG4gICAgICBlLnVwZGF0ZWRGaWVsZHMgPSBKU09OLnBhcnNlKGV2ZW50LlVwZGF0ZWRGaWVsZHMpXG4gICAgfVxuICAgIC8vIFRPRE86IHdhaXQgZm9yIHRjYiB0byBjaGFuZ2UgcmVtb3ZlZEZpZWxkcyB0byBSZW1vdmVkRmllbGRzXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChldmVudC5yZW1vdmVkRmllbGRzIHx8IGV2ZW50LlJlbW92ZWRGaWVsZHMpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIC8vIGUucmVtb3ZlZEZpZWxkcyA9IGV2ZW50LnJlbW92ZWRGaWVsZHNcbiAgICAgIC8vICAgPyBKU09OLnBhcnNlKGV2ZW50LnJlbW92ZWRGaWVsZHMpXG4gICAgICAvLyAgIDogSlNPTi5wYXJzZShldmVudC5SZW1vdmVkRmllbGRzKVxuICAgICAgZS5yZW1vdmVkRmllbGRzID0gSlNPTi5wYXJzZShldmVudC5yZW1vdmVkRmllbGRzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlXG59XG4iXX0=