parse-server 2.8.4 → 8.6.2

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 (240) hide show
  1. package/LICENSE +167 -25
  2. package/NOTICE +10 -0
  3. package/README.md +929 -278
  4. package/lib/AccountLockout.js +47 -30
  5. package/lib/Adapters/AdapterLoader.js +21 -6
  6. package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
  7. package/lib/Adapters/Auth/AuthAdapter.js +116 -13
  8. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
  9. package/lib/Adapters/Auth/OAuth1Client.js +27 -46
  10. package/lib/Adapters/Auth/apple.js +123 -0
  11. package/lib/Adapters/Auth/facebook.js +162 -35
  12. package/lib/Adapters/Auth/gcenter.js +217 -0
  13. package/lib/Adapters/Auth/github.js +118 -48
  14. package/lib/Adapters/Auth/google.js +160 -51
  15. package/lib/Adapters/Auth/gpgames.js +125 -0
  16. package/lib/Adapters/Auth/httpsRequest.js +6 -7
  17. package/lib/Adapters/Auth/index.js +170 -62
  18. package/lib/Adapters/Auth/instagram.js +114 -40
  19. package/lib/Adapters/Auth/janraincapture.js +52 -23
  20. package/lib/Adapters/Auth/janrainengage.js +19 -36
  21. package/lib/Adapters/Auth/keycloak.js +148 -0
  22. package/lib/Adapters/Auth/ldap.js +167 -0
  23. package/lib/Adapters/Auth/line.js +125 -0
  24. package/lib/Adapters/Auth/linkedin.js +111 -55
  25. package/lib/Adapters/Auth/meetup.js +24 -34
  26. package/lib/Adapters/Auth/mfa.js +324 -0
  27. package/lib/Adapters/Auth/microsoft.js +111 -0
  28. package/lib/Adapters/Auth/oauth2.js +97 -162
  29. package/lib/Adapters/Auth/phantauth.js +53 -0
  30. package/lib/Adapters/Auth/qq.js +108 -49
  31. package/lib/Adapters/Auth/spotify.js +107 -55
  32. package/lib/Adapters/Auth/twitter.js +188 -48
  33. package/lib/Adapters/Auth/utils.js +28 -0
  34. package/lib/Adapters/Auth/vkontakte.js +26 -39
  35. package/lib/Adapters/Auth/wechat.js +106 -44
  36. package/lib/Adapters/Auth/weibo.js +132 -58
  37. package/lib/Adapters/Cache/CacheAdapter.js +13 -8
  38. package/lib/Adapters/Cache/InMemoryCache.js +3 -13
  39. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
  40. package/lib/Adapters/Cache/LRUCache.js +13 -27
  41. package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
  42. package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
  43. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  44. package/lib/Adapters/Email/MailAdapter.js +10 -8
  45. package/lib/Adapters/Files/FilesAdapter.js +83 -25
  46. package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
  47. package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
  48. package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
  49. package/lib/Adapters/Logger/WinstonLogger.js +69 -88
  50. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
  51. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
  52. package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
  53. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  54. package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
  55. package/lib/Adapters/Push/PushAdapter.js +14 -7
  56. package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
  57. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
  58. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
  59. package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
  60. package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
  61. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
  62. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
  63. package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
  64. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  65. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  66. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  67. package/lib/Auth.js +488 -125
  68. package/lib/ClientSDK.js +2 -6
  69. package/lib/Config.js +525 -94
  70. package/lib/Controllers/AdaptableController.js +5 -25
  71. package/lib/Controllers/AnalyticsController.js +22 -23
  72. package/lib/Controllers/CacheController.js +10 -31
  73. package/lib/Controllers/DatabaseController.js +767 -313
  74. package/lib/Controllers/FilesController.js +49 -54
  75. package/lib/Controllers/HooksController.js +80 -84
  76. package/lib/Controllers/LiveQueryController.js +35 -22
  77. package/lib/Controllers/LoggerController.js +22 -58
  78. package/lib/Controllers/ParseGraphQLController.js +293 -0
  79. package/lib/Controllers/PushController.js +58 -49
  80. package/lib/Controllers/SchemaController.js +916 -422
  81. package/lib/Controllers/UserController.js +265 -180
  82. package/lib/Controllers/index.js +90 -125
  83. package/lib/Controllers/types.js +1 -1
  84. package/lib/Deprecator/Deprecations.js +30 -0
  85. package/lib/Deprecator/Deprecator.js +127 -0
  86. package/lib/Error.js +48 -0
  87. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  88. package/lib/GraphQL/ParseGraphQLServer.js +214 -0
  89. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  90. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  91. package/lib/GraphQL/loaders/configMutations.js +87 -0
  92. package/lib/GraphQL/loaders/configQueries.js +79 -0
  93. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  94. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  95. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
  96. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  97. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  98. package/lib/GraphQL/loaders/functionsMutations.js +78 -0
  99. package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
  100. package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
  101. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  102. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  103. package/lib/GraphQL/loaders/schemaMutations.js +162 -0
  104. package/lib/GraphQL/loaders/schemaQueries.js +81 -0
  105. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  106. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  107. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  108. package/lib/GraphQL/parseGraphQLUtils.js +63 -0
  109. package/lib/GraphQL/transformers/className.js +14 -0
  110. package/lib/GraphQL/transformers/constraintType.js +53 -0
  111. package/lib/GraphQL/transformers/inputType.js +51 -0
  112. package/lib/GraphQL/transformers/mutation.js +274 -0
  113. package/lib/GraphQL/transformers/outputType.js +51 -0
  114. package/lib/GraphQL/transformers/query.js +237 -0
  115. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  116. package/lib/KeyPromiseQueue.js +48 -0
  117. package/lib/LiveQuery/Client.js +25 -33
  118. package/lib/LiveQuery/Id.js +2 -5
  119. package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
  120. package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
  121. package/lib/LiveQuery/ParsePubSub.js +7 -16
  122. package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
  123. package/lib/LiveQuery/QueryTools.js +76 -15
  124. package/lib/LiveQuery/RequestSchema.js +111 -97
  125. package/lib/LiveQuery/SessionTokenCache.js +23 -36
  126. package/lib/LiveQuery/Subscription.js +8 -17
  127. package/lib/LiveQuery/equalObjects.js +2 -3
  128. package/lib/Options/Definitions.js +1355 -382
  129. package/lib/Options/docs.js +301 -62
  130. package/lib/Options/index.js +11 -1
  131. package/lib/Options/parsers.js +14 -10
  132. package/lib/Page.js +44 -0
  133. package/lib/ParseMessageQueue.js +6 -13
  134. package/lib/ParseServer.js +474 -235
  135. package/lib/ParseServerRESTController.js +102 -40
  136. package/lib/PromiseRouter.js +39 -50
  137. package/lib/Push/PushQueue.js +24 -30
  138. package/lib/Push/PushWorker.js +32 -56
  139. package/lib/Push/utils.js +22 -35
  140. package/lib/RestQuery.js +361 -139
  141. package/lib/RestWrite.js +713 -344
  142. package/lib/Routers/AggregateRouter.js +97 -71
  143. package/lib/Routers/AnalyticsRouter.js +8 -14
  144. package/lib/Routers/AudiencesRouter.js +16 -35
  145. package/lib/Routers/ClassesRouter.js +86 -72
  146. package/lib/Routers/CloudCodeRouter.js +28 -37
  147. package/lib/Routers/FeaturesRouter.js +22 -25
  148. package/lib/Routers/FilesRouter.js +266 -171
  149. package/lib/Routers/FunctionsRouter.js +87 -103
  150. package/lib/Routers/GlobalConfigRouter.js +94 -33
  151. package/lib/Routers/GraphQLRouter.js +41 -0
  152. package/lib/Routers/HooksRouter.js +43 -47
  153. package/lib/Routers/IAPValidationRouter.js +57 -70
  154. package/lib/Routers/InstallationsRouter.js +17 -25
  155. package/lib/Routers/LogsRouter.js +10 -25
  156. package/lib/Routers/PagesRouter.js +647 -0
  157. package/lib/Routers/PublicAPIRouter.js +104 -112
  158. package/lib/Routers/PurgeRouter.js +19 -29
  159. package/lib/Routers/PushRouter.js +14 -28
  160. package/lib/Routers/RolesRouter.js +7 -14
  161. package/lib/Routers/SchemasRouter.js +63 -42
  162. package/lib/Routers/SecurityRouter.js +34 -0
  163. package/lib/Routers/SessionsRouter.js +25 -38
  164. package/lib/Routers/UsersRouter.js +463 -190
  165. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  166. package/lib/SchemaMigrations/Migrations.js +30 -0
  167. package/lib/Security/Check.js +109 -0
  168. package/lib/Security/CheckGroup.js +44 -0
  169. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  170. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
  171. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  172. package/lib/Security/CheckRunner.js +213 -0
  173. package/lib/SharedRest.js +29 -0
  174. package/lib/StatusHandler.js +96 -93
  175. package/lib/TestUtils.js +70 -14
  176. package/lib/Utils.js +468 -0
  177. package/lib/batch.js +74 -40
  178. package/lib/cache.js +8 -8
  179. package/lib/cli/definitions/parse-live-query-server.js +4 -3
  180. package/lib/cli/definitions/parse-server.js +4 -3
  181. package/lib/cli/parse-live-query-server.js +9 -17
  182. package/lib/cli/parse-server.js +49 -47
  183. package/lib/cli/utils/commander.js +20 -29
  184. package/lib/cli/utils/runner.js +31 -32
  185. package/lib/cloud-code/Parse.Cloud.js +711 -36
  186. package/lib/cloud-code/Parse.Server.js +21 -0
  187. package/lib/cryptoUtils.js +6 -11
  188. package/lib/defaults.js +21 -15
  189. package/lib/deprecated.js +1 -1
  190. package/lib/index.js +78 -67
  191. package/lib/logger.js +12 -20
  192. package/lib/middlewares.js +484 -160
  193. package/lib/password.js +10 -6
  194. package/lib/request.js +175 -0
  195. package/lib/requiredParameter.js +4 -3
  196. package/lib/rest.js +157 -82
  197. package/lib/triggers.js +627 -185
  198. package/lib/vendor/README.md +3 -3
  199. package/lib/vendor/mongodbUrl.js +224 -137
  200. package/package.json +135 -57
  201. package/postinstall.js +38 -50
  202. package/public_html/invalid_verification_link.html +3 -3
  203. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  204. package/types/@types/deepcopy/index.d.ts +5 -0
  205. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  206. package/types/Options/index.d.ts +301 -0
  207. package/types/ParseServer.d.ts +65 -0
  208. package/types/eslint.config.mjs +30 -0
  209. package/types/index.d.ts +21 -0
  210. package/types/logger.d.ts +2 -0
  211. package/types/tests.ts +44 -0
  212. package/types/tsconfig.json +24 -0
  213. package/CHANGELOG.md +0 -1246
  214. package/PATENTS +0 -37
  215. package/bin/dev +0 -37
  216. package/lib/.DS_Store +0 -0
  217. package/lib/Adapters/Auth/common.js +0 -2
  218. package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
  219. package/lib/Controllers/SchemaCache.js +0 -97
  220. package/lib/LiveQuery/.DS_Store +0 -0
  221. package/lib/cli/utils/parsers.js +0 -77
  222. package/lib/cloud-code/.DS_Store +0 -0
  223. package/lib/cloud-code/HTTPResponse.js +0 -57
  224. package/lib/cloud-code/Untitled-1 +0 -123
  225. package/lib/cloud-code/httpRequest.js +0 -102
  226. package/lib/cloud-code/team.html +0 -123
  227. package/lib/graphql/ParseClass.js +0 -234
  228. package/lib/graphql/Schema.js +0 -197
  229. package/lib/graphql/index.js +0 -1
  230. package/lib/graphql/types/ACL.js +0 -35
  231. package/lib/graphql/types/Date.js +0 -25
  232. package/lib/graphql/types/File.js +0 -24
  233. package/lib/graphql/types/GeoPoint.js +0 -35
  234. package/lib/graphql/types/JSONObject.js +0 -30
  235. package/lib/graphql/types/NumberInput.js +0 -43
  236. package/lib/graphql/types/NumberQuery.js +0 -42
  237. package/lib/graphql/types/Pointer.js +0 -35
  238. package/lib/graphql/types/QueryConstraint.js +0 -61
  239. package/lib/graphql/types/StringQuery.js +0 -39
  240. package/lib/graphql/types/index.js +0 -110
@@ -1,23 +1,17 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.ParsePubSub = undefined;
7
-
8
- var _AdapterLoader = require('../Adapters/AdapterLoader');
9
-
10
- var _EventEmitterPubSub = require('../Adapters/PubSub/EventEmitterPubSub');
11
-
12
- var _RedisPubSub = require('../Adapters/PubSub/RedisPubSub');
13
-
14
- const ParsePubSub = {};
15
-
6
+ exports.ParsePubSub = void 0;
7
+ var _AdapterLoader = require("../Adapters/AdapterLoader");
8
+ var _EventEmitterPubSub = require("../Adapters/PubSub/EventEmitterPubSub");
9
+ var _RedisPubSub = require("../Adapters/PubSub/RedisPubSub");
10
+ const ParsePubSub = exports.ParsePubSub = {};
16
11
  function useRedis(config) {
17
12
  const redisURL = config.redisURL;
18
13
  return typeof redisURL !== 'undefined' && redisURL !== '';
19
14
  }
