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
package/lib/RestQuery.js CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  // An object that encapsulates everything we need to run a 'find'
4
4
  // operation, encoded in the REST API format.
@@ -6,8 +6,17 @@
6
6
  var SchemaController = require('./Controllers/SchemaController');
7
7
  var Parse = require('parse/node').Parse;
8
8
  const triggers = require('./triggers');
9
+ const {
10
+ continueWhile
11
+ } = require('parse/lib/node/promiseUtils');
12
+ const AlwaysSelectedKeys = ['objectId', 'createdAt', 'updatedAt', 'ACL'];
13
+ const {
14
+ enforceRoleSecurity
15
+ } = require('./SharedRest');
16
+ const {
17
+ createSanitizedError
18
+ } = require('./Error');
9
19
 
10
- const AlwaysSelectedKeys = ['objectId', 'createdAt', 'updatedAt'];
11
20
  // restOptions can include:
12
21
  // skip
13
22
  // limit
@@ -15,27 +24,86 @@ const AlwaysSelectedKeys = ['objectId', 'createdAt', 'updatedAt'];
15
24
  // count
16
25
  // include
17
26
  // keys
27
+ // excludeKeys
18
28
  // redirectClassNameForKey
19
- function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, clientSDK) {
20
-
29
+ // readPreference
30
+ // includeReadPreference
31
+ // subqueryReadPreference
32
+ /**
33
+ * Use to perform a query on a class. It will run security checks and triggers.
34
+ * @param options
35
+ * @param options.method {RestQuery.Method} The type of query to perform
36
+ * @param options.config {ParseServerConfiguration} The server configuration
37
+ * @param options.auth {Auth} The auth object for the request
38
+ * @param options.className {string} The name of the class to query
39
+ * @param options.restWhere {object} The where object for the query
40
+ * @param options.restOptions {object} The options object for the query
41
+ * @param options.clientSDK {string} The client SDK that is performing the query
42
+ * @param options.runAfterFind {boolean} Whether to run the afterFind trigger
43
+ * @param options.runBeforeFind {boolean} Whether to run the beforeFind trigger
44
+ * @param options.context {object} The context object for the query
45
+ * @returns {Promise<_UnsafeRestQuery>} A promise that is resolved with the _UnsafeRestQuery object
46
+ */
47
+ async function RestQuery({
48
+ method,
49
+ config,
50
+ auth,
51
+ className,
52
+ restWhere = {},
53
+ restOptions = {},
54
+ clientSDK,
55
+ runAfterFind = true,
56
+ runBeforeFind = true,
57
+ context
58
+ }) {
59
+ if (![RestQuery.Method.find, RestQuery.Method.get].includes(method)) {
60
+ throw new Parse.Error(Parse.Error.INVALID_QUERY, 'bad query type');
61
+ }
62
+ const isGet = method === RestQuery.Method.get;
63
+ enforceRoleSecurity(method, className, auth, config);
64
+ const result = runBeforeFind ? await triggers.maybeRunQueryTrigger(triggers.Types.beforeFind, className, restWhere, restOptions, config, auth, context, isGet) : Promise.resolve({
65
+ restWhere,
66
+ restOptions
67
+ });
68
+ return new _UnsafeRestQuery(config, auth, className, result.restWhere || restWhere, result.restOptions || restOptions, clientSDK, runAfterFind, context, isGet);
69
+ }
70
+ RestQuery.Method = Object.freeze({
71
+ get: 'get',
72
+ find: 'find'
73
+ });
74
+
75
+ /**
76
+ * _UnsafeRestQuery is meant for specific internal usage only. When you need to skip security checks or some triggers.
77
+ * Don't use it if you don't know what you are doing.
78
+ * @param config
79
+ * @param auth
80
+ * @param className
81
+ * @param restWhere
82
+ * @param restOptions
83
+ * @param clientSDK
84
+ * @param runAfterFind
85
+ * @param context
86
+ */
87
+ function _UnsafeRestQuery(config, auth, className, restWhere = {}, restOptions = {}, clientSDK, runAfterFind = true, context, isGet) {
21
88
  this.config = config;
22
89
  this.auth = auth;
23
90
  this.className = className;
24
91
  this.restWhere = restWhere;
25
92
  this.restOptions = restOptions;
26
93
  this.clientSDK = clientSDK;
94
+ this.runAfterFind = runAfterFind;
27
95
  this.response = null;
28
96
  this.findOptions = {};
29
- this.isWrite = false;
30
-
97
+ this.context = context || {};
98
+ this.isGet = isGet;
31
99
  if (!this.auth.isMaster) {
32
100
  if (this.className == '_Session') {
33
101
  if (!this.auth.user) {
34
- throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'Invalid session token');
102
+ throw createSanitizedError(Parse.Error.INVALID_SESSION_TOKEN, 'Invalid session token', config);
35
103
  }
36
104
  this.restWhere = {
37
- '$and': [this.restWhere, {
38
- 'user': {
105
+ $and: [this.restWhere, {
106
+ user: {
39
107
  __type: 'Pointer',
40
108
  className: '_User',
41
109
  objectId: this.auth.user.id
@@ -44,7 +112,6 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
44
112
  };
45
113
  }
46
114
  }
47
-
48
115
  this.doCount = false;
49
116
  this.includeAll = false;
50
117
 
@@ -55,17 +122,27 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
55
122
  // For example, passing an arg of include=foo.bar,foo.baz could lead to
56
123
  // this.include = [['foo'], ['foo', 'baz'], ['foo', 'bar']]
57
124
  this.include = [];
125
+ let keysForInclude = '';
58
126
 
59
127
  // If we have keys, we probably want to force some includes (n-1 level)
60
128
  // See issue: https://github.com/parse-community/parse-server/issues/3185
61
- if (restOptions.hasOwnProperty('keys')) {
62
- const keysForInclude = restOptions.keys.split(',').filter(key => {
129
+ if (Object.prototype.hasOwnProperty.call(restOptions, 'keys')) {
130
+ keysForInclude = restOptions.keys;
131
+ }
132
+
133
+ // If we have keys, we probably want to force some includes (n-1 level)
134
+ // in order to exclude specific keys.
135
+ if (Object.prototype.hasOwnProperty.call(restOptions, 'excludeKeys')) {
136
+ keysForInclude += ',' + restOptions.excludeKeys;
137
+ }
138
+ if (keysForInclude.length > 0) {
139
+ keysForInclude = keysForInclude.split(',').filter(key => {
63
140
  // At least 2 components
64
- return key.split(".").length > 1;
141
+ return key.split('.').length > 1;
65
142
  }).map(key => {
66
143
  // Slice the last component (a.b.c -> a.b)
67
144
  // Otherwise we'll include one level too much.
68
- return key.slice(0, key.lastIndexOf("."));
145
+ return key.slice(0, key.lastIndexOf('.'));
69
146
  }).join(',');
70
147
 
71
148
  // Concat the possibly present include string with the one from the keys
@@ -74,38 +151,48 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
74
151
  if (!restOptions.include || restOptions.include.length == 0) {
75
152
  restOptions.include = keysForInclude;
76
153
  } else {
77
- restOptions.include += "," + keysForInclude;
154
+ restOptions.include += ',' + keysForInclude;
78
155
  }
79
156
  }
80
157
  }
81
-
82
158
  for (var option in restOptions) {
83
159
  switch (option) {
84
160
  case 'keys':
85
161
  {
86
- const keys = restOptions.keys.split(',').concat(AlwaysSelectedKeys);
162
+ const keys = restOptions.keys.split(',').filter(key => key.length > 0).concat(AlwaysSelectedKeys);
87
163
  this.keys = Array.from(new Set(keys));
88
164
  break;
89
165
  }
166
+ case 'excludeKeys':
167
+ {
168
+ const exclude = restOptions.excludeKeys.split(',').filter(k => AlwaysSelectedKeys.indexOf(k) < 0);
169
+ this.excludeKeys = Array.from(new Set(exclude));
170
+ break;
171
+ }
90
172
  case 'count':
91
173
  this.doCount = true;
92
174
  break;
93
175
  case 'includeAll':
94
176
  this.includeAll = true;
95
177
  break;
178
+ case 'explain':
179
+ case 'hint':
96
180
  case 'distinct':
97
181
  case 'pipeline':
98
182
  case 'skip':
99
183
  case 'limit':
100
184
  case 'readPreference':
185
+ case 'comment':
101
186
  this.findOptions[option] = restOptions[option];
102
187
  break;
103
188
  case 'order':
104
189
  var fields = restOptions.order.split(',');
105
190
  this.findOptions.sort = fields.reduce((sortMap, field) => {
106
191
  field = field.trim();
107
- if (field === '$score') {
108
- sortMap.score = { $meta: 'textScore' };
192
+ if (field === '$score' || field === '-$score') {
193
+ sortMap.score = {
194
+ $meta: 'textScore'
195
+ };
109
196
  } else if (field[0] == '-') {
110
197
  sortMap[field.slice(1)] = -1;
111
198
  } else {
@@ -117,6 +204,10 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
117
204
  case 'include':
118
205
  {
119
206
  const paths = restOptions.include.split(',');
207
+ if (paths.includes('*')) {
208
+ this.includeAll = true;
209
+ break;
210
+ }
120
211
  // Load the existing includes (from keys)
121
212
  const pathSet = paths.reduce((memo, path) => {
122
213
  // Split each paths on . (a.b.c -> [a,b,c])
@@ -127,7 +218,6 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
127
218
  return memo;
128
219
  }, memo);
129
220
  }, {});
130
-
131
221
  this.include = Object.keys(pathSet).map(s => {
132
222
  return s.split('.');
133
223
  }).sort((a, b) => {
@@ -153,11 +243,15 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
153
243
  // Returns a promise for the response - an object with optional keys
154
244
  // 'results' and 'count'.
155
245
  // TODO: consolidate the replaceX functions
156
- RestQuery.prototype.execute = function (executeOptions) {
246
+ _UnsafeRestQuery.prototype.execute = function (executeOptions) {
157
247
  return Promise.resolve().then(() => {
158
248
  return this.buildRestWhere();
249
+ }).then(() => {
250
+ return this.denyProtectedFields();
159
251
  }).then(() => {
160
252
  return this.handleIncludeAll();
253
+ }).then(() => {
254
+ return this.handleExcludeKeys();
161
255
  }).then(() => {
162
256
  return this.runFind(executeOptions);
163
257
  }).then(() => {
@@ -166,12 +260,44 @@ RestQuery.prototype.execute = function (executeOptions) {
166
260
  return this.handleInclude();
167
261
  }).then(() => {
168
262
  return this.runAfterFindTrigger();
263
+ }).then(() => {
264
+ return this.handleAuthAdapters();
169
265
  }).then(() => {
170
266
  return this.response;
171
267
  });
172
268
  };
173
-
174
- RestQuery.prototype.buildRestWhere = function () {
269
+ _UnsafeRestQuery.prototype.each = function (callback) {
270
+ const {
271
+ config,
272
+ auth,
273
+ className,
274
+ restWhere,
275
+ restOptions,
276
+ clientSDK
277
+ } = this;
278
+ // if the limit is set, use it
279
+ restOptions.limit = restOptions.limit || 100;
280
+ restOptions.order = 'objectId';
281
+ let finished = false;
282
+ return continueWhile(() => {
283
+ return !finished;
284
+ }, async () => {
285
+ // Safe here to use _UnsafeRestQuery because the security was already
286
+ // checked during "await RestQuery()"
287
+ const query = new _UnsafeRestQuery(config, auth, className, restWhere, restOptions, clientSDK, this.runAfterFind, this.context);
288
+ const {
289
+ results
290
+ } = await query.execute();
291
+ results.forEach(callback);
292
+ finished = results.length < restOptions.limit;
293
+ if (!finished) {
294
+ restWhere.objectId = Object.assign({}, restWhere.objectId, {
295
+ $gt: results[results.length - 1].objectId
296
+ });
297
+ }
298
+ });
299
+ };
300
+ _UnsafeRestQuery.prototype.buildRestWhere = function () {
175
301
  return Promise.resolve().then(() => {
176
302
  return this.getUserAndRoleACL();
177
303
  }).then(() => {
@@ -191,20 +317,12 @@ RestQuery.prototype.buildRestWhere = function () {
191
317
  });
192
318
  };
193
319
 
194
- // Marks the query for a write attempt, so we read the proper ACL (write instead of read)
195
- RestQuery.prototype.forWrite = function () {
196
- this.isWrite = true;
197
- return this;
198
- };
199
-
200
320
  // Uses the Auth object to get the list of roles, adds the user id
201
- RestQuery.prototype.getUserAndRoleACL = function () {
321
+ _UnsafeRestQuery.prototype.getUserAndRoleACL = function () {
202
322
  if (this.auth.isMaster) {
203
323
  return Promise.resolve();
204
324
  }
205
-
206
325
  this.findOptions.acl = ['*'];
207
-
208
326
  if (this.auth.user) {
209
327
  return this.auth.getUserRoles().then(roles => {
210
328
  this.findOptions.acl = this.findOptions.acl.concat(roles, [this.auth.user.id]);
@@ -217,7 +335,7 @@ RestQuery.prototype.getUserAndRoleACL = function () {
217
335
 
218
336
  // Changes the className if redirectClassNameForKey is set.
219
337
  // Returns a promise.
220
- RestQuery.prototype.redirectClassNameForKey = function () {
338
+ _UnsafeRestQuery.prototype.redirectClassNameForKey = function () {
221
339
  if (!this.redirectKey) {
222
340
  return Promise.resolve();
223
341
  }
@@ -230,18 +348,17 @@ RestQuery.prototype.redirectClassNameForKey = function () {
230
348
  };
231
349
 
232
350
  // Validates this operation against the allowClientClassCreation config.
233
- RestQuery.prototype.validateClientClassCreation = function () {
351
+ _UnsafeRestQuery.prototype.validateClientClassCreation = function () {
234
352
  if (this.config.allowClientClassCreation === false && !this.auth.isMaster && SchemaController.systemClasses.indexOf(this.className) === -1) {
235
353
  return this.config.database.loadSchema().then(schemaController => schemaController.hasClass(this.className)).then(hasClass => {
236
354
  if (hasClass !== true) {
237
- throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, 'This user is not allowed to access ' + 'non-existent class: ' + this.className);
355
+ throw createSanitizedError(Parse.Error.OPERATION_FORBIDDEN, 'This user is not allowed to access ' + 'non-existent class: ' + this.className, this.config);
238
356
  }
239
357
  });
240
358
  } else {
241
359
  return Promise.resolve();
242
360
  }
243
361
  };
244
-
245
362
  function transformInQuery(inQueryObject, className, results) {
246
363
  var values = [];
247
364
  for (var result of results) {
@@ -263,7 +380,7 @@ function transformInQuery(inQueryObject, className, results) {
263
380
  // $inQuery clause.
264
381
  // The $inQuery clause turns into an $in with values that are just
265
382
  // pointers to the objects returned in the subquery.
266
- RestQuery.prototype.replaceInQuery = function () {
383
+ _UnsafeRestQuery.prototype.replaceInQuery = async function () {
267
384
  var inQueryObject = findObjectWithKey(this.restWhere, '$inQuery');
268
385
  if (!inQueryObject) {
269
386
  return;
@@ -274,24 +391,30 @@ RestQuery.prototype.replaceInQuery = function () {
274
391
  if (!inQueryValue.where || !inQueryValue.className) {
275
392
  throw new Parse.Error(Parse.Error.INVALID_QUERY, 'improper usage of $inQuery');
276
393
  }
277
-
278
394
  const additionalOptions = {
279
395
  redirectClassNameForKey: inQueryValue.redirectClassNameForKey
280
396
  };
281
-
282
397
  if (this.restOptions.subqueryReadPreference) {
283
398
  additionalOptions.readPreference = this.restOptions.subqueryReadPreference;
284
399
  additionalOptions.subqueryReadPreference = this.restOptions.subqueryReadPreference;
400
+ } else if (this.restOptions.readPreference) {
401
+ additionalOptions.readPreference = this.restOptions.readPreference;
285
402
  }
286
-
287
- var subquery = new RestQuery(this.config, this.auth, inQueryValue.className, inQueryValue.where, additionalOptions);
403
+ const subquery = await RestQuery({
404
+ method: RestQuery.Method.find,
405
+ config: this.config,
406
+ auth: this.auth,
407
+ className: inQueryValue.className,
408
+ restWhere: inQueryValue.where,
409
+ restOptions: additionalOptions,
410
+ context: this.context
411
+ });
288
412
  return subquery.execute().then(response => {
289
413
  transformInQuery(inQueryObject, subquery.className, response.results);
290
414
  // Recurse to repeat
291
415
  return this.replaceInQuery();
292
416
  });
293
417
  };
294
-
295
418
  function transformNotInQuery(notInQueryObject, className, results) {
296
419
  var values = [];
297
420
  for (var result of results) {
@@ -313,7 +436,7 @@ function transformNotInQuery(notInQueryObject, className, results) {
313
436
  // $notInQuery clause.
314
437
  // The $notInQuery clause turns into a $nin with values that are just
315
438
  // pointers to the objects returned in the subquery.
316
- RestQuery.prototype.replaceNotInQuery = function () {
439
+ _UnsafeRestQuery.prototype.replaceNotInQuery = async function () {
317
440
  var notInQueryObject = findObjectWithKey(this.restWhere, '$notInQuery');
318
441
  if (!notInQueryObject) {
319
442
  return;
@@ -324,17 +447,24 @@ RestQuery.prototype.replaceNotInQuery = function () {
324
447
  if (!notInQueryValue.where || !notInQueryValue.className) {
325
448
  throw new Parse.Error(Parse.Error.INVALID_QUERY, 'improper usage of $notInQuery');
326
449
  }
327
-
328
450
  const additionalOptions = {
329
451
  redirectClassNameForKey: notInQueryValue.redirectClassNameForKey
330
452
  };
331
-
332
453
  if (this.restOptions.subqueryReadPreference) {
333
454
  additionalOptions.readPreference = this.restOptions.subqueryReadPreference;
334
455
  additionalOptions.subqueryReadPreference = this.restOptions.subqueryReadPreference;
456
+ } else if (this.restOptions.readPreference) {
457
+ additionalOptions.readPreference = this.restOptions.readPreference;
335
458
  }
336
-
337
- var subquery = new RestQuery(this.config, this.auth, notInQueryValue.className, notInQueryValue.where, additionalOptions);
459
+ const subquery = await RestQuery({
460
+ method: RestQuery.Method.find,
461
+ config: this.config,
462
+ auth: this.auth,
463
+ className: notInQueryValue.className,
464
+ restWhere: notInQueryValue.where,
465
+ restOptions: additionalOptions,
466
+ context: this.context
467
+ });
338
468
  return subquery.execute().then(response => {
339
469
  transformNotInQuery(notInQueryObject, subquery.className, response.results);
340
470
  // Recurse to repeat
@@ -342,10 +472,17 @@ RestQuery.prototype.replaceNotInQuery = function () {
342
472
  });
343
473
  };
344
474
 
475
+ // Used to get the deepest object from json using dot notation.
476
+ const getDeepestObjectFromKey = (json, key, idx, src) => {
477
+ if (key in json) {
478
+ return json[key];
479
+ }
480
+ src.splice(1); // Exit Early
481
+ };
345
482
  const transformSelect = (selectObject, key, objects) => {
346
483
  var values = [];
347
484
  for (var result of objects) {
348
- values.push(key.split('.').reduce((o, i) => o[i], result));
485
+ values.push(key.split('.').reduce(getDeepestObjectFromKey, result));
349
486
  }
350
487
  delete selectObject['$select'];
351
488
  if (Array.isArray(selectObject['$in'])) {
@@ -360,7 +497,7 @@ const transformSelect = (selectObject, key, objects) => {
360
497
  // The $select clause turns into an $in with values selected out of
361
498
  // the subquery.
362
499
  // Returns a possible-promise.
363
- RestQuery.prototype.replaceSelect = function () {
500
+ _UnsafeRestQuery.prototype.replaceSelect = async function () {
364
501
  var selectObject = findObjectWithKey(this.restWhere, '$select');
365
502
  if (!selectObject) {
366
503
  return;
@@ -372,28 +509,34 @@ RestQuery.prototype.replaceSelect = function () {
372
509
  if (!selectValue.query || !selectValue.key || typeof selectValue.query !== 'object' || !selectValue.query.className || Object.keys(selectValue).length !== 2) {
373
510
  throw new Parse.Error(Parse.Error.INVALID_QUERY, 'improper usage of $select');
374
511
  }
375
-
376
512
  const additionalOptions = {
377
513
  redirectClassNameForKey: selectValue.query.redirectClassNameForKey
378
514
  };
379
-
380
515
  if (this.restOptions.subqueryReadPreference) {
381
516
  additionalOptions.readPreference = this.restOptions.subqueryReadPreference;
382
517
  additionalOptions.subqueryReadPreference = this.restOptions.subqueryReadPreference;
518
+ } else if (this.restOptions.readPreference) {
519
+ additionalOptions.readPreference = this.restOptions.readPreference;
383
520
  }
384
-
385
- var subquery = new RestQuery(this.config, this.auth, selectValue.query.className, selectValue.query.where, additionalOptions);
521
+ const subquery = await RestQuery({
522
+ method: RestQuery.Method.find,
523
+ config: this.config,
524
+ auth: this.auth,
525
+ className: selectValue.query.className,
526
+ restWhere: selectValue.query.where,
527
+ restOptions: additionalOptions,
528
+ context: this.context
529
+ });
386
530
  return subquery.execute().then(response => {
387
531
  transformSelect(selectObject, selectValue.key, response.results);
388
532
  // Keep replacing $select clauses
389
533
  return this.replaceSelect();
390
534
  });
391
535
  };
392
-
393
536
  const transformDontSelect = (dontSelectObject, key, objects) => {
394
537
  var values = [];
395
538
  for (var result of objects) {
396
- values.push(key.split('.').reduce((o, i) => o[i], result));
539
+ values.push(key.split('.').reduce(getDeepestObjectFromKey, result));
397
540
  }
398
541
  delete dontSelectObject['$dontSelect'];
399
542
  if (Array.isArray(dontSelectObject['$nin'])) {
@@ -408,7 +551,7 @@ const transformDontSelect = (dontSelectObject, key, objects) => {
408
551
  // The $dontSelect clause turns into an $nin with values selected out of
409
552
  // the subquery.
410
553
  // Returns a possible-promise.
411
- RestQuery.prototype.replaceDontSelect = function () {
554
+ _UnsafeRestQuery.prototype.replaceDontSelect = async function () {
412
555
  var dontSelectObject = findObjectWithKey(this.restWhere, '$dontSelect');
413
556
  if (!dontSelectObject) {
414
557
  return;
@@ -422,46 +565,40 @@ RestQuery.prototype.replaceDontSelect = function () {
422
565
  const additionalOptions = {
423
566
  redirectClassNameForKey: dontSelectValue.query.redirectClassNameForKey
424
567
  };
425
-
426
568
  if (this.restOptions.subqueryReadPreference) {
427
569
  additionalOptions.readPreference = this.restOptions.subqueryReadPreference;
428
570
  additionalOptions.subqueryReadPreference = this.restOptions.subqueryReadPreference;
571
+ } else if (this.restOptions.readPreference) {
572
+ additionalOptions.readPreference = this.restOptions.readPreference;
429
573
  }
430
-
431
- var subquery = new RestQuery(this.config, this.auth, dontSelectValue.query.className, dontSelectValue.query.where, additionalOptions);
574
+ const subquery = await RestQuery({
575
+ method: RestQuery.Method.find,
576
+ config: this.config,
577
+ auth: this.auth,
578
+ className: dontSelectValue.query.className,
579
+ restWhere: dontSelectValue.query.where,
580
+ restOptions: additionalOptions,
581
+ context: this.context
582
+ });
432
583
  return subquery.execute().then(response => {
433
584
  transformDontSelect(dontSelectObject, dontSelectValue.key, response.results);
434
585
  // Keep replacing $dontSelect clauses
435
586
  return this.replaceDontSelect();
436
587
  });
437
588
  };
438
-
439
- const cleanResultOfSensitiveUserInfo = function (result, auth, config) {
589
+ _UnsafeRestQuery.prototype.cleanResultAuthData = function (result) {
440
590
  delete result.password;
441
-
442
- if (auth.isMaster || auth.user && auth.user.id === result.objectId) {
443
- return;
444
- }
445
-
446
- for (const field of config.userSensitiveFields) {
447
- delete result[field];
448
- }
449
- };
450
-
451
- const cleanResultAuthData = function (result) {
452
591
  if (result.authData) {
453
592
  Object.keys(result.authData).forEach(provider => {
454
593
  if (result.authData[provider] === null) {
455
594
  delete result.authData[provider];
456
595
  }
457
596
  });
458
-
459
597
  if (Object.keys(result.authData).length == 0) {
460
598
  delete result.authData;
461
599
  }
462
600
  }
463
601
  };
464
-
465
602
  const replaceEqualityConstraint = constraint => {
466
603
  if (typeof constraint !== 'object') {
467
604
  return constraint;
@@ -485,8 +622,7 @@ const replaceEqualityConstraint = constraint => {
485
622
  }
486
623
  return constraint;
487
624
  };
488
-
489
- RestQuery.prototype.replaceEquality = function () {
625
+ _UnsafeRestQuery.prototype.replaceEquality = function () {
490
626
  if (typeof this.restWhere !== 'object') {
491
627
  return;
492
628
  }
@@ -497,9 +633,11 @@ RestQuery.prototype.replaceEquality = function () {
497
633
 
498
634
  // Returns a promise for whether it was successful.
499
635
  // Populates this.response with an object that only has 'results'.
500
- RestQuery.prototype.runFind = function (options = {}) {
636
+ _UnsafeRestQuery.prototype.runFind = async function (options = {}) {
501
637
  if (this.findOptions.limit === 0) {
502
- this.response = { results: [] };
638
+ this.response = {
639
+ results: []
640
+ };
503
641
  return Promise.resolve();
504
642
  }
505
643
  const findOptions = Object.assign({}, this.findOptions);
@@ -511,31 +649,26 @@ RestQuery.prototype.runFind = function (options = {}) {
511
649
  if (options.op) {
512
650
  findOptions.op = options.op;
513
651
  }
514
- if (this.isWrite) {
515
- findOptions.isWrite = true;
516
- }
517
- return this.config.database.find(this.className, this.restWhere, findOptions).then(results => {
518
- if (this.className === '_User') {
519
- for (var result of results) {
520
- cleanResultOfSensitiveUserInfo(result, this.auth, this.config);
521
- cleanResultAuthData(result);
522
- }
652
+ const results = await this.config.database.find(this.className, this.restWhere, findOptions, this.auth);
653
+ if (this.className === '_User' && !findOptions.explain) {
654
+ for (var result of results) {
655
+ this.cleanResultAuthData(result);
523
656
  }
524
-
525
- this.config.filesController.expandFilesInObject(this.config, results);
526
-
527
- if (this.redirectClassName) {
528
- for (var r of results) {
529
- r.className = this.redirectClassName;
530
- }
657
+ }
658
+ await this.config.filesController.expandFilesInObject(this.config, results);
659
+ if (this.redirectClassName) {
660
+ for (var r of results) {
661
+ r.className = this.redirectClassName;
531
662
  }
532
- this.response = { results: results };
533
- });
663
+ }
664
+ this.response = {
665
+ results: results
666
+ };
534
667
  };
535
668
 
536
669
  // Returns a promise for whether it was successful.
537
670
  // Populates this.response.count with the count
538
- RestQuery.prototype.runCount = function () {
671
+ _UnsafeRestQuery.prototype.runCount = function () {
539
672
  if (!this.doCount) {
540
673
  return;
541
674
  }
@@ -546,9 +679,21 @@ RestQuery.prototype.runCount = function () {
546
679
  this.response.count = c;
547
680
  });
548
681
  };
682
+ _UnsafeRestQuery.prototype.denyProtectedFields = async function () {
683
+ if (this.auth.isMaster) {
684
+ return;
685
+ }
686
+ const schemaController = await this.config.database.loadSchema();
687
+ const protectedFields = this.config.database.addProtectedFields(schemaController, this.className, this.restWhere, this.findOptions.acl, this.auth, this.findOptions) || [];
688
+ for (const key of protectedFields) {
689
+ if (this.restWhere[key]) {
690
+ throw createSanitizedError(Parse.Error.OPERATION_FORBIDDEN, `This user is not allowed to query ${key} on class ${this.className}`, this.config);
691
+ }
692
+ }
693
+ };
549
694
 
550
695
  // Augments this.response with all pointers on an object
551
- RestQuery.prototype.handleIncludeAll = function () {
696
+ _UnsafeRestQuery.prototype.handleIncludeAll = function () {
552
697
  if (!this.includeAll) {
553
698
  return;
554
699
  }
@@ -556,7 +701,7 @@ RestQuery.prototype.handleIncludeAll = function () {
556
701
  const includeFields = [];
557
702
  const keyFields = [];
558
703
  for (const field in schema.fields) {
559
- if (schema.fields[field].type && schema.fields[field].type === 'Pointer') {
704
+ if (schema.fields[field].type && schema.fields[field].type === 'Pointer' || schema.fields[field].type && schema.fields[field].type === 'Array') {
560
705
  includeFields.push([field]);
561
706
  keyFields.push(field);
562
707
  }
@@ -570,32 +715,72 @@ RestQuery.prototype.handleIncludeAll = function () {
570
715
  });
571
716
  };
572
717
 
718
+ // Updates property `this.keys` to contain all keys but the ones unselected.
719
+ _UnsafeRestQuery.prototype.handleExcludeKeys = function () {
720
+ if (!this.excludeKeys) {
721
+ return;
722
+ }
723
+ if (this.keys) {
724
+ this.keys = this.keys.filter(k => !this.excludeKeys.includes(k));
725
+ return;
726
+ }
727
+ return this.config.database.loadSchema().then(schemaController => schemaController.getOneSchema(this.className)).then(schema => {
728
+ const fields = Object.keys(schema.fields);
729
+ this.keys = fields.filter(k => !this.excludeKeys.includes(k));
730
+ });
731
+ };
732
+
573
733
  // Augments this.response with data at the paths provided in this.include.
574
- RestQuery.prototype.handleInclude = function () {
734
+ _UnsafeRestQuery.prototype.handleInclude = async function () {
575
735
  if (this.include.length == 0) {
576
736
  return;
577
737
  }
578
-
579
- var pathResponse = includePath(this.config, this.auth, this.response, this.include[0], this.restOptions);
580
- if (pathResponse.then) {
581
- return pathResponse.then(newResponse => {
582
- this.response = newResponse;
583
- this.include = this.include.slice(1);
584
- return this.handleInclude();
738
+ const indexedResults = this.response.results.reduce((indexed, result, i) => {
739
+ indexed[result.objectId] = i;
740
+ return indexed;
741
+ }, {});
742
+
743
+ // Build the execution tree
744
+ const executionTree = {};
745
+ this.include.forEach(path => {
746
+ let current = executionTree;
747
+ path.forEach(node => {
748
+ if (!current[node]) {
749
+ current[node] = {
750
+ path,
751
+ children: {}
752
+ };
753
+ }
754
+ current = current[node].children;
585
755
  });
586
- } else if (this.include.length > 0) {
587
- this.include = this.include.slice(1);
588
- return this.handleInclude();
589
- }
590
-
591
- return pathResponse;
756
+ });
757
+ const recursiveExecutionTree = async treeNode => {
758
+ const {
759
+ path,
760
+ children
761
+ } = treeNode;
762
+ const pathResponse = includePath(this.config, this.auth, this.response, path, this.context, this.restOptions, this);
763
+ if (pathResponse.then) {
764
+ const newResponse = await pathResponse;
765
+ newResponse.results.forEach(newObject => {
766
+ // We hydrate the root of each result with sub results
767
+ this.response.results[indexedResults[newObject.objectId]][path[0]] = newObject[path[0]];
768
+ });
769
+ }
770
+ return Promise.all(Object.values(children).map(recursiveExecutionTree));
771
+ };
772
+ await Promise.all(Object.values(executionTree).map(recursiveExecutionTree));
773
+ this.include = [];
592
774
  };
593
775
 
594
776
  //Returns a promise of a processed set of results
595
- RestQuery.prototype.runAfterFindTrigger = function () {
777
+ _UnsafeRestQuery.prototype.runAfterFindTrigger = function () {
596
778
  if (!this.response) {
597
779
  return;
598
780
  }
781
+ if (!this.runAfterFind) {
782
+ return;
783
+ }
599
784
  // Avoid doing any setup for triggers if there is no 'afterFind' trigger for this class.
600
785
  const hasAfterFindHook = triggers.triggerExists(this.className, triggers.Types.afterFind, this.config.applicationId);
601
786
  if (!hasAfterFindHook) {
@@ -605,8 +790,12 @@ RestQuery.prototype.runAfterFindTrigger = function () {
605
790
  if (this.findOptions.pipeline || this.findOptions.distinct) {
606
791
  return Promise.resolve();
607
792
  }
793
+ const json = Object.assign({}, this.restOptions);
794
+ json.where = this.restWhere;
795
+ const parseQuery = new Parse.Query(this.className);
796
+ parseQuery.withJSON(json);
608
797
  // Run afterFind trigger and set the new results
609
- return triggers.maybeRunAfterFindTrigger(triggers.Types.afterFind, this.auth, this.className, this.response.results, this.config).then(results => {
798
+ return triggers.maybeRunAfterFindTrigger(triggers.Types.afterFind, this.auth, this.className, this.response.results, this.config, parseQuery, this.context, this.isGet).then(results => {
610
799
  // Ensure we properly set the className back
611
800
  if (this.redirectClassName) {
612
801
  this.response.results = results.map(object => {
@@ -621,11 +810,20 @@ RestQuery.prototype.runAfterFindTrigger = function () {
621
810
  }
622
811
  });
623
812
  };
813
+ _UnsafeRestQuery.prototype.handleAuthAdapters = async function () {
814
+ if (this.className !== '_User' || this.findOptions.explain) {
815
+ return;
816
+ }
817
+ await Promise.all(this.response.results.map(result => this.config.authDataManager.runAfterFind({
818
+ config: this.config,
819
+ auth: this.auth
820
+ }, result.authData)));
821
+ };
624
822
 
625
823
  // Adds included values to the response.
626
824
  // Path is a list of field names.
627
825
  // Returns a promise for an augmented response.
628
- function includePath(config, auth, response, path, restOptions = {}) {
826
+ function includePath(config, auth, response, path, context, restOptions = {}) {
629
827
  var pointers = findPointers(response.results, path);
630
828
  if (pointers.length == 0) {
631
829
  return response;
@@ -662,22 +860,57 @@ function includePath(config, auth, response, path, restOptions = {}) {
662
860
  includeRestOptions.keys = Array.from(keySet).join(',');
663
861
  }
664
862
  }
665
-
863
+ if (restOptions.excludeKeys) {
864
+ const excludeKeys = new Set(restOptions.excludeKeys.split(','));
865
+ const excludeKeySet = Array.from(excludeKeys).reduce((set, key) => {
866
+ const keyPath = key.split('.');
867
+ let i = 0;
868
+ for (i; i < path.length; i++) {
869
+ if (path[i] != keyPath[i]) {
870
+ return set;
871
+ }
872
+ }
873
+ if (i == keyPath.length - 1) {
874
+ set.add(keyPath[i]);
875
+ }
876
+ return set;
877
+ }, new Set());
878
+ if (excludeKeySet.size > 0) {
879
+ includeRestOptions.excludeKeys = Array.from(excludeKeySet).join(',');
880
+ }
881
+ }
666
882
  if (restOptions.includeReadPreference) {
667
883
  includeRestOptions.readPreference = restOptions.includeReadPreference;
668
884
  includeRestOptions.includeReadPreference = restOptions.includeReadPreference;
885
+ } else if (restOptions.readPreference) {
886
+ includeRestOptions.readPreference = restOptions.readPreference;
669
887
  }
670
-
671
- const queryPromises = Object.keys(pointersHash).map(className => {
888
+ const queryPromises = Object.keys(pointersHash).map(async className => {
672
889
  const objectIds = Array.from(pointersHash[className]);
673
890
  let where;
674
891
  if (objectIds.length === 1) {
675
- where = { 'objectId': objectIds[0] };
892
+ where = {
893
+ objectId: objectIds[0]
894
+ };
676
895
  } else {
677
- where = { 'objectId': { '$in': objectIds } };
896
+ where = {
897
+ objectId: {
898
+ $in: objectIds
899
+ }
900
+ };
678
901
  }
679
- var query = new RestQuery(config, auth, className, where, includeRestOptions);
680
- return query.execute({ op: 'get' }).then(results => {
902
+ const query = await RestQuery({
903
+ method: objectIds.length === 1 ? RestQuery.Method.get : RestQuery.Method.find,
904
+ config,
905
+ auth,
906
+ className,
907
+ restWhere: where,
908
+ restOptions: includeRestOptions,
909
+ context: context
910
+ });
911
+ return query.execute({
912
+ op: 'get'
913
+ }).then(results => {
681
914
  results.className = className;
682
915
  return Promise.resolve(results);
683
916
  });
@@ -689,8 +922,7 @@ function includePath(config, auth, response, path, restOptions = {}) {
689
922
  for (var obj of includeResponse.results) {
690
923
  obj.__type = 'Object';
691
924
  obj.className = includeResponse.className;
692
-
693
- if (obj.className == "_User" && !auth.isMaster) {
925
+ if (obj.className == '_User' && !auth.isMaster) {
694
926
  delete obj.sessionToken;
695
927
  delete obj.authData;
696
928
  }
@@ -698,7 +930,6 @@ function includePath(config, auth, response, path, restOptions = {}) {
698
930
  }
699
931
  return replace;
700
932
  }, {});
701
-
702
933
  var resp = {
703
934
  results: replacePointers(response.results, path, replace)
704
935
  };
@@ -716,24 +947,17 @@ function includePath(config, auth, response, path, restOptions = {}) {
716
947
  // Returns a list of pointers in REST format.
717
948
  function findPointers(object, path) {
718
949
  if (object instanceof Array) {
719
- var answer = [];
720
- for (var x of object) {
721
- answer = answer.concat(findPointers(x, path));
722
- }
723
- return answer;
950
+ return object.map(x => findPointers(x, path)).flat();
724
951
  }
725
-
726
952
  if (typeof object !== 'object' || !object) {
727
953
  return [];
728
954
  }
729
-
730
955
  if (path.length == 0) {
731
956
  if (object === null || object.__type == 'Pointer') {
732
957
  return [object];
733
958
  }
734
959
  return [];
735
960
  }
736
-
737
961
  var subobject = object[path[0]];
738
962
  if (!subobject) {
739
963
  return [];
@@ -751,18 +975,15 @@ function replacePointers(object, path, replace) {
751
975
  if (object instanceof Array) {
752
976
  return object.map(obj => replacePointers(obj, path, replace)).filter(obj => typeof obj !== 'undefined');
753
977
  }
754
-
755
978
  if (typeof object !== 'object' || !object) {
756
979
  return object;
757
980
  }
758
-
759
981
  if (path.length === 0) {
760
982
  if (object && object.__type === 'Pointer') {
761
983
  return replace[object.objectId];
762
984
  }
763
985
  return object;
764
986
  }
765
-
766
987
  var subobject = object[path[0]];
767
988
  if (!subobject) {
768
989
  return object;
@@ -803,6 +1024,7 @@ function findObjectWithKey(root, key) {
803
1024
  }
804
1025
  }
805
1026
  }
806
-
807
1027
  module.exports = RestQuery;
808
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9SZXN0UXVlcnkuanMiXSwibmFtZXMiOlsiU2NoZW1hQ29udHJvbGxlciIsInJlcXVpcmUiLCJQYXJzZSIsInRyaWdnZXJzIiwiQWx3YXlzU2VsZWN0ZWRLZXlzIiwiUmVzdFF1ZXJ5IiwiY29uZmlnIiwiYXV0aCIsImNsYXNzTmFtZSIsInJlc3RXaGVyZSIsInJlc3RPcHRpb25zIiwiY2xpZW50U0RLIiwicmVzcG9uc2UiLCJmaW5kT3B0aW9ucyIsImlzV3JpdGUiLCJpc01hc3RlciIsInVzZXIiLCJFcnJvciIsIklOVkFMSURfU0VTU0lPTl9UT0tFTiIsIl9fdHlwZSIsIm9iamVjdElkIiwiaWQiLCJkb0NvdW50IiwiaW5jbHVkZUFsbCIsImluY2x1ZGUiLCJoYXNPd25Qcm9wZXJ0eSIsImtleXNGb3JJbmNsdWRlIiwia2V5cyIsInNwbGl0IiwiZmlsdGVyIiwia2V5IiwibGVuZ3RoIiwibWFwIiwic2xpY2UiLCJsYXN0SW5kZXhPZiIsImpvaW4iLCJvcHRpb24iLCJjb25jYXQiLCJBcnJheSIsImZyb20iLCJTZXQiLCJmaWVsZHMiLCJvcmRlciIsInNvcnQiLCJyZWR1Y2UiLCJzb3J0TWFwIiwiZmllbGQiLCJ0cmltIiwic2NvcmUiLCIkbWV0YSIsInBhdGhzIiwicGF0aFNldCIsIm1lbW8iLCJwYXRoIiwiaW5kZXgiLCJwYXJ0cyIsIk9iamVjdCIsInMiLCJhIiwiYiIsInJlZGlyZWN0S2V5IiwicmVkaXJlY3RDbGFzc05hbWVGb3JLZXkiLCJyZWRpcmVjdENsYXNzTmFtZSIsIklOVkFMSURfSlNPTiIsInByb3RvdHlwZSIsImV4ZWN1dGUiLCJleGVjdXRlT3B0aW9ucyIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsImJ1aWxkUmVzdFdoZXJlIiwiaGFuZGxlSW5jbHVkZUFsbCIsInJ1bkZpbmQiLCJydW5Db3VudCIsImhhbmRsZUluY2x1ZGUiLCJydW5BZnRlckZpbmRUcmlnZ2VyIiwiZ2V0VXNlckFuZFJvbGVBQ0wiLCJ2YWxpZGF0ZUNsaWVudENsYXNzQ3JlYXRpb24iLCJyZXBsYWNlU2VsZWN0IiwicmVwbGFjZURvbnRTZWxlY3QiLCJyZXBsYWNlSW5RdWVyeSIsInJlcGxhY2VOb3RJblF1ZXJ5IiwicmVwbGFjZUVxdWFsaXR5IiwiZm9yV3JpdGUiLCJhY2wiLCJnZXRVc2VyUm9sZXMiLCJyb2xlcyIsImRhdGFiYXNlIiwibmV3Q2xhc3NOYW1lIiwiYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uIiwic3lzdGVtQ2xhc3NlcyIsImluZGV4T2YiLCJsb2FkU2NoZW1hIiwic2NoZW1hQ29udHJvbGxlciIsImhhc0NsYXNzIiwiT1BFUkFUSU9OX0ZPUkJJRERFTiIsInRyYW5zZm9ybUluUXVlcnkiLCJpblF1ZXJ5T2JqZWN0IiwicmVzdWx0cyIsInZhbHVlcyIsInJlc3VsdCIsInB1c2giLCJpc0FycmF5IiwiZmluZE9iamVjdFdpdGhLZXkiLCJpblF1ZXJ5VmFsdWUiLCJ3aGVyZSIsIklOVkFMSURfUVVFUlkiLCJhZGRpdGlvbmFsT3B0aW9ucyIsInN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UiLCJyZWFkUHJlZmVyZW5jZSIsInN1YnF1ZXJ5IiwidHJhbnNmb3JtTm90SW5RdWVyeSIsIm5vdEluUXVlcnlPYmplY3QiLCJub3RJblF1ZXJ5VmFsdWUiLCJ0cmFuc2Zvcm1TZWxlY3QiLCJzZWxlY3RPYmplY3QiLCJvYmplY3RzIiwibyIsImkiLCJzZWxlY3RWYWx1ZSIsInF1ZXJ5IiwidHJhbnNmb3JtRG9udFNlbGVjdCIsImRvbnRTZWxlY3RPYmplY3QiLCJkb250U2VsZWN0VmFsdWUiLCJjbGVhblJlc3VsdE9mU2Vuc2l0aXZlVXNlckluZm8iLCJwYXNzd29yZCIsInVzZXJTZW5zaXRpdmVGaWVsZHMiLCJjbGVhblJlc3VsdEF1dGhEYXRhIiwiYXV0aERhdGEiLCJmb3JFYWNoIiwicHJvdmlkZXIiLCJyZXBsYWNlRXF1YWxpdHlDb25zdHJhaW50IiwiY29uc3RyYWludCIsImVxdWFsVG9PYmplY3QiLCJoYXNEaXJlY3RDb25zdHJhaW50IiwiaGFzT3BlcmF0b3JDb25zdHJhaW50Iiwib3B0aW9ucyIsImxpbWl0IiwiYXNzaWduIiwib3AiLCJmaW5kIiwiZmlsZXNDb250cm9sbGVyIiwiZXhwYW5kRmlsZXNJbk9iamVjdCIsInIiLCJjb3VudCIsInNraXAiLCJjIiwiZ2V0T25lU2NoZW1hIiwic2NoZW1hIiwiaW5jbHVkZUZpZWxkcyIsImtleUZpZWxkcyIsInR5cGUiLCJwYXRoUmVzcG9uc2UiLCJpbmNsdWRlUGF0aCIsIm5ld1Jlc3BvbnNlIiwiaGFzQWZ0ZXJGaW5kSG9vayIsInRyaWdnZXJFeGlzdHMiLCJUeXBlcyIsImFmdGVyRmluZCIsImFwcGxpY2F0aW9uSWQiLCJwaXBlbGluZSIsImRpc3RpbmN0IiwibWF5YmVSdW5BZnRlckZpbmRUcmlnZ2VyIiwib2JqZWN0IiwidG9KU09OIiwicG9pbnRlcnMiLCJmaW5kUG9pbnRlcnMiLCJwb2ludGVyc0hhc2giLCJwb2ludGVyIiwiYWRkIiwiaW5jbHVkZVJlc3RPcHRpb25zIiwia2V5U2V0Iiwic2V0Iiwia2V5UGF0aCIsInNpemUiLCJpbmNsdWRlUmVhZFByZWZlcmVuY2UiLCJxdWVyeVByb21pc2VzIiwib2JqZWN0SWRzIiwiYWxsIiwicmVzcG9uc2VzIiwicmVwbGFjZSIsImluY2x1ZGVSZXNwb25zZSIsIm9iaiIsInNlc3Npb25Ub2tlbiIsInJlc3AiLCJyZXBsYWNlUG9pbnRlcnMiLCJhbnN3ZXIiLCJ4Iiwic3Vib2JqZWN0IiwibmV3c3ViIiwicm9vdCIsIml0ZW0iLCJzdWJrZXkiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7O0FBRUEsSUFBSUEsbUJBQW1CQyxRQUFRLGdDQUFSLENBQXZCO0FBQ0EsSUFBSUMsUUFBUUQsUUFBUSxZQUFSLEVBQXNCQyxLQUFsQztBQUNBLE1BQU1DLFdBQVdGLFFBQVEsWUFBUixDQUFqQjs7QUFFQSxNQUFNRyxxQkFBcUIsQ0FBQyxVQUFELEVBQWEsV0FBYixFQUEwQixXQUExQixDQUEzQjtBQUNBO0FBQ0E7QUFD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QUwsQ0FBbEIsRUFBZ0NsSyxHQUFoQyxDQUFmO0FBQ0EsUUFBSTRKLE1BQUosRUFBWTtBQUNWLGFBQU9BLE1BQVA7QUFDRDtBQUNGO0FBQ0Y7O0FBRURPLE9BQU9DLE9BQVAsR0FBaUI3TCxTQUFqQiIsImZpbGUiOiJSZXN0UXVlcnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIHJ1biBhICdmaW5kJ1xuLy8gb3BlcmF0aW9uLCBlbmNvZGVkIGluIHRoZSBSRVNUIEFQSSBmb3JtYXQuXG5cbnZhciBTY2hlbWFDb250cm9sbGVyID0gcmVxdWlyZSgnLi9Db250cm9sbGVycy9TY2hlbWFDb250cm9sbGVyJyk7XG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2U7XG5jb25zdCB0cmlnZ2VycyA9IHJlcXVpcmUoJy4vdHJpZ2dlcnMnKTtcblxuY29uc3QgQWx3YXlzU2VsZWN0ZWRLZXlzID0gWydvYmplY3RJZCcsICdjcmVhdGVkQXQnLCAndXBkYXRlZEF0J107XG4vLyByZXN0T3B0aW9ucyBjYW4gaW5jbHVkZTpcbi8vICAgc2tpcFxuLy8gICBsaW1pdFxuLy8gICBvcmRlclxuLy8gICBjb3VudFxuLy8gICBpbmNsdWRlXG4vLyAgIGtleXNcbi8vICAgcmVkaXJlY3RDbGFzc05hbWVGb3JLZXlcbmZ1bmN0aW9uIFJlc3RRdWVyeShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgcmVzdFdoZXJlID0ge30sIHJlc3RPcHRpb25zID0ge30sIGNsaWVudFNESykge1xuXG4gIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB0aGlzLmF1dGggPSBhdXRoO1xuICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgdGhpcy5yZXN0V2hlcmUgPSByZXN0V2hlcmU7XG4gIHRoaXMucmVzdE9wdGlvbnMgPSByZXN0T3B0aW9ucztcbiAgdGhpcy5jbGllbnRTREsgPSBjbGllbnRTREs7XG4gIHRoaXMucmVzcG9uc2UgPSBudWxsO1xuICB0aGlzLmZpbmRPcHRpb25zID0ge307XG4gIHRoaXMuaXNXcml0ZSA9IGZhbHNlO1xuXG4gIGlmICghdGhpcy5hdXRoLmlzTWFzdGVyKSB7XG4gICAgaWYgKHRoaXMuY2xhc3NOYW1lID09ICdfU2Vzc2lvbicpIHtcbiAgICAgIGlmICghdGhpcy5hdXRoLnVzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfU0VTU0lPTl9UT0tFTixcbiAgICAgICAgICAnSW52YWxpZCBzZXNzaW9uIHRva2VuJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlc3RXaGVyZSA9IHtcbiAgICAgICAgJyRhbmQnOiBbdGhpcy5yZXN0V2hlcmUsIHtcbiAgICAgICAgICAndXNlcic6IHtcbiAgICAgICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiAnX1VzZXInLFxuICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuYXV0aC51c2VyLmlkXG4gICAgICAgICAgfVxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmRvQ291bnQgPSBmYWxzZTtcbiAgdGhpcy5pbmNsdWRlQWxsID0gZmFsc2U7XG5cbiAgLy8gVGhlIGZvcm1hdCBmb3IgdGhpcy5pbmNsdWRlIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgZm9ybWF0IGZvciB0aGVcbiAgLy8gaW5jbHVkZSBvcHRpb24gLSBpdCdzIHRoZSBwYXRocyB3ZSBzaG91bGQgaW5jbHVkZSwgaW4gb3JkZXIsXG4gIC8vIHN0b3JlZCBhcyBhcnJheXMsIHRha2luZyBpbnRvIGFjY291bnQgdGhhdCB3ZSBuZWVkIHRvIGluY2x1ZGUgZm9vXG4gIC8vIGJlZm9yZSBpbmNsdWRpbmcgZm9vLmJhci4gQWxzbyBpdCBzaG91bGQgZGVkdXBlLlxuICAvLyBGb3IgZXhhbXBsZSwgcGFzc2luZyBhbiBhcmcgb2YgaW5jbHVkZT1mb28uYmFyLGZvby5iYXogY291bGQgbGVhZCB0b1xuICAvLyB0aGlzLmluY2x1ZGUgPSBbWydmb28nXSwgWydmb28nLCAnYmF6J10sIFsnZm9vJywgJ2JhciddXVxuICB0aGlzLmluY2x1ZGUgPSBbXTtcblxuICAvLyBJZiB3ZSBoYXZlIGtleXMsIHdlIHByb2JhYmx5IHdhbnQgdG8gZm9yY2Ugc29tZSBpbmNsdWRlcyAobi0xIGxldmVsKVxuICAvLyBTZWUgaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJzZS1jb21tdW5pdHkvcGFyc2Utc2VydmVyL2lzc3Vlcy8zMTg1XG4gIGlmIChyZXN0T3B0aW9ucy5oYXNPd25Qcm9wZXJ0eSgna2V5cycpKSB7XG4gICAgY29uc3Qga2V5c0ZvckluY2x1ZGUgPSByZXN0T3B0aW9ucy5rZXlzLnNwbGl0KCcsJykuZmlsdGVyKChrZXkpID0+IHtcbiAgICAgIC8vIEF0IGxlYXN0IDIgY29tcG9uZW50c1xuICAgICAgcmV0dXJuIGtleS5zcGxpdChcIi5cIikubGVuZ3RoID4gMTtcbiAgICB9KS5tYXAoKGtleSkgPT4ge1xuICAgICAgLy8gU2xpY2UgdGhlIGxhc3QgY29tcG9uZW50IChhLmIuYyAtPiBhLmIpXG4gICAgICAvLyBPdGhlcndpc2Ugd2UnbGwgaW5jbHVkZSBvbmUgbGV2ZWwgdG9vIG11Y2guXG4gICAgICByZXR1cm4ga2V5LnNsaWNlKDAsIGtleS5sYXN0SW5kZXhPZihcIi5cIikpO1xuICAgIH0pLmpvaW4oJywnKTtcblxuICAgIC8vIENvbmNhdCB0aGUgcG9zc2libHkgcHJlc2VudCBpbmNsdWRlIHN0cmluZyB3aXRoIHRoZSBvbmUgZnJvbSB0aGUga2V5c1xuICAgIC8vIERlZHVwIC8gc29ydGluZyBpcyBoYW5kbGUgaW4gJ2luY2x1ZGUnIGNhc2UuXG4gICAgaWYgKGtleXNGb3JJbmNsdWRlLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghcmVzdE9wdGlvbnMuaW5jbHVkZSB8fCByZXN0T3B0aW9ucy5pbmNsdWRlLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLmluY2x1ZGUgPSBrZXlzRm9ySW5jbHVkZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3RPcHRpb25zLmluY2x1ZGUgKz0gXCIsXCIgKyBrZXlzRm9ySW5jbHVkZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBvcHRpb24gaW4gcmVzdE9wdGlvbnMpIHtcbiAgICBzd2l0Y2gob3B0aW9uKSB7XG4gICAgY2FzZSAna2V5cyc6IHtcbiAgICAgIGNvbnN0IGtleXMgPSByZXN0T3B0aW9ucy5rZXlzLnNwbGl0KCcsJykuY29uY2F0KEFsd2F5c1NlbGVjdGVkS2V5cyk7XG4gICAgICB0aGlzLmtleXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoa2V5cykpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ2NvdW50JzpcbiAgICAgIHRoaXMuZG9Db3VudCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbmNsdWRlQWxsJzpcbiAgICAgIHRoaXMuaW5jbHVkZUFsbCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdkaXN0aW5jdCc6XG4gICAgY2FzZSAncGlwZWxpbmUnOlxuICAgIGNhc2UgJ3NraXAnOlxuICAgIGNhc2UgJ2xpbWl0JzpcbiAgICBjYXNlICdyZWFkUHJlZmVyZW5jZSc6XG4gICAgICB0aGlzLmZpbmRPcHRpb25zW29wdGlvbl0gPSByZXN0T3B0aW9uc1tvcHRpb25dO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnb3JkZXInOlxuICAgICAgdmFyIGZpZWxkcyA9IHJlc3RPcHRpb25zLm9yZGVyLnNwbGl0KCcsJyk7XG4gICAgICB0aGlzLmZpbmRPcHRpb25zLnNvcnQgPSBmaWVsZHMucmVkdWNlKChzb3J0TWFwLCBmaWVsZCkgPT4ge1xuICAgICAgICBmaWVsZCA9IGZpZWxkLnRyaW0oKTtcbiAgICAgICAgaWYgKGZpZWxkID09PSAnJHNjb3JlJykge1xuICAgICAgICAgIHNvcnRNYXAuc2NvcmUgPSB7JG1ldGE6ICd0ZXh0U2NvcmUnfTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZFswXSA9PSAnLScpIHtcbiAgICAgICAgICBzb3J0TWFwW2ZpZWxkLnNsaWNlKDEpXSA9IC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvcnRNYXBbZmllbGRdID0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc29ydE1hcDtcbiAgICAgIH0sIHt9KTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2luY2x1ZGUnOiB7XG4gICAgICBjb25zdCBwYXRocyA9IHJlc3RPcHRpb25zLmluY2x1ZGUuc3BsaXQoJywnKTtcbiAgICAgIC8vIExvYWQgdGhlIGV4aXN0aW5nIGluY2x1ZGVzIChmcm9tIGtleXMpXG4gICAgICBjb25zdCBwYXRoU2V0ID0gcGF0aHMucmVkdWNlKChtZW1vLCBwYXRoKSA9PiB7XG4gICAgICAgIC8vIFNwbGl0IGVhY2ggcGF0aHMgb24gLiAoYS5iLmMgLT4gW2EsYixjXSlcbiAgICAgICAgLy8gcmVkdWNlIHRvIGNyZWF0ZSBhbGwgcGF0aHNcbiAgICAgICAgLy8gKFthLGIsY10gLT4ge2E6IHRydWUsICdhLmInOiB0cnVlLCAnYS5iLmMnOiB0cnVlfSlcbiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKG1lbW8sIHBhdGgsIGluZGV4LCBwYXJ0cykgPT4ge1xuICAgICAgICAgIG1lbW9bcGFydHMuc2xpY2UoMCwgaW5kZXggKyAxKS5qb2luKCcuJyldID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgICAgfSwgbWVtbyk7XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIHRoaXMuaW5jbHVkZSA9IE9iamVjdC5rZXlzKHBhdGhTZXQpLm1hcCgocykgPT4ge1xuICAgICAgICByZXR1cm4gcy5zcGxpdCgnLicpO1xuICAgICAgfSkuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDsgLy8gU29ydCBieSBudW1iZXIgb2YgY29tcG9uZW50c1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAncmVkaXJlY3RDbGFzc05hbWVGb3JLZXknOlxuICAgICAgdGhpcy5yZWRpcmVjdEtleSA9IHJlc3RPcHRpb25zLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5O1xuICAgICAgdGhpcy5yZWRpcmVjdENsYXNzTmFtZSA9IG51bGw7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdpbmNsdWRlUmVhZFByZWZlcmVuY2UnOlxuICAgIGNhc2UgJ3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2UnOlxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sXG4gICAgICAgICdiYWQgb3B0aW9uOiAnICsgb3B0aW9uKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gQSBjb252ZW5pZW50IG1ldGhvZCB0byBwZXJmb3JtIGFsbCB0aGUgc3RlcHMgb2YgcHJvY2Vzc2luZyBhIHF1ZXJ5XG4vLyBpbiBvcmRlci5cbi8vIFJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgcmVzcG9uc2UgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25hbCBrZXlzXG4vLyAncmVzdWx0cycgYW5kICdjb3VudCcuXG4vLyBUT0RPOiBjb25zb2xpZGF0ZSB0aGUgcmVwbGFjZVggZnVuY3Rpb25zXG5SZXN0UXVlcnkucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbihleGVjdXRlT3B0aW9ucykge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRSZXN0V2hlcmUoKTtcbiAgfSkudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlSW5jbHVkZUFsbCgpO1xuICB9KS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5ydW5GaW5kKGV4ZWN1dGVPcHRpb25zKTtcbiAgfSkudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuQ291bnQoKTtcbiAgfSkudGhlbigoKSA9PiB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlSW5jbHVkZSgpO1xuICB9KS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5ydW5BZnRlckZpbmRUcmlnZ2VyKCk7XG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlO1xuICB9KTtcbn07XG5cblJlc3RRdWVyeS5wcm90b3R5cGUuYnVpbGRSZXN0V2hlcmUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmdldFVzZXJBbmRSb2xlQUNMKCk7XG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5KCk7XG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbigpO1xuICB9KS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlU2VsZWN0KCk7XG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2VEb250U2VsZWN0KCk7XG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2VJblF1ZXJ5KCk7XG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2VOb3RJblF1ZXJ5KCk7XG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2VFcXVhbGl0eSgpO1xuICB9KTtcbn1cblxuLy8gTWFya3MgdGhlIHF1ZXJ5IGZvciBhIHdyaXRlIGF0dGVtcHQsIHNvIHdlIHJlYWQgdGhlIHByb3BlciBBQ0wgKHdyaXRlIGluc3RlYWQgb2YgcmVhZClcblJlc3RRdWVyeS5wcm90b3R5cGUuZm9yV3JpdGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5pc1dyaXRlID0gdHJ1ZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8vIFVzZXMgdGhlIEF1dGggb2JqZWN0IHRvIGdldCB0aGUgbGlzdCBvZiByb2xlcywgYWRkcyB0aGUgdXNlciBpZFxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5nZXRVc2VyQW5kUm9sZUFDTCA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgdGhpcy5maW5kT3B0aW9ucy5hY2wgPSBbJyonXTtcblxuICBpZiAodGhpcy5hdXRoLnVzZXIpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmdldFVzZXJSb2xlcygpLnRoZW4oKHJvbGVzKSA9PiB7XG4gICAgICB0aGlzLmZpbmRPcHRpb25zLmFjbCA9IHRoaXMuZmluZE9wdGlvbnMuYWNsLmNvbmNhdChyb2xlcywgW3RoaXMuYXV0aC51c2VyLmlkXSk7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG59O1xuXG4vLyBDaGFuZ2VzIHRoZSBjbGFzc05hbWUgaWYgcmVkaXJlY3RDbGFzc05hbWVGb3JLZXkgaXMgc2V0LlxuLy8gUmV0dXJucyBhIHByb21pc2UuXG5SZXN0UXVlcnkucHJvdG90eXBlLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5ID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5yZWRpcmVjdEtleSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIFdlIG5lZWQgdG8gY2hhbmdlIHRoZSBjbGFzcyBuYW1lIGJhc2VkIG9uIHRoZSBzY2hlbWFcbiAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5KHRoaXMuY2xhc3NOYW1lLCB0aGlzLnJlZGlyZWN0S2V5KVxuICAgIC50aGVuKChuZXdDbGFzc05hbWUpID0+IHtcbiAgICAgIHRoaXMuY2xhc3NOYW1lID0gbmV3Q2xhc3NOYW1lO1xuICAgICAgdGhpcy5yZWRpcmVjdENsYXNzTmFtZSA9IG5ld0NsYXNzTmFtZTtcbiAgICB9KTtcbn07XG5cbi8vIFZhbGlkYXRlcyB0aGlzIG9wZXJhdGlvbiBhZ2FpbnN0IHRoZSBhbGxvd0NsaWVudENsYXNzQ3JlYXRpb24gY29uZmlnLlxuUmVzdFF1ZXJ5LnByb3RvdHlwZS52YWxpZGF0ZUNsaWVudENsYXNzQ3JlYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuY29uZmlnLmFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiA9PT0gZmFsc2UgJiYgIXRoaXMuYXV0aC5pc01hc3RlclxuICAgICAgJiYgU2NoZW1hQ29udHJvbGxlci5zeXN0ZW1DbGFzc2VzLmluZGV4T2YodGhpcy5jbGFzc05hbWUpID09PSAtMSkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5sb2FkU2NoZW1hKClcbiAgICAgIC50aGVuKHNjaGVtYUNvbnRyb2xsZXIgPT4gc2NoZW1hQ29udHJvbGxlci5oYXNDbGFzcyh0aGlzLmNsYXNzTmFtZSkpXG4gICAgICAudGhlbihoYXNDbGFzcyA9PiB7XG4gICAgICAgIGlmIChoYXNDbGFzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICAgICAgJ1RoaXMgdXNlciBpcyBub3QgYWxsb3dlZCB0byBhY2Nlc3MgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub24tZXhpc3RlbnQgY2xhc3M6ICcgKyB0aGlzLmNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtSW5RdWVyeShpblF1ZXJ5T2JqZWN0LCBjbGFzc05hbWUsIHJlc3VsdHMpIHtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIHZhbHVlcy5wdXNoKHtcbiAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICBvYmplY3RJZDogcmVzdWx0Lm9iamVjdElkXG4gICAgfSk7XG4gIH1cbiAgZGVsZXRlIGluUXVlcnlPYmplY3RbJyRpblF1ZXJ5J107XG4gIGlmIChBcnJheS5pc0FycmF5KGluUXVlcnlPYmplY3RbJyRpbiddKSkge1xuICAgIGluUXVlcnlPYmplY3RbJyRpbiddID0gaW5RdWVyeU9iamVjdFsnJGluJ10uY29uY2F0KHZhbHVlcyk7XG4gIH0gZWxzZSB7XG4gICAgaW5RdWVyeU9iamVjdFsnJGluJ10gPSB2YWx1ZXM7XG4gIH1cbn1cblxuLy8gUmVwbGFjZXMgYSAkaW5RdWVyeSBjbGF1c2UgYnkgcnVubmluZyB0aGUgc3VicXVlcnksIGlmIHRoZXJlIGlzIGFuXG4vLyAkaW5RdWVyeSBjbGF1c2UuXG4vLyBUaGUgJGluUXVlcnkgY2xhdXNlIHR1cm5zIGludG8gYW4gJGluIHdpdGggdmFsdWVzIHRoYXQgYXJlIGp1c3Rcbi8vIHBvaW50ZXJzIHRvIHRoZSBvYmplY3RzIHJldHVybmVkIGluIHRoZSBzdWJxdWVyeS5cblJlc3RRdWVyeS5wcm90b3R5cGUucmVwbGFjZUluUXVlcnkgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGluUXVlcnlPYmplY3QgPSBmaW5kT2JqZWN0V2l0aEtleSh0aGlzLnJlc3RXaGVyZSwgJyRpblF1ZXJ5Jyk7XG4gIGlmICghaW5RdWVyeU9iamVjdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSBpblF1ZXJ5IHZhbHVlIG11c3QgaGF2ZSBwcmVjaXNlbHkgdHdvIGtleXMgLSB3aGVyZSBhbmQgY2xhc3NOYW1lXG4gIHZhciBpblF1ZXJ5VmFsdWUgPSBpblF1ZXJ5T2JqZWN0WyckaW5RdWVyeSddO1xuICBpZiAoIWluUXVlcnlWYWx1ZS53aGVyZSB8fCAhaW5RdWVyeVZhbHVlLmNsYXNzTmFtZSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLFxuICAgICAgJ2ltcHJvcGVyIHVzYWdlIG9mICRpblF1ZXJ5Jyk7XG4gIH1cblxuICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcbiAgICByZWRpcmVjdENsYXNzTmFtZUZvcktleTogaW5RdWVyeVZhbHVlLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5XG4gIH07XG5cbiAgaWYgKHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gIH1cblxuICB2YXIgc3VicXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KFxuICAgIHRoaXMuY29uZmlnLCB0aGlzLmF1dGgsIGluUXVlcnlWYWx1ZS5jbGFzc05hbWUsXG4gICAgaW5RdWVyeVZhbHVlLndoZXJlLCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gIHJldHVybiBzdWJxdWVyeS5leGVjdXRlKCkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICB0cmFuc2Zvcm1JblF1ZXJ5KGluUXVlcnlPYmplY3QsIHN1YnF1ZXJ5LmNsYXNzTmFtZSwgcmVzcG9uc2UucmVzdWx0cyk7XG4gICAgLy8gUmVjdXJzZSB0byByZXBlYXRcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlSW5RdWVyeSgpO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybU5vdEluUXVlcnkobm90SW5RdWVyeU9iamVjdCwgY2xhc3NOYW1lLCByZXN1bHRzKSB7XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgZm9yICh2YXIgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICB2YWx1ZXMucHVzaCh7XG4gICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgb2JqZWN0SWQ6IHJlc3VsdC5vYmplY3RJZFxuICAgIH0pO1xuICB9XG4gIGRlbGV0ZSBub3RJblF1ZXJ5T2JqZWN0Wyckbm90SW5RdWVyeSddO1xuICBpZiAoQXJyYXkuaXNBcnJheShub3RJblF1ZXJ5T2JqZWN0WyckbmluJ10pKSB7XG4gICAgbm90SW5RdWVyeU9iamVjdFsnJG5pbiddID0gbm90SW5RdWVyeU9iamVjdFsnJG5pbiddLmNvbmNhdCh2YWx1ZXMpO1xuICB9IGVsc2Uge1xuICAgIG5vdEluUXVlcnlPYmplY3RbJyRuaW4nXSA9IHZhbHVlcztcbiAgfVxufVxuXG4vLyBSZXBsYWNlcyBhICRub3RJblF1ZXJ5IGNsYXVzZSBieSBydW5uaW5nIHRoZSBzdWJxdWVyeSwgaWYgdGhlcmUgaXMgYW5cbi8vICRub3RJblF1ZXJ5IGNsYXVzZS5cbi8vIFRoZSAkbm90SW5RdWVyeSBjbGF1c2UgdHVybnMgaW50byBhICRuaW4gd2l0aCB2YWx1ZXMgdGhhdCBhcmUganVzdFxuLy8gcG9pbnRlcnMgdG8gdGhlIG9iamVjdHMgcmV0dXJuZWQgaW4gdGhlIHN1YnF1ZXJ5LlxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5yZXBsYWNlTm90SW5RdWVyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbm90SW5RdWVyeU9iamVjdCA9IGZpbmRPYmplY3RXaXRoS2V5KHRoaXMucmVzdFdoZXJlLCAnJG5vdEluUXVlcnknKTtcbiAgaWYgKCFub3RJblF1ZXJ5T2JqZWN0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVGhlIG5vdEluUXVlcnkgdmFsdWUgbXVzdCBoYXZlIHByZWNpc2VseSB0d28ga2V5cyAtIHdoZXJlIGFuZCBjbGFzc05hbWVcbiAgdmFyIG5vdEluUXVlcnlWYWx1ZSA9IG5vdEluUXVlcnlPYmplY3RbJyRub3RJblF1ZXJ5J107XG4gIGlmICghbm90SW5RdWVyeVZhbHVlLndoZXJlIHx8ICFub3RJblF1ZXJ5VmFsdWUuY2xhc3NOYW1lKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksXG4gICAgICAnaW1wcm9wZXIgdXNhZ2Ugb2YgJG5vdEluUXVlcnknKTtcbiAgfVxuXG4gIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xuICAgIHJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5OiBub3RJblF1ZXJ5VmFsdWUucmVkaXJlY3RDbGFzc05hbWVGb3JLZXlcbiAgfTtcblxuICBpZiAodGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgYWRkaXRpb25hbE9wdGlvbnMucmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gICAgYWRkaXRpb25hbE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSA9IHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZTtcbiAgfVxuXG4gIHZhciBzdWJxdWVyeSA9IG5ldyBSZXN0UXVlcnkoXG4gICAgdGhpcy5jb25maWcsIHRoaXMuYXV0aCwgbm90SW5RdWVyeVZhbHVlLmNsYXNzTmFtZSxcbiAgICBub3RJblF1ZXJ5VmFsdWUud2hlcmUsIGFkZGl0aW9uYWxPcHRpb25zKTtcbiAgcmV0dXJuIHN1YnF1ZXJ5LmV4ZWN1dGUoKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgIHRyYW5zZm9ybU5vdEluUXVlcnkobm90SW5RdWVyeU9iamVjdCwgc3VicXVlcnkuY2xhc3NOYW1lLCByZXNwb25zZS5yZXN1bHRzKTtcbiAgICAvLyBSZWN1cnNlIHRvIHJlcGVhdFxuICAgIHJldHVybiB0aGlzLnJlcGxhY2VOb3RJblF1ZXJ5KCk7XG4gIH0pO1xufTtcblxuY29uc3QgdHJhbnNmb3JtU2VsZWN0ID0gKHNlbGVjdE9iamVjdCwga2V5ICxvYmplY3RzKSA9PiB7XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgZm9yICh2YXIgcmVzdWx0IG9mIG9iamVjdHMpIHtcbiAgICB2YWx1ZXMucHVzaChrZXkuc3BsaXQoJy4nKS5yZWR1Y2UoKG8saSk9Pm9baV0sIHJlc3VsdCkpO1xuICB9XG4gIGRlbGV0ZSBzZWxlY3RPYmplY3RbJyRzZWxlY3QnXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0T2JqZWN0WyckaW4nXSkpIHtcbiAgICBzZWxlY3RPYmplY3RbJyRpbiddID0gc2VsZWN0T2JqZWN0WyckaW4nXS5jb25jYXQodmFsdWVzKTtcbiAgfSBlbHNlIHtcbiAgICBzZWxlY3RPYmplY3RbJyRpbiddID0gdmFsdWVzO1xuICB9XG59XG5cbi8vIFJlcGxhY2VzIGEgJHNlbGVjdCBjbGF1c2UgYnkgcnVubmluZyB0aGUgc3VicXVlcnksIGlmIHRoZXJlIGlzIGFcbi8vICRzZWxlY3QgY2xhdXNlLlxuLy8gVGhlICRzZWxlY3QgY2xhdXNlIHR1cm5zIGludG8gYW4gJGluIHdpdGggdmFsdWVzIHNlbGVjdGVkIG91dCBvZlxuLy8gdGhlIHN1YnF1ZXJ5LlxuLy8gUmV0dXJucyBhIHBvc3NpYmxlLXByb21pc2UuXG5SZXN0UXVlcnkucHJvdG90eXBlLnJlcGxhY2VTZWxlY3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNlbGVjdE9iamVjdCA9IGZpbmRPYmplY3RXaXRoS2V5KHRoaXMucmVzdFdoZXJlLCAnJHNlbGVjdCcpO1xuICBpZiAoIXNlbGVjdE9iamVjdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSBzZWxlY3QgdmFsdWUgbXVzdCBoYXZlIHByZWNpc2VseSB0d28ga2V5cyAtIHF1ZXJ5IGFuZCBrZXlcbiAgdmFyIHNlbGVjdFZhbHVlID0gc2VsZWN0T2JqZWN0Wyckc2VsZWN0J107XG4gIC8vIGlPUyBTREsgZG9uJ3Qgc2VuZCB3aGVyZSBpZiBub3Qgc2V0LCBsZXQgaXQgcGFzc1xuICBpZiAoIXNlbGVjdFZhbHVlLnF1ZXJ5IHx8XG4gICAgICAhc2VsZWN0VmFsdWUua2V5IHx8XG4gICAgICB0eXBlb2Ygc2VsZWN0VmFsdWUucXVlcnkgIT09ICdvYmplY3QnIHx8XG4gICAgICAhc2VsZWN0VmFsdWUucXVlcnkuY2xhc3NOYW1lIHx8XG4gICAgICBPYmplY3Qua2V5cyhzZWxlY3RWYWx1ZSkubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksXG4gICAgICAnaW1wcm9wZXIgdXNhZ2Ugb2YgJHNlbGVjdCcpO1xuICB9XG5cbiAgY29uc3QgYWRkaXRpb25hbE9wdGlvbnMgPSB7XG4gICAgcmVkaXJlY3RDbGFzc05hbWVGb3JLZXk6IHNlbGVjdFZhbHVlLnF1ZXJ5LnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5XG4gIH07XG5cbiAgaWYgKHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gIH1cblxuICB2YXIgc3VicXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KFxuICAgIHRoaXMuY29uZmlnLCB0aGlzLmF1dGgsIHNlbGVjdFZhbHVlLnF1ZXJ5LmNsYXNzTmFtZSxcbiAgICBzZWxlY3RWYWx1ZS5xdWVyeS53aGVyZSwgYWRkaXRpb25hbE9wdGlvbnMpO1xuICByZXR1cm4gc3VicXVlcnkuZXhlY3V0ZSgpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgdHJhbnNmb3JtU2VsZWN0KHNlbGVjdE9iamVjdCwgc2VsZWN0VmFsdWUua2V5LCByZXNwb25zZS5yZXN1bHRzKTtcbiAgICAvLyBLZWVwIHJlcGxhY2luZyAkc2VsZWN0IGNsYXVzZXNcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlU2VsZWN0KCk7XG4gIH0pXG59O1xuXG5jb25zdCB0cmFuc2Zvcm1Eb250U2VsZWN0ID0gKGRvbnRTZWxlY3RPYmplY3QsIGtleSwgb2JqZWN0cykgPT4ge1xuICB2YXIgdmFsdWVzID0gW107XG4gIGZvciAodmFyIHJlc3VsdCBvZiBvYmplY3RzKSB7XG4gICAgdmFsdWVzLnB1c2goa2V5LnNwbGl0KCcuJykucmVkdWNlKChvLGkpPT5vW2ldLCByZXN1bHQpKTtcbiAgfVxuICBkZWxldGUgZG9udFNlbGVjdE9iamVjdFsnJGRvbnRTZWxlY3QnXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZG9udFNlbGVjdE9iamVjdFsnJG5pbiddKSkge1xuICAgIGRvbnRTZWxlY3RPYmplY3RbJyRuaW4nXSA9IGRvbnRTZWxlY3RPYmplY3RbJyRuaW4nXS5jb25jYXQodmFsdWVzKTtcbiAgfSBlbHNlIHtcbiAgICBkb250U2VsZWN0T2JqZWN0WyckbmluJ10gPSB2YWx1ZXM7XG4gIH1cbn1cblxuLy8gUmVwbGFjZXMgYSAkZG9udFNlbGVjdCBjbGF1c2UgYnkgcnVubmluZyB0aGUgc3VicXVlcnksIGlmIHRoZXJlIGlzIGFcbi8vICRkb250U2VsZWN0IGNsYXVzZS5cbi8vIFRoZSAkZG9udFNlbGVjdCBjbGF1c2UgdHVybnMgaW50byBhbiAkbmluIHdpdGggdmFsdWVzIHNlbGVjdGVkIG91dCBvZlxuLy8gdGhlIHN1YnF1ZXJ5LlxuLy8gUmV0dXJucyBhIHBvc3NpYmxlLXByb21pc2UuXG5SZXN0UXVlcnkucHJvdG90eXBlLnJlcGxhY2VEb250U2VsZWN0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBkb250U2VsZWN0T2JqZWN0ID0gZmluZE9iamVjdFdpdGhLZXkodGhpcy5yZXN0V2hlcmUsICckZG9udFNlbGVjdCcpO1xuICBpZiAoIWRvbnRTZWxlY3RPYmplY3QpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgZG9udFNlbGVjdCB2YWx1ZSBtdXN0IGhhdmUgcHJlY2lzZWx5IHR3byBrZXlzIC0gcXVlcnkgYW5kIGtleVxuICB2YXIgZG9udFNlbGVjdFZhbHVlID0gZG9udFNlbGVjdE9iamVjdFsnJGRvbnRTZWxlY3QnXTtcbiAgaWYgKCFkb250U2VsZWN0VmFsdWUucXVlcnkgfHxcbiAgICAgICFkb250U2VsZWN0VmFsdWUua2V5IHx8XG4gICAgICB0eXBlb2YgZG9udFNlbGVjdFZhbHVlLnF1ZXJ5ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgIWRvbnRTZWxlY3RWYWx1ZS5xdWVyeS5jbGFzc05hbWUgfHxcbiAgICAgIE9iamVjdC5rZXlzKGRvbnRTZWxlY3RWYWx1ZSkubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksXG4gICAgICAnaW1wcm9wZXIgdXNhZ2Ugb2YgJGRvbnRTZWxlY3QnKTtcbiAgfVxuICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcbiAgICByZWRpcmVjdENsYXNzTmFtZUZvcktleTogZG9udFNlbGVjdFZhbHVlLnF1ZXJ5LnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5XG4gIH07XG5cbiAgaWYgKHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gIH1cblxuICB2YXIgc3VicXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KFxuICAgIHRoaXMuY29uZmlnLCB0aGlzLmF1dGgsIGRvbnRTZWxlY3RWYWx1ZS5xdWVyeS5jbGFzc05hbWUsXG4gICAgZG9udFNlbGVjdFZhbHVlLnF1ZXJ5LndoZXJlLCBhZGRpdGlvbmFsT3B0aW9ucyk7XG4gIHJldHVybiBzdWJxdWVyeS5leGVjdXRlKCkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICB0cmFuc2Zvcm1Eb250U2VsZWN0KGRvbnRTZWxlY3RPYmplY3QsIGRvbnRTZWxlY3RWYWx1ZS5rZXksIHJlc3BvbnNlLnJlc3VsdHMpO1xuICAgIC8vIEtlZXAgcmVwbGFjaW5nICRkb250U2VsZWN0IGNsYXVzZXNcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlRG9udFNlbGVjdCgpO1xuICB9KVxufTtcblxuY29uc3QgY2xlYW5SZXN1bHRPZlNlbnNpdGl2ZVVzZXJJbmZvID0gZnVuY3Rpb24gKHJlc3VsdCwgYXV0aCwgY29uZmlnKSB7XG4gIGRlbGV0ZSByZXN1bHQucGFzc3dvcmQ7XG5cbiAgaWYgKGF1dGguaXNNYXN0ZXIgfHwgKGF1dGgudXNlciAmJiBhdXRoLnVzZXIuaWQgPT09IHJlc3VsdC5vYmplY3RJZCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IGZpZWxkIG9mIGNvbmZpZy51c2VyU2Vuc2l0aXZlRmllbGRzKSB7XG4gICAgZGVsZXRlIHJlc3VsdFtmaWVsZF07XG4gIH1cbn07XG5cbmNvbnN0IGNsZWFuUmVzdWx0QXV0aERhdGEgPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gIGlmIChyZXN1bHQuYXV0aERhdGEpIHtcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQuYXV0aERhdGEpLmZvckVhY2goKHByb3ZpZGVyKSA9PiB7XG4gICAgICBpZiAocmVzdWx0LmF1dGhEYXRhW3Byb3ZpZGVyXSA9PT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgcmVzdWx0LmF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhyZXN1bHQuYXV0aERhdGEpLmxlbmd0aCA9PSAwKSB7XG4gICAgICBkZWxldGUgcmVzdWx0LmF1dGhEYXRhO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgcmVwbGFjZUVxdWFsaXR5Q29uc3RyYWludCA9IChjb25zdHJhaW50KSA9PiB7XG4gIGlmICh0eXBlb2YgY29uc3RyYWludCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gY29uc3RyYWludDtcbiAgfVxuICBjb25zdCBlcXVhbFRvT2JqZWN0ID0ge307XG4gIGxldCBoYXNEaXJlY3RDb25zdHJhaW50ID0gZmFsc2U7XG4gIGxldCBoYXNPcGVyYXRvckNvbnN0cmFpbnQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgaW4gY29uc3RyYWludCkge1xuICAgIGlmIChrZXkuaW5kZXhPZignJCcpICE9PSAwKSB7XG4gICAgICBoYXNEaXJlY3RDb25zdHJhaW50ID0gdHJ1ZTtcbiAgICAgIGVxdWFsVG9PYmplY3Rba2V5XSA9IGNvbnN0cmFpbnRba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFzT3BlcmF0b3JDb25zdHJhaW50ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKGhhc0RpcmVjdENvbnN0cmFpbnQgJiYgaGFzT3BlcmF0b3JDb25zdHJhaW50KSB7XG4gICAgY29uc3RyYWludFsnJGVxJ10gPSBlcXVhbFRvT2JqZWN0O1xuICAgIE9iamVjdC5rZXlzKGVxdWFsVG9PYmplY3QpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgZGVsZXRlIGNvbnN0cmFpbnRba2V5XTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29uc3RyYWludDtcbn1cblxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5yZXBsYWNlRXF1YWxpdHkgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHR5cGVvZiB0aGlzLnJlc3RXaGVyZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5yZXN0V2hlcmUpIHtcbiAgICB0aGlzLnJlc3RXaGVyZVtrZXldID0gcmVwbGFjZUVxdWFsaXR5Q29uc3RyYWludCh0aGlzLnJlc3RXaGVyZVtrZXldKTtcbiAgfVxufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3Igd2hldGhlciBpdCB3YXMgc3VjY2Vzc2Z1bC5cbi8vIFBvcHVsYXRlcyB0aGlzLnJlc3BvbnNlIHdpdGggYW4gb2JqZWN0IHRoYXQgb25seSBoYXMgJ3Jlc3VsdHMnLlxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5ydW5GaW5kID0gZnVuY3Rpb24ob3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0aGlzLmZpbmRPcHRpb25zLmxpbWl0ID09PSAwKSB7XG4gICAgdGhpcy5yZXNwb25zZSA9IHtyZXN1bHRzOiBbXX07XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG4gIGNvbnN0IGZpbmRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5maW5kT3B0aW9ucyk7XG4gIGlmICh0aGlzLmtleXMpIHtcbiAgICBmaW5kT3B0aW9ucy5rZXlzID0gdGhpcy5rZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICByZXR1cm4ga2V5LnNwbGl0KCcuJylbMF07XG4gICAgfSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMub3ApIHtcbiAgICBmaW5kT3B0aW9ucy5vcCA9IG9wdGlvbnMub3A7XG4gIH1cbiAgaWYgKHRoaXMuaXNXcml0ZSkge1xuICAgIGZpbmRPcHRpb25zLmlzV3JpdGUgPSB0cnVlO1xuICB9XG4gIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKHRoaXMuY2xhc3NOYW1lLCB0aGlzLnJlc3RXaGVyZSwgZmluZE9wdGlvbnMpXG4gICAgLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgICAgICBmb3IgKHZhciByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgIGNsZWFuUmVzdWx0T2ZTZW5zaXRpdmVVc2VySW5mbyhyZXN1bHQsIHRoaXMuYXV0aCwgdGhpcy5jb25maWcpO1xuICAgICAgICAgIGNsZWFuUmVzdWx0QXV0aERhdGEocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbmZpZy5maWxlc0NvbnRyb2xsZXIuZXhwYW5kRmlsZXNJbk9iamVjdCh0aGlzLmNvbmZpZywgcmVzdWx0cyk7XG5cbiAgICAgIGlmICh0aGlzLnJlZGlyZWN0Q2xhc3NOYW1lKSB7XG4gICAgICAgIGZvciAodmFyIHIgb2YgcmVzdWx0cykge1xuICAgICAgICAgIHIuY2xhc3NOYW1lID0gdGhpcy5yZWRpcmVjdENsYXNzTmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5yZXNwb25zZSA9IHtyZXN1bHRzOiByZXN1bHRzfTtcbiAgICB9KTtcbn07XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIGZvciB3aGV0aGVyIGl0IHdhcyBzdWNjZXNzZnVsLlxuLy8gUG9wdWxhdGVzIHRoaXMucmVzcG9uc2UuY291bnQgd2l0aCB0aGUgY291bnRcblJlc3RRdWVyeS5wcm90b3R5cGUucnVuQ291bnQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLmRvQ291bnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5maW5kT3B0aW9ucy5jb3VudCA9IHRydWU7XG4gIGRlbGV0ZSB0aGlzLmZpbmRPcHRpb25zLnNraXA7XG4gIGRlbGV0ZSB0aGlzLmZpbmRPcHRpb25zLmxpbWl0O1xuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UuZmluZCh0aGlzLmNsYXNzTmFtZSwgdGhpcy5yZXN0V2hlcmUsIHRoaXMuZmluZE9wdGlvbnMpXG4gICAgLnRoZW4oKGMpID0+IHtcbiAgICAgIHRoaXMucmVzcG9uc2UuY291bnQgPSBjO1xuICAgIH0pO1xufTtcblxuLy8gQXVnbWVudHMgdGhpcy5yZXNwb25zZSB3aXRoIGFsbCBwb2ludGVycyBvbiBhbiBvYmplY3RcblJlc3RRdWVyeS5wcm90b3R5cGUuaGFuZGxlSW5jbHVkZUFsbCA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMuaW5jbHVkZUFsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UubG9hZFNjaGVtYSgpXG4gICAgLnRoZW4oc2NoZW1hQ29udHJvbGxlciA9PiBzY2hlbWFDb250cm9sbGVyLmdldE9uZVNjaGVtYSh0aGlzLmNsYXNzTmFtZSkpXG4gICAgLnRoZW4oc2NoZW1hID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVGaWVsZHMgPSBbXTtcbiAgICAgIGNvbnN0IGtleUZpZWxkcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBzY2hlbWEuZmllbGRzKSB7XG4gICAgICAgIGlmIChzY2hlbWEuZmllbGRzW2ZpZWxkXS50eXBlICYmIHNjaGVtYS5maWVsZHNbZmllbGRdLnR5cGUgPT09ICdQb2ludGVyJykge1xuICAgICAgICAgIGluY2x1ZGVGaWVsZHMucHVzaChbZmllbGRdKTtcbiAgICAgICAgICBrZXlGaWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEFkZCBmaWVsZHMgdG8gaW5jbHVkZSwga2V5cywgcmVtb3ZlIGR1cHNcbiAgICAgIHRoaXMuaW5jbHVkZSA9IFsuLi5uZXcgU2V0KFsuLi50aGlzLmluY2x1ZGUsIC4uLmluY2x1ZGVGaWVsZHNdKV07XG4gICAgICAvLyBpZiB0aGlzLmtleXMgbm90IHNldCwgdGhlbiBhbGwga2V5cyBhcmUgYWxyZWFkeSBpbmNsdWRlZFxuICAgICAgaWYgKHRoaXMua2V5cykge1xuICAgICAgICB0aGlzLmtleXMgPSBbLi4ubmV3IFNldChbLi4udGhpcy5rZXlzLCAuLi5rZXlGaWVsZHNdKV07XG4gICAgICB9XG4gICAgfSk7XG59O1xuXG4vLyBBdWdtZW50cyB0aGlzLnJlc3BvbnNlIHdpdGggZGF0YSBhdCB0aGUgcGF0aHMgcHJvdmlkZWQgaW4gdGhpcy5pbmNsdWRlLlxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5oYW5kbGVJbmNsdWRlID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmluY2x1ZGUubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGF0aFJlc3BvbnNlID0gaW5jbHVkZVBhdGgodGhpcy5jb25maWcsIHRoaXMuYXV0aCxcbiAgICB0aGlzLnJlc3BvbnNlLCB0aGlzLmluY2x1ZGVbMF0sIHRoaXMucmVzdE9wdGlvbnMpO1xuICBpZiAocGF0aFJlc3BvbnNlLnRoZW4pIHtcbiAgICByZXR1cm4gcGF0aFJlc3BvbnNlLnRoZW4oKG5ld1Jlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLnJlc3BvbnNlID0gbmV3UmVzcG9uc2U7XG4gICAgICB0aGlzLmluY2x1ZGUgPSB0aGlzLmluY2x1ZGUuc2xpY2UoMSk7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVJbmNsdWRlKCk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodGhpcy5pbmNsdWRlLmxlbmd0aCA+IDApIHtcbiAgICB0aGlzLmluY2x1ZGUgPSB0aGlzLmluY2x1ZGUuc2xpY2UoMSk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlSW5jbHVkZSgpO1xuICB9XG5cbiAgcmV0dXJuIHBhdGhSZXNwb25zZTtcbn07XG5cbi8vUmV0dXJucyBhIHByb21pc2Ugb2YgYSBwcm9jZXNzZWQgc2V0IG9mIHJlc3VsdHNcblJlc3RRdWVyeS5wcm90b3R5cGUucnVuQWZ0ZXJGaW5kVHJpZ2dlciA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMucmVzcG9uc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gQXZvaWQgZG9pbmcgYW55IHNldHVwIGZvciB0cmlnZ2VycyBpZiB0aGVyZSBpcyBubyAnYWZ0ZXJGaW5kJyB0cmlnZ2VyIGZvciB0aGlzIGNsYXNzLlxuICBjb25zdCBoYXNBZnRlckZpbmRIb29rID0gdHJpZ2dlcnMudHJpZ2dlckV4aXN0cyh0aGlzLmNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYWZ0ZXJGaW5kLCB0aGlzLmNvbmZpZy5hcHBsaWNhdGlvbklkKTtcbiAgaWYgKCFoYXNBZnRlckZpbmRIb29rKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG4gIC8vIFNraXAgQWdncmVnYXRlIGFuZCBEaXN0aW5jdCBRdWVyaWVzXG4gIGlmICh0aGlzLmZpbmRPcHRpb25zLnBpcGVsaW5lIHx8IHRoaXMuZmluZE9wdGlvbnMuZGlzdGluY3QpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgLy8gUnVuIGFmdGVyRmluZCB0cmlnZ2VyIGFuZCBzZXQgdGhlIG5ldyByZXN1bHRzXG4gIHJldHVybiB0cmlnZ2Vycy5tYXliZVJ1bkFmdGVyRmluZFRyaWdnZXIodHJpZ2dlcnMuVHlwZXMuYWZ0ZXJGaW5kLCB0aGlzLmF1dGgsIHRoaXMuY2xhc3NOYW1lLHRoaXMucmVzcG9uc2UucmVzdWx0cywgdGhpcy5jb25maWcpLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAvLyBFbnN1cmUgd2UgcHJvcGVybHkgc2V0IHRoZSBjbGFzc05hbWUgYmFja1xuICAgIGlmICh0aGlzLnJlZGlyZWN0Q2xhc3NOYW1lKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlLnJlc3VsdHMgPSByZXN1bHRzLm1hcCgob2JqZWN0KSA9PiB7XG4gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQYXJzZS5PYmplY3QpIHtcbiAgICAgICAgICBvYmplY3QgPSBvYmplY3QudG9KU09OKCk7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0LmNsYXNzTmFtZSA9IHRoaXMucmVkaXJlY3RDbGFzc05hbWU7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXNwb25zZS5yZXN1bHRzID0gcmVzdWx0cztcbiAgICB9XG4gIH0pO1xufTtcblxuLy8gQWRkcyBpbmNsdWRlZCB2YWx1ZXMgdG8gdGhlIHJlc3BvbnNlLlxuLy8gUGF0aCBpcyBhIGxpc3Qgb2YgZmllbGQgbmFtZXMuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gYXVnbWVudGVkIHJlc3BvbnNlLlxuZnVuY3Rpb24gaW5jbHVkZVBhdGgoY29uZmlnLCBhdXRoLCByZXNwb25zZSwgcGF0aCwgcmVzdE9wdGlvbnMgPSB7fSkge1xuICB2YXIgcG9pbnRlcnMgPSBmaW5kUG9pbnRlcnMocmVzcG9uc2UucmVzdWx0cywgcGF0aCk7XG4gIGlmIChwb2ludGVycy5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuICBjb25zdCBwb2ludGVyc0hhc2ggPSB7fTtcbiAgZm9yICh2YXIgcG9pbnRlciBvZiBwb2ludGVycykge1xuICAgIGlmICghcG9pbnRlcikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHBvaW50ZXIuY2xhc3NOYW1lO1xuICAgIC8vIG9ubHkgaW5jbHVkZSB0aGUgZ29vZCBwb2ludGVyc1xuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIHBvaW50ZXJzSGFzaFtjbGFzc05hbWVdID0gcG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0gfHwgbmV3IFNldCgpO1xuICAgICAgcG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0uYWRkKHBvaW50ZXIub2JqZWN0SWQpO1xuICAgIH1cbiAgfVxuICBjb25zdCBpbmNsdWRlUmVzdE9wdGlvbnMgPSB7fTtcbiAgaWYgKHJlc3RPcHRpb25zLmtleXMpIHtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldChyZXN0T3B0aW9ucy5rZXlzLnNwbGl0KCcsJykpO1xuICAgIGNvbnN0IGtleVNldCA9IEFycmF5LmZyb20oa2V5cykucmVkdWNlKChzZXQsIGtleSkgPT4ge1xuICAgICAgY29uc3Qga2V5UGF0aCA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yIChpOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0aFtpXSAhPSBrZXlQYXRoW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIHNldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPCBrZXlQYXRoLmxlbmd0aCkge1xuICAgICAgICBzZXQuYWRkKGtleVBhdGhbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldDtcbiAgICB9LCBuZXcgU2V0KCkpO1xuICAgIGlmIChrZXlTZXQuc2l6ZSA+IDApIHtcbiAgICAgIGluY2x1ZGVSZXN0T3B0aW9ucy5rZXlzID0gQXJyYXkuZnJvbShrZXlTZXQpLmpvaW4oJywnKTtcbiAgICB9XG4gIH1cblxuICBpZiAocmVzdE9wdGlvbnMuaW5jbHVkZVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgaW5jbHVkZVJlc3RPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gcmVzdE9wdGlvbnMuaW5jbHVkZVJlYWRQcmVmZXJlbmNlO1xuICAgIGluY2x1ZGVSZXN0T3B0aW9ucy5pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSByZXN0T3B0aW9ucy5pbmNsdWRlUmVhZFByZWZlcmVuY2U7XG4gIH1cblxuICBjb25zdCBxdWVyeVByb21pc2VzID0gT2JqZWN0LmtleXMocG9pbnRlcnNIYXNoKS5tYXAoKGNsYXNzTmFtZSkgPT4ge1xuICAgIGNvbnN0IG9iamVjdElkcyA9IEFycmF5LmZyb20ocG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0pO1xuICAgIGxldCB3aGVyZTtcbiAgICBpZiAob2JqZWN0SWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgd2hlcmUgPSB7J29iamVjdElkJzogb2JqZWN0SWRzWzBdfTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hlcmUgPSB7J29iamVjdElkJzogeyckaW4nOiBvYmplY3RJZHN9fTtcbiAgICB9XG4gICAgdmFyIHF1ZXJ5ID0gbmV3IFJlc3RRdWVyeShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgd2hlcmUsIGluY2x1ZGVSZXN0T3B0aW9ucyk7XG4gICAgcmV0dXJuIHF1ZXJ5LmV4ZWN1dGUoe29wOiAnZ2V0J30pLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgIHJlc3VsdHMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHRzKTtcbiAgICB9KVxuICB9KVxuXG4gIC8vIEdldCB0aGUgb2JqZWN0cyBmb3IgYWxsIHRoZXNlIG9iamVjdCBpZHNcbiAgcmV0dXJuIFByb21pc2UuYWxsKHF1ZXJ5UHJvbWlzZXMpLnRoZW4oKHJlc3BvbnNlcykgPT4ge1xuICAgIHZhciByZXBsYWNlID0gcmVzcG9uc2VzLnJlZHVjZSgocmVwbGFjZSwgaW5jbHVkZVJlc3BvbnNlKSA9PiB7XG4gICAgICBmb3IgKHZhciBvYmogb2YgaW5jbHVkZVJlc3BvbnNlLnJlc3VsdHMpIHtcbiAgICAgICAgb2JqLl9fdHlwZSA9ICdPYmplY3QnO1xuICAgICAgICBvYmouY2xhc3NOYW1lID0gaW5jbHVkZVJlc3BvbnNlLmNsYXNzTmFtZTtcblxuICAgICAgICBpZiAob2JqLmNsYXNzTmFtZSA9PSBcIl9Vc2VyXCIgJiYgIWF1dGguaXNNYXN0ZXIpIHtcbiAgICAgICAgICBkZWxldGUgb2JqLnNlc3Npb25Ub2tlbjtcbiAgICAgICAgICBkZWxldGUgb2JqLmF1dGhEYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJlcGxhY2Vbb2JqLm9iamVjdElkXSA9IG9iajtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXBsYWNlO1xuICAgIH0sIHt9KVxuXG4gICAgdmFyIHJlc3AgPSB7XG4gICAgICByZXN1bHRzOiByZXBsYWNlUG9pbnRlcnMocmVzcG9uc2UucmVzdWx0cywgcGF0aCwgcmVwbGFjZSlcbiAgICB9O1xuICAgIGlmIChyZXNwb25zZS5jb3VudCkge1xuICAgICAgcmVzcC5jb3VudCA9IHJlc3BvbnNlLmNvdW50O1xuICAgIH1cbiAgICByZXR1cm4gcmVzcDtcbiAgfSk7XG59XG5cbi8vIE9iamVjdCBtYXkgYmUgYSBsaXN0IG9mIFJFU1QtZm9ybWF0IG9iamVjdCB0byBmaW5kIHBvaW50ZXJzIGluLCBvclxuLy8gaXQgbWF5IGJlIGEgc2luZ2xlIG9iamVjdC5cbi8vIElmIHRoZSBwYXRoIHlpZWxkcyB0aGluZ3MgdGhhdCBhcmVuJ3QgcG9pbnRlcnMsIHRoaXMgdGhyb3dzIGFuIGVycm9yLlxuLy8gUGF0aCBpcyBhIGxpc3Qgb2YgZmllbGRzIHRvIHNlYXJjaCBpbnRvLlxuLy8gUmV0dXJucyBhIGxpc3Qgb2YgcG9pbnRlcnMgaW4gUkVTVCBmb3JtYXQuXG5mdW5jdGlvbiBmaW5kUG9pbnRlcnMob2JqZWN0LCBwYXRoKSB7XG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHZhciBhbnN3ZXIgPSBbXTtcbiAgICBmb3IgKHZhciB4IG9mIG9iamVjdCkge1xuICAgICAgYW5zd2VyID0gYW5zd2VyLmNvbmNhdChmaW5kUG9pbnRlcnMoeCwgcGF0aCkpO1xuICAgIH1cbiAgICByZXR1cm4gYW5zd2VyO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnIHx8ICFvYmplY3QpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBpZiAocGF0aC5sZW5ndGggPT0gMCkge1xuICAgIGlmIChvYmplY3QgPT09IG51bGwgfHwgb2JqZWN0Ll9fdHlwZSA9PSAnUG9pbnRlcicpIHtcbiAgICAgIHJldHVybiBbb2JqZWN0XTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIHN1Ym9iamVjdCA9IG9iamVjdFtwYXRoWzBdXTtcbiAgaWYgKCFzdWJvYmplY3QpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIGZpbmRQb2ludGVycyhzdWJvYmplY3QsIHBhdGguc2xpY2UoMSkpO1xufVxuXG4vLyBPYmplY3QgbWF5IGJlIGEgbGlzdCBvZiBSRVNULWZvcm1hdCBvYmplY3RzIHRvIHJlcGxhY2UgcG9pbnRlcnNcbi8vIGluLCBvciBpdCBtYXkgYmUgYSBzaW5nbGUgb2JqZWN0LlxuLy8gUGF0aCBpcyBhIGxpc3Qgb2YgZmllbGRzIHRvIHNlYXJjaCBpbnRvLlxuLy8gcmVwbGFjZSBpcyBhIG1hcCBmcm9tIG9iamVjdCBpZCAtPiBvYmplY3QuXG4vLyBSZXR1cm5zIHNvbWV0aGluZyBhbmFsb2dvdXMgdG8gb2JqZWN0LCBidXQgd2l0aCB0aGUgYXBwcm9wcmlhdGVcbi8vIHBvaW50ZXJzIGluZmxhdGVkLlxuZnVuY3Rpb24gcmVwbGFjZVBvaW50ZXJzKG9iamVjdCwgcGF0aCwgcmVwbGFjZSkge1xuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICByZXR1cm4gb2JqZWN0Lm1hcCgob2JqKSA9PiByZXBsYWNlUG9pbnRlcnMob2JqLCBwYXRoLCByZXBsYWNlKSlcbiAgICAgIC5maWx0ZXIoKG9iaikgPT4gdHlwZW9mIG9iaiAhPT0gJ3VuZGVmaW5lZCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnIHx8ICFvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG5cbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKG9iamVjdCAmJiBvYmplY3QuX190eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICAgIHJldHVybiByZXBsYWNlW29iamVjdC5vYmplY3RJZF07XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICB2YXIgc3Vib2JqZWN0ID0gb2JqZWN0W3BhdGhbMF1dO1xuICBpZiAoIXN1Ym9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cbiAgdmFyIG5ld3N1YiA9IHJlcGxhY2VQb2ludGVycyhzdWJvYmplY3QsIHBhdGguc2xpY2UoMSksIHJlcGxhY2UpO1xuICB2YXIgYW5zd2VyID0ge307XG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoa2V5ID09IHBhdGhbMF0pIHtcbiAgICAgIGFuc3dlcltrZXldID0gbmV3c3ViO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbnN3ZXJba2V5XSA9IG9iamVjdFtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYW5zd2VyO1xufVxuXG4vLyBGaW5kcyBhIHN1Ym9iamVjdCB0aGF0IGhhcyB0aGUgZ2l2ZW4ga2V5LCBpZiB0aGVyZSBpcyBvbmUuXG4vLyBSZXR1cm5zIHVuZGVmaW5lZCBvdGhlcndpc2UuXG5mdW5jdGlvbiBmaW5kT2JqZWN0V2l0aEtleShyb290LCBrZXkpIHtcbiAgaWYgKHR5cGVvZiByb290ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocm9vdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgZm9yICh2YXIgaXRlbSBvZiByb290KSB7XG4gICAgICBjb25zdCBhbnN3ZXIgPSBmaW5kT2JqZWN0V2l0aEtleShpdGVtLCBrZXkpO1xuICAgICAgaWYgKGFuc3dlcikge1xuICAgICAgICByZXR1cm4gYW5zd2VyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAocm9vdCAmJiByb290W2tleV0pIHtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuICBmb3IgKHZhciBzdWJrZXkgaW4gcm9vdCkge1xuICAgIGNvbnN0IGFuc3dlciA9IGZpbmRPYmplY3RXaXRoS2V5KHJvb3Rbc3Via2V5XSwga2V5KTtcbiAgICBpZiAoYW5zd2VyKSB7XG4gICAgICByZXR1cm4gYW5zd2VyO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlc3RRdWVyeTtcbiJdfQ==
1028
+ // For tests
1029
+ module.exports._UnsafeRestQuery = _UnsafeRestQuery;
1030
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTY2hlbWFDb250cm9sbGVyIiwicmVxdWlyZSIsIlBhcnNlIiwidHJpZ2dlcnMiLCJjb250aW51ZVdoaWxlIiwiQWx3YXlzU2VsZWN0ZWRLZXlzIiwiZW5mb3JjZVJvbGVTZWN1cml0eSIsImNyZWF0ZVNhbml0aXplZEVycm9yIiwiUmVzdFF1ZXJ5IiwibWV0aG9kIiwiY29uZmlnIiwiYXV0aCIsImNsYXNzTmFtZSIsInJlc3RXaGVyZSIsInJlc3RPcHRpb25zIiwiY2xpZW50U0RLIiwicnVuQWZ0ZXJGaW5kIiwicnVuQmVmb3JlRmluZCIsImNvbnRleHQiLCJNZXRob2QiLCJmaW5kIiwiZ2V0IiwiaW5jbHVkZXMiLCJFcnJvciIsIklOVkFMSURfUVVFUlkiLCJpc0dldCIsInJlc3VsdCIsIm1heWJlUnVuUXVlcnlUcmlnZ2VyIiwiVHlwZXMiLCJiZWZvcmVGaW5kIiwiUHJvbWlzZSIsInJlc29sdmUiLCJfVW5zYWZlUmVzdFF1ZXJ5IiwiT2JqZWN0IiwiZnJlZXplIiwicmVzcG9uc2UiLCJmaW5kT3B0aW9ucyIsImlzTWFzdGVyIiwidXNlciIsIklOVkFMSURfU0VTU0lPTl9UT0tFTiIsIiRhbmQiLCJfX3R5cGUiLCJvYmplY3RJZCIsImlkIiwiZG9Db3VudCIsImluY2x1ZGVBbGwiLCJpbmNsdWRlIiwia2V5c0ZvckluY2x1ZGUiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJrZXlzIiwiZXhjbHVkZUtleXMiLCJsZW5ndGgiLCJzcGxpdCIsImZpbHRlciIsImtleSIsIm1hcCIsInNsaWNlIiwibGFzdEluZGV4T2YiLCJqb2luIiwib3B0aW9uIiwiY29uY2F0IiwiQXJyYXkiLCJmcm9tIiwiU2V0IiwiZXhjbHVkZSIsImsiLCJpbmRleE9mIiwiZmllbGRzIiwib3JkZXIiLCJzb3J0IiwicmVkdWNlIiwic29ydE1hcCIsImZpZWxkIiwidHJpbSIsInNjb3JlIiwiJG1ldGEiLCJwYXRocyIsInBhdGhTZXQiLCJtZW1vIiwicGF0aCIsImluZGV4IiwicGFydHMiLCJzIiwiYSIsImIiLCJyZWRpcmVjdEtleSIsInJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5IiwicmVkaXJlY3RDbGFzc05hbWUiLCJJTlZBTElEX0pTT04iLCJleGVjdXRlIiwiZXhlY3V0ZU9wdGlvbnMiLCJ0aGVuIiwiYnVpbGRSZXN0V2hlcmUiLCJkZW55UHJvdGVjdGVkRmllbGRzIiwiaGFuZGxlSW5jbHVkZUFsbCIsImhhbmRsZUV4Y2x1ZGVLZXlzIiwicnVuRmluZCIsInJ1bkNvdW50IiwiaGFuZGxlSW5jbHVkZSIsInJ1bkFmdGVyRmluZFRyaWdnZXIiLCJoYW5kbGVBdXRoQWRhcHRlcnMiLCJlYWNoIiwiY2FsbGJhY2siLCJsaW1pdCIsImZpbmlzaGVkIiwicXVlcnkiLCJyZXN1bHRzIiwiZm9yRWFjaCIsImFzc2lnbiIsIiRndCIsImdldFVzZXJBbmRSb2xlQUNMIiwidmFsaWRhdGVDbGllbnRDbGFzc0NyZWF0aW9uIiwicmVwbGFjZVNlbGVjdCIsInJlcGxhY2VEb250U2VsZWN0IiwicmVwbGFjZUluUXVlcnkiLCJyZXBsYWNlTm90SW5RdWVyeSIsInJlcGxhY2VFcXVhbGl0eSIsImFjbCIsImdldFVzZXJSb2xlcyIsInJvbGVzIiwiZGF0YWJhc2UiLCJuZXdDbGFzc05hbWUiLCJhbGxvd0NsaWVudENsYXNzQ3JlYXRpb24iLCJzeXN0ZW1DbGFzc2VzIiwibG9hZFNjaGVtYSIsInNjaGVtYUNvbnRyb2xsZXIiLCJoYXNDbGFzcyIsIk9QRVJBVElPTl9GT1JCSURERU4iLCJ0cmFuc2Zvcm1JblF1ZXJ5IiwiaW5RdWVyeU9iamVjdCIsInZhbHVlcyIsInB1c2giLCJpc0FycmF5IiwiZmluZE9iamVjdFdpdGhLZXkiLCJpblF1ZXJ5VmFsdWUiLCJ3aGVyZSIsImFkZGl0aW9uYWxPcHRpb25zIiwic3VicXVlcnlSZWFkUHJlZmVyZW5jZSIsInJlYWRQcmVmZXJlbmNlIiwic3VicXVlcnkiLCJ0cmFuc2Zvcm1Ob3RJblF1ZXJ5Iiwibm90SW5RdWVyeU9iamVjdCIsIm5vdEluUXVlcnlWYWx1ZSIsImdldERlZXBlc3RPYmplY3RGcm9tS2V5IiwianNvbiIsImlkeCIsInNyYyIsInNwbGljZSIsInRyYW5zZm9ybVNlbGVjdCIsInNlbGVjdE9iamVjdCIsIm9iamVjdHMiLCJzZWxlY3RWYWx1ZSIsInRyYW5zZm9ybURvbnRTZWxlY3QiLCJkb250U2VsZWN0T2JqZWN0IiwiZG9udFNlbGVjdFZhbHVlIiwiY2xlYW5SZXN1bHRBdXRoRGF0YSIsInBhc3N3b3JkIiwiYXV0aERhdGEiLCJwcm92aWRlciIsInJlcGxhY2VFcXVhbGl0eUNvbnN0cmFpbnQiLCJjb25zdHJhaW50IiwiZXF1YWxUb09iamVjdCIsImhhc0RpcmVjdENvbnN0cmFpbnQiLCJoYXNPcGVyYXRvckNvbnN0cmFpbnQiLCJvcHRpb25zIiwib3AiLCJleHBsYWluIiwiZmlsZXNDb250cm9sbGVyIiwiZXhwYW5kRmlsZXNJbk9iamVjdCIsInIiLCJjb3VudCIsInNraXAiLCJjIiwicHJvdGVjdGVkRmllbGRzIiwiYWRkUHJvdGVjdGVkRmllbGRzIiwiZ2V0T25lU2NoZW1hIiwic2NoZW1hIiwiaW5jbHVkZUZpZWxkcyIsImtleUZpZWxkcyIsInR5cGUiLCJpbmRleGVkUmVzdWx0cyIsImluZGV4ZWQiLCJpIiwiZXhlY3V0aW9uVHJlZSIsImN1cnJlbnQiLCJub2RlIiwiY2hpbGRyZW4iLCJyZWN1cnNpdmVFeGVjdXRpb25UcmVlIiwidHJlZU5vZGUiLCJwYXRoUmVzcG9uc2UiLCJpbmNsdWRlUGF0aCIsIm5ld1Jlc3BvbnNlIiwibmV3T2JqZWN0IiwiYWxsIiwiaGFzQWZ0ZXJGaW5kSG9vayIsInRyaWdnZXJFeGlzdHMiLCJhZnRlckZpbmQiLCJhcHBsaWNhdGlvbklkIiwicGlwZWxpbmUiLCJkaXN0aW5jdCIsInBhcnNlUXVlcnkiLCJRdWVyeSIsIndpdGhKU09OIiwibWF5YmVSdW5BZnRlckZpbmRUcmlnZ2VyIiwib2JqZWN0IiwidG9KU09OIiwiYXV0aERhdGFNYW5hZ2VyIiwicG9pbnRlcnMiLCJmaW5kUG9pbnRlcnMiLCJwb2ludGVyc0hhc2giLCJwb2ludGVyIiwiYWRkIiwiaW5jbHVkZVJlc3RPcHRpb25zIiwia2V5U2V0Iiwic2V0Iiwia2V5UGF0aCIsInNpemUiLCJleGNsdWRlS2V5U2V0IiwiaW5jbHVkZVJlYWRQcmVmZXJlbmNlIiwicXVlcnlQcm9taXNlcyIsIm9iamVjdElkcyIsIiRpbiIsInJlc3BvbnNlcyIsInJlcGxhY2UiLCJpbmNsdWRlUmVzcG9uc2UiLCJvYmoiLCJzZXNzaW9uVG9rZW4iLCJyZXNwIiwicmVwbGFjZVBvaW50ZXJzIiwieCIsImZsYXQiLCJzdWJvYmplY3QiLCJuZXdzdWIiLCJhbnN3ZXIiLCJyb290IiwiaXRlbSIsInN1YmtleSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvUmVzdFF1ZXJ5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEFuIG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyBldmVyeXRoaW5nIHdlIG5lZWQgdG8gcnVuIGEgJ2ZpbmQnXG4vLyBvcGVyYXRpb24sIGVuY29kZWQgaW4gdGhlIFJFU1QgQVBJIGZvcm1hdC5cblxudmFyIFNjaGVtYUNvbnRyb2xsZXIgPSByZXF1aXJlKCcuL0NvbnRyb2xsZXJzL1NjaGVtYUNvbnRyb2xsZXInKTtcbnZhciBQYXJzZSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKS5QYXJzZTtcbmNvbnN0IHRyaWdnZXJzID0gcmVxdWlyZSgnLi90cmlnZ2VycycpO1xuY29uc3QgeyBjb250aW51ZVdoaWxlIH0gPSByZXF1aXJlKCdwYXJzZS9saWIvbm9kZS9wcm9taXNlVXRpbHMnKTtcbmNvbnN0IEFsd2F5c1NlbGVjdGVkS2V5cyA9IFsnb2JqZWN0SWQnLCAnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCcsICdBQ0wnXTtcbmNvbnN0IHsgZW5mb3JjZVJvbGVTZWN1cml0eSB9ID0gcmVxdWlyZSgnLi9TaGFyZWRSZXN0Jyk7XG5jb25zdCB7IGNyZWF0ZVNhbml0aXplZEVycm9yIH0gPSByZXF1aXJlKCcuL0Vycm9yJyk7XG5cbi8vIHJlc3RPcHRpb25zIGNhbiBpbmNsdWRlOlxuLy8gICBza2lwXG4vLyAgIGxpbWl0XG4vLyAgIG9yZGVyXG4vLyAgIGNvdW50XG4vLyAgIGluY2x1ZGVcbi8vICAga2V5c1xuLy8gICBleGNsdWRlS2V5c1xuLy8gICByZWRpcmVjdENsYXNzTmFtZUZvcktleVxuLy8gICByZWFkUHJlZmVyZW5jZVxuLy8gICBpbmNsdWRlUmVhZFByZWZlcmVuY2Vcbi8vICAgc3VicXVlcnlSZWFkUHJlZmVyZW5jZVxuLyoqXG4gKiBVc2UgdG8gcGVyZm9ybSBhIHF1ZXJ5IG9uIGEgY2xhc3MuIEl0IHdpbGwgcnVuIHNlY3VyaXR5IGNoZWNrcyBhbmQgdHJpZ2dlcnMuXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMubWV0aG9kIHtSZXN0UXVlcnkuTWV0aG9kfSBUaGUgdHlwZSBvZiBxdWVyeSB0byBwZXJmb3JtXG4gKiBAcGFyYW0gb3B0aW9ucy5jb25maWcge1BhcnNlU2VydmVyQ29uZmlndXJhdGlvbn0gVGhlIHNlcnZlciBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0gb3B0aW9ucy5hdXRoIHtBdXRofSBUaGUgYXV0aCBvYmplY3QgZm9yIHRoZSByZXF1ZXN0XG4gKiBAcGFyYW0gb3B0aW9ucy5jbGFzc05hbWUge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIHF1ZXJ5XG4gKiBAcGFyYW0gb3B0aW9ucy5yZXN0V2hlcmUge29iamVjdH0gVGhlIHdoZXJlIG9iamVjdCBmb3IgdGhlIHF1ZXJ5XG4gKiBAcGFyYW0gb3B0aW9ucy5yZXN0T3B0aW9ucyB7b2JqZWN0fSBUaGUgb3B0aW9ucyBvYmplY3QgZm9yIHRoZSBxdWVyeVxuICogQHBhcmFtIG9wdGlvbnMuY2xpZW50U0RLIHtzdHJpbmd9IFRoZSBjbGllbnQgU0RLIHRoYXQgaXMgcGVyZm9ybWluZyB0aGUgcXVlcnlcbiAqIEBwYXJhbSBvcHRpb25zLnJ1bkFmdGVyRmluZCB7Ym9vbGVhbn0gV2hldGhlciB0byBydW4gdGhlIGFmdGVyRmluZCB0cmlnZ2VyXG4gKiBAcGFyYW0gb3B0aW9ucy5ydW5CZWZvcmVGaW5kIHtib29sZWFufSBXaGV0aGVyIHRvIHJ1biB0aGUgYmVmb3JlRmluZCB0cmlnZ2VyXG4gKiBAcGFyYW0gb3B0aW9ucy5jb250ZXh0IHtvYmplY3R9IFRoZSBjb250ZXh0IG9iamVjdCBmb3IgdGhlIHF1ZXJ5XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxfVW5zYWZlUmVzdFF1ZXJ5Pn0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCB0aGUgX1Vuc2FmZVJlc3RRdWVyeSBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gUmVzdFF1ZXJ5KHtcbiAgbWV0aG9kLFxuICBjb25maWcsXG4gIGF1dGgsXG4gIGNsYXNzTmFtZSxcbiAgcmVzdFdoZXJlID0ge30sXG4gIHJlc3RPcHRpb25zID0ge30sXG4gIGNsaWVudFNESyxcbiAgcnVuQWZ0ZXJGaW5kID0gdHJ1ZSxcbiAgcnVuQmVmb3JlRmluZCA9IHRydWUsXG4gIGNvbnRleHQsXG59KSB7XG4gIGlmICghW1Jlc3RRdWVyeS5NZXRob2QuZmluZCwgUmVzdFF1ZXJ5Lk1ldGhvZC5nZXRdLmluY2x1ZGVzKG1ldGhvZCkpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9RVUVSWSwgJ2JhZCBxdWVyeSB0eXBlJyk7XG4gIH1cbiAgY29uc3QgaXNHZXQgPSBtZXRob2QgPT09IFJlc3RRdWVyeS5NZXRob2QuZ2V0O1xuICBlbmZvcmNlUm9sZVNlY3VyaXR5KG1ldGhvZCwgY2xhc3NOYW1lLCBhdXRoLCBjb25maWcpO1xuICBjb25zdCByZXN1bHQgPSBydW5CZWZvcmVGaW5kXG4gICAgPyBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1blF1ZXJ5VHJpZ2dlcihcbiAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZUZpbmQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICByZXN0V2hlcmUsXG4gICAgICByZXN0T3B0aW9ucyxcbiAgICAgIGNvbmZpZyxcbiAgICAgIGF1dGgsXG4gICAgICBjb250ZXh0LFxuICAgICAgaXNHZXRcbiAgICApXG4gICAgOiBQcm9taXNlLnJlc29sdmUoeyByZXN0V2hlcmUsIHJlc3RPcHRpb25zIH0pO1xuXG4gIHJldHVybiBuZXcgX1Vuc2FmZVJlc3RRdWVyeShcbiAgICBjb25maWcsXG4gICAgYXV0aCxcbiAgICBjbGFzc05hbWUsXG4gICAgcmVzdWx0LnJlc3RXaGVyZSB8fCByZXN0V2hlcmUsXG4gICAgcmVzdWx0LnJlc3RPcHRpb25zIHx8IHJlc3RPcHRpb25zLFxuICAgIGNsaWVudFNESyxcbiAgICBydW5BZnRlckZpbmQsXG4gICAgY29udGV4dCxcbiAgICBpc0dldFxuICApO1xufVxuXG5SZXN0UXVlcnkuTWV0aG9kID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGdldDogJ2dldCcsXG4gIGZpbmQ6ICdmaW5kJyxcbn0pO1xuXG4vKipcbiAqIF9VbnNhZmVSZXN0UXVlcnkgaXMgbWVhbnQgZm9yIHNwZWNpZmljIGludGVybmFsIHVzYWdlIG9ubHkuIFdoZW4geW91IG5lZWQgdG8gc2tpcCBzZWN1cml0eSBjaGVja3Mgb3Igc29tZSB0cmlnZ2Vycy5cbiAqIERvbid0IHVzZSBpdCBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gKiBAcGFyYW0gY29uZmlnXG4gKiBAcGFyYW0gYXV0aFxuICogQHBhcmFtIGNsYXNzTmFtZVxuICogQHBhcmFtIHJlc3RXaGVyZVxuICogQHBhcmFtIHJlc3RPcHRpb25zXG4gKiBAcGFyYW0gY2xpZW50U0RLXG4gKiBAcGFyYW0gcnVuQWZ0ZXJGaW5kXG4gKiBAcGFyYW0gY29udGV4dFxuICovXG5mdW5jdGlvbiBfVW5zYWZlUmVzdFF1ZXJ5KFxuICBjb25maWcsXG4gIGF1dGgsXG4gIGNsYXNzTmFtZSxcbiAgcmVzdFdoZXJlID0ge30sXG4gIHJlc3RPcHRpb25zID0ge30sXG4gIGNsaWVudFNESyxcbiAgcnVuQWZ0ZXJGaW5kID0gdHJ1ZSxcbiAgY29udGV4dCxcbiAgaXNHZXRcbikge1xuICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgdGhpcy5hdXRoID0gYXV0aDtcbiAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gIHRoaXMucmVzdFdoZXJlID0gcmVzdFdoZXJlO1xuICB0aGlzLnJlc3RPcHRpb25zID0gcmVzdE9wdGlvbnM7XG4gIHRoaXMuY2xpZW50U0RLID0gY2xpZW50U0RLO1xuICB0aGlzLnJ1bkFmdGVyRmluZCA9IHJ1bkFmdGVyRmluZDtcbiAgdGhpcy5yZXNwb25zZSA9IG51bGw7XG4gIHRoaXMuZmluZE9wdGlvbnMgPSB7fTtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dCB8fCB7fTtcbiAgdGhpcy5pc0dldCA9IGlzR2V0O1xuICBpZiAoIXRoaXMuYXV0aC5pc01hc3Rlcikge1xuICAgIGlmICh0aGlzLmNsYXNzTmFtZSA9PSAnX1Nlc3Npb24nKSB7XG4gICAgICBpZiAoIXRoaXMuYXV0aC51c2VyKSB7XG4gICAgICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfU0VTU0lPTl9UT0tFTiwgJ0ludmFsaWQgc2Vzc2lvbiB0b2tlbicsIGNvbmZpZyk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlc3RXaGVyZSA9IHtcbiAgICAgICAgJGFuZDogW1xuICAgICAgICAgIHRoaXMucmVzdFdoZXJlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuYXV0aC51c2VyLmlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmRvQ291bnQgPSBmYWxzZTtcbiAgdGhpcy5pbmNsdWRlQWxsID0gZmFsc2U7XG5cbiAgLy8gVGhlIGZvcm1hdCBmb3IgdGhpcy5pbmNsdWRlIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgZm9ybWF0IGZvciB0aGVcbiAgLy8gaW5jbHVkZSBvcHRpb24gLSBpdCdzIHRoZSBwYXRocyB3ZSBzaG91bGQgaW5jbHVkZSwgaW4gb3JkZXIsXG4gIC8vIHN0b3JlZCBhcyBhcnJheXMsIHRha2luZyBpbnRvIGFjY291bnQgdGhhdCB3ZSBuZWVkIHRvIGluY2x1ZGUgZm9vXG4gIC8vIGJlZm9yZSBpbmNsdWRpbmcgZm9vLmJhci4gQWxzbyBpdCBzaG91bGQgZGVkdXBlLlxuICAvLyBGb3IgZXhhbXBsZSwgcGFzc2luZyBhbiBhcmcgb2YgaW5jbHVkZT1mb28uYmFyLGZvby5iYXogY291bGQgbGVhZCB0b1xuICAvLyB0aGlzLmluY2x1ZGUgPSBbWydmb28nXSwgWydmb28nLCAnYmF6J10sIFsnZm9vJywgJ2JhciddXVxuICB0aGlzLmluY2x1ZGUgPSBbXTtcbiAgbGV0IGtleXNGb3JJbmNsdWRlID0gJyc7XG5cbiAgLy8gSWYgd2UgaGF2ZSBrZXlzLCB3ZSBwcm9iYWJseSB3YW50IHRvIGZvcmNlIHNvbWUgaW5jbHVkZXMgKG4tMSBsZXZlbClcbiAgLy8gU2VlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcGFyc2UtY29tbXVuaXR5L3BhcnNlLXNlcnZlci9pc3N1ZXMvMzE4NVxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3RPcHRpb25zLCAna2V5cycpKSB7XG4gICAga2V5c0ZvckluY2x1ZGUgPSByZXN0T3B0aW9ucy5rZXlzO1xuICB9XG5cbiAgLy8gSWYgd2UgaGF2ZSBrZXlzLCB3ZSBwcm9iYWJseSB3YW50IHRvIGZvcmNlIHNvbWUgaW5jbHVkZXMgKG4tMSBsZXZlbClcbiAgLy8gaW4gb3JkZXIgdG8gZXhjbHVkZSBzcGVjaWZpYyBrZXlzLlxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3RPcHRpb25zLCAnZXhjbHVkZUtleXMnKSkge1xuICAgIGtleXNGb3JJbmNsdWRlICs9ICcsJyArIHJlc3RPcHRpb25zLmV4Y2x1ZGVLZXlzO1xuICB9XG5cbiAgaWYgKGtleXNGb3JJbmNsdWRlLmxlbmd0aCA+IDApIHtcbiAgICBrZXlzRm9ySW5jbHVkZSA9IGtleXNGb3JJbmNsdWRlXG4gICAgICAuc3BsaXQoJywnKVxuICAgICAgLmZpbHRlcihrZXkgPT4ge1xuICAgICAgICAvLyBBdCBsZWFzdCAyIGNvbXBvbmVudHNcbiAgICAgICAgcmV0dXJuIGtleS5zcGxpdCgnLicpLmxlbmd0aCA+IDE7XG4gICAgICB9KVxuICAgICAgLm1hcChrZXkgPT4ge1xuICAgICAgICAvLyBTbGljZSB0aGUgbGFzdCBjb21wb25lbnQgKGEuYi5jIC0+IGEuYilcbiAgICAgICAgLy8gT3RoZXJ3aXNlIHdlJ2xsIGluY2x1ZGUgb25lIGxldmVsIHRvbyBtdWNoLlxuICAgICAgICByZXR1cm4ga2V5LnNsaWNlKDAsIGtleS5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgIH0pXG4gICAgICAuam9pbignLCcpO1xuXG4gICAgLy8gQ29uY2F0IHRoZSBwb3NzaWJseSBwcmVzZW50IGluY2x1ZGUgc3RyaW5nIHdpdGggdGhlIG9uZSBmcm9tIHRoZSBrZXlzXG4gICAgLy8gRGVkdXAgLyBzb3J0aW5nIGlzIGhhbmRsZSBpbiAnaW5jbHVkZScgY2FzZS5cbiAgICBpZiAoa2V5c0ZvckluY2x1ZGUubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCFyZXN0T3B0aW9ucy5pbmNsdWRlIHx8IHJlc3RPcHRpb25zLmluY2x1ZGUubGVuZ3RoID09IDApIHtcbiAgICAgICAgcmVzdE9wdGlvbnMuaW5jbHVkZSA9IGtleXNGb3JJbmNsdWRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdE9wdGlvbnMuaW5jbHVkZSArPSAnLCcgKyBrZXlzRm9ySW5jbHVkZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBvcHRpb24gaW4gcmVzdE9wdGlvbnMpIHtcbiAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgY2FzZSAna2V5cyc6IHtcbiAgICAgICAgY29uc3Qga2V5cyA9IHJlc3RPcHRpb25zLmtleXNcbiAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleS5sZW5ndGggPiAwKVxuICAgICAgICAgIC5jb25jYXQoQWx3YXlzU2VsZWN0ZWRLZXlzKTtcbiAgICAgICAgdGhpcy5rZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KGtleXMpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdleGNsdWRlS2V5cyc6IHtcbiAgICAgICAgY29uc3QgZXhjbHVkZSA9IHJlc3RPcHRpb25zLmV4Y2x1ZGVLZXlzXG4gICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAuZmlsdGVyKGsgPT4gQWx3YXlzU2VsZWN0ZWRLZXlzLmluZGV4T2YoaykgPCAwKTtcbiAgICAgICAgdGhpcy5leGNsdWRlS2V5cyA9IEFycmF5LmZyb20obmV3IFNldChleGNsdWRlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY291bnQnOlxuICAgICAgICB0aGlzLmRvQ291bnQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2luY2x1ZGVBbGwnOlxuICAgICAgICB0aGlzLmluY2x1ZGVBbGwgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2V4cGxhaW4nOlxuICAgICAgY2FzZSAnaGludCc6XG4gICAgICBjYXNlICdkaXN0aW5jdCc6XG4gICAgICBjYXNlICdwaXBlbGluZSc6XG4gICAgICBjYXNlICdza2lwJzpcbiAgICAgIGNhc2UgJ2xpbWl0JzpcbiAgICAgIGNhc2UgJ3JlYWRQcmVmZXJlbmNlJzpcbiAgICAgIGNhc2UgJ2NvbW1lbnQnOlxuICAgICAgICB0aGlzLmZpbmRPcHRpb25zW29wdGlvbl0gPSByZXN0T3B0aW9uc1tvcHRpb25dO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29yZGVyJzpcbiAgICAgICAgdmFyIGZpZWxkcyA9IHJlc3RPcHRpb25zLm9yZGVyLnNwbGl0KCcsJyk7XG4gICAgICAgIHRoaXMuZmluZE9wdGlvbnMuc29ydCA9IGZpZWxkcy5yZWR1Y2UoKHNvcnRNYXAsIGZpZWxkKSA9PiB7XG4gICAgICAgICAgZmllbGQgPSBmaWVsZC50cmltKCk7XG4gICAgICAgICAgaWYgKGZpZWxkID09PSAnJHNjb3JlJyB8fCBmaWVsZCA9PT0gJy0kc2NvcmUnKSB7XG4gICAgICAgICAgICBzb3J0TWFwLnNjb3JlID0geyAkbWV0YTogJ3RleHRTY29yZScgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkWzBdID09ICctJykge1xuICAgICAgICAgICAgc29ydE1hcFtmaWVsZC5zbGljZSgxKV0gPSAtMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc29ydE1hcFtmaWVsZF0gPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc29ydE1hcDtcbiAgICAgICAgfSwge30pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2luY2x1ZGUnOiB7XG4gICAgICAgIGNvbnN0IHBhdGhzID0gcmVzdE9wdGlvbnMuaW5jbHVkZS5zcGxpdCgnLCcpO1xuICAgICAgICBpZiAocGF0aHMuaW5jbHVkZXMoJyonKSkge1xuICAgICAgICAgIHRoaXMuaW5jbHVkZUFsbCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9hZCB0aGUgZXhpc3RpbmcgaW5jbHVkZXMgKGZyb20ga2V5cylcbiAgICAgICAgY29uc3QgcGF0aFNldCA9IHBhdGhzLnJlZHVjZSgobWVtbywgcGF0aCkgPT4ge1xuICAgICAgICAgIC8vIFNwbGl0IGVhY2ggcGF0aHMgb24gLiAoYS5iLmMgLT4gW2EsYixjXSlcbiAgICAgICAgICAvLyByZWR1Y2UgdG8gY3JlYXRlIGFsbCBwYXRoc1xuICAgICAgICAgIC8vIChbYSxiLGNdIC0+IHthOiB0cnVlLCAnYS5iJzogdHJ1ZSwgJ2EuYi5jJzogdHJ1ZX0pXG4gICAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKG1lbW8sIHBhdGgsIGluZGV4LCBwYXJ0cykgPT4ge1xuICAgICAgICAgICAgbWVtb1twYXJ0cy5zbGljZSgwLCBpbmRleCArIDEpLmpvaW4oJy4nKV0gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgICAgICAgfSwgbWVtbyk7XG4gICAgICAgIH0sIHt9KTtcblxuICAgICAgICB0aGlzLmluY2x1ZGUgPSBPYmplY3Qua2V5cyhwYXRoU2V0KVxuICAgICAgICAgIC5tYXAocyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcy5zcGxpdCgnLicpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoOyAvLyBTb3J0IGJ5IG51bWJlciBvZiBjb21wb25lbnRzXG4gICAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAncmVkaXJlY3RDbGFzc05hbWVGb3JLZXknOlxuICAgICAgICB0aGlzLnJlZGlyZWN0S2V5ID0gcmVzdE9wdGlvbnMucmVkaXJlY3RDbGFzc05hbWVGb3JLZXk7XG4gICAgICAgIHRoaXMucmVkaXJlY3RDbGFzc05hbWUgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2luY2x1ZGVSZWFkUHJlZmVyZW5jZSc6XG4gICAgICBjYXNlICdzdWJxdWVyeVJlYWRQcmVmZXJlbmNlJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9KU09OLCAnYmFkIG9wdGlvbjogJyArIG9wdGlvbik7XG4gICAgfVxuICB9XG59XG5cbi8vIEEgY29udmVuaWVudCBtZXRob2QgdG8gcGVyZm9ybSBhbGwgdGhlIHN0ZXBzIG9mIHByb2Nlc3NpbmcgYSBxdWVyeVxuLy8gaW4gb3JkZXIuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHJlc3BvbnNlIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9uYWwga2V5c1xuLy8gJ3Jlc3VsdHMnIGFuZCAnY291bnQnLlxuLy8gVE9ETzogY29uc29saWRhdGUgdGhlIHJlcGxhY2VYIGZ1bmN0aW9uc1xuX1Vuc2FmZVJlc3RRdWVyeS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uIChleGVjdXRlT3B0aW9ucykge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFJlc3RXaGVyZSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGVueVByb3RlY3RlZEZpZWxkcygpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW5jbHVkZUFsbCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXhjbHVkZUtleXMoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bkZpbmQoZXhlY3V0ZU9wdGlvbnMpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucnVuQ291bnQoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUluY2x1ZGUoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bkFmdGVyRmluZFRyaWdnZXIoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUF1dGhBZGFwdGVycygpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2U7XG4gICAgfSk7XG59O1xuXG5fVW5zYWZlUmVzdFF1ZXJ5LnByb3RvdHlwZS5lYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIGNvbnN0IHsgY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHJlc3RXaGVyZSwgcmVzdE9wdGlvbnMsIGNsaWVudFNESyB9ID0gdGhpcztcbiAgLy8gaWYgdGhlIGxpbWl0IGlzIHNldCwgdXNlIGl0XG4gIHJlc3RPcHRpb25zLmxpbWl0ID0gcmVzdE9wdGlvbnMubGltaXQgfHwgMTAwO1xuICByZXN0T3B0aW9ucy5vcmRlciA9ICdvYmplY3RJZCc7XG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIHJldHVybiBjb250aW51ZVdoaWxlKFxuICAgICgpID0+IHtcbiAgICAgIHJldHVybiAhZmluaXNoZWQ7XG4gICAgfSxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBTYWZlIGhlcmUgdG8gdXNlIF9VbnNhZmVSZXN0UXVlcnkgYmVjYXVzZSB0aGUgc2VjdXJpdHkgd2FzIGFscmVhZHlcbiAgICAgIC8vIGNoZWNrZWQgZHVyaW5nIFwiYXdhaXQgUmVzdFF1ZXJ5KClcIlxuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgX1Vuc2FmZVJlc3RRdWVyeShcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBhdXRoLFxuICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgIHJlc3RXaGVyZSxcbiAgICAgICAgcmVzdE9wdGlvbnMsXG4gICAgICAgIGNsaWVudFNESyxcbiAgICAgICAgdGhpcy5ydW5BZnRlckZpbmQsXG4gICAgICAgIHRoaXMuY29udGV4dFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgcmVzdWx0cyB9ID0gYXdhaXQgcXVlcnkuZXhlY3V0ZSgpO1xuICAgICAgcmVzdWx0cy5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgICAgIGZpbmlzaGVkID0gcmVzdWx0cy5sZW5ndGggPCByZXN0T3B0aW9ucy5saW1pdDtcbiAgICAgIGlmICghZmluaXNoZWQpIHtcbiAgICAgICAgcmVzdFdoZXJlLm9iamVjdElkID0gT2JqZWN0LmFzc2lnbih7fSwgcmVzdFdoZXJlLm9iamVjdElkLCB7XG4gICAgICAgICAgJGd0OiByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0ub2JqZWN0SWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgKTtcbn07XG5cbl9VbnNhZmVSZXN0UXVlcnkucHJvdG90eXBlLmJ1aWxkUmVzdFdoZXJlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRVc2VyQW5kUm9sZUFDTCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVkaXJlY3RDbGFzc05hbWVGb3JLZXkoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZVNlbGVjdCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZURvbnRTZWxlY3QoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VJblF1ZXJ5KCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTm90SW5RdWVyeSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZUVxdWFsaXR5KCk7XG4gICAgfSk7XG59O1xuXG4vLyBVc2VzIHRoZSBBdXRoIG9iamVjdCB0byBnZXQgdGhlIGxpc3Qgb2Ygcm9sZXMsIGFkZHMgdGhlIHVzZXIgaWRcbl9VbnNhZmVSZXN0UXVlcnkucHJvdG90eXBlLmdldFVzZXJBbmRSb2xlQUNMID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgdGhpcy5maW5kT3B0aW9ucy5hY2wgPSBbJyonXTtcblxuICBpZiAodGhpcy5hdXRoLnVzZXIpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmdldFVzZXJSb2xlcygpLnRoZW4ocm9sZXMgPT4ge1xuICAgICAgdGhpcy5maW5kT3B0aW9ucy5hY2wgPSB0aGlzLmZpbmRPcHRpb25zLmFjbC5jb25jYXQocm9sZXMsIFt0aGlzLmF1dGgudXNlci5pZF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufTtcblxuLy8gQ2hhbmdlcyB0aGUgY2xhc3NOYW1lIGlmIHJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5IGlzIHNldC5cbi8vIFJldHVybnMgYSBwcm9taXNlLlxuX1Vuc2FmZVJlc3RRdWVyeS5wcm90b3R5cGUucmVkaXJlY3RDbGFzc05hbWVGb3JLZXkgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5yZWRpcmVjdEtleSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIFdlIG5lZWQgdG8gY2hhbmdlIHRoZSBjbGFzcyBuYW1lIGJhc2VkIG9uIHRoZSBzY2hlbWFcbiAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5KHRoaXMuY2xhc3NOYW1lLCB0aGlzLnJlZGlyZWN0S2V5KVxuICAgIC50aGVuKG5ld0NsYXNzTmFtZSA9PiB7XG4gICAgICB0aGlzLmNsYXNzTmFtZSA9IG5ld0NsYXNzTmFtZTtcbiAgICAgIHRoaXMucmVkaXJlY3RDbGFzc05hbWUgPSBuZXdDbGFzc05hbWU7XG4gICAgfSk7XG59O1xuXG4vLyBWYWxpZGF0ZXMgdGhpcyBvcGVyYXRpb24gYWdhaW5zdCB0aGUgYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uIGNvbmZpZy5cbl9VbnNhZmVSZXN0UXVlcnkucHJvdG90eXBlLnZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKFxuICAgIHRoaXMuY29uZmlnLmFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiA9PT0gZmFsc2UgJiZcbiAgICAhdGhpcy5hdXRoLmlzTWFzdGVyICYmXG4gICAgU2NoZW1hQ29udHJvbGxlci5zeXN0ZW1DbGFzc2VzLmluZGV4T2YodGhpcy5jbGFzc05hbWUpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5sb2FkU2NoZW1hKClcbiAgICAgIC50aGVuKHNjaGVtYUNvbnRyb2xsZXIgPT4gc2NoZW1hQ29udHJvbGxlci5oYXNDbGFzcyh0aGlzLmNsYXNzTmFtZSkpXG4gICAgICAudGhlbihoYXNDbGFzcyA9PiB7XG4gICAgICAgIGlmIChoYXNDbGFzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgICAgICAgICdUaGlzIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzICcgKyAnbm9uLWV4aXN0ZW50IGNsYXNzOiAnICsgdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtSW5RdWVyeShpblF1ZXJ5T2JqZWN0LCBjbGFzc05hbWUsIHJlc3VsdHMpIHtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIHZhbHVlcy5wdXNoKHtcbiAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICBvYmplY3RJZDogcmVzdWx0Lm9iamVjdElkLFxuICAgIH0pO1xuICB9XG4gIGRlbGV0ZSBpblF1ZXJ5T2JqZWN0WyckaW5RdWVyeSddO1xuICBpZiAoQXJyYXkuaXNBcnJheShpblF1ZXJ5T2JqZWN0WyckaW4nXSkpIHtcbiAgICBpblF1ZXJ5T2JqZWN0WyckaW4nXSA9IGluUXVlcnlPYmplY3RbJyRpbiddLmNvbmNhdCh2YWx1ZXMpO1xuICB9IGVsc2Uge1xuICAgIGluUXVlcnlPYmplY3RbJyRpbiddID0gdmFsdWVzO1xuICB9XG59XG5cbi8vIFJlcGxhY2VzIGEgJGluUXVlcnkgY2xhdXNlIGJ5IHJ1bm5pbmcgdGhlIHN1YnF1ZXJ5LCBpZiB0aGVyZSBpcyBhblxuLy8gJGluUXVlcnkgY2xhdXNlLlxuLy8gVGhlICRpblF1ZXJ5IGNsYXVzZSB0dXJucyBpbnRvIGFuICRpbiB3aXRoIHZhbHVlcyB0aGF0IGFyZSBqdXN0XG4vLyBwb2ludGVycyB0byB0aGUgb2JqZWN0cyByZXR1cm5lZCBpbiB0aGUgc3VicXVlcnkuXG5fVW5zYWZlUmVzdFF1ZXJ5LnByb3RvdHlwZS5yZXBsYWNlSW5RdWVyeSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgdmFyIGluUXVlcnlPYmplY3QgPSBmaW5kT2JqZWN0V2l0aEtleSh0aGlzLnJlc3RXaGVyZSwgJyRpblF1ZXJ5Jyk7XG4gIGlmICghaW5RdWVyeU9iamVjdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSBpblF1ZXJ5IHZhbHVlIG11c3QgaGF2ZSBwcmVjaXNlbHkgdHdvIGtleXMgLSB3aGVyZSBhbmQgY2xhc3NOYW1lXG4gIHZhciBpblF1ZXJ5VmFsdWUgPSBpblF1ZXJ5T2JqZWN0WyckaW5RdWVyeSddO1xuICBpZiAoIWluUXVlcnlWYWx1ZS53aGVyZSB8fCAhaW5RdWVyeVZhbHVlLmNsYXNzTmFtZSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLCAnaW1wcm9wZXIgdXNhZ2Ugb2YgJGluUXVlcnknKTtcbiAgfVxuXG4gIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xuICAgIHJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5OiBpblF1ZXJ5VmFsdWUucmVkaXJlY3RDbGFzc05hbWVGb3JLZXksXG4gIH07XG5cbiAgaWYgKHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gIH0gZWxzZSBpZiAodGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZTtcbiAgfVxuXG4gIGNvbnN0IHN1YnF1ZXJ5ID0gYXdhaXQgUmVzdFF1ZXJ5KHtcbiAgICBtZXRob2Q6IFJlc3RRdWVyeS5NZXRob2QuZmluZCxcbiAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgIGF1dGg6IHRoaXMuYXV0aCxcbiAgICBjbGFzc05hbWU6IGluUXVlcnlWYWx1ZS5jbGFzc05hbWUsXG4gICAgcmVzdFdoZXJlOiBpblF1ZXJ5VmFsdWUud2hlcmUsXG4gICAgcmVzdE9wdGlvbnM6IGFkZGl0aW9uYWxPcHRpb25zLFxuICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgfSk7XG4gIHJldHVybiBzdWJxdWVyeS5leGVjdXRlKCkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgdHJhbnNmb3JtSW5RdWVyeShpblF1ZXJ5T2JqZWN0LCBzdWJxdWVyeS5jbGFzc05hbWUsIHJlc3BvbnNlLnJlc3VsdHMpO1xuICAgIC8vIFJlY3Vyc2UgdG8gcmVwZWF0XG4gICAgcmV0dXJuIHRoaXMucmVwbGFjZUluUXVlcnkoKTtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Ob3RJblF1ZXJ5KG5vdEluUXVlcnlPYmplY3QsIGNsYXNzTmFtZSwgcmVzdWx0cykge1xuICB2YXIgdmFsdWVzID0gW107XG4gIGZvciAodmFyIHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgdmFsdWVzLnB1c2goe1xuICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgIG9iamVjdElkOiByZXN1bHQub2JqZWN0SWQsXG4gICAgfSk7XG4gIH1cbiAgZGVsZXRlIG5vdEluUXVlcnlPYmplY3RbJyRub3RJblF1ZXJ5J107XG4gIGlmIChBcnJheS5pc0FycmF5KG5vdEluUXVlcnlPYmplY3RbJyRuaW4nXSkpIHtcbiAgICBub3RJblF1ZXJ5T2JqZWN0WyckbmluJ10gPSBub3RJblF1ZXJ5T2JqZWN0WyckbmluJ10uY29uY2F0KHZhbHVlcyk7XG4gIH0gZWxzZSB7XG4gICAgbm90SW5RdWVyeU9iamVjdFsnJG5pbiddID0gdmFsdWVzO1xuICB9XG59XG5cbi8vIFJlcGxhY2VzIGEgJG5vdEluUXVlcnkgY2xhdXNlIGJ5IHJ1bm5pbmcgdGhlIHN1YnF1ZXJ5LCBpZiB0aGVyZSBpcyBhblxuLy8gJG5vdEluUXVlcnkgY2xhdXNlLlxuLy8gVGhlICRub3RJblF1ZXJ5IGNsYXVzZSB0dXJucyBpbnRvIGEgJG5pbiB3aXRoIHZhbHVlcyB0aGF0IGFyZSBqdXN0XG4vLyBwb2ludGVycyB0byB0aGUgb2JqZWN0cyByZXR1cm5lZCBpbiB0aGUgc3VicXVlcnkuXG5fVW5zYWZlUmVzdFF1ZXJ5LnByb3RvdHlwZS5yZXBsYWNlTm90SW5RdWVyeSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vdEluUXVlcnlPYmplY3QgPSBmaW5kT2JqZWN0V2l0aEtleSh0aGlzLnJlc3RXaGVyZSwgJyRub3RJblF1ZXJ5Jyk7XG4gIGlmICghbm90SW5RdWVyeU9iamVjdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSBub3RJblF1ZXJ5IHZhbHVlIG11c3QgaGF2ZSBwcmVjaXNlbHkgdHdvIGtleXMgLSB3aGVyZSBhbmQgY2xhc3NOYW1lXG4gIHZhciBub3RJblF1ZXJ5VmFsdWUgPSBub3RJblF1ZXJ5T2JqZWN0Wyckbm90SW5RdWVyeSddO1xuICBpZiAoIW5vdEluUXVlcnlWYWx1ZS53aGVyZSB8fCAhbm90SW5RdWVyeVZhbHVlLmNsYXNzTmFtZSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLCAnaW1wcm9wZXIgdXNhZ2Ugb2YgJG5vdEluUXVlcnknKTtcbiAgfVxuXG4gIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xuICAgIHJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5OiBub3RJblF1ZXJ5VmFsdWUucmVkaXJlY3RDbGFzc05hbWVGb3JLZXksXG4gIH07XG5cbiAgaWYgKHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gIH0gZWxzZSBpZiAodGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZTtcbiAgfVxuXG4gIGNvbnN0IHN1YnF1ZXJ5ID0gYXdhaXQgUmVzdFF1ZXJ5KHtcbiAgICBtZXRob2Q6IFJlc3RRdWVyeS5NZXRob2QuZmluZCxcbiAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgIGF1dGg6IHRoaXMuYXV0aCxcbiAgICBjbGFzc05hbWU6IG5vdEluUXVlcnlWYWx1ZS5jbGFzc05hbWUsXG4gICAgcmVzdFdoZXJlOiBub3RJblF1ZXJ5VmFsdWUud2hlcmUsXG4gICAgcmVzdE9wdGlvbnM6IGFkZGl0aW9uYWxPcHRpb25zLFxuICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgfSk7XG5cbiAgcmV0dXJuIHN1YnF1ZXJ5LmV4ZWN1dGUoKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICB0cmFuc2Zvcm1Ob3RJblF1ZXJ5KG5vdEluUXVlcnlPYmplY3QsIHN1YnF1ZXJ5LmNsYXNzTmFtZSwgcmVzcG9uc2UucmVzdWx0cyk7XG4gICAgLy8gUmVjdXJzZSB0byByZXBlYXRcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlTm90SW5RdWVyeSgpO1xuICB9KTtcbn07XG5cbi8vIFVzZWQgdG8gZ2V0IHRoZSBkZWVwZXN0IG9iamVjdCBmcm9tIGpzb24gdXNpbmcgZG90IG5vdGF0aW9uLlxuY29uc3QgZ2V0RGVlcGVzdE9iamVjdEZyb21LZXkgPSAoanNvbiwga2V5LCBpZHgsIHNyYykgPT4ge1xuICBpZiAoa2V5IGluIGpzb24pIHtcbiAgICByZXR1cm4ganNvbltrZXldO1xuICB9XG4gIHNyYy5zcGxpY2UoMSk7IC8vIEV4aXQgRWFybHlcbn07XG5cbmNvbnN0IHRyYW5zZm9ybVNlbGVjdCA9IChzZWxlY3RPYmplY3QsIGtleSwgb2JqZWN0cykgPT4ge1xuICB2YXIgdmFsdWVzID0gW107XG4gIGZvciAodmFyIHJlc3VsdCBvZiBvYmplY3RzKSB7XG4gICAgdmFsdWVzLnB1c2goa2V5LnNwbGl0KCcuJykucmVkdWNlKGdldERlZXBlc3RPYmplY3RGcm9tS2V5LCByZXN1bHQpKTtcbiAgfVxuICBkZWxldGUgc2VsZWN0T2JqZWN0Wyckc2VsZWN0J107XG4gIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdE9iamVjdFsnJGluJ10pKSB7XG4gICAgc2VsZWN0T2JqZWN0WyckaW4nXSA9IHNlbGVjdE9iamVjdFsnJGluJ10uY29uY2F0KHZhbHVlcyk7XG4gIH0gZWxzZSB7XG4gICAgc2VsZWN0T2JqZWN0WyckaW4nXSA9IHZhbHVlcztcbiAgfVxufTtcblxuLy8gUmVwbGFjZXMgYSAkc2VsZWN0IGNsYXVzZSBieSBydW5uaW5nIHRoZSBzdWJxdWVyeSwgaWYgdGhlcmUgaXMgYVxuLy8gJHNlbGVjdCBjbGF1c2UuXG4vLyBUaGUgJHNlbGVjdCBjbGF1c2UgdHVybnMgaW50byBhbiAkaW4gd2l0aCB2YWx1ZXMgc2VsZWN0ZWQgb3V0IG9mXG4vLyB0aGUgc3VicXVlcnkuXG4vLyBSZXR1cm5zIGEgcG9zc2libGUtcHJvbWlzZS5cbl9VbnNhZmVSZXN0UXVlcnkucHJvdG90eXBlLnJlcGxhY2VTZWxlY3QgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxlY3RPYmplY3QgPSBmaW5kT2JqZWN0V2l0aEtleSh0aGlzLnJlc3RXaGVyZSwgJyRzZWxlY3QnKTtcbiAgaWYgKCFzZWxlY3RPYmplY3QpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgc2VsZWN0IHZhbHVlIG11c3QgaGF2ZSBwcmVjaXNlbHkgdHdvIGtleXMgLSBxdWVyeSBhbmQga2V5XG4gIHZhciBzZWxlY3RWYWx1ZSA9IHNlbGVjdE9iamVjdFsnJHNlbGVjdCddO1xuICAvLyBpT1MgU0RLIGRvbid0IHNlbmQgd2hlcmUgaWYgbm90IHNldCwgbGV0IGl0IHBhc3NcbiAgaWYgKFxuICAgICFzZWxlY3RWYWx1ZS5xdWVyeSB8fFxuICAgICFzZWxlY3RWYWx1ZS5rZXkgfHxcbiAgICB0eXBlb2Ygc2VsZWN0VmFsdWUucXVlcnkgIT09ICdvYmplY3QnIHx8XG4gICAgIXNlbGVjdFZhbHVlLnF1ZXJ5LmNsYXNzTmFtZSB8fFxuICAgIE9iamVjdC5rZXlzKHNlbGVjdFZhbHVlKS5sZW5ndGggIT09IDJcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksICdpbXByb3BlciB1c2FnZSBvZiAkc2VsZWN0Jyk7XG4gIH1cblxuICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcbiAgICByZWRpcmVjdENsYXNzTmFtZUZvcktleTogc2VsZWN0VmFsdWUucXVlcnkucmVkaXJlY3RDbGFzc05hbWVGb3JLZXksXG4gIH07XG5cbiAgaWYgKHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gIH0gZWxzZSBpZiAodGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZTtcbiAgfVxuXG4gIGNvbnN0IHN1YnF1ZXJ5ID0gYXdhaXQgUmVzdFF1ZXJ5KHtcbiAgICBtZXRob2Q6IFJlc3RRdWVyeS5NZXRob2QuZmluZCxcbiAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgIGF1dGg6IHRoaXMuYXV0aCxcbiAgICBjbGFzc05hbWU6IHNlbGVjdFZhbHVlLnF1ZXJ5LmNsYXNzTmFtZSxcbiAgICByZXN0V2hlcmU6IHNlbGVjdFZhbHVlLnF1ZXJ5LndoZXJlLFxuICAgIHJlc3RPcHRpb25zOiBhZGRpdGlvbmFsT3B0aW9ucyxcbiAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsXG4gIH0pO1xuXG4gIHJldHVybiBzdWJxdWVyeS5leGVjdXRlKCkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgdHJhbnNmb3JtU2VsZWN0KHNlbGVjdE9iamVjdCwgc2VsZWN0VmFsdWUua2V5LCByZXNwb25zZS5yZXN1bHRzKTtcbiAgICAvLyBLZWVwIHJlcGxhY2luZyAkc2VsZWN0IGNsYXVzZXNcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlU2VsZWN0KCk7XG4gIH0pO1xufTtcblxuY29uc3QgdHJhbnNmb3JtRG9udFNlbGVjdCA9IChkb250U2VsZWN0T2JqZWN0LCBrZXksIG9iamVjdHMpID0+IHtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciByZXN1bHQgb2Ygb2JqZWN0cykge1xuICAgIHZhbHVlcy5wdXNoKGtleS5zcGxpdCgnLicpLnJlZHVjZShnZXREZWVwZXN0T2JqZWN0RnJvbUtleSwgcmVzdWx0KSk7XG4gIH1cbiAgZGVsZXRlIGRvbnRTZWxlY3RPYmplY3RbJyRkb250U2VsZWN0J107XG4gIGlmIChBcnJheS5pc0FycmF5KGRvbnRTZWxlY3RPYmplY3RbJyRuaW4nXSkpIHtcbiAgICBkb250U2VsZWN0T2JqZWN0WyckbmluJ10gPSBkb250U2VsZWN0T2JqZWN0WyckbmluJ10uY29uY2F0KHZhbHVlcyk7XG4gIH0gZWxzZSB7XG4gICAgZG9udFNlbGVjdE9iamVjdFsnJG5pbiddID0gdmFsdWVzO1xuICB9XG59O1xuXG4vLyBSZXBsYWNlcyBhICRkb250U2VsZWN0IGNsYXVzZSBieSBydW5uaW5nIHRoZSBzdWJxdWVyeSwgaWYgdGhlcmUgaXMgYVxuLy8gJGRvbnRTZWxlY3QgY2xhdXNlLlxuLy8gVGhlICRkb250U2VsZWN0IGNsYXVzZSB0dXJucyBpbnRvIGFuICRuaW4gd2l0aCB2YWx1ZXMgc2VsZWN0ZWQgb3V0IG9mXG4vLyB0aGUgc3VicXVlcnkuXG4vLyBSZXR1cm5zIGEgcG9zc2libGUtcHJvbWlzZS5cbl9VbnNhZmVSZXN0UXVlcnkucHJvdG90eXBlLnJlcGxhY2VEb250U2VsZWN0ID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICB2YXIgZG9udFNlbGVjdE9iamVjdCA9IGZpbmRPYmplY3RXaXRoS2V5KHRoaXMucmVzdFdoZXJlLCAnJGRvbnRTZWxlY3QnKTtcbiAgaWYgKCFkb250U2VsZWN0T2JqZWN0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVGhlIGRvbnRTZWxlY3QgdmFsdWUgbXVzdCBoYXZlIHByZWNpc2VseSB0d28ga2V5cyAtIHF1ZXJ5IGFuZCBrZXlcbiAgdmFyIGRvbnRTZWxlY3RWYWx1ZSA9IGRvbnRTZWxlY3RPYmplY3RbJyRkb250U2VsZWN0J107XG4gIGlmIChcbiAgICAhZG9udFNlbGVjdFZhbHVlLnF1ZXJ5IHx8XG4gICAgIWRvbnRTZWxlY3RWYWx1ZS5rZXkgfHxcbiAgICB0eXBlb2YgZG9udFNlbGVjdFZhbHVlLnF1ZXJ5ICE9PSAnb2JqZWN0JyB8fFxuICAgICFkb250U2VsZWN0VmFsdWUucXVlcnkuY2xhc3NOYW1lIHx8XG4gICAgT2JqZWN0LmtleXMoZG9udFNlbGVjdFZhbHVlKS5sZW5ndGggIT09IDJcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksICdpbXByb3BlciB1c2FnZSBvZiAkZG9udFNlbGVjdCcpO1xuICB9XG4gIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xuICAgIHJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5OiBkb250U2VsZWN0VmFsdWUucXVlcnkucmVkaXJlY3RDbGFzc05hbWVGb3JLZXksXG4gIH07XG5cbiAgaWYgKHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gIH0gZWxzZSBpZiAodGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZTtcbiAgfVxuXG4gIGNvbnN0IHN1YnF1ZXJ5ID0gYXdhaXQgUmVzdFF1ZXJ5KHtcbiAgICBtZXRob2Q6IFJlc3RRdWVyeS5NZXRob2QuZmluZCxcbiAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgIGF1dGg6IHRoaXMuYXV0aCxcbiAgICBjbGFzc05hbWU6IGRvbnRTZWxlY3RWYWx1ZS5xdWVyeS5jbGFzc05hbWUsXG4gICAgcmVzdFdoZXJlOiBkb250U2VsZWN0VmFsdWUucXVlcnkud2hlcmUsXG4gICAgcmVzdE9wdGlvbnM6IGFkZGl0aW9uYWxPcHRpb25zLFxuICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgfSk7XG5cbiAgcmV0dXJuIHN1YnF1ZXJ5LmV4ZWN1dGUoKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICB0cmFuc2Zvcm1Eb250U2VsZWN0KGRvbnRTZWxlY3RPYmplY3QsIGRvbnRTZWxlY3RWYWx1ZS5rZXksIHJlc3BvbnNlLnJlc3VsdHMpO1xuICAgIC8vIEtlZXAgcmVwbGFjaW5nICRkb250U2VsZWN0IGNsYXVzZXNcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlRG9udFNlbGVjdCgpO1xuICB9KTtcbn07XG5cbl9VbnNhZmVSZXN0UXVlcnkucHJvdG90eXBlLmNsZWFuUmVzdWx0QXV0aERhdGEgPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gIGRlbGV0ZSByZXN1bHQucGFzc3dvcmQ7XG4gIGlmIChyZXN1bHQuYXV0aERhdGEpIHtcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQuYXV0aERhdGEpLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5hdXRoRGF0YVtwcm92aWRlcl0gPT09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIHJlc3VsdC5hdXRoRGF0YVtwcm92aWRlcl07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocmVzdWx0LmF1dGhEYXRhKS5sZW5ndGggPT0gMCkge1xuICAgICAgZGVsZXRlIHJlc3VsdC5hdXRoRGF0YTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IHJlcGxhY2VFcXVhbGl0eUNvbnN0cmFpbnQgPSBjb25zdHJhaW50ID0+IHtcbiAgaWYgKHR5cGVvZiBjb25zdHJhaW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBjb25zdHJhaW50O1xuICB9XG4gIGNvbnN0IGVxdWFsVG9PYmplY3QgPSB7fTtcbiAgbGV0IGhhc0RpcmVjdENvbnN0cmFpbnQgPSBmYWxzZTtcbiAgbGV0IGhhc09wZXJhdG9yQ29uc3RyYWludCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGtleSBpbiBjb25zdHJhaW50KSB7XG4gICAgaWYgKGtleS5pbmRleE9mKCckJykgIT09IDApIHtcbiAgICAgIGhhc0RpcmVjdENvbnN0cmFpbnQgPSB0cnVlO1xuICAgICAgZXF1YWxUb09iamVjdFtrZXldID0gY29uc3RyYWludFtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNPcGVyYXRvckNvbnN0cmFpbnQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoaGFzRGlyZWN0Q29uc3RyYWludCAmJiBoYXNPcGVyYXRvckNvbnN0cmFpbnQpIHtcbiAgICBjb25zdHJhaW50WyckZXEnXSA9IGVxdWFsVG9PYmplY3Q7XG4gICAgT2JqZWN0LmtleXMoZXF1YWxUb09iamVjdCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGNvbnN0cmFpbnRba2V5XTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29uc3RyYWludDtcbn07XG5cbl9VbnNhZmVSZXN0UXVlcnkucHJvdG90eXBlLnJlcGxhY2VFcXVhbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHR5cGVvZiB0aGlzLnJlc3RXaGVyZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5yZXN0V2hlcmUpIHtcbiAgICB0aGlzLnJlc3RXaGVyZVtrZXldID0gcmVwbGFjZUVxdWFsaXR5Q29uc3RyYWludCh0aGlzLnJlc3RXaGVyZVtrZXldKTtcbiAgfVxufTtcblxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZXRoZXIgaXQgd2FzIHN1Y2Nlc3NmdWwuXG4vLyBQb3B1bGF0ZXMgdGhpcy5yZXNwb25zZSB3aXRoIGFuIG9iamVjdCB0aGF0IG9ubHkgaGFzICdyZXN1bHRzJy5cbl9VbnNhZmVSZXN0UXVlcnkucHJvdG90eXBlLnJ1bkZpbmQgPSBhc3luYyBmdW5jdGlvbiAob3B0aW9ucyA9IHt9KSB7XG4gIGlmICh0aGlzLmZpbmRPcHRpb25zLmxpbWl0ID09PSAwKSB7XG4gICAgdGhpcy5yZXNwb25zZSA9IHsgcmVzdWx0czogW10gfTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgY29uc3QgZmluZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmZpbmRPcHRpb25zKTtcbiAgaWYgKHRoaXMua2V5cykge1xuICAgIGZpbmRPcHRpb25zLmtleXMgPSB0aGlzLmtleXMubWFwKGtleSA9PiB7XG4gICAgICByZXR1cm4ga2V5LnNwbGl0KCcuJylbMF07XG4gICAgfSk7XG4gIH1cbiAgaWYgKG9wdGlvbnMub3ApIHtcbiAgICBmaW5kT3B0aW9ucy5vcCA9IG9wdGlvbnMub3A7XG4gIH1cbiAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQodGhpcy5jbGFzc05hbWUsIHRoaXMucmVzdFdoZXJlLCBmaW5kT3B0aW9ucywgdGhpcy5hdXRoKTtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInICYmICFmaW5kT3B0aW9ucy5leHBsYWluKSB7XG4gICAgZm9yICh2YXIgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIHRoaXMuY2xlYW5SZXN1bHRBdXRoRGF0YShyZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IHRoaXMuY29uZmlnLmZpbGVzQ29udHJvbGxlci5leHBhbmRGaWxlc0luT2JqZWN0KHRoaXMuY29uZmlnLCByZXN1bHRzKTtcblxuICBpZiAodGhpcy5yZWRpcmVjdENsYXNzTmFtZSkge1xuICAgIGZvciAodmFyIHIgb2YgcmVzdWx0cykge1xuICAgICAgci5jbGFzc05hbWUgPSB0aGlzLnJlZGlyZWN0Q2xhc3NOYW1lO1xuICAgIH1cbiAgfVxuICB0aGlzLnJlc3BvbnNlID0geyByZXN1bHRzOiByZXN1bHRzIH07XG59O1xuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3Igd2hldGhlciBpdCB3YXMgc3VjY2Vzc2Z1bC5cbi8vIFBvcHVsYXRlcyB0aGlzLnJlc3BvbnNlLmNvdW50IHdpdGggdGhlIGNvdW50XG5fVW5zYWZlUmVzdFF1ZXJ5LnByb3RvdHlwZS5ydW5Db3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmRvQ291bnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5maW5kT3B0aW9ucy5jb3VudCA9IHRydWU7XG4gIGRlbGV0ZSB0aGlzLmZpbmRPcHRpb25zLnNraXA7XG4gIGRlbGV0ZSB0aGlzLmZpbmRPcHRpb25zLmxpbWl0O1xuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UuZmluZCh0aGlzLmNsYXNzTmFtZSwgdGhpcy5yZXN0V2hlcmUsIHRoaXMuZmluZE9wdGlvbnMpLnRoZW4oYyA9PiB7XG4gICAgdGhpcy5yZXNwb25zZS5jb3VudCA9IGM7XG4gIH0pO1xufTtcblxuX1Vuc2FmZVJlc3RRdWVyeS5wcm90b3R5cGUuZGVueVByb3RlY3RlZEZpZWxkcyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYXV0aC5pc01hc3Rlcikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzY2hlbWFDb250cm9sbGVyID0gYXdhaXQgdGhpcy5jb25maWcuZGF0YWJhc2UubG9hZFNjaGVtYSgpO1xuICBjb25zdCBwcm90ZWN0ZWRGaWVsZHMgPVxuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmFkZFByb3RlY3RlZEZpZWxkcyhcbiAgICAgIHNjaGVtYUNvbnRyb2xsZXIsXG4gICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIHRoaXMucmVzdFdoZXJlLFxuICAgICAgdGhpcy5maW5kT3B0aW9ucy5hY2wsXG4gICAgICB0aGlzLmF1dGgsXG4gICAgICB0aGlzLmZpbmRPcHRpb25zXG4gICAgKSB8fCBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgcHJvdGVjdGVkRmllbGRzKSB7XG4gICAgaWYgKHRoaXMucmVzdFdoZXJlW2tleV0pIHtcbiAgICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICBgVGhpcyB1c2VyIGlzIG5vdCBhbGxvd2VkIHRvIHF1ZXJ5ICR7a2V5fSBvbiBjbGFzcyAke3RoaXMuY2xhc3NOYW1lfWAsXG4gICAgICAgIHRoaXMuY29uZmlnXG4gICAgICApO1xuICAgIH1cbiAgfVxufTtcblxuLy8gQXVnbWVudHMgdGhpcy5yZXNwb25zZSB3aXRoIGFsbCBwb2ludGVycyBvbiBhbiBvYmplY3Rcbl9VbnNhZmVSZXN0UXVlcnkucHJvdG90eXBlLmhhbmRsZUluY2x1ZGVBbGwgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5pbmNsdWRlQWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgIC5sb2FkU2NoZW1hKClcbiAgICAudGhlbihzY2hlbWFDb250cm9sbGVyID0+IHNjaGVtYUNvbnRyb2xsZXIuZ2V0T25lU2NoZW1hKHRoaXMuY2xhc3NOYW1lKSlcbiAgICAudGhlbihzY2hlbWEgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZUZpZWxkcyA9IFtdO1xuICAgICAgY29uc3Qga2V5RmllbGRzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIHNjaGVtYS5maWVsZHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChzY2hlbWEuZmllbGRzW2ZpZWxkXS50eXBlICYmIHNjaGVtYS5maWVsZHNbZmllbGRdLnR5cGUgPT09ICdQb2ludGVyJykgfHxcbiAgICAgICAgICAoc2NoZW1hLmZpZWxkc1tmaWVsZF0udHlwZSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkXS50eXBlID09PSAnQXJyYXknKVxuICAgICAgICApIHtcbiAgICAgICAgICBpbmNsdWRlRmllbGRzLnB1c2goW2ZpZWxkXSk7XG4gICAgICAgICAga2V5RmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBZGQgZmllbGRzIHRvIGluY2x1ZGUsIGtleXMsIHJlbW92ZSBkdXBzXG4gICAgICB0aGlzLmluY2x1ZGUgPSBbLi4ubmV3IFNldChbLi4udGhpcy5pbmNsdWRlLCAuLi5pbmNsdWRlRmllbGRzXSldO1xuICAgICAgLy8gaWYgdGhpcy5rZXlzIG5vdCBzZXQsIHRoZW4gYWxsIGtleXMgYXJlIGFscmVhZHkgaW5jbHVkZWRcbiAgICAgIGlmICh0aGlzLmtleXMpIHtcbiAgICAgICAgdGhpcy5rZXlzID0gWy4uLm5ldyBTZXQoWy4uLnRoaXMua2V5cywgLi4ua2V5RmllbGRzXSldO1xuICAgICAgfVxuICAgIH0pO1xufTtcblxuLy8gVXBkYXRlcyBwcm9wZXJ0eSBgdGhpcy5rZXlzYCB0byBjb250YWluIGFsbCBrZXlzIGJ1dCB0aGUgb25lcyB1bnNlbGVjdGVkLlxuX1Vuc2FmZVJlc3RRdWVyeS5wcm90b3R5cGUuaGFuZGxlRXhjbHVkZUtleXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5leGNsdWRlS2V5cykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodGhpcy5rZXlzKSB7XG4gICAgdGhpcy5rZXlzID0gdGhpcy5rZXlzLmZpbHRlcihrID0+ICF0aGlzLmV4Y2x1ZGVLZXlzLmluY2x1ZGVzKGspKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgLmxvYWRTY2hlbWEoKVxuICAgIC50aGVuKHNjaGVtYUNvbnRyb2xsZXIgPT4gc2NoZW1hQ29udHJvbGxlci5nZXRPbmVTY2hlbWEodGhpcy5jbGFzc05hbWUpKVxuICAgIC50aGVuKHNjaGVtYSA9PiB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzY2hlbWEuZmllbGRzKTtcbiAgICAgIHRoaXMua2V5cyA9IGZpZWxkcy5maWx0ZXIoayA9PiAhdGhpcy5leGNsdWRlS2V5cy5pbmNsdWRlcyhrKSk7XG4gICAgfSk7XG59O1xuXG4vLyBBdWdtZW50cyB0aGlzLnJlc3BvbnNlIHdpdGggZGF0YSBhdCB0aGUgcGF0aHMgcHJvdmlkZWQgaW4gdGhpcy5pbmNsdWRlLlxuX1Vuc2FmZVJlc3RRdWVyeS5wcm90b3R5cGUuaGFuZGxlSW5jbHVkZSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuaW5jbHVkZS5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGluZGV4ZWRSZXN1bHRzID0gdGhpcy5yZXNwb25zZS5yZXN1bHRzLnJlZHVjZSgoaW5kZXhlZCwgcmVzdWx0LCBpKSA9PiB7XG4gICAgaW5kZXhlZFtyZXN1bHQub2JqZWN0SWRdID0gaTtcbiAgICByZXR1cm4gaW5kZXhlZDtcbiAgfSwge30pO1xuXG4gIC8vIEJ1aWxkIHRoZSBleGVjdXRpb24gdHJlZVxuICBjb25zdCBleGVjdXRpb25UcmVlID0ge31cbiAgdGhpcy5pbmNsdWRlLmZvckVhY2gocGF0aCA9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSBleGVjdXRpb25UcmVlO1xuICAgIHBhdGguZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgaWYgKCFjdXJyZW50W25vZGVdKSB7XG4gICAgICAgIGN1cnJlbnRbbm9kZV0gPSB7XG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBjaGlsZHJlbjoge31cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W25vZGVdLmNoaWxkcmVuXG4gICAgfSk7XG4gIH0pO1xuXG4gIGNvbnN0IHJlY3Vyc2l2ZUV4ZWN1dGlvblRyZWUgPSBhc3luYyAodHJlZU5vZGUpID0+IHtcbiAgICBjb25zdCB7IHBhdGgsIGNoaWxkcmVuIH0gPSB0cmVlTm9kZTtcbiAgICBjb25zdCBwYXRoUmVzcG9uc2UgPSBpbmNsdWRlUGF0aChcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgdGhpcy5hdXRoLFxuICAgICAgdGhpcy5yZXNwb25zZSxcbiAgICAgIHBhdGgsXG4gICAgICB0aGlzLmNvbnRleHQsXG4gICAgICB0aGlzLnJlc3RPcHRpb25zLFxuICAgICAgdGhpcyxcbiAgICApO1xuICAgIGlmIChwYXRoUmVzcG9uc2UudGhlbikge1xuICAgICAgY29uc3QgbmV3UmVzcG9uc2UgPSBhd2FpdCBwYXRoUmVzcG9uc2VcbiAgICAgIG5ld1Jlc3BvbnNlLnJlc3VsdHMuZm9yRWFjaChuZXdPYmplY3QgPT4ge1xuICAgICAgICAvLyBXZSBoeWRyYXRlIHRoZSByb290IG9mIGVhY2ggcmVzdWx0IHdpdGggc3ViIHJlc3VsdHNcbiAgICAgICAgdGhpcy5yZXNwb25zZS5yZXN1bHRzW2luZGV4ZWRSZXN1bHRzW25ld09iamVjdC5vYmplY3RJZF1dW3BhdGhbMF1dID0gbmV3T2JqZWN0W3BhdGhbMF1dO1xuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC52YWx1ZXMoY2hpbGRyZW4pLm1hcChyZWN1cnNpdmVFeGVjdXRpb25UcmVlKSk7XG4gIH1cblxuICBhd2FpdCBQcm9taXNlLmFsbChPYmplY3QudmFsdWVzKGV4ZWN1dGlvblRyZWUpLm1hcChyZWN1cnNpdmVFeGVjdXRpb25UcmVlKSk7XG4gIHRoaXMuaW5jbHVkZSA9IFtdXG59O1xuXG4vL1JldHVybnMgYSBwcm9taXNlIG9mIGEgcHJvY2Vzc2VkIHNldCBvZiByZXN1bHRzXG5fVW5zYWZlUmVzdFF1ZXJ5LnByb3RvdHlwZS5ydW5BZnRlckZpbmRUcmlnZ2VyID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMucmVzcG9uc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCF0aGlzLnJ1bkFmdGVyRmluZCkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBBdm9pZCBkb2luZyBhbnkgc2V0dXAgZm9yIHRyaWdnZXJzIGlmIHRoZXJlIGlzIG5vICdhZnRlckZpbmQnIHRyaWdnZXIgZm9yIHRoaXMgY2xhc3MuXG4gIGNvbnN0IGhhc0FmdGVyRmluZEhvb2sgPSB0cmlnZ2Vycy50cmlnZ2VyRXhpc3RzKFxuICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgIHRyaWdnZXJzLlR5cGVzLmFmdGVyRmluZCxcbiAgICB0aGlzLmNvbmZpZy5hcHBsaWNhdGlvbklkXG4gICk7XG4gIGlmICghaGFzQWZ0ZXJGaW5kSG9vaykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICAvLyBTa2lwIEFnZ3JlZ2F0ZSBhbmQgRGlzdGluY3QgUXVlcmllc1xuICBpZiAodGhpcy5maW5kT3B0aW9ucy5waXBlbGluZSB8fCB0aGlzLmZpbmRPcHRpb25zLmRpc3RpbmN0KSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgY29uc3QganNvbiA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucmVzdE9wdGlvbnMpO1xuICBqc29uLndoZXJlID0gdGhpcy5yZXN0V2hlcmU7XG4gIGNvbnN0IHBhcnNlUXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkodGhpcy5jbGFzc05hbWUpO1xuICBwYXJzZVF1ZXJ5LndpdGhKU09OKGpzb24pO1xuICAvLyBSdW4gYWZ0ZXJGaW5kIHRyaWdnZXIgYW5kIHNldCB0aGUgbmV3IHJlc3VsdHNcbiAgcmV0dXJuIHRyaWdnZXJzXG4gICAgLm1heWJlUnVuQWZ0ZXJGaW5kVHJpZ2dlcihcbiAgICAgIHRyaWdnZXJzLlR5cGVzLmFmdGVyRmluZCxcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgdGhpcy5yZXNwb25zZS5yZXN1bHRzLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBwYXJzZVF1ZXJ5LFxuICAgICAgdGhpcy5jb250ZXh0LFxuICAgICAgdGhpcy5pc0dldFxuICAgIClcbiAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgIC8vIEVuc3VyZSB3ZSBwcm9wZXJseSBzZXQgdGhlIGNsYXNzTmFtZSBiYWNrXG4gICAgICBpZiAodGhpcy5yZWRpcmVjdENsYXNzTmFtZSkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlLnJlc3VsdHMgPSByZXN1bHRzLm1hcChvYmplY3QgPT4ge1xuICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQYXJzZS5PYmplY3QpIHtcbiAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdC50b0pTT04oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0LmNsYXNzTmFtZSA9IHRoaXMucmVkaXJlY3RDbGFzc05hbWU7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc3BvbnNlLnJlc3VsdHMgPSByZXN1bHRzO1xuICAgICAgfVxuICAgIH0pO1xufTtcblxuX1Vuc2FmZVJlc3RRdWVyeS5wcm90b3R5cGUuaGFuZGxlQXV0aEFkYXB0ZXJzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicgfHwgdGhpcy5maW5kT3B0aW9ucy5leHBsYWluKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHRoaXMucmVzcG9uc2UucmVzdWx0cy5tYXAocmVzdWx0ID0+XG4gICAgICB0aGlzLmNvbmZpZy5hdXRoRGF0YU1hbmFnZXIucnVuQWZ0ZXJGaW5kKFxuICAgICAgICB7IGNvbmZpZzogdGhpcy5jb25maWcsIGF1dGg6IHRoaXMuYXV0aCB9LFxuICAgICAgICByZXN1bHQuYXV0aERhdGFcbiAgICAgIClcbiAgICApXG4gICk7XG59O1xuXG4vLyBBZGRzIGluY2x1ZGVkIHZhbHVlcyB0byB0aGUgcmVzcG9uc2UuXG4vLyBQYXRoIGlzIGEgbGlzdCBvZiBmaWVsZCBuYW1lcy5cbi8vIFJldHVybnMgYSBwcm9taXNlIGZvciBhbiBhdWdtZW50ZWQgcmVzcG9uc2UuXG5mdW5jdGlvbiBpbmNsdWRlUGF0aChjb25maWcsIGF1dGgsIHJlc3BvbnNlLCBwYXRoLCBjb250ZXh0LCByZXN0T3B0aW9ucyA9IHt9KSB7XG4gIHZhciBwb2ludGVycyA9IGZpbmRQb2ludGVycyhyZXNwb25zZS5yZXN1bHRzLCBwYXRoKTtcbiAgaWYgKHBvaW50ZXJzLmxlbmd0aCA9PSAwKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG4gIGNvbnN0IHBvaW50ZXJzSGFzaCA9IHt9O1xuICBmb3IgKHZhciBwb2ludGVyIG9mIHBvaW50ZXJzKSB7XG4gICAgaWYgKCFwb2ludGVyKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NOYW1lID0gcG9pbnRlci5jbGFzc05hbWU7XG4gICAgLy8gb25seSBpbmNsdWRlIHRoZSBnb29kIHBvaW50ZXJzXG4gICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgcG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0gPSBwb2ludGVyc0hhc2hbY2xhc3NOYW1lXSB8fCBuZXcgU2V0KCk7XG4gICAgICBwb2ludGVyc0hhc2hbY2xhc3NOYW1lXS5hZGQocG9pbnRlci5vYmplY3RJZCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGluY2x1ZGVSZXN0T3B0aW9ucyA9IHt9O1xuICBpZiAocmVzdE9wdGlvbnMua2V5cykge1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KHJlc3RPcHRpb25zLmtleXMuc3BsaXQoJywnKSk7XG4gICAgY29uc3Qga2V5U2V0ID0gQXJyYXkuZnJvbShrZXlzKS5yZWR1Y2UoKHNldCwga2V5KSA9PiB7XG4gICAgICBjb25zdCBrZXlQYXRoID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKGk7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXRoW2ldICE9IGtleVBhdGhbaV0pIHtcbiAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA8IGtleVBhdGgubGVuZ3RoKSB7XG4gICAgICAgIHNldC5hZGQoa2V5UGF0aFtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0O1xuICAgIH0sIG5ldyBTZXQoKSk7XG4gICAgaWYgKGtleVNldC5zaXplID4gMCkge1xuICAgICAgaW5jbHVkZVJlc3RPcHRpb25zLmtleXMgPSBBcnJheS5mcm9tKGtleVNldCkuam9pbignLCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXN0T3B0aW9ucy5leGNsdWRlS2V5cykge1xuICAgIGNvbnN0IGV4Y2x1ZGVLZXlzID0gbmV3IFNldChyZXN0T3B0aW9ucy5leGNsdWRlS2V5cy5zcGxpdCgnLCcpKTtcbiAgICBjb25zdCBleGNsdWRlS2V5U2V0ID0gQXJyYXkuZnJvbShleGNsdWRlS2V5cykucmVkdWNlKChzZXQsIGtleSkgPT4ge1xuICAgICAgY29uc3Qga2V5UGF0aCA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yIChpOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0aFtpXSAhPSBrZXlQYXRoW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIHNldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPT0ga2V5UGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgIHNldC5hZGQoa2V5UGF0aFtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0O1xuICAgIH0sIG5ldyBTZXQoKSk7XG4gICAgaWYgKGV4Y2x1ZGVLZXlTZXQuc2l6ZSA+IDApIHtcbiAgICAgIGluY2x1ZGVSZXN0T3B0aW9ucy5leGNsdWRlS2V5cyA9IEFycmF5LmZyb20oZXhjbHVkZUtleVNldCkuam9pbignLCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXN0T3B0aW9ucy5pbmNsdWRlUmVhZFByZWZlcmVuY2UpIHtcbiAgICBpbmNsdWRlUmVzdE9wdGlvbnMucmVhZFByZWZlcmVuY2UgPSByZXN0T3B0aW9ucy5pbmNsdWRlUmVhZFByZWZlcmVuY2U7XG4gICAgaW5jbHVkZVJlc3RPcHRpb25zLmluY2x1ZGVSZWFkUHJlZmVyZW5jZSA9IHJlc3RPcHRpb25zLmluY2x1ZGVSZWFkUHJlZmVyZW5jZTtcbiAgfSBlbHNlIGlmIChyZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZSkge1xuICAgIGluY2x1ZGVSZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZSA9IHJlc3RPcHRpb25zLnJlYWRQcmVmZXJlbmNlO1xuICB9XG4gIGNvbnN0IHF1ZXJ5UHJvbWlzZXMgPSBPYmplY3Qua2V5cyhwb2ludGVyc0hhc2gpLm1hcChhc3luYyBjbGFzc05hbWUgPT4ge1xuICAgIGNvbnN0IG9iamVjdElkcyA9IEFycmF5LmZyb20ocG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0pO1xuICAgIGxldCB3aGVyZTtcbiAgICBpZiAob2JqZWN0SWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgd2hlcmUgPSB7IG9iamVjdElkOiBvYmplY3RJZHNbMF0gfTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hlcmUgPSB7IG9iamVjdElkOiB7ICRpbjogb2JqZWN0SWRzIH0gfTtcbiAgICB9XG4gICAgY29uc3QgcXVlcnkgPSBhd2FpdCBSZXN0UXVlcnkoe1xuICAgICAgbWV0aG9kOiBvYmplY3RJZHMubGVuZ3RoID09PSAxID8gUmVzdFF1ZXJ5Lk1ldGhvZC5nZXQgOiBSZXN0UXVlcnkuTWV0aG9kLmZpbmQsXG4gICAgICBjb25maWcsXG4gICAgICBhdXRoLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgcmVzdFdoZXJlOiB3aGVyZSxcbiAgICAgIHJlc3RPcHRpb25zOiBpbmNsdWRlUmVzdE9wdGlvbnMsXG4gICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgIH0pO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlKHsgb3A6ICdnZXQnIH0pLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICByZXN1bHRzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0cyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEdldCB0aGUgb2JqZWN0cyBmb3IgYWxsIHRoZXNlIG9iamVjdCBpZHNcbiAgcmV0dXJuIFByb21pc2UuYWxsKHF1ZXJ5UHJvbWlzZXMpLnRoZW4ocmVzcG9uc2VzID0+IHtcbiAgICB2YXIgcmVwbGFjZSA9IHJlc3BvbnNlcy5yZWR1Y2UoKHJlcGxhY2UsIGluY2x1ZGVSZXNwb25zZSkgPT4ge1xuICAgICAgZm9yICh2YXIgb2JqIG9mIGluY2x1ZGVSZXNwb25zZS5yZXN1bHRzKSB7XG4gICAgICAgIG9iai5fX3R5cGUgPSAnT2JqZWN0JztcbiAgICAgICAgb2JqLmNsYXNzTmFtZSA9IGluY2x1ZGVSZXNwb25zZS5jbGFzc05hbWU7XG5cbiAgICAgICAgaWYgKG9iai5jbGFzc05hbWUgPT0gJ19Vc2VyJyAmJiAhYXV0aC5pc01hc3Rlcikge1xuICAgICAgICAgIGRlbGV0ZSBvYmouc2Vzc2lvblRva2VuO1xuICAgICAgICAgIGRlbGV0ZSBvYmouYXV0aERhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmVwbGFjZVtvYmoub2JqZWN0SWRdID0gb2JqO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcGxhY2U7XG4gICAgfSwge30pO1xuICAgIHZhciByZXNwID0ge1xuICAgICAgcmVzdWx0czogcmVwbGFjZVBvaW50ZXJzKHJlc3BvbnNlLnJlc3VsdHMsIHBhdGgsIHJlcGxhY2UpLFxuICAgIH07XG4gICAgaWYgKHJlc3BvbnNlLmNvdW50KSB7XG4gICAgICByZXNwLmNvdW50ID0gcmVzcG9uc2UuY291bnQ7XG4gICAgfVxuICAgIHJldHVybiByZXNwO1xuICB9KTtcbn1cblxuLy8gT2JqZWN0IG1heSBiZSBhIGxpc3Qgb2YgUkVTVC1mb3JtYXQgb2JqZWN0IHRvIGZpbmQgcG9pbnRlcnMgaW4sIG9yXG4vLyBpdCBtYXkgYmUgYSBzaW5nbGUgb2JqZWN0LlxuLy8gSWYgdGhlIHBhdGggeWllbGRzIHRoaW5ncyB0aGF0IGFyZW4ndCBwb2ludGVycywgdGhpcyB0aHJvd3MgYW4gZXJyb3IuXG4vLyBQYXRoIGlzIGEgbGlzdCBvZiBmaWVsZHMgdG8gc2VhcmNoIGludG8uXG4vLyBSZXR1cm5zIGEgbGlzdCBvZiBwb2ludGVycyBpbiBSRVNUIGZvcm1hdC5cbmZ1bmN0aW9uIGZpbmRQb2ludGVycyhvYmplY3QsIHBhdGgpIHtcbiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgcmV0dXJuIG9iamVjdC5tYXAoeCA9PiBmaW5kUG9pbnRlcnMoeCwgcGF0aCkpLmZsYXQoKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0JyB8fCAhb2JqZWN0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKHBhdGgubGVuZ3RoID09IDApIHtcbiAgICBpZiAob2JqZWN0ID09PSBudWxsIHx8IG9iamVjdC5fX3R5cGUgPT0gJ1BvaW50ZXInKSB7XG4gICAgICByZXR1cm4gW29iamVjdF07XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBzdWJvYmplY3QgPSBvYmplY3RbcGF0aFswXV07XG4gIGlmICghc3Vib2JqZWN0KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBmaW5kUG9pbnRlcnMoc3Vib2JqZWN0LCBwYXRoLnNsaWNlKDEpKTtcbn1cblxuLy8gT2JqZWN0IG1heSBiZSBhIGxpc3Qgb2YgUkVTVC1mb3JtYXQgb2JqZWN0cyB0byByZXBsYWNlIHBvaW50ZXJzXG4vLyBpbiwgb3IgaXQgbWF5IGJlIGEgc2luZ2xlIG9iamVjdC5cbi8vIFBhdGggaXMgYSBsaXN0IG9mIGZpZWxkcyB0byBzZWFyY2ggaW50by5cbi8vIHJlcGxhY2UgaXMgYSBtYXAgZnJvbSBvYmplY3QgaWQgLT4gb2JqZWN0LlxuLy8gUmV0dXJucyBzb21ldGhpbmcgYW5hbG9nb3VzIHRvIG9iamVjdCwgYnV0IHdpdGggdGhlIGFwcHJvcHJpYXRlXG4vLyBwb2ludGVycyBpbmZsYXRlZC5cbmZ1bmN0aW9uIHJlcGxhY2VQb2ludGVycyhvYmplY3QsIHBhdGgsIHJlcGxhY2UpIHtcbiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgcmV0dXJuIG9iamVjdFxuICAgICAgLm1hcChvYmogPT4gcmVwbGFjZVBvaW50ZXJzKG9iaiwgcGF0aCwgcmVwbGFjZSkpXG4gICAgICAuZmlsdGVyKG9iaiA9PiB0eXBlb2Ygb2JqICE9PSAndW5kZWZpbmVkJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcgfHwgIW9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICBpZiAob2JqZWN0ICYmIG9iamVjdC5fX3R5cGUgPT09ICdQb2ludGVyJykge1xuICAgICAgcmV0dXJuIHJlcGxhY2Vbb2JqZWN0Lm9iamVjdElkXTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIHZhciBzdWJvYmplY3QgPSBvYmplY3RbcGF0aFswXV07XG4gIGlmICghc3Vib2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICB2YXIgbmV3c3ViID0gcmVwbGFjZVBvaW50ZXJzKHN1Ym9iamVjdCwgcGF0aC5zbGljZSgxKSwgcmVwbGFjZSk7XG4gIHZhciBhbnN3ZXIgPSB7fTtcbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIGlmIChrZXkgPT0gcGF0aFswXSkge1xuICAgICAgYW5zd2VyW2tleV0gPSBuZXdzdWI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFuc3dlcltrZXldID0gb2JqZWN0W2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBhbnN3ZXI7XG59XG5cbi8vIEZpbmRzIGEgc3Vib2JqZWN0IHRoYXQgaGFzIHRoZSBnaXZlbiBrZXksIGlmIHRoZXJlIGlzIG9uZS5cbi8vIFJldHVybnMgdW5kZWZpbmVkIG90aGVyd2lzZS5cbmZ1bmN0aW9uIGZpbmRPYmplY3RXaXRoS2V5KHJvb3QsIGtleSkge1xuICBpZiAodHlwZW9mIHJvb3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChyb290IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICBmb3IgKHZhciBpdGVtIG9mIHJvb3QpIHtcbiAgICAgIGNvbnN0IGFuc3dlciA9IGZpbmRPYmplY3RXaXRoS2V5KGl0ZW0sIGtleSk7XG4gICAgICBpZiAoYW5zd2VyKSB7XG4gICAgICAgIHJldHVybiBhbnN3ZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChyb290ICYmIHJvb3Rba2V5XSkge1xuICAgIHJldHVybiByb290O1xuICB9XG4gIGZvciAodmFyIHN1YmtleSBpbiByb290KSB7XG4gICAgY29uc3QgYW5zd2VyID0gZmluZE9iamVjdFdpdGhLZXkocm9vdFtzdWJrZXldLCBrZXkpO1xuICAgIGlmIChhbnN3ZXIpIHtcbiAgICAgIHJldHVybiBhbnN3ZXI7XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVzdFF1ZXJ5O1xuLy8gRm9yIHRlc3RzXG5tb2R1bGUuZXhwb3J0cy5fVW5zYWZlUmVzdFF1ZXJ5ID0gX1Vuc2FmZVJlc3RRdWVyeTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBOztBQUVBLElBQUlBLGdCQUFnQixHQUFHQyxPQUFPLENBQUMsZ0NBQWdDLENBQUM7QUFDaEUsSUFBSUMsS0FBSyxHQUFHRCxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUNDLEtBQUs7QUFDdkMsTUFBTUMsUUFBUSxHQUFHRixPQUFP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