20
-
21
15
  ParsePubSub.createPublisher = function (config) {
22
16
  if (useRedis(config)) {
23
17
  return _RedisPubSub.RedisPubSub.createPublisher(config);
@@ -29,7 +23,6 @@ ParsePubSub.createPublisher = function (config) {
29
23
  return adapter.createPublisher(config);
30
24
  }
31
25
  };
32
-
33
26
  ParsePubSub.createSubscriber = function (config) {
34
27
  if (useRedis(config)) {
35
28
  return _RedisPubSub.RedisPubSub.createSubscriber(config);
@@ -41,6 +34,4 @@ ParsePubSub.createSubscriber = function (config) {
41
34
  return adapter.createSubscriber(config);
42
35
  }
43
36
  };
44
-
45
- exports.ParsePubSub = ParsePubSub;
46
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9MaXZlUXVlcnkvUGFyc2VQdWJTdWIuanMiXSwibmFtZXMiOlsiUGFyc2VQdWJTdWIiLCJ1c2VSZWRpcyIsImNvbmZpZyIsInJlZGlzVVJMIiwiY3JlYXRlUHVibGlzaGVyIiwiUmVkaXNQdWJTdWIiLCJhZGFwdGVyIiwicHViU3ViQWRhcHRlciIsIkV2ZW50RW1pdHRlclB1YlN1YiIsImNyZWF0ZVN1YnNjcmliZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFJQTs7QUFJQSxNQUFNQSxjQUFjLEVBQXBCOztBQUVBLFNBQVNDLFFBQVQsQ0FBa0JDLE1BQWxCLEVBQXdDO0FBQ3RDLFFBQU1DLFdBQVdELE9BQU9DLFFBQXhCO0FBQ0EsU0FBTyxPQUFPQSxRQUFQLEtBQW9CLFdBQXBCLElBQW1DQSxhQUFhLEVBQXZEO0FBQ0Q7O0FBRURILFlBQVlJLGVBQVosR0FBOEIsVUFBU0YsTUFBVCxFQUEyQjtBQUN2RCxNQUFJRCxTQUFTQyxNQUFULENBQUosRUFBc0I7QUFDcEIsV0FBT0cseUJBQVlELGVBQVosQ0FBNEJGLE1BQTVCLENBQVA7QUFDRCxHQUZELE1BRU87QUFDTCxVQUFNSSxVQUFVLGdDQUFZSixPQUFPSyxhQUFuQixFQUFrQ0Msc0NBQWxDLEVBQXNETixNQUF0RCxDQUFoQjtBQUNBLFFBQUksT0FBT0ksUUFBUUYsZUFBZixLQUFtQyxVQUF2QyxFQUFtRDtBQUNqRCxZQUFNLDZDQUFOO0FBQ0Q7QUFDRCxXQUFPRSxRQUFRRixlQUFSLENBQXdCRixNQUF4QixDQUFQO0FBQ0Q7QUFDRixDQVZEOztBQVlBRixZQUFZUyxnQkFBWixHQUErQixVQUFTUCxNQUFULEVBQTRCO0FBQ3pELE1BQUlELFNBQVNDLE1BQVQsQ0FBSixFQUFzQjtBQUNwQixXQUFPRyx5QkFBWUksZ0JBQVosQ0FBNkJQLE1BQTdCLENBQVA7QUFDRCxHQUZELE1BRU87QUFDTCxVQUFNSSxVQUFVLGdDQUFZSixPQUFPSyxhQUFuQixFQUFrQ0Msc0NBQWxDLEVBQXNETixNQUF0RCxDQUFoQjtBQUNBLFFBQUksT0FBT0ksUUFBUUcsZ0JBQWYsS0FBb0MsVUFBeEMsRUFBb0Q7QUFDbEQsWUFBTSw4Q0FBTjtBQUNEO0FBQ0QsV0FBT0gsUUFBUUcsZ0JBQVIsQ0FBeUJQLE1BQXpCLENBQVA7QUFDRDtBQUNGLENBVkQ7O1FBYUVGLFcsR0FBQUEsVyIsImZpbGUiOiJQYXJzZVB1YlN1Yi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvYWRBZGFwdGVyIH0gZnJvbSAnLi4vQWRhcHRlcnMvQWRhcHRlckxvYWRlcic7XG5pbXBvcnQge1xuICBFdmVudEVtaXR0ZXJQdWJTdWJcbn0gZnJvbSAnLi4vQWRhcHRlcnMvUHViU3ViL0V2ZW50RW1pdHRlclB1YlN1Yic7XG5cbmltcG9ydCB7XG4gIFJlZGlzUHViU3ViXG59IGZyb20gJy4uL0FkYXB0ZXJzL1B1YlN1Yi9SZWRpc1B1YlN1Yic7XG5cbmNvbnN0IFBhcnNlUHViU3ViID0ge307XG5cbmZ1bmN0aW9uIHVzZVJlZGlzKGNvbmZpZzogYW55KTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlZGlzVVJMID0gY29uZmlnLnJlZGlzVVJMO1xuICByZXR1cm4gdHlwZW9mIHJlZGlzVVJMICE9PSAndW5kZWZpbmVkJyAmJiByZWRpc1VSTCAhPT0gJyc7XG59XG5cblBhcnNlUHViU3ViLmNyZWF0ZVB1Ymxpc2hlciA9IGZ1bmN0aW9uKGNvbmZpZzogYW55KTogYW55IHtcbiAgaWYgKHVzZVJlZGlzKGNvbmZpZykpIHtcbiAgICByZXR1cm4gUmVkaXNQdWJTdWIuY3JlYXRlUHVibGlzaGVyKGNvbmZpZyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYWRhcHRlciA9IGxvYWRBZGFwdGVyKGNvbmZpZy5wdWJTdWJBZGFwdGVyLCBFdmVudEVtaXR0ZXJQdWJTdWIsIGNvbmZpZylcbiAgICBpZiAodHlwZW9mIGFkYXB0ZXIuY3JlYXRlUHVibGlzaGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyAncHViU3ViQWRhcHRlciBzaG91bGQgaGF2ZSBjcmVhdGVQdWJsaXNoZXIoKSc7XG4gICAgfVxuICAgIHJldHVybiBhZGFwdGVyLmNyZWF0ZVB1Ymxpc2hlcihjb25maWcpO1xuICB9XG59XG5cblBhcnNlUHViU3ViLmNyZWF0ZVN1YnNjcmliZXIgPSBmdW5jdGlvbihjb25maWc6IGFueSk6IHZvaWQge1xuICBpZiAodXNlUmVkaXMoY29uZmlnKSkge1xuICAgIHJldHVybiBSZWRpc1B1YlN1Yi5jcmVhdGVTdWJzY3JpYmVyKGNvbmZpZyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYWRhcHRlciA9IGxvYWRBZGFwdGVyKGNvbmZpZy5wdWJTdWJBZGFwdGVyLCBFdmVudEVtaXR0ZXJQdWJTdWIsIGNvbmZpZylcbiAgICBpZiAodHlwZW9mIGFkYXB0ZXIuY3JlYXRlU3Vic2NyaWJlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgJ3B1YlN1YkFkYXB0ZXIgc2hvdWxkIGhhdmUgY3JlYXRlU3Vic2NyaWJlcigpJztcbiAgICB9XG4gICAgcmV0dXJuIGFkYXB0ZXIuY3JlYXRlU3Vic2NyaWJlcihjb25maWcpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFBhcnNlUHViU3ViXG59XG4iXX0=
37
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQWRhcHRlckxvYWRlciIsInJlcXVpcmUiLCJfRXZlbnRFbWl0dGVyUHViU3ViIiwiX1JlZGlzUHViU3ViIiwiUGFyc2VQdWJTdWIiLCJleHBvcnRzIiwidXNlUmVkaXMiLCJjb25maWciLCJyZWRpc1VSTCIsImNyZWF0ZVB1Ymxpc2hlciIsIlJlZGlzUHViU3ViIiwiYWRhcHRlciIsImxvYWRBZGFwdGVyIiwicHViU3ViQWRhcHRlciIsIkV2ZW50RW1pdHRlclB1YlN1YiIsImNyZWF0ZVN1YnNjcmliZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvTGl2ZVF1ZXJ5L1BhcnNlUHViU3ViLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvYWRBZGFwdGVyIH0gZnJvbSAnLi4vQWRhcHRlcnMvQWRhcHRlckxvYWRlcic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXJQdWJTdWIgfSBmcm9tICcuLi9BZGFwdGVycy9QdWJTdWIvRXZlbnRFbWl0dGVyUHViU3ViJztcblxuaW1wb3J0IHsgUmVkaXNQdWJTdWIgfSBmcm9tICcuLi9BZGFwdGVycy9QdWJTdWIvUmVkaXNQdWJTdWInO1xuXG5jb25zdCBQYXJzZVB1YlN1YiA9IHt9O1xuXG5mdW5jdGlvbiB1c2VSZWRpcyhjb25maWc6IGFueSk6IGJvb2xlYW4ge1xuICBjb25zdCByZWRpc1VSTCA9IGNvbmZpZy5yZWRpc1VSTDtcbiAgcmV0dXJuIHR5cGVvZiByZWRpc1VSTCAhPT0gJ3VuZGVmaW5lZCcgJiYgcmVkaXNVUkwgIT09ICcnO1xufVxuXG5QYXJzZVB1YlN1Yi5jcmVhdGVQdWJsaXNoZXIgPSBmdW5jdGlvbiAoY29uZmlnOiBhbnkpOiBhbnkge1xuICBpZiAodXNlUmVkaXMoY29uZmlnKSkge1xuICAgIHJldHVybiBSZWRpc1B1YlN1Yi5jcmVhdGVQdWJsaXNoZXIoY29uZmlnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhZGFwdGVyID0gbG9hZEFkYXB0ZXIoY29uZmlnLnB1YlN1YkFkYXB0ZXIsIEV2ZW50RW1pdHRlclB1YlN1YiwgY29uZmlnKTtcbiAgICBpZiAodHlwZW9mIGFkYXB0ZXIuY3JlYXRlUHVibGlzaGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyAncHViU3ViQWRhcHRlciBzaG91bGQgaGF2ZSBjcmVhdGVQdWJsaXNoZXIoKSc7XG4gICAgfVxuICAgIHJldHVybiBhZGFwdGVyLmNyZWF0ZVB1Ymxpc2hlcihjb25maWcpO1xuICB9XG59O1xuXG5QYXJzZVB1YlN1Yi5jcmVhdGVTdWJzY3JpYmVyID0gZnVuY3Rpb24gKGNvbmZpZzogYW55KTogdm9pZCB7XG4gIGlmICh1c2VSZWRpcyhjb25maWcpKSB7XG4gICAgcmV0dXJuIFJlZGlzUHViU3ViLmNyZWF0ZVN1YnNjcmliZXIoY29uZmlnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBhZGFwdGVyID0gbG9hZEFkYXB0ZXIoY29uZmlnLnB1YlN1YkFkYXB0ZXIsIEV2ZW50RW1pdHRlclB1YlN1YiwgY29uZmlnKTtcbiAgICBpZiAodHlwZW9mIGFkYXB0ZXIuY3JlYXRlU3Vic2NyaWJlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgJ3B1YlN1YkFkYXB0ZXIgc2hvdWxkIGhhdmUgY3JlYXRlU3Vic2NyaWJlcigpJztcbiAgICB9XG4gICAgcmV0dXJuIGFkYXB0ZXIuY3JlYXRlU3Vic2NyaWJlcihjb25maWcpO1xuICB9XG59O1xuXG5leHBvcnQgeyBQYXJzZVB1YlN1YiB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxjQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxtQkFBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsWUFBQSxHQUFBRixPQUFBO0FBRUEsTUFBTUcsV0FBVyxHQUFBQyxPQUFBLENBQUFELFdBQUEsR0FBRyxDQUFDLENBQUM7QUFFdEIsU0FBU0UsUUFBUUEsQ0FBQ0MsTUFBVyxFQUFXO0VBQ3RDLE1BQU1DLFFBQVEsR0FBR0QsTUFBTSxDQUFDQyxRQUFRO0VBQ2hDLE9BQU8sT0FBT0EsUUFBUSxLQUFLLFdBQVcsSUFBSUEsUUFBUSxLQUFLLEVBQUU7QUFDM0Q7QUFFQUosV0FBVyxDQUFDSyxlQUFlLEdBQUcsVUFBVUYsTUFBVyxFQUFPO0VBQ3hELElBQUlELFFBQVEsQ0FBQ0MsTUFBTSxDQUFDLEVBQUU7SUFDcEIsT0FBT0csd0JBQVcsQ0FBQ0QsZUFBZSxDQUFDRixNQUFNLENBQUM7RUFDNUMsQ0FBQyxNQUFNO0lBQ0wsTUFBTUksT0FBTyxHQUFHLElBQUFDLDBCQUFXLEVBQUNMLE1BQU0sQ0FBQ00sYUFBYSxFQUFFQyxzQ0FBa0IsRUFBRVAsTUFBTSxDQUFDO0lBQzdFLElBQUksT0FBT0ksT0FBTyxDQUFDRixlQUFlLEtBQUssVUFBVSxFQUFFO01BQ2pELE1BQU0sNkNBQTZDO0lBQ3JEO0lBQ0EsT0FBT0UsT0FBTyxDQUFDRixlQUFlLENBQUNGLE1BQU0sQ0FBQztFQUN4QztBQUNGLENBQUM7QUFFREgsV0FBVyxDQUFDVyxnQkFBZ0IsR0FBRyxVQUFVUixNQUFXLEVBQVE7RUFDMUQsSUFBSUQsUUFBUSxDQUFDQyxNQUFNLENBQUMsRUFBRTtJQUNwQixPQUFPRyx3QkFBVyxDQUFDSyxnQkFBZ0IsQ0FBQ1IsTUFBTSxDQUFDO0VBQzdDLENBQUMsTUFBTTtJQUNMLE1BQU1JLE9BQU8sR0FBRyxJQUFBQywwQkFBVyxFQUFDTCxNQUFNLENBQUNNLGFBQWEsRUFBRUMsc0NBQWtCLEVBQUVQLE1BQU0sQ0FBQztJQUM3RSxJQUFJLE9BQU9JLE9BQU8sQ0FBQ0ksZ0JBQWdCLEtBQUssVUFBVSxFQUFFO01BQ2xELE1BQU0sOENBQThDO0lBQ3REO0lBQ0EsT0FBT0osT0FBTyxDQUFDSSxnQkFBZ0IsQ0FBQ1IsTUFBTSxDQUFDO0VBQ3pDO0FBQ0YsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,63 +1,66 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.ParseWebSocket = exports.ParseWebSocketServer = undefined;
7
-
8
- var _logger = require('../logger');
9
-
10
- var _logger2 = _interopRequireDefault(_logger);
11
-
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
- const typeMap = new Map([['disconnect', 'close']]);
15
- const getWS = function () {
16
- try {
17
- return require('uws');
18
- } catch (e) {
19
- return require('ws');
20
- }
21
- };
22
-
6
+ exports.ParseWebSocketServer = exports.ParseWebSocket = void 0;
7
+ var _AdapterLoader = require("../Adapters/AdapterLoader");
8
+ var _WSAdapter = require("../Adapters/WebSocketServer/WSAdapter");
9
+ var _logger = _interopRequireDefault(require("../logger"));
10
+ var _events = _interopRequireDefault(require("events"));
11
+ var _util = require("util");
12
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
13
  class ParseWebSocketServer {
24
-
25
- constructor(server, onConnect, websocketTimeout = 10 * 1000) {
26
- const WebSocketServer = getWS().Server;
27
- const wss = new WebSocketServer({ server: server });
28
- wss.on('listening', () => {
29
- _logger2.default.info('Parse LiveQuery Server starts running');
30
- });
31
- wss.on('connection', ws => {
14
+ constructor(server, onConnect, config) {
15
+ config.server = server;
16
+ const wss = (0, _AdapterLoader.loadAdapter)(config.wssAdapter, _WSAdapter.WSAdapter, config);
17
+ wss.onListen = () => {
18
+ _logger.default.info('Parse LiveQuery Server started running');
19
+ };
20
+ wss.onConnection = ws => {
21
+ ws.waitingForPong = false;
22
+ ws.on('pong', () => {
23
+ ws.waitingForPong = false;
24
+ });
25
+ ws.on('error', error => {
26
+ _logger.default.error(error.message);
27
+ _logger.default.error((0, _util.inspect)(ws, false));
28
+ });
32
29
  onConnect(new ParseWebSocket(ws));
33
30
  // Send ping to client periodically
34
31
  const pingIntervalId = setInterval(() => {
35
- if (ws.readyState == ws.OPEN) {
32
+ if (!ws.waitingForPong) {
36
33
  ws.ping();
34
+ ws.waitingForPong = true;
37
35
  } else {
38
36
  clearInterval(pingIntervalId);
37
+ ws.terminate();
39
38
  }
40
- }, websocketTimeout);
41
- });
39
+ }, config.websocketTimeout || 10 * 1000);
40
+ };
41
+ wss.onError = error => {
42
+ _logger.default.error(error);
43
+ };
44
+ wss.start();
42
45
  this.server = wss;
43
46
  }
47
+ close() {
48
+ if (this.server && this.server.close) {
49
+ this.server.close();
50
+ }
51
+ }
44
52
  }
45
-
46
53
  exports.ParseWebSocketServer = ParseWebSocketServer;
47
- class ParseWebSocket {
48
-
54
+ class ParseWebSocket extends _events.default.EventEmitter {
49
55
  constructor(ws) {
56
+ super();
57
+ ws.onmessage = request => this.emit('message', request && request.data ? request.data : request);
58
+ ws.onclose = () => this.emit('disconnect');
50
59
  this.ws = ws;
51
60
  }
52
-
53
- on(type, callback) {
54
- const wsType = typeMap.has(type) ? typeMap.get(type) : type;
55
- this.ws.on(wsType, callback);
56
- }
57
-
58
61
  send(message) {
59
62
  this.ws.send(message);
60
63
  }
61
64
  }
62
65
  exports.ParseWebSocket = ParseWebSocket;
63
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9MaXZlUXVlcnkvUGFyc2VXZWJTb2NrZXRTZXJ2ZXIuanMiXSwibmFtZXMiOlsidHlwZU1hcCIsIk1hcCIsImdldFdTIiwicmVxdWlyZSIsImUiLCJQYXJzZVdlYlNvY2tldFNlcnZlciIsImNvbnN0cnVjdG9yIiwic2VydmVyIiwib25Db25uZWN0Iiwid2Vic29ja2V0VGltZW91dCIsIldlYlNvY2tldFNlcnZlciIsIlNlcnZlciIsIndzcyIsIm9uIiwibG9nZ2VyIiwiaW5mbyIsIndzIiwiUGFyc2VXZWJTb2NrZXQiLCJwaW5nSW50ZXJ2YWxJZCIsInNldEludGVydmFsIiwicmVhZHlTdGF0ZSIsIk9QRU4iLCJwaW5nIiwiY2xlYXJJbnRlcnZhbCIsInR5cGUiLCJjYWxsYmFjayIsIndzVHlwZSIsImhhcyIsImdldCIsInNlbmQiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7Ozs7OztBQUVBLE1BQU1BLFVBQVUsSUFBSUMsR0FBSixDQUFRLENBQUMsQ0FBQyxZQUFELEVBQWUsT0FBZixDQUFELENBQVIsQ0FBaEI7QUFDQSxNQUFNQyxRQUFRLFlBQVc7QUFDdkIsTUFBSTtBQUNGLFdBQU9DLFFBQVEsS0FBUixDQUFQO0FBQ0QsR0FGRCxDQUVFLE9BQU1DLENBQU4sRUFBUztBQUNULFdBQU9ELFFBQVEsSUFBUixDQUFQO0FBQ0Q7QUFDRixDQU5EOztBQVFPLE1BQU1FLG9CQUFOLENBQTJCOztBQUdoQ0MsY0FBWUMsTUFBWixFQUF5QkMsU0FBekIsRUFBOENDLG1CQUEyQixLQUFLLElBQTlFLEVBQW9GO0FBQ2xGLFVBQU1DLGtCQUFrQlIsUUFBUVMsTUFBaEM7QUFDQSxVQUFNQyxNQUFNLElBQUlGLGVBQUosQ0FBb0IsRUFBRUgsUUFBUUEsTUFBVixFQUFwQixDQUFaO0FBQ0FLLFFBQUlDLEVBQUosQ0FBTyxXQUFQLEVBQW9CLE1BQU07QUFDeEJDLHVCQUFPQyxJQUFQLENBQVksdUNBQVo7QUFDRCxLQUZEO0FBR0FILFFBQUlDLEVBQUosQ0FBTyxZQUFQLEVBQXNCRyxFQUFELElBQVE7QUFDM0JSLGdCQUFVLElBQUlTLGNBQUosQ0FBbUJELEVBQW5CLENBQVY7QUFDQTtBQUNBLFlBQU1FLGlCQUFpQkMsWUFBWSxNQUFNO0FBQ3ZDLFlBQUlILEdBQUdJLFVBQUgsSUFBaUJKLEdBQUdLLElBQXhCLEVBQThCO0FBQzVCTCxhQUFHTSxJQUFIO0FBQ0QsU0FGRCxNQUVPO0FBQ0xDLHdCQUFjTCxjQUFkO0FBQ0Q7QUFDRixPQU5zQixFQU1wQlQsZ0JBTm9CLENBQXZCO0FBT0QsS0FWRDtBQVdBLFNBQUtGLE1BQUwsR0FBY0ssR0FBZDtBQUNEO0FBckIrQjs7UUFBckJQLG9CLEdBQUFBLG9CO0FBd0JOLE1BQU1ZLGNBQU4sQ0FBcUI7O0FBRzFCWCxjQUFZVSxFQUFaLEVBQXFCO0FBQ25CLFNBQUtBLEVBQUwsR0FBVUEsRUFBVjtBQUNEOztBQUVESCxLQUFHVyxJQUFILEVBQWlCQyxRQUFqQixFQUFpQztBQUMvQixVQUFNQyxTQUFTMUIsUUFBUTJCLEdBQVIsQ0FBWUgsSUFBWixJQUFvQnhCLFFBQVE0QixHQUFSLENBQVlKLElBQVosQ0FBcEIsR0FBd0NBLElBQXZEO0FBQ0EsU0FBS1IsRUFBTCxDQUFRSCxFQUFSLENBQVdhLE1BQVgsRUFBbUJELFFBQW5CO0FBQ0Q7O0FBRURJLE9BQUtDLE9BQUwsRUFBeUI7QUFDdkIsU0FBS2QsRUFBTCxDQUFRYSxJQUFSLENBQWFDLE9BQWI7QUFDRDtBQWR5QjtRQUFmYixjLEdBQUFBLGMiLCJmaWxlIjoiUGFyc2VXZWJTb2NrZXRTZXJ2ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5cbmNvbnN0IHR5cGVNYXAgPSBuZXcgTWFwKFtbJ2Rpc2Nvbm5lY3QnLCAnY2xvc2UnXV0pO1xuY29uc3QgZ2V0V1MgPSBmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZSgndXdzJyk7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJldHVybiByZXF1aXJlKCd3cycpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYXJzZVdlYlNvY2tldFNlcnZlciB7XG4gIHNlcnZlcjogT2JqZWN0O1xuXG4gIGNvbnN0cnVjdG9yKHNlcnZlcjogYW55LCBvbkNvbm5lY3Q6IEZ1bmN0aW9uLCB3ZWJzb2NrZXRUaW1lb3V0OiBudW1iZXIgPSAxMCAqIDEwMDApIHtcbiAgICBjb25zdCBXZWJTb2NrZXRTZXJ2ZXIgPSBnZXRXUygpLlNlcnZlcjtcbiAgICBjb25zdCB3c3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHsgc2VydmVyOiBzZXJ2ZXIgfSk7XG4gICAgd3NzLm9uKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbygnUGFyc2UgTGl2ZVF1ZXJ5IFNlcnZlciBzdGFydHMgcnVubmluZycpO1xuICAgIH0pO1xuICAgIHdzcy5vbignY29ubmVjdGlvbicsICh3cykgPT4ge1xuICAgICAgb25Db25uZWN0KG5ldyBQYXJzZVdlYlNvY2tldCh3cykpO1xuICAgICAgLy8gU2VuZCBwaW5nIHRvIGNsaWVudCBwZXJpb2RpY2FsbHlcbiAgICAgIGNvbnN0IHBpbmdJbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBpZiAod3MucmVhZHlTdGF0ZSA9PSB3cy5PUEVOKSB7XG4gICAgICAgICAgd3MucGluZygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwocGluZ0ludGVydmFsSWQpO1xuICAgICAgICB9XG4gICAgICB9LCB3ZWJzb2NrZXRUaW1lb3V0KTtcbiAgICB9KTtcbiAgICB0aGlzLnNlcnZlciA9IHdzcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFyc2VXZWJTb2NrZXQge1xuICB3czogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHdzOiBhbnkpIHtcbiAgICB0aGlzLndzID0gd3M7XG4gIH1cblxuICBvbih0eXBlOiBzdHJpbmcsIGNhbGxiYWNrKTogdm9pZCB7XG4gICAgY29uc3Qgd3NUeXBlID0gdHlwZU1hcC5oYXModHlwZSkgPyB0eXBlTWFwLmdldCh0eXBlKSA6IHR5cGU7XG4gICAgdGhpcy53cy5vbih3c1R5cGUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHNlbmQobWVzc2FnZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy53cy5zZW5kKG1lc3NhZ2UpO1xuICB9XG59XG4iXX0=
66
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQWRhcHRlckxvYWRlciIsInJlcXVpcmUiLCJfV1NBZGFwdGVyIiwiX2xvZ2dlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfZXZlbnRzIiwiX3V0aWwiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJQYXJzZVdlYlNvY2tldFNlcnZlciIsImNvbnN0cnVjdG9yIiwic2VydmVyIiwib25Db25uZWN0IiwiY29uZmlnIiwid3NzIiwibG9hZEFkYXB0ZXIiLCJ3c3NBZGFwdGVyIiwiV1NBZGFwdGVyIiwib25MaXN0ZW4iLCJsb2dnZXIiLCJpbmZvIiwib25Db25uZWN0aW9uIiwid3MiLCJ3YWl0aW5nRm9yUG9uZyIsIm9uIiwiZXJyb3IiLCJtZXNzYWdlIiwiaW5zcGVjdCIsIlBhcnNlV2ViU29ja2V0IiwicGluZ0ludGVydmFsSWQiLCJzZXRJbnRlcnZhbCIsInBpbmciLCJjbGVhckludGVydmFsIiwidGVybWluYXRlIiwid2Vic29ja2V0VGltZW91dCIsIm9uRXJyb3IiLCJzdGFydCIsImNsb3NlIiwiZXhwb3J0cyIsImV2ZW50cyIsIkV2ZW50RW1pdHRlciIsIm9ubWVzc2FnZSIsInJlcXVlc3QiLCJlbWl0IiwiZGF0YSIsIm9uY2xvc2UiLCJzZW5kIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL0xpdmVRdWVyeS9QYXJzZVdlYlNvY2tldFNlcnZlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBsb2FkQWRhcHRlciB9IGZyb20gJy4uL0FkYXB0ZXJzL0FkYXB0ZXJMb2FkZXInO1xuaW1wb3J0IHsgV1NBZGFwdGVyIH0gZnJvbSAnLi4vQWRhcHRlcnMvV2ViU29ja2V0U2VydmVyL1dTQWRhcHRlcic7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgZXZlbnRzIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBpbnNwZWN0IH0gZnJvbSAndXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBQYXJzZVdlYlNvY2tldFNlcnZlciB7XG4gIHNlcnZlcjogT2JqZWN0O1xuXG4gIGNvbnN0cnVjdG9yKHNlcnZlcjogYW55LCBvbkNvbm5lY3Q6IEZ1bmN0aW9uLCBjb25maWcpIHtcbiAgICBjb25maWcuc2VydmVyID0gc2VydmVyO1xuICAgIGNvbnN0IHdzcyA9IGxvYWRBZGFwdGVyKGNvbmZpZy53c3NBZGFwdGVyLCBXU0FkYXB0ZXIsIGNvbmZpZyk7XG4gICAgd3NzLm9uTGlzdGVuID0gKCkgPT4ge1xuICAgICAgbG9nZ2VyLmluZm8oJ1BhcnNlIExpdmVRdWVyeSBTZXJ2ZXIgc3RhcnRlZCBydW5uaW5nJyk7XG4gICAgfTtcbiAgICB3c3Mub25Db25uZWN0aW9uID0gd3MgPT4ge1xuICAgICAgd3Mud2FpdGluZ0ZvclBvbmcgPSBmYWxzZTtcbiAgICAgIHdzLm9uKCdwb25nJywgKCkgPT4ge1xuICAgICAgICB3cy53YWl0aW5nRm9yUG9uZyA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgICB3cy5vbignZXJyb3InLCBlcnJvciA9PiB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGluc3BlY3Qod3MsIGZhbHNlKSk7XG4gICAgICB9KTtcbiAgICAgIG9uQ29ubmVjdChuZXcgUGFyc2VXZWJTb2NrZXQod3MpKTtcbiAgICAgIC8vIFNlbmQgcGluZyB0byBjbGllbnQgcGVyaW9kaWNhbGx5XG4gICAgICBjb25zdCBwaW5nSW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgaWYgKCF3cy53YWl0aW5nRm9yUG9uZykge1xuICAgICAgICAgIHdzLnBpbmcoKTtcbiAgICAgICAgICB3cy53YWl0aW5nRm9yUG9uZyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChwaW5nSW50ZXJ2YWxJZCk7XG4gICAgICAgICAgd3MudGVybWluYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbmZpZy53ZWJzb2NrZXRUaW1lb3V0IHx8IDEwICogMTAwMCk7XG4gICAgfTtcbiAgICB3c3Mub25FcnJvciA9IGVycm9yID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihlcnJvcik7XG4gICAgfTtcbiAgICB3c3Muc3RhcnQoKTtcbiAgICB0aGlzLnNlcnZlciA9IHdzcztcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLnNlcnZlciAmJiB0aGlzLnNlcnZlci5jbG9zZSkge1xuICAgICAgdGhpcy5zZXJ2ZXIuY2xvc2UoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhcnNlV2ViU29ja2V0IGV4dGVuZHMgZXZlbnRzLkV2ZW50RW1pdHRlciB7XG4gIHdzOiBhbnk7XG5cbiAgY29uc3RydWN0b3Iod3M6IGFueSkge1xuICAgIHN1cGVyKCk7XG4gICAgd3Mub25tZXNzYWdlID0gcmVxdWVzdCA9PlxuICAgICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgcmVxdWVzdCAmJiByZXF1ZXN0LmRhdGEgPyByZXF1ZXN0LmRhdGEgOiByZXF1ZXN0KTtcbiAgICB3cy5vbmNsb3NlID0gKCkgPT4gdGhpcy5lbWl0KCdkaXNjb25uZWN0Jyk7XG4gICAgdGhpcy53cyA9IHdzO1xuICB9XG5cbiAgc2VuZChtZXNzYWdlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLndzLnNlbmQobWVzc2FnZSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsY0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBRCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUssS0FBQSxHQUFBTCxPQUFBO0FBQStCLFNBQUFHLHVCQUFBRyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRXhCLE1BQU1HLG9CQUFv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
@@ -1,4 +1,4 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  var equalObjects = require('./equalObjects');
4
4
  var Id = require('./Id');
@@ -15,7 +15,7 @@ var Parse = require('parse/node');
15
15
  * Convert $or queries into an array of where conditions
16
16
  */
17
17
  function flattenOrQueries(where) {
18
- if (!where.hasOwnProperty('$or')) {
18
+ if (!Object.prototype.hasOwnProperty.call(where, '$or')) {
19
19
  return where;
20
20
  }
21
21
  var accum = [];
@@ -85,9 +85,7 @@ function queryHash(query) {
85
85
  values.push(where[columns[i]]);
86
86
  }
87
87
  }
88
-
89
88
  var sections = [columns.join(','), stringify(values)];
90
-
91
89
  return query.className + ':' + sections.join('|');
92
90
  }
93
91
 
@@ -107,6 +105,13 @@ function contains(haystack, needle) {
107
105
  }
108
106
  return false;
109
107
  }
108
+ if (Array.isArray(needle)) {
109
+ for (const need of needle) {
110
+ if (contains(haystack, need)) {
111
+ return true;
112
+ }
113
+ }
114
+ }
110
115
  return haystack.indexOf(needle) > -1;
111
116
  }
112
117
  /**
@@ -130,7 +135,6 @@ function matchesQuery(object, query) {
130
135
  }
131
136
  return true;
132
137
  }
133
-
134
138
  function equalObjectsGeneric(obj, compareTo, eqlFn) {
135
139
  if (Array.isArray(obj)) {
136
140
  for (var i = 0; i < obj.length; i++) {
@@ -140,7 +144,6 @@ function equalObjectsGeneric(obj, compareTo, eqlFn) {
140
144
  }
141
145
  return false;
142
146
  }
143
-
144
147
  return eqlFn(obj, compareTo);
145
148
  }
146
149
 
@@ -151,11 +154,11 @@ function matchesKeyConstraints(object, key, constraints) {
151
154
  if (constraints === null) {
152
155
  return false;
153
156
  }
154
- if (key.indexOf(".") >= 0) {
157
+ if (key.indexOf('.') >= 0) {
155
158
  // Key references a subobject
156
- var keyComponents = key.split(".");
159
+ var keyComponents = key.split('.');
157
160
  var subObjectKey = keyComponents[0];
158
- var keyRemainder = keyComponents.slice(1).join(".");
161
+ var keyRemainder = keyComponents.slice(1).join('.');
159
162
  return matchesKeyConstraints(object[subObjectKey] || {}, keyRemainder, constraints);
160
163
  }
161
164
  var i;
@@ -167,10 +170,30 @@ function matchesKeyConstraints(object, key, constraints) {
167
170
  }
168
171
  return false;
169
172
  }
173
+ if (key === '$and') {
174
+ for (i = 0; i < constraints.length; i++) {
175
+ if (!matchesQuery(object, constraints[i])) {
176
+ return false;
177
+ }
178
+ }
179
+ return true;
180
+ }
181
+ if (key === '$nor') {
182
+ for (i = 0; i < constraints.length; i++) {
183
+ if (matchesQuery(object, constraints[i])) {
184
+ return false;
185
+ }
186
+ }
187
+ return true;
188
+ }
170
189
  if (key === '$relatedTo') {
171
190
  // Bail! We can't handle relational queries locally
172
191
  return false;
173
192
  }
193
+ // Decode Date JSON value
194
+ if (object[key] && object[key].__type == 'Date') {
195
+ object[key] = new Date(object[key].iso);
196
+ }
174
197
  // Equality (or Array contains) cases
175
198
  if (typeof constraints !== 'object') {
176
199
  if (Array.isArray(object[key])) {
@@ -185,13 +208,12 @@ function matchesKeyConstraints(object, key, constraints) {
185
208
  return typeof obj !== 'undefined' && ptr.className === obj.className && ptr.objectId === obj.objectId;
186
209
  });
187
210
  }
188
-
189
211
  return equalObjectsGeneric(object[key], Parse._decode(key, constraints), equalObjects);
190
212
  }
191
213
  // More complex cases
192
214
  for (var condition in constraints) {
193
215
  compareTo = constraints[condition];
194
- if (compareTo.__type) {
216
+ if (compareTo?.__type) {
195
217
  compareTo = Parse._decode(key, compareTo);
196
218
  }
197
219
  switch (condition) {
@@ -215,6 +237,11 @@ function matchesKeyConstraints(object, key, constraints) {
215
237
  return false;
216
238
  }
217
239
  break;
240
+ case '$eq':
241
+ if (!equalObjects(object[key], compareTo)) {
242
+ return false;
243
+ }
244
+ break;
218
245
  case '$ne':
219
246
  if (equalObjects(object[key], compareTo)) {
220
247
  return false;
@@ -231,6 +258,9 @@ function matchesKeyConstraints(object, key, constraints) {
231
258
  }
232
259
  break;
233
260
  case '$all':
261
+ if (!object[key]) {
262
+ return false;
263
+ }
234
264
  for (i = 0; i < compareTo.length; i++) {
235
265
  if (object[key].indexOf(compareTo[i]) < 0) {
236
266
  return false;
@@ -266,7 +296,6 @@ function matchesKeyConstraints(object, key, constraints) {
266
296
  if (escapeEnd > -1) {
267
297
  expString += compareTo.substring(escapeStart + 2, escapeEnd).replace(/\\\\\\\\E/g, '\\E').replace(/\W/g, '\\$&');
268
298
  }
269
-
270
299
  escapeStart = compareTo.indexOf('\\Q', escapeEnd);
271
300
  }
272
301
  expString += compareTo.substring(Math.max(escapeStart, escapeEnd + 2));
@@ -293,6 +322,40 @@ function matchesKeyConstraints(object, key, constraints) {
293
322
  return false;
294
323
  }
295
324
  return object[key].latitude > southWest.latitude && object[key].latitude < northEast.latitude && object[key].longitude > southWest.longitude && object[key].longitude < northEast.longitude;
325
+ case '$containedBy':
326
+ {
327
+ for (const value of object[key]) {
328
+ if (!contains(compareTo, value)) {
329
+ return false;
330
+ }
331
+ }
332
+ return true;
333
+ }
334
+ case '$geoWithin':
335
+ {
336
+ if (compareTo.$polygon) {
337
+ const points = compareTo.$polygon.map(geoPoint => [geoPoint.latitude, geoPoint.longitude]);
338
+ const polygon = new Parse.Polygon(points);
339
+ return polygon.containsPoint(object[key]);
340
+ }
341
+ if (compareTo.$centerSphere) {
342
+ const [WGS84Point, maxDistance] = compareTo.$centerSphere;
343
+ const centerPoint = new Parse.GeoPoint({
344
+ latitude: WGS84Point[1],
345
+ longitude: WGS84Point[0]
346
+ });
347
+ const point = new Parse.GeoPoint(object[key]);
348
+ const distance = point.radiansTo(centerPoint);
349
+ return distance <= maxDistance;
350
+ }
351
+ break;
352
+ }
353
+ case '$geoIntersects':
354
+ {
355
+ const polygon = new Parse.Polygon(object[key].coordinates);
356
+ const point = new Parse.GeoPoint(compareTo.$point);
357
+ return polygon.containsPoint(point);
358
+ }
296
359
  case '$options':
297
360
  // Not a query type, but a way to add options to $regex. Ignore and
298
361
  // avoid the default
@@ -311,11 +374,9 @@ function matchesKeyConstraints(object, key, constraints) {
311
374
  }
312
375
  return true;
313
376
  }
314
-
315
377
  var QueryTools = {
316
378
  queryHash: queryHash,
317
379
  matchesQuery: matchesQuery
318
380
  };
319
-
320
381
  module.exports = QueryTools;
321
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9MaXZlUXVlcnkvUXVlcnlUb29scy5qcyJdLCJuYW1lcyI6WyJlcXVhbE9iamVjdHMiLCJyZXF1aXJlIiwiSWQiLCJQYXJzZSIsImZsYXR0ZW5PclF1ZXJpZXMiLCJ3aGVyZSIsImhhc093blByb3BlcnR5IiwiYWNjdW0iLCJpIiwiJG9yIiwibGVuZ3RoIiwiY29uY2F0Iiwic3RyaW5naWZ5Iiwib2JqZWN0IiwicmVwbGFjZSIsIkFycmF5IiwiaXNBcnJheSIsImNvcHkiLCJtYXAiLCJzb3J0Iiwiam9pbiIsInNlY3Rpb25zIiwia2V5cyIsIk9iamVjdCIsImsiLCJwdXNoIiwicXVlcnlIYXNoIiwicXVlcnkiLCJRdWVyeSIsImNsYXNzTmFtZSIsIl93aGVyZSIsImNvbHVtbnMiLCJ2YWx1ZXMiLCJ1bmlxdWVDb2x1bW5zIiwic3ViVmFsdWVzIiwiaiIsImNvbnRhaW5zIiwiaGF5c3RhY2siLCJuZWVkbGUiLCJfX3R5cGUiLCJwdHIiLCJvYmplY3RJZCIsImluZGV4T2YiLCJtYXRjaGVzUXVlcnkiLCJpZCIsImZpZWxkIiwibWF0Y2hlc0tleUNvbnN0cmFpbnRzIiwiZXF1YWxPYmplY3RzR2VuZXJpYyIsIm9iaiIsImNvbXBhcmVUbyIsImVxbEZuIiwia2V5IiwiY29uc3RyYWludHMiLCJrZXlDb21wb25lbnRzIiwic3BsaXQiLCJzdWJPYmplY3RLZXkiLCJrZXlSZW1haW5kZXIiLCJzbGljZSIsIl9kZWNvZGUiLCJjb25kaXRpb24iLCJwcm9wZXJ0eUV4aXN0cyIsImV4aXN0ZW5jZUlzUmVxdWlyZWQiLCJ0ZXN0IiwiZXhwU3RyaW5nIiwiZXNjYXBlRW5kIiwiZXNjYXBlU3RhcnQiLCJzdWJzdHJpbmciLCJNYXRoIiwibWF4IiwiZXhwIiwiUmVnRXhwIiwiJG9wdGlvbnMiLCJkaXN0YW5jZSIsInJhZGlhbnNUbyIsIiRtYXhEaXN0YW5jZSIsIkluZmluaXR5Iiwic291dGhXZXN0IiwiJGJveCIsIm5vcnRoRWFzdCIsImxhdGl0dWRlIiwi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Y2VzQ29udGVudCI6WyJ2YXIgZXF1YWxPYmplY3RzID0gcmVxdWlyZSgnLi9lcXVhbE9iamVjdHMnKTtcbnZhciBJZCA9IHJlcXVpcmUoJy4vSWQnKTtcbnZhciBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKTtcblxuLyoqXG4gKiBRdWVyeSBIYXNoZXMgYXJlIGRldGVybWluaXN0aWMgaGFzaGVzIGZvciBQYXJzZSBRdWVyaWVzLlxuICogQW55IHR3byBxdWVyaWVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBzZXQgb2YgY29uc3RyYWludHMgd2lsbCBwcm9kdWNlIHRoZSBzYW1lXG4gKiBoYXNoLiBUaGlzIGxldHMgdXMgcmVsaWFibHkgZ3JvdXAgY29tcG9uZW50cyBieSB0aGUgcXVlcmllcyB0aGV5IGRlcGVuZCB1cG9uLFxuICogYW5kIHF1aWNrbHkgZGV0ZXJtaW5lIGlmIGEgcXVlcnkgaGFzIGNoYW5nZWQuXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0ICRvciBxdWVyaWVzIGludG8gYW4gYXJyYXkgb2Ygd2hlcmUgY29uZGl0aW9uc1xuICovXG5mdW5jdGlvbiBmbGF0dGVuT3JRdWVyaWVzKHdoZXJlKSB7XG4gIGlmICghd2hlcmUuaGFzT3duUHJvcGVydHkoJyRvcicpKSB7XG4gICAgcmV0dXJuIHdoZXJlO1xuICB9XG4gIHZhciBhY2N1bSA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHdoZXJlLiRvci5sZW5ndGg7IGkrKykge1xuICAgIGFjY3VtID0gYWNjdW0uY29uY2F0KHdoZXJlLiRvcltpXSk7XG4gIH1cbiAgcmV0dXJuIGFjY3VtO1xufVxuXG4vKipcbiAqIERldGVybWluaXN0aWNhbGx5IHR1cm5zIGFuIG9iamVjdCBpbnRvIGEgc3RyaW5nLiBEaXNyZWdhcmRzIG9yZGVyaW5nXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeShvYmplY3QpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcgfHwgb2JqZWN0ID09PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gJ1wiJyArIG9iamVjdC5yZXBsYWNlKC9cXHwvZywgJyV8JykgKyAnXCInO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0ICsgJyc7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgIHZhciBjb3B5ID0gb2JqZWN0Lm1hcChzdHJpbmdpZnkpO1xuICAgIGNvcHkuc29ydCgpO1xuICAgIHJldHVybiAnWycgKyBjb3B5LmpvaW4oJywnKSArICddJztcbiAgfVxuICB2YXIgc2VjdGlvbnMgPSBbXTtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuICBrZXlzLnNvcnQoKTtcbiAgZm9yICh2YXIgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4gICAgc2VjdGlvbnMucHVzaChzdHJpbmdpZnkoa2V5c1trXSkgKyAnOicgKyBzdHJpbmdpZnkob2JqZWN0W2tleXNba11dKSk7XG4gIH1cbiAgcmV0dXJuICd7JyArIHNlY3Rpb25zLmpvaW4oJywnKSArICd9Jztcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGhhc2ggZnJvbSBhIHF1ZXJ5LCB3aXRoIHVuaXF1ZSBmaWVsZHMgZm9yIGNvbHVtbnMsIHZhbHVlcywgb3JkZXIsXG4gKiBza2lwLCBhbmQgbGltaXQuXG4gKi9cbmZ1bmN0aW9uIHF1ZXJ5SGFzaChxdWVyeSkge1xuICBpZiAocXVlcnkgaW5zdGFuY2VvZiBQYXJzZS5RdWVyeSkge1xuICAgIHF1ZXJ5ID0ge1xuICAgICAgY2xhc3NOYW1lOiBxdWVyeS5jbGFzc05hbWUsXG4gICAgICB3aGVyZTogcXVlcnkuX3doZXJlXG4gICAgfVxuICB9XG4gIHZhciB3aGVyZSA9IGZsYXR0ZW5PclF1ZXJpZXMocXVlcnkud2hlcmUgfHwge30pO1xuICB2YXIgY29sdW1ucyA9IFtdO1xuICB2YXIgdmFsdWVzID0gW107XG4gIHZhciBpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh3aGVyZSkpIHtcbiAgICB2YXIgdW5pcXVlQ29sdW1ucyA9IHt9O1xuICAgIGZvciAoaSA9IDA7IGkgPCB3aGVyZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN1YlZhbHVlcyA9IHt9O1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh3aGVyZVtpXSk7XG4gICAgICBrZXlzLnNvcnQoKTtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7IGorKykge1xuICAgICAgICBzdWJWYWx1ZXNba2V5c1tqXV0gPSB3aGVyZVtpXVtrZXlzW2pdXTtcbiAgICAgICAgdW5pcXVlQ29sdW1uc1trZXlzW2pdXSA9IHRydWU7XG4gICAgICB9XG4gICAgICB2YWx1ZXMucHVzaChzdWJWYWx1ZXMpO1xuICAgIH1cbiAgICBjb2x1bW5zID0gT2JqZWN0LmtleXModW5pcXVlQ29sdW1ucyk7XG4gICAgY29sdW1ucy5zb3J0KCk7XG4gIH0gZWxzZSB7XG4gICAgY29sdW1ucyA9IE9iamVjdC5rZXlzKHdoZXJlKTtcbiAgICBjb2x1bW5zLnNvcnQoKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWVzLnB1c2god2hlcmVbY29sdW1uc1tpXV0pO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzZWN0aW9ucyA9IFtjb2x1bW5zLmpvaW4oJywnKSwgc3RyaW5naWZ5KHZhbHVlcyldO1xuXG4gIHJldHVybiBxdWVyeS5jbGFzc05hbWUgKyAnOicgKyBzZWN0aW9ucy5qb2luKCd8Jyk7XG59XG5cbi8qKlxuICogY29udGFpbnMgLS0gRGV0ZXJtaW5lcyBpZiBhbiBvYmplY3QgaXMgY29udGFpbmVkIGluIGEgbGlzdCB3aXRoIHNwZWNpYWwgaGFuZGxpbmcgZm9yIFBhcnNlIHBvaW50ZXJzLlxuICovXG5mdW5jdGlvbiBjb250YWlucyhoYXlzdGFjazogQXJyYXksIG5lZWRsZTogYW55KTogYm9vbGVhbiB7XG4gIGlmIChuZWVkbGUgJiYgbmVlZGxlLl9fdHlwZSAmJiBuZWVkbGUuX190eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICBmb3IgKGNvbnN0IGkgaW4gaGF5c3RhY2spIHtcbiAgICAgIGNvbnN0IHB0ciA9IGhheXN0YWNrW2ldO1xuICAgICAgaWYgKHR5cGVvZiBwdHIgPT09ICdzdHJpbmcnICYmIHB0ciA9PT0gbmVlZGxlLm9iamVjdElkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHB0ci5jbGFzc05hbWUgPT09IG5lZWRsZS5jbGFzc05hbWUgJiZcbiAgICAgICAgICBwdHIub2JqZWN0SWQgPT09IG5lZWRsZS5vYmplY3RJZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBoYXlzdGFjay5pbmRleE9mKG5lZWRsZSkgPiAtMTtcbn1cbi8qKlxuICogbWF0Y2hlc1F1ZXJ5IC0tIERldGVybWluZXMgaWYgYW4gb2JqZWN0IHdvdWxkIGJlIHJldHVybmVkIGJ5IGEgUGFyc2UgUXVlcnlcbiAqIEl0J3MgYSBsaWdodHdlaWdodCwgd2hlcmUtY2xhdXNlIG9ubHkgaW1wbGVtZW50YXRpb24gb2YgYSBmdWxsIHF1ZXJ5IGVuZ2luZS5cbiAqIFNpbmNlIHdlIGZpbmQgcXVlcmllcyB0aGF0IG1hdGNoIG9iamVjdHMsIHJhdGhlciB0aGFuIG9iamVjdHMgdGhhdCBtYXRjaFxuICogcXVlcmllcywgd2UgY2FuIGF2b2lkIGJ1aWxkaW5nIGEgZnVsbC1ibG93biBxdWVyeSB0b29sLlxuICovXG5mdW5jdGlvbiBtYXRjaGVzUXVlcnkob2JqZWN0OiBhbnksIHF1ZXJ5OiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKHF1ZXJ5IGluc3RhbmNlb2YgUGFyc2UuUXVlcnkpIHtcbiAgICB2YXIgY2xhc3NOYW1lID1cbiAgICAgIChvYmplY3QuaWQgaW5zdGFuY2VvZiBJZCkgPyBvYmplY3QuaWQuY2xhc3NOYW1lIDogb2JqZWN0LmNsYXNzTmFtZTtcbiAgICBpZiAoY2xhc3NOYW1lICE9PSBxdWVyeS5jbGFzc05hbWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXNRdWVyeShvYmplY3QsIHF1ZXJ5Ll93aGVyZSk7XG4gIH1cbiAgZm9yICh2YXIgZmllbGQgaW4gcXVlcnkpIHtcbiAgICBpZiAoIW1hdGNoZXNLZXlDb25zdHJhaW50cyhvYmplY3QsIGZpZWxkLCBxdWVyeVtmaWVsZF0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBlcXVhbE9iamVjdHNHZW5lcmljKG9iaiwgY29tcGFyZVRvLCBlcWxGbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChlcWxGbihvYmpbaV0sIGNvbXBhcmVUbykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBlcWxGbihvYmosIGNvbXBhcmVUbyk7XG59XG5cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gb2JqZWN0IG1hdGNoZXMgYSBzaW5nbGUga2V5J3MgY29uc3RyYWludHNcbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc0tleUNvbnN0cmFpbnRzKG9iamVjdCwga2V5LCBjb25zdHJhaW50cykge1xuICBpZiAoY29uc3RyYWludHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYoa2V5LmluZGV4T2YoXCIuXCIpID49IDApe1xuICAgIC8vIEtleSByZWZlcmVuY2VzIGEgc3Vib2JqZWN0XG4gICAgdmFyIGtleUNvbXBvbmVudHMgPSBrZXkuc3BsaXQoXCIuXCIpO1xuICAgIHZhciBzdWJPYmplY3RLZXkgPSBrZXlDb21wb25lbnRzWzBdO1xuICAgIHZhciBrZXlSZW1haW5kZXIgPSBrZXlDb21wb25lbnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpO1xuICAgIHJldHVybiBtYXRjaGVzS2V5Q29uc3RyYWludHMob2JqZWN0W3N1Yk9iamVjdEtleV0gfHwge30sIGtleVJlbWFpbmRlciwgY29uc3RyYWludHMpO1xuICB9XG4gIHZhciBpO1xuICBpZiAoa2V5ID09PSAnJG9yJykge1xuICAgIGZvciAoaSA9IDA7IGkgPCBjb25zdHJhaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG1hdGNoZXNRdWVyeShvYmplY3QsIGNvbnN0cmFpbnRzW2ldKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChrZXkgPT09ICckcmVsYXRlZFRvJykge1xuICAgIC8vIEJhaWwhIFdlIGNhbid0IGhhbmRsZSByZWxhdGlvbmFsIHF1ZXJpZXMgbG9jYWxseVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBFcXVhbGl0eSAob3IgQXJyYXkgY29udGFpbnMpIGNhc2VzXG4gIGlmICh0eXBlb2YgY29uc3RyYWludHMgIT09ICdvYmplY3QnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0W2tleV0pKSB7XG4gICAgICByZXR1cm4gb2JqZWN0W2tleV0uaW5kZXhPZihjb25zdHJhaW50cykgPiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdFtrZXldID09PSBjb25zdHJhaW50cztcbiAgfVxuICB2YXIgY29tcGFyZVRvO1xuICBpZiAoY29uc3RyYWludHMuX190eXBlKSB7XG4gICAgaWYgKGNvbnN0cmFpbnRzLl9fdHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICByZXR1cm4gZXF1YWxPYmplY3RzR2VuZXJpYyhvYmplY3Rba2V5XSwgY29uc3RyYWludHMsIGZ1bmN0aW9uKG9iaiwgcHRyKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdHlwZW9mIG9iaiAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICBwdHIuY2xhc3NOYW1lID09PSBvYmouY2xhc3NOYW1lICYmXG4gICAgICAgICAgcHRyLm9iamVjdElkID09PSBvYmoub2JqZWN0SWRcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBlcXVhbE9iamVjdHNHZW5lcmljKG9iamVjdFtrZXldLCBQYXJzZS5fZGVjb2RlKGtleSwgY29uc3RyYWludHMpLCBlcXVhbE9iamVjdHMpO1xuICB9XG4gIC8vIE1vcmUgY29tcGxleCBjYXNlc1xuICBmb3IgKHZhciBjb25kaXRpb24gaW4gY29uc3RyYWludHMpIHtcbiAgICBjb21wYXJlVG8gPSBjb25zdHJhaW50c1tjb25kaXRpb25dO1xuICAgIGlmIChjb21wYXJlVG8uX190eXBlKSB7XG4gICAgICBjb21wYXJlVG8gPSBQYXJzZS5fZGVjb2RlKGtleSwgY29tcGFyZVRvKTtcbiAgICB9XG4gICAgc3dpdGNoIChjb25kaXRpb24pIHtcbiAgICBjYXNlICckbHQnOlxuICAgICAgaWYgKG9iamVjdFtrZXldID49IGNvbXBhcmVUbykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICckbHRlJzpcbiAgICAgIGlmIChvYmplY3Rba2V5XSA+IGNvbXBhcmVUbykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICckZ3QnOlxuICAgICAgaWYgKG9iamVjdFtrZXldIDw9IGNvbXBhcmVUbykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICckZ3RlJzpcbiAgICAgIGlmIChvYmplY3Rba2V5XSA8IGNvbXBhcmVUbykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICckbmUnOlxuICAgICAgaWYgKGVxdWFsT2JqZWN0cyhvYmplY3Rba2V5XSwgY29tcGFyZVRvKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICckaW4nOlxuICAgICAgaWYgKCFjb250YWlucyhjb21wYXJlVG8sIG9iamVjdFtrZXldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICckbmluJzpcbiAgICAgIGlmIChjb250YWlucyhjb21wYXJlVG8sIG9iamVjdFtrZXldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlICckYWxsJzpcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wYXJlVG8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKG9iamVjdFtrZXldLmluZGV4T2YoY29tcGFyZVRvW2ldKSA8IDApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJyRleGlzdHMnOiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eUV4aXN0cyA9IHR5cGVvZiBvYmplY3Rba2V5XSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgICBjb25zdCBleGlzdGVuY2VJc1JlcXVpcmVkID0gY29uc3RyYWludHNbJyRleGlzdHMnXTtcbiAgICAgIGlmICh0eXBlb2YgY29uc3RyYWludHNbJyRleGlzdHMnXSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIC8vIFRoZSBTREsgd2lsbCBuZXZlciBzdWJtaXQgYSBub24tYm9vbGVhbiBmb3IgJGV4aXN0cywgYnV0IGlmIHNvbWVvbmVcbiAgICAgICAgLy8gdHJpZXMgdG8gc3VibWl0IGEgbm9uLWJvb2xlYW4gZm9yICRleGl0cyBvdXRzaWRlIHRoZSBTREtzLCBqdXN0IGlnbm9yZSBpdC5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoKCFwcm9wZXJ0eUV4aXN0cyAmJiBleGlzdGVuY2VJc1JlcXVpcmVkKSB8fCAocHJvcGVydHlFeGlzdHMgJiYgIWV4aXN0ZW5jZUlzUmVxdWlyZWQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICckcmVnZXgnOlxuICAgICAgaWYgKHR5cGVvZiBjb21wYXJlVG8gPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlVG8udGVzdChvYmplY3Rba2V5XSk7XG4gICAgICB9XG4gICAgICAvLyBKUyBkb2Vzbid0IHN1cHBvcnQgcGVybC1zdHlsZSBlc2NhcGluZ1xuICAgICAgdmFyIGV4cFN0cmluZyA9ICcnO1xuICAgICAgdmFyIGVzY2FwZUVuZCA9IC0yO1xuICAgICAgdmFyIGVzY2FwZVN0YXJ0ID0gY29tcGFyZVRvLmluZGV4T2YoJ1xcXFxRJyk7XG4gICAgICB3aGlsZSAoZXNjYXBlU3RhcnQgPiAtMSkge1xuICAgICAgICAvLyBBZGQgdGhlIHVuZXNjYXBlZCBwb3J0aW9uXG4gICAgICAgIGV4cFN0cmluZyArPSBjb21wYXJlVG8uc3Vic3RyaW5nKGVzY2FwZUVuZCArIDIsIGVzY2FwZVN0YXJ0KTtcbiAgICAgICAgZXNjYXBlRW5kID0gY29tcGFyZVRvLmluZGV4T2YoJ1xcXFxFJywgZXNjYXBlU3RhcnQpO1xuICAgICAgICBpZiAoZXNjYXBlRW5kID4gLTEpIHtcbiAgICAgICAgICBleHBTdHJpbmcgKz0gY29tcGFyZVRvLnN1YnN0cmluZyhlc2NhcGVTdGFydCArIDIsIGVzY2FwZUVuZClcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXFxcXFxcXFxcXFxcRS9nLCAnXFxcXEUnKS5yZXBsYWNlKC9cXFcvZywgJ1xcXFwkJicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXNjYXBlU3RhcnQgPSBjb21wYXJlVG8uaW5kZXhPZignXFxcXFEnLCBlc2NhcGVFbmQpO1xuICAgICAgfVxuICAgICAgZXhwU3RyaW5nICs9IGNvbXBhcmVUby5zdWJzdHJpbmcoTWF0aC5tYXgoZXNjYXBlU3RhcnQsIGVzY2FwZUVuZCArIDIpKTtcbiAgICAgIHZhciBleHAgPSBuZXcgUmVnRXhwKGV4cFN0cmluZywgY29uc3RyYWludHMuJG9wdGlvbnMgfHwgJycpO1xuICAgICAgaWYgKCFleHAudGVzdChvYmplY3Rba2V5XSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnJG5lYXJTcGhlcmUnOlxuICAgICAgaWYgKCFjb21wYXJlVG8gfHwgIW9iamVjdFtrZXldKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciBkaXN0YW5jZSA9IGNvbXBhcmVUby5yYWRpYW5zVG8ob2JqZWN0W2tleV0pO1xuICAgICAgdmFyIG1heCA9IGNvbnN0cmFpbnRzLiRtYXhEaXN0YW5jZSB8fCBJbmZpbml0eTtcbiAgICAgIHJldHVybiBkaXN0YW5jZSA8PSBtYXg7XG4gICAgY2FzZSAnJHdpdGhpbic6XG4gICAgICBpZiAoIWNvbXBhcmVUbyB8fCAhb2JqZWN0W2tleV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIHNvdXRoV2VzdCA9IGNvbXBhcmVUby4kYm94WzBdO1xuICAgICAgdmFyIG5vcnRoRWFzdCA9IGNvbXBhcmVUby4kYm94WzFdO1xuICAgICAgaWYgKHNvdXRoV2VzdC5sYXRpdHVkZSA+IG5vcnRoRWFzdC5sYXRpdHVkZSB8fFxuICAgICAgICAgICAgc291dGhXZXN0LmxvbmdpdHVkZSA+IG5vcnRoRWFzdC5sb25naXR1ZGUpIHtcbiAgICAgICAgLy8gSW52YWxpZCBib3gsIGNyb3NzZXMgdGhlIGRhdGUgbGluZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBvYmplY3Rba2V5XS5sYXRpdHVkZSA+IHNvdXRoV2VzdC5sYXRpdHVkZSAmJlxuICAgICAgICAgIG9iamVjdFtrZXldLmxhdGl0dWRlIDwgbm9ydGhFYXN0LmxhdGl0dWRlICYmXG4gICAgICAgICAgb2JqZWN0W2tleV0ubG9uZ2l0dWRlID4gc291dGhXZXN0LmxvbmdpdHVkZSAmJlxuICAgICAgICAgIG9iamVjdFtrZXldLmxvbmdpdHVkZSA8IG5vcnRoRWFzdC5sb25naXR1ZGVcbiAgICAgICk7XG4gICAgY2FzZSAnJG9wdGlvbnMnOlxuICAgICAgLy8gTm90IGEgcXVlcnkgdHlwZSwgYnV0IGEgd2F5IHRvIGFkZCBvcHRpb25zIHRvICRyZWdleC4gSWdub3JlIGFuZFxuICAgICAgLy8gYXZvaWQgdGhlIGRlZmF1bHRcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJyRtYXhEaXN0YW5jZSc6XG4gICAgICAvLyBOb3QgYSBxdWVyeSB0eXBlLCBidXQgYSB3YXkgdG8gYWRkIGEgY2FwIHRvICRuZWFyU3BoZXJlLiBJZ25vcmUgYW5kXG4gICAgICAvLyBhdm9pZCB0aGUgZGVmYXVsdFxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnJHNlbGVjdCc6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSAnJGRvbnRTZWxlY3QnOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG52YXIgUXVlcnlUb29scyA9IHtcbiAgcXVlcnlIYXNoOiBxdWVyeUhhc2gsXG4gIG1hdGNoZXNRdWVyeTogbWF0Y2hlc1F1ZXJ5XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFF1ZXJ5VG9vbHM7XG4iXX0=
382
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlcXVhbE9iamVjdHMiLCJyZXF1aXJlIiwiSWQiLCJQYXJzZSIsImZsYXR0ZW5PclF1ZXJpZXMiLCJ3aGVyZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImFjY3VtIiwiaSIsIiRvciIsImxlbmd0aCIsImNvbmNhdCIsInN0cmluZ2lmeSIsIm9iamVjdCIsInJlcGxhY2UiLCJBcnJheSIsImlzQXJyYXkiLCJjb3B5IiwibWFwIiwic29ydCIsImpvaW4iLCJzZWN0aW9ucyIsImtleXMiLCJrIiwicHVzaCIsInF1ZXJ5SGFzaCIsInF1ZXJ5IiwiUXVlcnkiLCJjbGFzc05hbWUiLCJfd2hlcmUiLCJjb2x1bW5zIiwidmFsdWVzIiwidW5pcXVlQ29sdW1ucyIsInN1YlZhbHVlcyIsImoiLCJjb250YWlucyIsImhheXN0YWNrIiwibmVlZGxlIiwiX190eXBlIiwicHRyIiwib2JqZWN0SWQiLCJuZWVkIiwiaW5kZXhPZiIsIm1hdGNoZXNRdWVyeSIsImlkIiwiZmllbGQiLCJtYXRjaGVzS2V5Q29uc3RyYWludHMiLCJlcXVhbE9iamVjdHNHZW5lcmljIiwib2JqIiwiY29tcGFyZVRvIiwiZXFsRm4iLCJrZXkiLCJjb25zdHJhaW50cyIsImtleUNvbXBvbmVudHMiLCJzcGxpdCIsInN1Yk9iamVjdEtleSIsImtleVJlbWFpbmRlciIsInNsaWNlIiwiRGF0ZSIsImlzbyIsIl9kZWNvZGUiLCJjb25kaXRpb24iLCJwcm9wZXJ0eUV4aXN0cyIsImV4aXN0ZW5jZUlzUmVxdWlyZWQiLCJ0ZXN0IiwiZXhwU3RyaW5nIiwiZXNjYXBlRW5kIiwiZXNjYXBlU3RhcnQiLCJzdWJzdHJpbmciLCJNYXRoIiwibWF4IiwiZXhwIiwiUmVnRXhwIiwiJG9wdGlvbnMiLCJkaXN0YW5jZSIsInJhZGlhbnNUbyIsIiRtYXhEaXN0YW5jZSIsIkluZmluaXR5Iiwic291dGhXZXN0IiwiJGJveCIsIm5vcnRoRWFzdCIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwidmFsdWUiLCIkcG9seWdvbiIsInBvaW50cyIsImdlb1BvaW50IiwicG9seWdvbiIsIlBvbHlnb24iLCJjb250YWluc1BvaW50IiwiJGNlbnRlclNwaGVyZSIsIldHUzg0UG9pbnQiLCJtYXhEaXN0YW5jZSIsImNlbnRlclBvaW50IiwiR2VvUG9pbnQiLCJwb2ludCIsImNvb3JkaW5hdGVzIiwiJHBvaW50IiwiUXVlcnlUb29scyIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvTGl2ZVF1ZXJ5L1F1ZXJ5VG9vbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGVxdWFsT2JqZWN0cyA9IHJlcXVpcmUoJy4vZXF1YWxPYmplY3RzJyk7XG52YXIgSWQgPSByZXF1aXJlKCcuL0lkJyk7XG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJyk7XG5cbi8qKlxuICogUXVlcnkgSGFzaGVzIGFyZSBkZXRlcm1pbmlzdGljIGhhc2hlcyBmb3IgUGFyc2UgUXVlcmllcy5cbiAqIEFueSB0d28gcXVlcmllcyB0aGF0IGhhdmUgdGhlIHNhbWUgc2V0IG9mIGNvbnN0cmFpbnRzIHdpbGwgcHJvZHVjZSB0aGUgc2FtZVxuICogaGFzaC4gVGhpcyBsZXRzIHVzIHJlbGlhYmx5IGdyb3VwIGNvbXBvbmVudHMgYnkgdGhlIHF1ZXJpZXMgdGhleSBkZXBlbmQgdXBvbixcbiAqIGFuZCBxdWlja2x5IGRldGVybWluZSBpZiBhIHF1ZXJ5IGhhcyBjaGFuZ2VkLlxuICovXG5cbi8qKlxuICogQ29udmVydCAkb3IgcXVlcmllcyBpbnRvIGFuIGFycmF5IG9mIHdoZXJlIGNvbmRpdGlvbnNcbiAqL1xuZnVuY3Rpb24gZmxhdHRlbk9yUXVlcmllcyh3aGVyZSkge1xuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh3aGVyZSwgJyRvcicpKSB7XG4gICAgcmV0dXJuIHdoZXJlO1xuICB9XG4gIHZhciBhY2N1bSA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHdoZXJlLiRvci5sZW5ndGg7IGkrKykge1xuICAgIGFjY3VtID0gYWNjdW0uY29uY2F0KHdoZXJlLiRvcltpXSk7XG4gIH1cbiAgcmV0dXJuIGFjY3VtO1xufVxuXG4vKipcbiAqIERldGVybWluaXN0aWNhbGx5IHR1cm5zIGFuIG9iamVjdCBpbnRvIGEgc3RyaW5nLiBEaXNyZWdhcmRzIG9yZGVyaW5nXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeShvYmplY3QpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcgfHwgb2JqZWN0ID09PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gJ1wiJyArIG9iamVjdC5yZXBsYWNlKC9cXHwvZywgJyV8JykgKyAnXCInO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0ICsgJyc7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgIHZhciBjb3B5ID0gb2JqZWN0Lm1hcChzdHJpbmdpZnkpO1xuICAgIGNvcHkuc29ydCgpO1xuICAgIHJldHVybiAnWycgKyBjb3B5LmpvaW4oJywnKSArICddJztcbiAgfVxuICB2YXIgc2VjdGlvbnMgPSBbXTtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuICBrZXlzLnNvcnQoKTtcbiAgZm9yICh2YXIgayA9IDA7IGsgPCBrZXlzLmxlbmd0aDsgaysrKSB7XG4gICAgc2VjdGlvbnMucHVzaChzdHJpbmdpZnkoa2V5c1trXSkgKyAnOicgKyBzdHJpbmdpZnkob2JqZWN0W2tleXNba11dKSk7XG4gIH1cbiAgcmV0dXJuICd7JyArIHNlY3Rpb25zLmpvaW4oJywnKSArICd9Jztcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGhhc2ggZnJvbSBhIHF1ZXJ5LCB3aXRoIHVuaXF1ZSBmaWVsZHMgZm9yIGNvbHVtbnMsIHZhbHVlcywgb3JkZXIsXG4gKiBza2lwLCBhbmQgbGltaXQuXG4gKi9cbmZ1bmN0aW9uIHF1ZXJ5SGFzaChxdWVyeSkge1xuICBpZiAocXVlcnkgaW5zdGFuY2VvZiBQYXJzZS5RdWVyeSkge1xuICAgIHF1ZXJ5ID0ge1xuICAgICAgY2xhc3NOYW1lOiBxdWVyeS5jbGFzc05hbWUsXG4gICAgICB3aGVyZTogcXVlcnkuX3doZXJlLFxuICAgIH07XG4gIH1cbiAgdmFyIHdoZXJlID0gZmxhdHRlbk9yUXVlcmllcyhxdWVyeS53aGVyZSB8fCB7fSk7XG4gIHZhciBjb2x1bW5zID0gW107XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgdmFyIGk7XG4gIGlmIChBcnJheS5pc0FycmF5KHdoZXJlKSkge1xuICAgIHZhciB1bmlxdWVDb2x1bW5zID0ge307XG4gICAgZm9yIChpID0gMDsgaSA8IHdoZXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3ViVmFsdWVzID0ge307XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHdoZXJlW2ldKTtcbiAgICAgIGtleXMuc29ydCgpO1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHN1YlZhbHVlc1trZXlzW2pdXSA9IHdoZXJlW2ldW2tleXNbal1dO1xuICAgICAgICB1bmlxdWVDb2x1bW5zW2tleXNbal1dID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhbHVlcy5wdXNoKHN1YlZhbHVlcyk7XG4gICAgfVxuICAgIGNvbHVtbnMgPSBPYmplY3Qua2V5cyh1bmlxdWVDb2x1bW5zKTtcbiAgICBjb2x1bW5zLnNvcnQoKTtcbiAgfSBlbHNlIHtcbiAgICBjb2x1bW5zID0gT2JqZWN0LmtleXMod2hlcmUpO1xuICAgIGNvbHVtbnMuc29ydCgpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZXMucHVzaCh3aGVyZVtjb2x1bW5zW2ldXSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNlY3Rpb25zID0gW2NvbHVtbnMuam9pbignLCcpLCBzdHJpbmdpZnkodmFsdWVzKV07XG5cbiAgcmV0dXJuIHF1ZXJ5LmNsYXNzTmFtZSArICc6JyArIHNlY3Rpb25zLmpvaW4oJ3wnKTtcbn1cblxuLyoqXG4gKiBjb250YWlucyAtLSBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBpcyBjb250YWluZWQgaW4gYSBsaXN0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgUGFyc2UgcG9pbnRlcnMuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zKGhheXN0YWNrOiBBcnJheSwgbmVlZGxlOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKG5lZWRsZSAmJiBuZWVkbGUuX190eXBlICYmIG5lZWRsZS5fX3R5cGUgPT09ICdQb2ludGVyJykge1xuICAgIGZvciAoY29uc3QgaSBpbiBoYXlzdGFjaykge1xuICAgICAgY29uc3QgcHRyID0gaGF5c3RhY2tbaV07XG4gICAgICBpZiAodHlwZW9mIHB0ciA9PT0gJ3N0cmluZycgJiYgcHRyID09PSBuZWVkbGUub2JqZWN0SWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHRyLmNsYXNzTmFtZSA9PT0gbmVlZGxlLmNsYXNzTmFtZSAmJiBwdHIub2JqZWN0SWQgPT09IG5lZWRsZS5vYmplY3RJZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShuZWVkbGUpKSB7XG4gICAgZm9yIChjb25zdCBuZWVkIG9mIG5lZWRsZSkge1xuICAgICAgaWYgKGNvbnRhaW5zKGhheXN0YWNrLCBuZWVkKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGF5c3RhY2suaW5kZXhPZihuZWVkbGUpID4gLTE7XG59XG4vKipcbiAqIG1hdGNoZXNRdWVyeSAtLSBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCB3b3VsZCBiZSByZXR1cm5lZCBieSBhIFBhcnNlIFF1ZXJ5XG4gKiBJdCdzIGEgbGlnaHR3ZWlnaHQsIHdoZXJlLWNsYXVzZSBvbmx5IGltcGxlbWVudGF0aW9uIG9mIGEgZnVsbCBxdWVyeSBlbmdpbmUuXG4gKiBTaW5jZSB3ZSBmaW5kIHF1ZXJpZXMgdGhhdCBtYXRjaCBvYmplY3RzLCByYXRoZXIgdGhhbiBvYmplY3RzIHRoYXQgbWF0Y2hcbiAqIHF1ZXJpZXMsIHdlIGNhbiBhdm9pZCBidWlsZGluZyBhIGZ1bGwtYmxvd24gcXVlcnkgdG9vbC5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1F1ZXJ5KG9iamVjdDogYW55LCBxdWVyeTogYW55KTogYm9vbGVhbiB7XG4gIGlmIChxdWVyeSBpbnN0YW5jZW9mIFBhcnNlLlF1ZXJ5KSB7XG4gICAgdmFyIGNsYXNzTmFtZSA9IG9iamVjdC5pZCBpbnN0YW5jZW9mIElkID8gb2JqZWN0LmlkLmNsYXNzTmFtZSA6IG9iamVjdC5jbGFzc05hbWU7XG4gICAgaWYgKGNsYXNzTmFtZSAhPT0gcXVlcnkuY2xhc3NOYW1lKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzUXVlcnkob2JqZWN0LCBxdWVyeS5fd2hlcmUpO1xuICB9XG4gIGZvciAodmFyIGZpZWxkIGluIHF1ZXJ5KSB7XG4gICAgaWYgKCFtYXRjaGVzS2V5Q29uc3RyYWludHMob2JqZWN0LCBmaWVsZCwgcXVlcnlbZmllbGRdKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZXF1YWxPYmplY3RzR2VuZXJpYyhvYmosIGNvbXBhcmVUbywgZXFsRm4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZXFsRm4ob2JqW2ldLCBjb21wYXJlVG8pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gZXFsRm4ob2JqLCBjb21wYXJlVG8pO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhbiBvYmplY3QgbWF0Y2hlcyBhIHNpbmdsZSBrZXkncyBjb25zdHJhaW50c1xuICovXG5mdW5jdGlvbiBtYXRjaGVzS2V5Q29uc3RyYWludHMob2JqZWN0LCBrZXksIGNvbnN0cmFpbnRzKSB7XG4gIGlmIChjb25zdHJhaW50cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5LmluZGV4T2YoJy4nKSA+PSAwKSB7XG4gICAgLy8gS2V5IHJlZmVyZW5jZXMgYSBzdWJvYmplY3RcbiAgICB2YXIga2V5Q29tcG9uZW50cyA9IGtleS5zcGxpdCgnLicpO1xuICAgIHZhciBzdWJPYmplY3RLZXkgPSBrZXlDb21wb25lbnRzWzBdO1xuICAgIHZhciBrZXlSZW1haW5kZXIgPSBrZXlDb21wb25lbnRzLnNsaWNlKDEpLmpvaW4oJy4nKTtcbiAgICByZXR1cm4gbWF0Y2hlc0tleUNvbnN0cmFpbnRzKG9iamVjdFtzdWJPYmplY3RLZXldIHx8IHt9LCBrZXlSZW1haW5kZXIsIGNvbnN0cmFpbnRzKTtcbiAgfVxuICB2YXIgaTtcbiAgaWYgKGtleSA9PT0gJyRvcicpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChtYXRjaGVzUXVlcnkob2JqZWN0LCBjb25zdHJhaW50c1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoa2V5ID09PSAnJGFuZCcpIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgY29uc3RyYWludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghbWF0Y2hlc1F1ZXJ5KG9iamVjdCwgY29uc3RyYWludHNbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGtleSA9PT0gJyRub3InKSB7XG4gICAgZm9yIChpID0gMDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobWF0Y2hlc1F1ZXJ5KG9iamVjdCwgY29uc3RyYWludHNbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGtleSA9PT0gJyRyZWxhdGVkVG8nKSB7XG4gICAgLy8gQmFpbCEgV2UgY2FuJ3QgaGFuZGxlIHJlbGF0aW9uYWwgcXVlcmllcyBsb2NhbGx5XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIERlY29kZSBEYXRlIEpTT04gdmFsdWVcbiAgaWYgKG9iamVjdFtrZXldICYmIG9iamVjdFtrZXldLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICBvYmplY3Rba2V5XSA9IG5ldyBEYXRlKG9iamVjdFtrZXldLmlzbyk7XG4gIH1cbiAgLy8gRXF1YWxpdHkgKG9yIEFycmF5IGNvbnRhaW5zKSBjYXNlc1xuICBpZiAodHlwZW9mIGNvbnN0cmFpbnRzICE9PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdFtrZXldKSkge1xuICAgICAgcmV0dXJuIG9iamVjdFtrZXldLmluZGV4T2YoY29uc3RyYWludHMpID4gLTE7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Rba2V5XSA9PT0gY29uc3RyYWludHM7XG4gIH1cbiAgdmFyIGNvbXBhcmVUbztcbiAgaWYgKGNvbnN0cmFpbnRzLl9fdHlwZSkge1xuICAgIGlmIChjb25zdHJhaW50cy5fX3R5cGUgPT09ICdQb2ludGVyJykge1xuICAgICAgcmV0dXJuIGVxdWFsT2JqZWN0c0dlbmVyaWMob2JqZWN0W2tleV0sIGNvbnN0cmFpbnRzLCBmdW5jdGlvbiAob2JqLCBwdHIpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0eXBlb2Ygb2JqICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgIHB0ci5jbGFzc05hbWUgPT09IG9iai5jbGFzc05hbWUgJiZcbiAgICAgICAgICBwdHIub2JqZWN0SWQgPT09IG9iai5vYmplY3RJZFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVxdWFsT2JqZWN0c0dlbmVyaWMob2JqZWN0W2tleV0sIFBhcnNlLl9kZWNvZGUoa2V5LCBjb25zdHJhaW50cyksIGVxdWFsT2JqZWN0cyk7XG4gIH1cbiAgLy8gTW9yZSBjb21wbGV4IGNhc2VzXG4gIGZvciAodmFyIGNvbmRpdGlvbiBpbiBjb25zdHJhaW50cykge1xuICAgIGNvbXBhcmVUbyA9IGNvbnN0cmFpbnRzW2NvbmRpdGlvbl07XG4gICAgaWYgKGNvbXBhcmVUbz8uX190eXBlKSB7XG4gICAgICBjb21wYXJlVG8gPSBQYXJzZS5fZGVjb2RlKGtleSwgY29tcGFyZVRvKTtcbiAgICB9XG4gICAgc3dpdGNoIChjb25kaXRpb24pIHtcbiAgICAgIGNhc2UgJyRsdCc6XG4gICAgICAgIGlmIChvYmplY3Rba2V5XSA+PSBjb21wYXJlVG8pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckbHRlJzpcbiAgICAgICAgaWYgKG9iamVjdFtrZXldID4gY29tcGFyZVRvKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJGd0JzpcbiAgICAgICAgaWYgKG9iamVjdFtrZXldIDw9IGNvbXBhcmVUbykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRndGUnOlxuICAgICAgICBpZiAob2JqZWN0W2tleV0gPCBjb21wYXJlVG8pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckZXEnOlxuICAgICAgICBpZiAoIWVxdWFsT2JqZWN0cyhvYmplY3Rba2V5XSwgY29tcGFyZVRvKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRuZSc6XG4gICAgICAgIGlmIChlcXVhbE9iamVjdHMob2JqZWN0W2tleV0sIGNvbXBhcmVUbykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICckaW4nOlxuICAgICAgICBpZiAoIWNvbnRhaW5zKGNvbXBhcmVUbywgb2JqZWN0W2tleV0pKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJG5pbic6XG4gICAgICAgIGlmIChjb250YWlucyhjb21wYXJlVG8sIG9iamVjdFtrZXldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRhbGwnOlxuICAgICAgICBpZiAoIW9iamVjdFtrZXldKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wYXJlVG8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAob2JqZWN0W2tleV0uaW5kZXhPZihjb21wYXJlVG9baV0pIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRleGlzdHMnOiB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5RXhpc3RzID0gdHlwZW9mIG9iamVjdFtrZXldICE9PSAndW5kZWZpbmVkJztcbiAgICAgICAgY29uc3QgZXhpc3RlbmNlSXNSZXF1aXJlZCA9IGNvbnN0cmFpbnRzWyckZXhpc3RzJ107XG4gICAgICAgIGlmICh0eXBlb2YgY29uc3RyYWludHNbJyRleGlzdHMnXSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgLy8gVGhlIFNESyB3aWxsIG5ldmVyIHN1Ym1pdCBhIG5vbi1ib29sZWFuIGZvciAkZXhpc3RzLCBidXQgaWYgc29tZW9uZVxuICAgICAgICAgIC8vIHRyaWVzIHRvIHN1Ym1pdCBhIG5vbi1ib29sZWFuIGZvciAkZXhpdHMgb3V0c2lkZSB0aGUgU0RLcywganVzdCBpZ25vcmUgaXQuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCghcHJvcGVydHlFeGlzdHMgJiYgZXhpc3RlbmNlSXNSZXF1aXJlZCkgfHwgKHByb3BlcnR5RXhpc3RzICYmICFleGlzdGVuY2VJc1JlcXVpcmVkKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJyRyZWdleCc6XG4gICAgICAgIGlmICh0eXBlb2YgY29tcGFyZVRvID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiBjb21wYXJlVG8udGVzdChvYmplY3Rba2V5XSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgZG9lc24ndCBzdXBwb3J0IHBlcmwtc3R5bGUgZXNjYXBpbmdcbiAgICAgICAgdmFyIGV4cFN0cmluZyA9ICcnO1xuICAgICAgICB2YXIgZXNjYXBlRW5kID0gLTI7XG4gICAgICAgIHZhciBlc2NhcGVTdGFydCA9IGNvbXBhcmVUby5pbmRleE9mKCdcXFxcUScpO1xuICAgICAgICB3aGlsZSAoZXNjYXBlU3RhcnQgPiAtMSkge1xuICAgICAgICAgIC8vIEFkZCB0aGUgdW5lc2NhcGVkIHBvcnRpb25cbiAgICAgICAgICBleHBTdHJpbmcgKz0gY29tcGFyZVRvLnN1YnN0cmluZyhlc2NhcGVFbmQgKyAyLCBlc2NhcGVTdGFydCk7XG4gICAgICAgICAgZXNjYXBlRW5kID0gY29tcGFyZVRvLmluZGV4T2YoJ1xcXFxFJywgZXNjYXBlU3RhcnQpO1xuICAgICAgICAgIGlmIChlc2NhcGVFbmQgPiAtMSkge1xuICAgICAgICAgICAgZXhwU3RyaW5nICs9IGNvbXBhcmVUb1xuICAgICAgICAgICAgICAuc3Vic3RyaW5nKGVzY2FwZVN0YXJ0ICsgMiwgZXNjYXBlRW5kKVxuICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFxcXFxcXFxcXFxcXEUvZywgJ1xcXFxFJylcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcVy9nLCAnXFxcXCQmJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXNjYXBlU3RhcnQgPSBjb21wYXJlVG8uaW5kZXhPZignXFxcXFEnLCBlc2NhcGVFbmQpO1xuICAgICAgICB9XG4gICAgICAgIGV4cFN0cmluZyArPSBjb21wYXJlVG8uc3Vic3RyaW5nKE1hdGgubWF4KGVzY2FwZVN0YXJ0LCBlc2NhcGVFbmQgKyAyKSk7XG4gICAgICAgIHZhciBleHAgPSBuZXcgUmVnRXhwKGV4cFN0cmluZywgY29uc3RyYWludHMuJG9wdGlvbnMgfHwgJycpO1xuICAgICAgICBpZiAoIWV4cC50ZXN0KG9iamVjdFtrZXldKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRuZWFyU3BoZXJlJzpcbiAgICAgICAgaWYgKCFjb21wYXJlVG8gfHwgIW9iamVjdFtrZXldKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkaXN0YW5jZSA9IGNvbXBhcmVUby5yYWRpYW5zVG8ob2JqZWN0W2tleV0pO1xuICAgICAgICB2YXIgbWF4ID0gY29uc3RyYWludHMuJG1heERpc3RhbmNlIHx8IEluZmluaXR5O1xuICAgICAgICByZXR1cm4gZGlzdGFuY2UgPD0gbWF4O1xuICAgICAgY2FzZSAnJHdpdGhpbic6XG4gICAgICAgIGlmICghY29tcGFyZVRvIHx8ICFvYmplY3Rba2V5XSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc291dGhXZXN0ID0gY29tcGFyZVRvLiRib3hbMF07XG4gICAgICAgIHZhciBub3J0aEVhc3QgPSBjb21wYXJlVG8uJGJveFsxXTtcbiAgICAgICAgaWYgKHNvdXRoV2VzdC5sYXRpdHVkZSA+IG5vcnRoRWFzdC5sYXRpdHVkZSB8fCBzb3V0aFdlc3QubG9uZ2l0dWRlID4gbm9ydGhFYXN0LmxvbmdpdHVkZSkge1xuICAgICAgICAgIC8vIEludmFsaWQgYm94LCBjcm9zc2VzIHRoZSBkYXRlIGxpbmVcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBvYmplY3Rba2V5XS5sYXRpdHVkZSA+IHNvdXRoV2VzdC5sYXRpdHVkZSAmJlxuICAgICAgICAgIG9iamVjdFtrZXldLmxhdGl0dWRlIDwgbm9ydGhFYXN0LmxhdGl0dWRlICYmXG4gICAgICAgICAgb2JqZWN0W2tleV0ubG9uZ2l0dWRlID4gc291dGhXZXN0LmxvbmdpdHVkZSAmJlxuICAgICAgICAgIG9iamVjdFtrZXldLmxvbmdpdHVkZSA8IG5vcnRoRWFzdC5sb25naXR1ZGVcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJyRjb250YWluZWRCeSc6IHtcbiAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBvYmplY3Rba2V5XSkge1xuICAgICAgICAgIGlmICghY29udGFpbnMoY29tcGFyZVRvLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjYXNlICckZ2VvV2l0aGluJzoge1xuICAgICAgICBpZiAoY29tcGFyZVRvLiRwb2x5Z29uKSB7XG4gICAgICAgICAgY29uc3QgcG9pbnRzID0gY29tcGFyZVRvLiRwb2x5Z29uLm1hcChnZW9Qb2ludCA9PiBbXG4gICAgICAgICAgICBnZW9Qb2ludC5sYXRpdHVkZSxcbiAgICAgICAgICAgIGdlb1BvaW50LmxvbmdpdHVkZSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBjb25zdCBwb2x5Z29uID0gbmV3IFBhcnNlLlBvbHlnb24ocG9pbnRzKTtcbiAgICAgICAgICByZXR1cm4gcG9seWdvbi5jb250YWluc1BvaW50KG9iamVjdFtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcGFyZVRvLiRjZW50ZXJTcGhlcmUpIHtcbiAgICAgICAgICBjb25zdCBbV0dTODRQb2ludCwgbWF4RGlzdGFuY2VdID0gY29tcGFyZVRvLiRjZW50ZXJTcGhlcmU7XG4gICAgICAgICAgY29uc3QgY2VudGVyUG9pbnQgPSBuZXcgUGFyc2UuR2VvUG9pbnQoe1xuICAgICAgICAgICAgbGF0aXR1ZGU6IFdHUzg0UG9pbnRbMV0sXG4gICAgICAgICAgICBsb25naXR1ZGU6IFdHUzg0UG9pbnRbMF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcG9pbnQgPSBuZXcgUGFyc2UuR2VvUG9pbnQob2JqZWN0W2tleV0pO1xuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gcG9pbnQucmFkaWFuc1RvKGNlbnRlclBvaW50KTtcbiAgICAgICAgICByZXR1cm4gZGlzdGFuY2UgPD0gbWF4RGlzdGFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICckZ2VvSW50ZXJzZWN0cyc6IHtcbiAgICAgICAgY29uc3QgcG9seWdvbiA9IG5ldyBQYXJzZS5Qb2x5Z29uKG9iamVjdFtrZXldLmNvb3JkaW5hdGVzKTtcbiAgICAgICAgY29uc3QgcG9pbnQgPSBuZXcgUGFyc2UuR2VvUG9pbnQoY29tcGFyZVRvLiRwb2ludCk7XG4gICAgICAgIHJldHVybiBwb2x5Z29uLmNvbnRhaW5zUG9pbnQocG9pbnQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnJG9wdGlvbnMnOlxuICAgICAgICAvLyBOb3QgYSBxdWVyeSB0eXBlLCBidXQgYSB3YXkgdG8gYWRkIG9wdGlvbnMgdG8gJHJlZ2V4LiBJZ25vcmUgYW5kXG4gICAgICAgIC8vIGF2b2lkIHRoZSBkZWZhdWx0XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnJG1heERpc3RhbmNlJzpcbiAgICAgICAgLy8gTm90IGEgcXVlcnkgdHlwZSwgYnV0IGEgd2F5IHRvIGFkZCBhIGNhcCB0byAkbmVhclNwaGVyZS4gSWdub3JlIGFuZFxuICAgICAgICAvLyBhdm9pZCB0aGUgZGVmYXVsdFxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyRzZWxlY3QnOlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBjYXNlICckZG9udFNlbGVjdCc6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbnZhciBRdWVyeVRvb2xzID0ge1xuICBxdWVyeUhhc2g6IHF1ZXJ5SGFzaCxcbiAgbWF0Y2hlc1F1ZXJ5OiBtYXRjaGVzUXVlcnksXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFF1ZXJ5VG9vbHM7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBSUEsWUFBWSxHQUFHQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7QUFDNUMsSUFBSUMsRUFBRSxHQUFHRCxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQ3hCLElBQUlFLEtBQUssR0FBR0YsT0FBTyxDQUFDLFlBQVksQ0FBQzs7QUFFakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVNHLGdCQUFnQkEsQ0FBQ0MsS0FBSyxFQUFFO0VBQy9CLElBQUksQ0FBQ0MsTUFBTSxDQUFDQyxTQUFTLENBQUNDLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDSixLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7SUFDdkQsT0FBT0EsS0FBSztFQUNkO0VBQ0EsSUFB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