@beiguancyc/parse-server 9.9.0-ruixiang.1

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 (251) hide show
  1. package/LICENSE +176 -0
  2. package/NOTICE +10 -0
  3. package/README.md +1311 -0
  4. package/bin/parse-live-query-server +3 -0
  5. package/bin/parse-server +3 -0
  6. package/lib/AccountLockout.js +149 -0
  7. package/lib/Adapters/AdapterLoader.js +60 -0
  8. package/lib/Adapters/Analytics/AnalyticsAdapter.js +32 -0
  9. package/lib/Adapters/Auth/AuthAdapter.js +132 -0
  10. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +119 -0
  11. package/lib/Adapters/Auth/OAuth1Client.js +204 -0
  12. package/lib/Adapters/Auth/apple.js +125 -0
  13. package/lib/Adapters/Auth/facebook.js +187 -0
  14. package/lib/Adapters/Auth/gcenter.js +217 -0
  15. package/lib/Adapters/Auth/github.js +125 -0
  16. package/lib/Adapters/Auth/google.js +122 -0
  17. package/lib/Adapters/Auth/gpgames.js +125 -0
  18. package/lib/Adapters/Auth/httpsRequest.js +41 -0
  19. package/lib/Adapters/Auth/index.js +248 -0
  20. package/lib/Adapters/Auth/instagram.js +118 -0
  21. package/lib/Adapters/Auth/janraincapture.js +85 -0
  22. package/lib/Adapters/Auth/janrainengage.js +57 -0
  23. package/lib/Adapters/Auth/keycloak.js +168 -0
  24. package/lib/Adapters/Auth/ldap.js +193 -0
  25. package/lib/Adapters/Auth/line.js +125 -0
  26. package/lib/Adapters/Auth/linkedin.js +117 -0
  27. package/lib/Adapters/Auth/meetup.js +44 -0
  28. package/lib/Adapters/Auth/mfa.js +334 -0
  29. package/lib/Adapters/Auth/microsoft.js +111 -0
  30. package/lib/Adapters/Auth/oauth2.js +115 -0
  31. package/lib/Adapters/Auth/phantauth.js +53 -0
  32. package/lib/Adapters/Auth/qq.js +113 -0
  33. package/lib/Adapters/Auth/spotify.js +115 -0
  34. package/lib/Adapters/Auth/twitter.js +197 -0
  35. package/lib/Adapters/Auth/utils.js +28 -0
  36. package/lib/Adapters/Auth/vkontakte.js +55 -0
  37. package/lib/Adapters/Auth/wechat.js +110 -0
  38. package/lib/Adapters/Auth/weibo.js +141 -0
  39. package/lib/Adapters/Cache/CacheAdapter.js +40 -0
  40. package/lib/Adapters/Cache/InMemoryCache.js +61 -0
  41. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +34 -0
  42. package/lib/Adapters/Cache/LRUCache.js +35 -0
  43. package/lib/Adapters/Cache/NullCacheAdapter.js +26 -0
  44. package/lib/Adapters/Cache/RedisCacheAdapter.js +109 -0
  45. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  46. package/lib/Adapters/Email/MailAdapter.js +32 -0
  47. package/lib/Adapters/Files/FilesAdapter.js +129 -0
  48. package/lib/Adapters/Files/GridFSBucketAdapter.js +280 -0
  49. package/lib/Adapters/Files/GridStoreAdapter.js +5 -0
  50. package/lib/Adapters/Logger/LoggerAdapter.js +27 -0
  51. package/lib/Adapters/Logger/WinstonLogger.js +107 -0
  52. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +63 -0
  53. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +55 -0
  54. package/lib/Adapters/PubSub/EventEmitterPubSub.js +53 -0
  55. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  56. package/lib/Adapters/PubSub/RedisPubSub.js +49 -0
  57. package/lib/Adapters/Push/PushAdapter.js +40 -0
  58. package/lib/Adapters/Storage/Mongo/MongoCollection.js +212 -0
  59. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +334 -0
  60. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +1047 -0
  61. package/lib/Adapters/Storage/Mongo/MongoTransform.js +1397 -0
  62. package/lib/Adapters/Storage/Postgres/PostgresClient.js +38 -0
  63. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +73 -0
  64. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +2409 -0
  65. package/lib/Adapters/Storage/Postgres/sql/array/add-unique.sql +11 -0
  66. package/lib/Adapters/Storage/Postgres/sql/array/add.sql +11 -0
  67. package/lib/Adapters/Storage/Postgres/sql/array/contains-all-regex.sql +14 -0
  68. package/lib/Adapters/Storage/Postgres/sql/array/contains-all.sql +14 -0
  69. package/lib/Adapters/Storage/Postgres/sql/array/contains.sql +11 -0
  70. package/lib/Adapters/Storage/Postgres/sql/array/remove.sql +11 -0
  71. package/lib/Adapters/Storage/Postgres/sql/index.js +32 -0
  72. package/lib/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql +19 -0
  73. package/lib/Adapters/Storage/StorageAdapter.js +2 -0
  74. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  75. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  76. package/lib/Auth.js +687 -0
  77. package/lib/AuthDataLock.js +53 -0
  78. package/lib/ClientSDK.js +39 -0
  79. package/lib/Config.js +879 -0
  80. package/lib/Controllers/AdaptableController.js +72 -0
  81. package/lib/Controllers/AnalyticsController.js +43 -0
  82. package/lib/Controllers/CacheController.js +71 -0
  83. package/lib/Controllers/DatabaseController.js +1685 -0
  84. package/lib/Controllers/FilesController.js +122 -0
  85. package/lib/Controllers/HooksController.js +254 -0
  86. package/lib/Controllers/LiveQueryController.js +72 -0
  87. package/lib/Controllers/LoggerController.js +222 -0
  88. package/lib/Controllers/ParseGraphQLController.js +294 -0
  89. package/lib/Controllers/PushController.js +224 -0
  90. package/lib/Controllers/SchemaController.js +1563 -0
  91. package/lib/Controllers/UserController.js +364 -0
  92. package/lib/Controllers/index.js +251 -0
  93. package/lib/Controllers/types.js +2 -0
  94. package/lib/Deprecator/Deprecations.js +100 -0
  95. package/lib/Deprecator/Deprecator.js +140 -0
  96. package/lib/Error.js +50 -0
  97. package/lib/FileUrlValidator.js +69 -0
  98. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  99. package/lib/GraphQL/ParseGraphQLServer.js +241 -0
  100. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  101. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  102. package/lib/GraphQL/helpers/queryComplexity.js +138 -0
  103. package/lib/GraphQL/loaders/configMutations.js +87 -0
  104. package/lib/GraphQL/loaders/configQueries.js +79 -0
  105. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  106. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  107. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1099 -0
  108. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  109. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  110. package/lib/GraphQL/loaders/functionsMutations.js +77 -0
  111. package/lib/GraphQL/loaders/parseClassMutations.js +267 -0
  112. package/lib/GraphQL/loaders/parseClassQueries.js +126 -0
  113. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  114. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  115. package/lib/GraphQL/loaders/schemaMutations.js +161 -0
  116. package/lib/GraphQL/loaders/schemaQueries.js +80 -0
  117. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  118. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  119. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  120. package/lib/GraphQL/parseGraphQLUtils.js +71 -0
  121. package/lib/GraphQL/transformers/className.js +14 -0
  122. package/lib/GraphQL/transformers/constraintType.js +53 -0
  123. package/lib/GraphQL/transformers/inputType.js +51 -0
  124. package/lib/GraphQL/transformers/mutation.js +280 -0
  125. package/lib/GraphQL/transformers/outputType.js +51 -0
  126. package/lib/GraphQL/transformers/query.js +237 -0
  127. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  128. package/lib/InstallationDedup.js +178 -0
  129. package/lib/KeyPromiseQueue.js +48 -0
  130. package/lib/LiveQuery/Client.js +90 -0
  131. package/lib/LiveQuery/Id.js +20 -0
  132. package/lib/LiveQuery/ParseCloudCodePublisher.js +54 -0
  133. package/lib/LiveQuery/ParseLiveQueryServer.js +1071 -0
  134. package/lib/LiveQuery/ParsePubSub.js +37 -0
  135. package/lib/LiveQuery/ParseWebSocketServer.js +66 -0
  136. package/lib/LiveQuery/QueryTools.js +443 -0
  137. package/lib/LiveQuery/RequestSchema.js +161 -0
  138. package/lib/LiveQuery/SessionTokenCache.js +51 -0
  139. package/lib/LiveQuery/Subscription.js +47 -0
  140. package/lib/LiveQuery/equalObjects.js +50 -0
  141. package/lib/Options/Definitions.js +1599 -0
  142. package/lib/Options/docs.js +389 -0
  143. package/lib/Options/index.js +12 -0
  144. package/lib/Options/parsers.js +89 -0
  145. package/lib/Page.js +44 -0
  146. package/lib/ParseMessageQueue.js +24 -0
  147. package/lib/ParseServer.js +632 -0
  148. package/lib/ParseServerRESTController.js +173 -0
  149. package/lib/PromiseRouter.js +208 -0
  150. package/lib/Push/PushQueue.js +67 -0
  151. package/lib/Push/PushWorker.js +101 -0
  152. package/lib/Push/utils.js +129 -0
  153. package/lib/RestQuery.js +1208 -0
  154. package/lib/RestWrite.js +1671 -0
  155. package/lib/Routers/AggregateRouter.js +150 -0
  156. package/lib/Routers/AnalyticsRouter.js +26 -0
  157. package/lib/Routers/AudiencesRouter.js +54 -0
  158. package/lib/Routers/ClassesRouter.js +191 -0
  159. package/lib/Routers/CloudCodeRouter.js +87 -0
  160. package/lib/Routers/FeaturesRouter.js +72 -0
  161. package/lib/Routers/FilesRouter.js +772 -0
  162. package/lib/Routers/FunctionsRouter.js +341 -0
  163. package/lib/Routers/GlobalConfigRouter.js +123 -0
  164. package/lib/Routers/GraphQLRouter.js +41 -0
  165. package/lib/Routers/HooksRouter.js +121 -0
  166. package/lib/Routers/IAPValidationRouter.js +113 -0
  167. package/lib/Routers/InstallationsRouter.js +46 -0
  168. package/lib/Routers/LogsRouter.js +57 -0
  169. package/lib/Routers/PagesRouter.js +676 -0
  170. package/lib/Routers/PurgeRouter.js +45 -0
  171. package/lib/Routers/PushRouter.js +75 -0
  172. package/lib/Routers/RolesRouter.js +33 -0
  173. package/lib/Routers/SchemasRouter.js +118 -0
  174. package/lib/Routers/SecurityRouter.js +34 -0
  175. package/lib/Routers/SessionsRouter.js +126 -0
  176. package/lib/Routers/UsersRouter.js +733 -0
  177. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  178. package/lib/SchemaMigrations/Migrations.js +30 -0
  179. package/lib/Security/Check.js +109 -0
  180. package/lib/Security/CheckGroup.js +44 -0
  181. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  182. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +160 -0
  183. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  184. package/lib/Security/CheckRunner.js +213 -0
  185. package/lib/SharedRest.js +34 -0
  186. package/lib/StatusHandler.js +329 -0
  187. package/lib/TestUtils.js +87 -0
  188. package/lib/Utils.js +577 -0
  189. package/lib/batch.js +185 -0
  190. package/lib/cache.js +12 -0
  191. package/lib/cli/definitions/parse-live-query-server.js +9 -0
  192. package/lib/cli/definitions/parse-server.js +9 -0
  193. package/lib/cli/parse-live-query-server.js +14 -0
  194. package/lib/cli/parse-server.js +101 -0
  195. package/lib/cli/utils/commander.js +132 -0
  196. package/lib/cli/utils/runner.js +53 -0
  197. package/lib/cloud-code/Parse.Cloud.js +797 -0
  198. package/lib/cloud-code/Parse.Server.js +21 -0
  199. package/lib/cryptoUtils.js +54 -0
  200. package/lib/defaults.js +58 -0
  201. package/lib/deprecated.js +12 -0
  202. package/lib/index.js +89 -0
  203. package/lib/logger.js +40 -0
  204. package/lib/middlewares.js +810 -0
  205. package/lib/password.js +40 -0
  206. package/lib/request.js +175 -0
  207. package/lib/requiredParameter.js +11 -0
  208. package/lib/rest.js +264 -0
  209. package/lib/triggers.js +949 -0
  210. package/lib/vendor/README.md +8 -0
  211. package/lib/vendor/mongodbUrl.js +1012 -0
  212. package/package.json +172 -0
  213. package/postinstall.js +38 -0
  214. package/public/custom_json.html +17 -0
  215. package/public/custom_json.json +23 -0
  216. package/public/custom_page.html +15 -0
  217. package/public/de/email_verification_link_expired.html +24 -0
  218. package/public/de/email_verification_link_invalid.html +21 -0
  219. package/public/de/email_verification_send_fail.html +21 -0
  220. package/public/de/email_verification_send_success.html +19 -0
  221. package/public/de/email_verification_success.html +18 -0
  222. package/public/de/password_reset.html +65 -0
  223. package/public/de/password_reset_link_invalid.html +19 -0
  224. package/public/de/password_reset_success.html +18 -0
  225. package/public/de-AT/email_verification_link_expired.html +24 -0
  226. package/public/de-AT/email_verification_link_invalid.html +21 -0
  227. package/public/de-AT/email_verification_send_fail.html +21 -0
  228. package/public/de-AT/email_verification_send_success.html +19 -0
  229. package/public/de-AT/email_verification_success.html +18 -0
  230. package/public/de-AT/password_reset.html +65 -0
  231. package/public/de-AT/password_reset_link_invalid.html +19 -0
  232. package/public/de-AT/password_reset_success.html +18 -0
  233. package/public/email_verification_link_expired.html +24 -0
  234. package/public/email_verification_link_invalid.html +21 -0
  235. package/public/email_verification_send_fail.html +21 -0
  236. package/public/email_verification_send_success.html +19 -0
  237. package/public/email_verification_success.html +18 -0
  238. package/public/password_reset.html +65 -0
  239. package/public/password_reset_link_invalid.html +19 -0
  240. package/public/password_reset_success.html +18 -0
  241. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  242. package/types/@types/deepcopy/index.d.ts +5 -0
  243. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  244. package/types/Options/index.d.ts +320 -0
  245. package/types/ParseServer.d.ts +65 -0
  246. package/types/eslint.config.mjs +30 -0
  247. package/types/index.d.ts +21 -0
  248. package/types/logger.d.ts +2 -0
  249. package/types/tests.ts +44 -0
  250. package/types/tsconfig.json +24 -0
  251. package/views/choose_password +215 -0
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.logLevels = exports.default = exports.LoggerController = exports.LogOrder = exports.LogLevel = void 0;
7
+ var _node = require("parse/node");
8
+ var _AdaptableController = _interopRequireDefault(require("./AdaptableController"));
9
+ var _LoggerAdapter = require("../Adapters/Logger/LoggerAdapter");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ const MILLISECONDS_IN_A_DAY = 24 * 60 * 60 * 1000;
12
+ const DEFAULT_LOG_STRING_TRUNCATE_LENGTH = 1000;
13
+ const truncationMarker = '... (truncated)';
14
+ const LogLevel = exports.LogLevel = {
15
+ INFO: 'info',
16
+ ERROR: 'error'
17
+ };
18
+ const LogOrder = exports.LogOrder = {
19
+ DESCENDING: 'desc',
20
+ ASCENDING: 'asc'
21
+ };
22
+ const logLevels = exports.logLevels = ['error', 'warn', 'info', 'debug', 'verbose', 'silly', 'silent'];
23
+ class LoggerController extends _AdaptableController.default {
24
+ constructor(adapter, appId, options = {
25
+ logLevel: 'info'
26
+ }) {
27
+ super(adapter, appId, options);
28
+ let level = 'info';
29
+ if (options.verbose) {
30
+ level = 'verbose';
31
+ }
32
+ if (options.logLevel) {
33
+ level = options.logLevel;
34
+ }
35
+ const index = logLevels.indexOf(level); // info by default
36
+ logLevels.forEach((level, levelIndex) => {
37
+ if (levelIndex > index) {
38
+ // silence the levels that are > maxIndex
39
+ this[level] = () => {};
40
+ }
41
+ });
42
+ this.logStringTruncateLength = options.logStringTruncateLength ?? DEFAULT_LOG_STRING_TRUNCATE_LENGTH;
43
+ }
44
+ maskSensitiveUrl(path) {
45
+ const urlString = 'http://localhost' + path; // prepend dummy string to make a real URL
46
+ const urlObj = new URL(urlString);
47
+ const query = urlObj.searchParams;
48
+ let sanitizedQuery = '?';
49
+ for (const [key, value] of query) {
50
+ if (key !== 'password') {
51
+ // normal value
52
+ sanitizedQuery += key + '=' + value + '&';
53
+ } else {
54
+ // password value, redact it
55
+ sanitizedQuery += key + '=' + '********' + '&';
56
+ }
57
+ }
58
+
59
+ // trim last character, ? or &
60
+ sanitizedQuery = sanitizedQuery.slice(0, -1);
61
+
62
+ // return original path name with sanitized params attached
63
+ return urlObj.pathname + sanitizedQuery;
64
+ }
65
+ maskSensitive(argArray) {
66
+ return argArray.map(e => {
67
+ if (!e) {
68
+ return e;
69
+ }
70
+ if (typeof e === 'string') {
71
+ return e.replace(/(password".?:.?")[^"]*"/g, '$1********"');
72
+ }
73
+ // else it is an object...
74
+
75
+ // check the url
76
+ if (e.url) {
77
+ // for strings
78
+ if (typeof e.url === 'string') {
79
+ e.url = this.maskSensitiveUrl(e.url);
80
+ } else if (Array.isArray(e.url)) {
81
+ // for strings in array
82
+ e.url = e.url.map(item => {
83
+ if (typeof item === 'string') {
84
+ return this.maskSensitiveUrl(item);
85
+ }
86
+ return item;
87
+ });
88
+ }
89
+ }
90
+ if (e.body) {
91
+ for (const key of Object.keys(e.body)) {
92
+ if (key === 'password') {
93
+ e.body[key] = '********';
94
+ break;
95
+ }
96
+ }
97
+ }
98
+ if (e.params) {
99
+ for (const key of Object.keys(e.params)) {
100
+ if (key === 'password') {
101
+ e.params[key] = '********';
102
+ break;
103
+ }
104
+ }
105
+ }
106
+ return e;
107
+ });
108
+ }
109
+ log(level, args) {
110
+ // make the passed in arguments object an array with the spread operator
111
+ args = this.maskSensitive([...args]);
112
+ args = [].concat(level, args.map(arg => {
113
+ if (typeof arg === 'function') {
114
+ return arg();
115
+ }
116
+ return arg;
117
+ }));
118
+ this.adapter.log.apply(this.adapter, args);
119
+ }
120
+ info() {
121
+ return this.log('info', arguments);
122
+ }
123
+ error() {
124
+ return this.log('error', arguments);
125
+ }
126
+ warn() {
127
+ return this.log('warn', arguments);
128
+ }
129
+ verbose() {
130
+ return this.log('verbose', arguments);
131
+ }
132
+ debug() {
133
+ return this.log('debug', arguments);
134
+ }
135
+ silly() {
136
+ return this.log('silly', arguments);
137
+ }
138
+ logRequest({
139
+ method,
140
+ url,
141
+ headers,
142
+ body
143
+ }) {
144
+ this.verbose(() => {
145
+ const stringifiedBody = JSON.stringify(body, null, 2);
146
+ return `REQUEST for [${method}] ${url}: ${stringifiedBody}`;
147
+ }, {
148
+ method,
149
+ url,
150
+ headers,
151
+ body
152
+ });
153
+ }
154
+ logResponse({
155
+ method,
156
+ url,
157
+ result
158
+ }) {
159
+ this.verbose(() => {
160
+ const stringifiedResponse = JSON.stringify(result, null, 2);
161
+ return `RESPONSE from [${method}] ${url}: ${stringifiedResponse}`;
162
+ }, {
163
+ result: result
164
+ });
165
+ }
166
+ // check that date input is valid
167
+ static validDateTime(date) {
168
+ if (!date) {
169
+ return null;
170
+ }
171
+ date = new Date(date);
172
+ if (!isNaN(date.getTime())) {
173
+ return date;
174
+ }
175
+ return null;
176
+ }
177
+ truncateLogMessage(string) {
178
+ if (string && string.length > this.logStringTruncateLength) {
179
+ const truncated = string.substring(0, this.logStringTruncateLength) + truncationMarker;
180
+ return truncated;
181
+ }
182
+ return string;
183
+ }
184
+ static parseOptions(options = {}) {
185
+ const from = LoggerController.validDateTime(options.from) || new Date(Date.now() - 7 * MILLISECONDS_IN_A_DAY);
186
+ const until = LoggerController.validDateTime(options.until) || new Date();
187
+ const size = Number(options.size) || 10;
188
+ const order = options.order || LogOrder.DESCENDING;
189
+ const level = options.level || LogLevel.INFO;
190
+ return {
191
+ from,
192
+ until,
193
+ size,
194
+ order,
195
+ level
196
+ };
197
+ }
198
+
199
+ // Returns a promise for a {response} object.
200
+ // query params:
201
+ // level (optional) Level of logging you want to query for (info || error)
202
+ // from (optional) Start time for the search. Defaults to 1 week ago.
203
+ // until (optional) End time for the search. Defaults to current time.
204
+ // order (optional) Direction of results returned, either “asc” or “desc”. Defaults to “desc”.
205
+ // size (optional) Number of rows returned by search. Defaults to 10
206
+ getLogs(options = {}) {
207
+ if (!this.adapter) {
208
+ throw new _node.Parse.Error(_node.Parse.Error.PUSH_MISCONFIGURED, 'Logger adapter is not available');
209
+ }
210
+ if (typeof this.adapter.query !== 'function') {
211
+ throw new _node.Parse.Error(_node.Parse.Error.PUSH_MISCONFIGURED, 'Querying logs is not supported with this adapter');
212
+ }
213
+ options = LoggerController.parseOptions(options);
214
+ return this.adapter.query(options);
215
+ }
216
+ expectedAdapterType() {
217
+ return _LoggerAdapter.LoggerAdapter;
218
+ }
219
+ }
220
+ exports.LoggerController = LoggerController;
221
+ var _default = exports.default = LoggerController;
222
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsInJlcXVpcmUiLCJfQWRhcHRhYmxlQ29udHJvbGxlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfTG9nZ2VyQWRhcHRlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIk1JTExJU0VDT05EU19JTl9BX0RBWSIsIkRFRkFVTFRfTE9HX1NUUklOR19UUlVOQ0FURV9MRU5HVEgiLCJ0cnVuY2F0aW9uTWFya2VyIiwiTG9nTGV2ZWwiLCJleHBvcnRzIiwiSU5GTyIsIkVSUk9SIiwiTG9nT3JkZXIiLCJERVNDRU5ESU5HIiwiQVNDRU5ESU5HIiwibG9nTGV2ZWxzIiwiTG9nZ2VyQ29udHJvbGxlciIsIkFkYXB0YWJsZUNvbnRyb2xsZXIiLCJjb25zdHJ1Y3RvciIsImFkYXB0ZXIiLCJhcHBJZCIsIm9wdGlvbnMiLCJsb2dMZXZlbCIsImxldmVsIiwidmVyYm9zZSIsImluZGV4IiwiaW5kZXhPZiIsImZvckVhY2giLCJsZXZlbEluZGV4IiwibG9nU3RyaW5nVHJ1bmNhdGVMZW5ndGgiLCJtYXNrU2Vuc2l0aXZlVXJsIiwicGF0aCIsInVybFN0cmluZyIsInVybE9iaiIsIlVSTCIsInF1ZXJ5Iiwic2VhcmNoUGFyYW1zIiwic2FuaXRpemVkUXVlcnkiLCJrZXkiLCJ2YWx1ZSIsInNsaWNlIiwicGF0aG5hbWUiLCJtYXNrU2Vuc2l0aXZlIiwiYXJnQXJyYXkiLCJtYXAiLCJyZXBsYWNlIiwidXJsIiwiQXJyYXkiLCJpc0FycmF5IiwiaXRlbSIsImJvZHkiLCJPYmplY3QiLCJrZXlzIiwicGFyYW1zIiwibG9nIiwiYXJncyIsImNvbmNhdCIsImFyZyIsImFwcGx5IiwiaW5mbyIsImFyZ3VtZW50cyIsImVycm9yIiwid2FybiIsImRlYnVnIiwic2lsbHkiLCJsb2dSZXF1ZXN0IiwibWV0aG9kIiwiaGVhZGVycyIsInN0cmluZ2lmaWVkQm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJsb2dSZXNwb25zZSIsInJlc3VsdCIsInN0cmluZ2lmaWVkUmVzcG9uc2UiLCJ2YWxpZERhdGVUaW1lIiwiZGF0ZSIsIkRhdGUiLCJpc05hTiIsImdldFRpbWUiLCJ0cnVuY2F0ZUxvZ01lc3NhZ2UiLCJzdHJpbmciLCJsZW5ndGgiLCJ0cnVuY2F0ZWQiLCJzdWJzdHJpbmciLCJwYXJzZU9wdGlvbnMiLCJmcm9tIiwibm93IiwidW50aWwiLCJzaXplIiwiTnVtYmVyIiwib3JkZXIiLCJnZXRMb2dzIiwiUGFyc2UiLCJFcnJvciIsIlBVU0hfTUlTQ09ORklHVVJFRCIsImV4cGVjdGVkQWRhcHRlclR5cGUiLCJMb2dnZXJBZGFwdGVyIiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvQ29udHJvbGxlcnMvTG9nZ2VyQ29udHJvbGxlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQYXJzZSB9IGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IEFkYXB0YWJsZUNvbnRyb2xsZXIgZnJvbSAnLi9BZGFwdGFibGVDb250cm9sbGVyJztcbmltcG9ydCB7IExvZ2dlckFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9Mb2dnZXIvTG9nZ2VyQWRhcHRlcic7XG5cbmNvbnN0IE1JTExJU0VDT05EU19JTl9BX0RBWSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5jb25zdCBERUZBVUxUX0xPR19TVFJJTkdfVFJVTkNBVEVfTEVOR1RIID0gMTAwMDtcbmNvbnN0IHRydW5jYXRpb25NYXJrZXIgPSAnLi4uICh0cnVuY2F0ZWQpJztcblxuZXhwb3J0IGNvbnN0IExvZ0xldmVsID0ge1xuICBJTkZPOiAnaW5mbycsXG4gIEVSUk9SOiAnZXJyb3InLFxufTtcblxuZXhwb3J0IGNvbnN0IExvZ09yZGVyID0ge1xuICBERVNDRU5ESU5HOiAnZGVzYycsXG4gIEFTQ0VORElORzogJ2FzYycsXG59O1xuXG5leHBvcnQgY29uc3QgbG9nTGV2ZWxzID0gWydlcnJvcicsICd3YXJuJywgJ2luZm8nLCAnZGVidWcnLCAndmVyYm9zZScsICdzaWxseScsICdzaWxlbnQnXTtcblxuZXhwb3J0IGNsYXNzIExvZ2dlckNvbnRyb2xsZXIgZXh0ZW5kcyBBZGFwdGFibGVDb250cm9sbGVyIHtcbiAgY29uc3RydWN0b3IoYWRhcHRlciwgYXBwSWQsIG9wdGlvbnMgPSB7IGxvZ0xldmVsOiAnaW5mbycgfSkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIGFwcElkLCBvcHRpb25zKTtcbiAgICBsZXQgbGV2ZWwgPSAnaW5mbyc7XG4gICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgbGV2ZWwgPSAndmVyYm9zZSc7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmxvZ0xldmVsKSB7XG4gICAgICBsZXZlbCA9IG9wdGlvbnMubG9nTGV2ZWw7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gbG9nTGV2ZWxzLmluZGV4T2YobGV2ZWwpOyAvLyBpbmZvIGJ5IGRlZmF1bHRcbiAgICBsb2dMZXZlbHMuZm9yRWFjaCgobGV2ZWwsIGxldmVsSW5kZXgpID0+IHtcbiAgICAgIGlmIChsZXZlbEluZGV4ID4gaW5kZXgpIHtcbiAgICAgICAgLy8gc2lsZW5jZSB0aGUgbGV2ZWxzIHRoYXQgYXJlID4gbWF4SW5kZXhcbiAgICAgICAgdGhpc1tsZXZlbF0gPSAoKSA9PiB7fTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmxvZ1N0cmluZ1RydW5jYXRlTGVuZ3RoID1cbiAgICAgIG9wdGlvbnMubG9nU3RyaW5nVHJ1bmNhdGVMZW5ndGggPz8gREVGQVVMVF9MT0dfU1RSSU5HX1RSVU5DQVRFX0xFTkdUSDtcbiAgfVxuXG4gIG1hc2tTZW5zaXRpdmVVcmwocGF0aCkge1xuICAgIGNvbnN0IHVybFN0cmluZyA9ICdodHRwOi8vbG9jYWxob3N0JyArIHBhdGg7IC8vIHByZXBlbmQgZHVtbXkgc3RyaW5nIHRvIG1ha2UgYSByZWFsIFVSTFxuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsU3RyaW5nKTtcbiAgICBjb25zdCBxdWVyeSA9IHVybE9iai5zZWFyY2hQYXJhbXM7XG4gICAgbGV0IHNhbml0aXplZFF1ZXJ5ID0gJz8nO1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcXVlcnkpIHtcbiAgICAgIGlmIChrZXkgIT09ICdwYXNzd29yZCcpIHtcbiAgICAgICAgLy8gbm9ybWFsIHZhbHVlXG4gICAgICAgIHNhbml0aXplZFF1ZXJ5ICs9IGtleSArICc9JyArIHZhbHVlICsgJyYnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcGFzc3dvcmQgdmFsdWUsIHJlZGFjdCBpdFxuICAgICAgICBzYW5pdGl6ZWRRdWVyeSArPSBrZXkgKyAnPScgKyAnKioqKioqKionICsgJyYnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHRyaW0gbGFzdCBjaGFyYWN0ZXIsID8gb3IgJlxuICAgIHNhbml0aXplZFF1ZXJ5ID0gc2FuaXRpemVkUXVlcnkuc2xpY2UoMCwgLTEpO1xuXG4gICAgLy8gcmV0dXJuIG9yaWdpbmFsIHBhdGggbmFtZSB3aXRoIHNhbml0aXplZCBwYXJhbXMgYXR0YWNoZWRcbiAgICByZXR1cm4gdXJsT2JqLnBhdGhuYW1lICsgc2FuaXRpemVkUXVlcnk7XG4gIH1cblxuICBtYXNrU2Vuc2l0aXZlKGFyZ0FycmF5KSB7XG4gICAgcmV0dXJuIGFyZ0FycmF5Lm1hcChlID0+IHtcbiAgICAgIGlmICghZSkge1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZS5yZXBsYWNlKC8ocGFzc3dvcmRcIi4/Oi4/XCIpW15cIl0qXCIvZywgJyQxKioqKioqKipcIicpO1xuICAgICAgfVxuICAgICAgLy8gZWxzZSBpdCBpcyBhbiBvYmplY3QuLi5cblxuICAgICAgLy8gY2hlY2sgdGhlIHVybFxuICAgICAgaWYgKGUudXJsKSB7XG4gICAgICAgIC8vIGZvciBzdHJpbmdzXG4gICAgICAgIGlmICh0eXBlb2YgZS51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgZS51cmwgPSB0aGlzLm1hc2tTZW5zaXRpdmVVcmwoZS51cmwpO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZS51cmwpKSB7XG4gICAgICAgICAgLy8gZm9yIHN0cmluZ3MgaW4gYXJyYXlcbiAgICAgICAgICBlLnVybCA9IGUudXJsLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFza1NlbnNpdGl2ZVVybChpdGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGUuYm9keSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlLmJvZHkpKSB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgZS5ib2R5W2tleV0gPSAnKioqKioqKionO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlLnBhcmFtcykge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlLnBhcmFtcykpIHtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncGFzc3dvcmQnKSB7XG4gICAgICAgICAgICBlLnBhcmFtc1trZXldID0gJyoqKioqKioqJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvZyhsZXZlbCwgYXJncykge1xuICAgIC8vIG1ha2UgdGhlIHBhc3NlZCBpbiBhcmd1bWVudHMgb2JqZWN0IGFuIGFycmF5IHdpdGggdGhlIHNwcmVhZCBvcGVyYXRvclxuICAgIGFyZ3MgPSB0aGlzLm1hc2tTZW5zaXRpdmUoWy4uLmFyZ3NdKTtcbiAgICBhcmdzID0gW10uY29uY2F0KFxuICAgICAgbGV2ZWwsXG4gICAgICBhcmdzLm1hcChhcmcgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBhcmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJnO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuYWRhcHRlci5sb2cuYXBwbHkodGhpcy5hZGFwdGVyLCBhcmdzKTtcbiAgfVxuXG4gIGluZm8oKSB7XG4gICAgcmV0dXJuIHRoaXMubG9nKCdpbmZvJywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIGVycm9yKCkge1xuICAgIHJldHVybiB0aGlzLmxvZygnZXJyb3InLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgd2FybigpIHtcbiAgICByZXR1cm4gdGhpcy5sb2coJ3dhcm4nLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgdmVyYm9zZSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2coJ3ZlcmJvc2UnLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgZGVidWcoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9nKCdkZWJ1ZycsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBzaWxseSgpIHtcbiAgICByZXR1cm4gdGhpcy5sb2coJ3NpbGx5JywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIGxvZ1JlcXVlc3QoeyBtZXRob2QsIHVybCwgaGVhZGVycywgYm9keSB9KSB7XG4gICAgdGhpcy52ZXJib3NlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBzdHJpbmdpZmllZEJvZHkgPSBKU09OLnN0cmluZ2lmeShib2R5LCBudWxsLCAyKTtcbiAgICAgICAgcmV0dXJuIGBSRVFVRVNUIGZvciBbJHttZXRob2R9XSAke3VybH06ICR7c3RyaW5naWZpZWRCb2R5fWA7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIHVybCxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgYm9keSxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgbG9nUmVzcG9uc2UoeyBtZXRob2QsIHVybCwgcmVzdWx0IH0pIHtcbiAgICB0aGlzLnZlcmJvc2UoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0cmluZ2lmaWVkUmVzcG9uc2UgPSBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpO1xuICAgICAgICByZXR1cm4gYFJFU1BPTlNFIGZyb20gWyR7bWV0aG9kfV0gJHt1cmx9OiAke3N0cmluZ2lmaWVkUmVzcG9uc2V9YDtcbiAgICAgIH0sXG4gICAgICB7IHJlc3VsdDogcmVzdWx0IH1cbiAgICApO1xuICB9XG4gIC8vIGNoZWNrIHRoYXQgZGF0ZSBpbnB1dCBpcyB2YWxpZFxuICBzdGF0aWMgdmFsaWREYXRlVGltZShkYXRlKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xuXG4gICAgaWYgKCFpc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ1bmNhdGVMb2dNZXNzYWdlKHN0cmluZykge1xuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLmxlbmd0aCA+IHRoaXMubG9nU3RyaW5nVHJ1bmNhdGVMZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRydW5jYXRlZCA9XG4gICAgICAgIHN0cmluZy5zdWJzdHJpbmcoMCwgdGhpcy5sb2dTdHJpbmdUcnVuY2F0ZUxlbmd0aCkgKyB0cnVuY2F0aW9uTWFya2VyO1xuICAgICAgcmV0dXJuIHRydW5jYXRlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nO1xuICB9XG5cbiAgc3RhdGljIHBhcnNlT3B0aW9ucyhvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBmcm9tID1cbiAgICAgIExvZ2dlckNvbnRyb2xsZXIudmFsaWREYXRlVGltZShvcHRpb25zLmZyb20pIHx8XG4gICAgICBuZXcgRGF0ZShEYXRlLm5vdygpIC0gNyAqIE1JTExJU0VDT05EU19JTl9BX0RBWSk7XG4gICAgY29uc3QgdW50aWwgPSBMb2dnZXJDb250cm9sbGVyLnZhbGlkRGF0ZVRpbWUob3B0aW9ucy51bnRpbCkgfHwgbmV3IERhdGUoKTtcbiAgICBjb25zdCBzaXplID0gTnVtYmVyKG9wdGlvbnMuc2l6ZSkgfHwgMTA7XG4gICAgY29uc3Qgb3JkZXIgPSBvcHRpb25zLm9yZGVyIHx8IExvZ09yZGVyLkRFU0NFTkRJTkc7XG4gICAgY29uc3QgbGV2ZWwgPSBvcHRpb25zLmxldmVsIHx8IExvZ0xldmVsLklORk87XG5cbiAgICByZXR1cm4ge1xuICAgICAgZnJvbSxcbiAgICAgIHVudGlsLFxuICAgICAgc2l6ZSxcbiAgICAgIG9yZGVyLFxuICAgICAgbGV2ZWwsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBwcm9taXNlIGZvciBhIHtyZXNwb25zZX0gb2JqZWN0LlxuICAvLyBxdWVyeSBwYXJhbXM6XG4gIC8vIGxldmVsIChvcHRpb25hbCkgTGV2ZWwgb2YgbG9nZ2luZyB5b3Ugd2FudCB0byBxdWVyeSBmb3IgKGluZm8gfHwgZXJyb3IpXG4gIC8vIGZyb20gKG9wdGlvbmFsKSBTdGFydCB0aW1lIGZvciB0aGUgc2VhcmNoLiBEZWZhdWx0cyB0byAxIHdlZWsgYWdvLlxuICAvLyB1bnRpbCAob3B0aW9uYWwpIEVuZCB0aW1lIGZvciB0aGUgc2VhcmNoLiBEZWZhdWx0cyB0byBjdXJyZW50IHRpbWUuXG4gIC8vIG9yZGVyIChvcHRpb25hbCkgRGlyZWN0aW9uIG9mIHJlc3VsdHMgcmV0dXJuZWQsIGVpdGhlciDigJxhc2PigJ0gb3Ig4oCcZGVzY+KAnS4gRGVmYXVsdHMgdG8g4oCcZGVzY+KAnS5cbiAgLy8gc2l6ZSAob3B0aW9uYWwpIE51bWJlciBvZiByb3dzIHJldHVybmVkIGJ5IHNlYXJjaC4gRGVmYXVsdHMgdG8gMTBcbiAgZ2V0TG9ncyhvcHRpb25zID0ge30pIHtcbiAgICBpZiAoIXRoaXMuYWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLlBVU0hfTUlTQ09ORklHVVJFRCwgJ0xvZ2dlciBhZGFwdGVyIGlzIG5vdCBhdmFpbGFibGUnKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLmFkYXB0ZXIucXVlcnkgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuUFVTSF9NSVNDT05GSUdVUkVELFxuICAgICAgICAnUXVlcnlpbmcgbG9ncyBpcyBub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBhZGFwdGVyJ1xuICAgICAgKTtcbiAgICB9XG4gICAgb3B0aW9ucyA9IExvZ2dlckNvbnRyb2xsZXIucGFyc2VPcHRpb25zKG9wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucXVlcnkob3B0aW9ucyk7XG4gIH1cblxuICBleHBlY3RlZEFkYXB0ZXJUeXBlKCkge1xuICAgIHJldHVybiBMb2dnZXJBZGFwdGVyO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExvZ2dlckNvbnRyb2xsZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLEtBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLG9CQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxjQUFBLEdBQUFILE9BQUE7QUFBaUUsU0FBQUUsdUJBQUFFLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFFakUsTUFBTUcscUJBQXFCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtBQUNqRCxNQUFNQyxrQ0FBa0MsR0FBRyxJQUFJO0FBQy9DLE1BQU1DLGdCQUFnQixHQUFHLGlCQUFpQjtBQUVuQyxNQUFNQyxRQUFRLEdBQUFDLE9BQUEs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
@@ -0,0 +1,294 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.GraphQLConfigKey = exports.GraphQLConfigId = exports.GraphQLConfigClassName = void 0;
7
+ var _requiredParameter = _interopRequireDefault(require("../../lib/requiredParameter"));
8
+ var _Utils = _interopRequireDefault(require("../Utils"));
9
+ var _DatabaseController = _interopRequireDefault(require("./DatabaseController"));
10
+ var _CacheController = _interopRequireDefault(require("./CacheController"));
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ const GraphQLConfigClassName = exports.GraphQLConfigClassName = '_GraphQLConfig';
13
+ const GraphQLConfigId = exports.GraphQLConfigId = '1';
14
+ const GraphQLConfigKey = exports.GraphQLConfigKey = 'config';
15
+ class ParseGraphQLController {
16
+ constructor(params = {}) {
17
+ this.databaseController = params.databaseController || (0, _requiredParameter.default)(`ParseGraphQLController requires a "databaseController" to be instantiated.`);
18
+ this.cacheController = params.cacheController;
19
+ this.isMounted = !!params.mountGraphQL;
20
+ this.configCacheKey = GraphQLConfigKey;
21
+ }
22
+ async getGraphQLConfig() {
23
+ if (this.isMounted) {
24
+ const _cachedConfig = await this._getCachedGraphQLConfig();
25
+ if (_cachedConfig) {
26
+ return _cachedConfig;
27
+ }
28
+ }
29
+ const results = await this.databaseController.find(GraphQLConfigClassName, {
30
+ objectId: GraphQLConfigId
31
+ }, {
32
+ limit: 1
33
+ });
34
+ let graphQLConfig;
35
+ if (results.length != 1) {
36
+ // If there is no config in the database - return empty config.
37
+ return {};
38
+ } else {
39
+ graphQLConfig = results[0][GraphQLConfigKey];
40
+ }
41
+ if (this.isMounted) {
42
+ this._putCachedGraphQLConfig(graphQLConfig);
43
+ }
44
+ return graphQLConfig;
45
+ }
46
+ async updateGraphQLConfig(graphQLConfig) {
47
+ // throws if invalid
48
+ this._validateGraphQLConfig(graphQLConfig || (0, _requiredParameter.default)('You must provide a graphQLConfig!'));
49
+
50
+ // Transform in dot notation to make sure it works
51
+ const update = Object.keys(graphQLConfig).reduce((acc, key) => {
52
+ return {
53
+ [GraphQLConfigKey]: {
54
+ ...acc[GraphQLConfigKey],
55
+ [key]: graphQLConfig[key]
56
+ }
57
+ };
58
+ }, {
59
+ [GraphQLConfigKey]: {}
60
+ });
61
+ await this.databaseController.update(GraphQLConfigClassName, {
62
+ objectId: GraphQLConfigId
63
+ }, update, {
64
+ upsert: true
65
+ });
66
+ if (this.isMounted) {
67
+ this._putCachedGraphQLConfig(graphQLConfig);
68
+ }
69
+ return {
70
+ response: {
71
+ result: true
72
+ }
73
+ };
74
+ }
75
+ _getCachedGraphQLConfig() {
76
+ return this.cacheController.graphQL.get(this.configCacheKey);
77
+ }
78
+ _putCachedGraphQLConfig(graphQLConfig) {
79
+ return this.cacheController.graphQL.put(this.configCacheKey, graphQLConfig, 60000);
80
+ }
81
+ _validateGraphQLConfig(graphQLConfig) {
82
+ const errorMessages = [];
83
+ if (!graphQLConfig) {
84
+ errorMessages.push('cannot be undefined, null or empty');
85
+ } else if (!isValidSimpleObject(graphQLConfig)) {
86
+ errorMessages.push('must be a valid object');
87
+ } else {
88
+ const {
89
+ enabledForClasses = null,
90
+ disabledForClasses = null,
91
+ classConfigs = null,
92
+ ...invalidKeys
93
+ } = graphQLConfig;
94
+ if (Object.keys(invalidKeys).length) {
95
+ errorMessages.push(`encountered invalid keys: [${Object.keys(invalidKeys)}]`);
96
+ }
97
+ if (enabledForClasses !== null && !isValidStringArray(enabledForClasses)) {
98
+ errorMessages.push(`"enabledForClasses" is not a valid array`);
99
+ }
100
+ if (disabledForClasses !== null && !isValidStringArray(disabledForClasses)) {
101
+ errorMessages.push(`"disabledForClasses" is not a valid array`);
102
+ }
103
+ if (classConfigs !== null) {
104
+ if (Array.isArray(classConfigs)) {
105
+ classConfigs.forEach(classConfig => {
106
+ const errorMessage = this._validateClassConfig(classConfig);
107
+ if (errorMessage) {
108
+ errorMessages.push(`classConfig:${classConfig.className} is invalid because ${errorMessage}`);
109
+ }
110
+ });
111
+ } else {
112
+ errorMessages.push(`"classConfigs" is not a valid array`);
113
+ }
114
+ }
115
+ }
116
+ if (errorMessages.length) {
117
+ throw new Error(`Invalid graphQLConfig: ${errorMessages.join('; ')}`);
118
+ }
119
+ }
120
+ _validateClassConfig(classConfig) {
121
+ if (!isValidSimpleObject(classConfig)) {
122
+ return 'it must be a valid object';
123
+ } else {
124
+ const {
125
+ className,
126
+ type = null,
127
+ query = null,
128
+ mutation = null,
129
+ ...invalidKeys
130
+ } = classConfig;
131
+ if (Object.keys(invalidKeys).length) {
132
+ return `"invalidKeys" [${Object.keys(invalidKeys)}] should not be present`;
133
+ }
134
+ if (typeof className !== 'string' || !className.trim().length) {
135
+ // TODO consider checking class exists in schema?
136
+ return `"className" must be a valid string`;
137
+ }
138
+ if (type !== null) {
139
+ if (!isValidSimpleObject(type)) {
140
+ return `"type" must be a valid object`;
141
+ }
142
+ const {
143
+ inputFields = null,
144
+ outputFields = null,
145
+ constraintFields = null,
146
+ sortFields = null,
147
+ ...invalidKeys
148
+ } = type;
149
+ if (Object.keys(invalidKeys).length) {
150
+ return `"type" contains invalid keys, [${Object.keys(invalidKeys)}]`;
151
+ } else if (outputFields !== null && !isValidStringArray(outputFields)) {
152
+ return `"outputFields" must be a valid string array`;
153
+ } else if (constraintFields !== null && !isValidStringArray(constraintFields)) {
154
+ return `"constraintFields" must be a valid string array`;
155
+ }
156
+ if (sortFields !== null) {
157
+ if (Array.isArray(sortFields)) {
158
+ let errorMessage;
159
+ sortFields.every((sortField, index) => {
160
+ if (!isValidSimpleObject(sortField)) {
161
+ errorMessage = `"sortField" at index ${index} is not a valid object`;
162
+ return false;
163
+ } else {
164
+ const {
165
+ field,
166
+ asc,
167
+ desc,
168
+ ...invalidKeys
169
+ } = sortField;
170
+ if (Object.keys(invalidKeys).length) {
171
+ errorMessage = `"sortField" at index ${index} contains invalid keys, [${Object.keys(invalidKeys)}]`;
172
+ return false;
173
+ } else {
174
+ if (typeof field !== 'string' || field.trim().length === 0) {
175
+ errorMessage = `"sortField" at index ${index} did not provide the "field" as a string`;
176
+ return false;
177
+ } else if (typeof asc !== 'boolean' || typeof desc !== 'boolean') {
178
+ errorMessage = `"sortField" at index ${index} did not provide "asc" or "desc" as booleans`;
179
+ return false;
180
+ }
181
+ }
182
+ }
183
+ return true;
184
+ });
185
+ if (errorMessage) {
186
+ return errorMessage;
187
+ }
188
+ } else {
189
+ return `"sortFields" must be a valid array.`;
190
+ }
191
+ }
192
+ if (inputFields !== null) {
193
+ if (isValidSimpleObject(inputFields)) {
194
+ const {
195
+ create = null,
196
+ update = null,
197
+ ...invalidKeys
198
+ } = inputFields;
199
+ if (Object.keys(invalidKeys).length) {
200
+ return `"inputFields" contains invalid keys: [${Object.keys(invalidKeys)}]`;
201
+ } else {
202
+ if (update !== null && !isValidStringArray(update)) {
203
+ return `"inputFields.update" must be a valid string array`;
204
+ } else if (create !== null) {
205
+ if (!isValidStringArray(create)) {
206
+ return `"inputFields.create" must be a valid string array`;
207
+ } else if (className === '_User') {
208
+ if (!create.includes('username') || !create.includes('password')) {
209
+ return `"inputFields.create" must include required fields, username and password`;
210
+ }
211
+ }
212
+ }
213
+ }
214
+ } else {
215
+ return `"inputFields" must be a valid object`;
216
+ }
217
+ }
218
+ }
219
+ if (query !== null) {
220
+ if (isValidSimpleObject(query)) {
221
+ const {
222
+ find = null,
223
+ get = null,
224
+ findAlias = null,
225
+ getAlias = null,
226
+ ...invalidKeys
227
+ } = query;
228
+ if (Object.keys(invalidKeys).length) {
229
+ return `"query" contains invalid keys, [${Object.keys(invalidKeys)}]`;
230
+ } else if (find !== null && typeof find !== 'boolean') {
231
+ return `"query.find" must be a boolean`;
232
+ } else if (get !== null && typeof get !== 'boolean') {
233
+ return `"query.get" must be a boolean`;
234
+ } else if (findAlias !== null && typeof findAlias !== 'string') {
235
+ return `"query.findAlias" must be a string`;
236
+ } else if (getAlias !== null && typeof getAlias !== 'string') {
237
+ return `"query.getAlias" must be a string`;
238
+ }
239
+ } else {
240
+ return `"query" must be a valid object`;
241
+ }
242
+ }
243
+ if (mutation !== null) {
244
+ if (isValidSimpleObject(mutation)) {
245
+ const {
246
+ create = null,
247
+ update = null,
248
+ destroy = null,
249
+ createAlias = null,
250
+ updateAlias = null,
251
+ destroyAlias = null,
252
+ ...invalidKeys
253
+ } = mutation;
254
+ if (Object.keys(invalidKeys).length) {
255
+ return `"mutation" contains invalid keys, [${Object.keys(invalidKeys)}]`;
256
+ }
257
+ if (create !== null && typeof create !== 'boolean') {
258
+ return `"mutation.create" must be a boolean`;
259
+ }
260
+ if (update !== null && typeof update !== 'boolean') {
261
+ return `"mutation.update" must be a boolean`;
262
+ }
263
+ if (destroy !== null && typeof destroy !== 'boolean') {
264
+ return `"mutation.destroy" must be a boolean`;
265
+ }
266
+ if (createAlias !== null && typeof createAlias !== 'string') {
267
+ return `"mutation.createAlias" must be a string`;
268
+ }
269
+ if (updateAlias !== null && typeof updateAlias !== 'string') {
270
+ return `"mutation.updateAlias" must be a string`;
271
+ }
272
+ if (destroyAlias !== null && typeof destroyAlias !== 'string') {
273
+ return `"mutation.destroyAlias" must be a string`;
274
+ }
275
+ } else {
276
+ return `"mutation" must be a valid object`;
277
+ }
278
+ }
279
+ }
280
+ }
281
+ }
282
+ const isValidStringArray = function (array) {
283
+ return Array.isArray(array) ? !array.some(s => typeof s !== 'string' || s.trim().length < 1) : false;
284
+ };
285
+ /**
286
+ * Ensures the obj is a simple JSON/{}
287
+ * object, i.e. not an array, null, date
288
+ * etc.
289
+ */
290
+ const isValidSimpleObject = function (obj) {
291
+ return typeof obj === 'object' && !Array.isArray(obj) && obj !== null && _Utils.default.isDate(obj) !== true && _Utils.default.isPromise(obj) !== true;
292
+ };
293
+ var _default = exports.default = ParseGraphQLController;
294
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVxdWlyZWRQYXJhbWV0ZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9VdGlscyIsIl9EYXRhYmFzZUNvbnRyb2xsZXIiLCJfQ2FjaGVDb250cm9sbGVyIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiR3JhcGhRTENvbmZpZ0NsYXNzTmFtZSIsImV4cG9ydHMiLCJHcmFwaFFMQ29uZmlnSWQiLCJHcmFwaFFMQ29uZmlnS2V5IiwiUGFyc2VHcmFwaFFMQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwicGFyYW1zIiwiZGF0YWJhc2VDb250cm9sbGVyIiwicmVxdWlyZWRQYXJhbWV0ZXIiLCJjYWNoZUNvbnRyb2xsZXIiLCJpc01vdW50ZWQiLCJtb3VudEdyYXBoUUwiLCJjb25maWdDYWNoZUtleSIsImdldEdyYXBoUUxDb25maWciLCJfY2FjaGVkQ29uZmlnIiwiX2dldENhY2hlZEdyYXBoUUxDb25maWciLCJyZXN1bHRzIiwiZmluZCIsIm9iamVjdElkIiwibGltaXQiLCJncmFwaFFMQ29uZmlnIiwibGVuZ3RoIiwiX3B1dENhY2hlZEdyYXBoUUxDb25maWciLCJ1cGRhdGVHcmFwaFFMQ29uZmlnIiwiX3ZhbGlkYXRlR3JhcGhRTENvbmZpZyIsInVwZGF0ZSIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJhY2MiLCJrZXkiLCJ1cHNlcnQiLCJyZXNwb25zZSIsInJlc3VsdCIsImdyYXBoUUwiLCJnZXQiLCJwdXQiLCJlcnJvck1lc3NhZ2VzIiwicHVzaCIsImlzVmFsaWRTaW1wbGVPYmplY3QiLCJlbmFibGVkRm9yQ2xhc3NlcyIsImRpc2FibGVkRm9yQ2xhc3NlcyIsImNsYXNzQ29uZmlncyIsImludmFsaWRLZXlzIiwiaXNWYWxpZFN0cmluZ0FycmF5IiwiQXJyYXkiLCJpc0FycmF5IiwiZm9yRWFjaCIsImNsYXNzQ29uZmlnIiwiZXJyb3JNZXNzYWdlIiwiX3ZhbGlkYXRlQ2xhc3NDb25maWciLCJjbGFzc05hbWUiLCJFcnJvciIsImpvaW4iLCJ0eXBlIiwicXVlcnkiLCJtdXRhdGlvbiIsInRyaW0iLCJpbnB1dEZpZWxkcyIsIm91dHB1dEZpZWxkcyIsImNvbnN0cmFpbnRGaWVsZHMiLCJzb3J0RmllbGRzIiwiZXZlcnkiLCJzb3J0RmllbGQiLCJpbmRleCIsImZpZWxkIiwiYXNjIiwiZGVzYyIsImNyZWF0ZSIsImluY2x1ZGVzIiwiZmluZEFsaWFzIiwiZ2V0QWxpYXMiLCJkZXN0cm95IiwiY3JlYXRlQWxpYXMiLCJ1cGRhdGVBbGlhcyIsImRlc3Ryb3lBbGlhcyIsImFycmF5Iiwic29tZSIsInMiLCJvYmoiLCJVdGlscyIsImlzRGF0ZSIsImlzUHJvbWlzZSIsIl9kZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbnRyb2xsZXJzL1BhcnNlR3JhcGhRTENvbnRyb2xsZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJlcXVpcmVkUGFyYW1ldGVyIGZyb20gJy4uLy4uL2xpYi9yZXF1aXJlZFBhcmFtZXRlcic7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vVXRpbHMnO1xuaW1wb3J0IERhdGFiYXNlQ29udHJvbGxlciBmcm9tICcuL0RhdGFiYXNlQ29udHJvbGxlcic7XG5pbXBvcnQgQ2FjaGVDb250cm9sbGVyIGZyb20gJy4vQ2FjaGVDb250cm9sbGVyJztcblxuY29uc3QgR3JhcGhRTENvbmZpZ0NsYXNzTmFtZSA9ICdfR3JhcGhRTENvbmZpZyc7XG5jb25zdCBHcmFwaFFMQ29uZmlnSWQgPSAnMSc7XG5jb25zdCBHcmFwaFFMQ29uZmlnS2V5ID0gJ2NvbmZpZyc7XG5cbmNsYXNzIFBhcnNlR3JhcGhRTENvbnRyb2xsZXIge1xuICBkYXRhYmFzZUNvbnRyb2xsZXI6IERhdGFiYXNlQ29udHJvbGxlcjtcbiAgY2FjaGVDb250cm9sbGVyOiBDYWNoZUNvbnRyb2xsZXI7XG4gIGlzTW91bnRlZDogYm9vbGVhbjtcbiAgY29uZmlnQ2FjaGVLZXk6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXJhbXM6IHtcbiAgICAgIGRhdGFiYXNlQ29udHJvbGxlcjogRGF0YWJhc2VDb250cm9sbGVyLFxuICAgICAgY2FjaGVDb250cm9sbGVyOiBDYWNoZUNvbnRyb2xsZXIsXG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMuZGF0YWJhc2VDb250cm9sbGVyID1cbiAgICAgIHBhcmFtcy5kYXRhYmFzZUNvbnRyb2xsZXIgfHxcbiAgICAgIHJlcXVpcmVkUGFyYW1ldGVyKFxuICAgICAgICBgUGFyc2VHcmFwaFFMQ29udHJvbGxlciByZXF1aXJlcyBhIFwiZGF0YWJhc2VDb250cm9sbGVyXCIgdG8gYmUgaW5zdGFudGlhdGVkLmBcbiAgICAgICk7XG4gICAgdGhpcy5jYWNoZUNvbnRyb2xsZXIgPSBwYXJhbXMuY2FjaGVDb250cm9sbGVyO1xuICAgIHRoaXMuaXNNb3VudGVkID0gISFwYXJhbXMubW91bnRHcmFwaFFMO1xuICAgIHRoaXMuY29uZmlnQ2FjaGVLZXkgPSBHcmFwaFFMQ29uZmlnS2V5O1xuICB9XG5cbiAgYXN5bmMgZ2V0R3JhcGhRTENvbmZpZygpOiBQcm9taXNlPFBhcnNlR3JhcGhRTENvbmZpZz4ge1xuICAgIGlmICh0aGlzLmlzTW91bnRlZCkge1xuICAgICAgY29uc3QgX2NhY2hlZENvbmZpZyA9IGF3YWl0IHRoaXMuX2dldENhY2hlZEdyYXBoUUxDb25maWcoKTtcbiAgICAgIGlmIChfY2FjaGVkQ29uZmlnKSB7XG4gICAgICAgIHJldHVybiBfY2FjaGVkQ29uZmlnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmRhdGFiYXNlQ29udHJvbGxlci5maW5kKFxuICAgICAgR3JhcGhRTENvbmZpZ0NsYXNzTmFtZSxcbiAgICAgIHsgb2JqZWN0SWQ6IEdyYXBoUUxDb25maWdJZCB9LFxuICAgICAgeyBsaW1pdDogMSB9XG4gICAgKTtcblxuICAgIGxldCBncmFwaFFMQ29uZmlnO1xuICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyBjb25maWcgaW4gdGhlIGRhdGFiYXNlIC0gcmV0dXJuIGVtcHR5IGNvbmZpZy5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JhcGhRTENvbmZpZyA9IHJlc3VsdHNbMF1bR3JhcGhRTENvbmZpZ0tleV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNNb3VudGVkKSB7XG4gICAgICB0aGlzLl9wdXRDYWNoZWRHcmFwaFFMQ29uZmlnKGdyYXBoUUxDb25maWcpO1xuICAgIH1cblxuICAgIHJldHVybiBncmFwaFFMQ29uZmlnO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlR3JhcGhRTENvbmZpZyhncmFwaFFMQ29uZmlnOiBQYXJzZUdyYXBoUUxDb25maWcpOiBQcm9taXNlPFBhcnNlR3JhcGhRTENvbmZpZz4ge1xuICAgIC8vIHRocm93cyBpZiBpbnZhbGlkXG4gICAgdGhpcy5fdmFsaWRhdGVHcmFwaFFMQ29uZmlnKFxuICAgICAgZ3JhcGhRTENvbmZpZyB8fCByZXF1aXJlZFBhcmFtZXRlcignWW91IG11c3QgcHJvdmlkZSBhIGdyYXBoUUxDb25maWchJylcbiAgICApO1xuXG4gICAgLy8gVHJhbnNmb3JtIGluIGRvdCBub3RhdGlvbiB0byBtYWtlIHN1cmUgaXQgd29ya3NcbiAgICBjb25zdCB1cGRhdGUgPSBPYmplY3Qua2V5cyhncmFwaFFMQ29uZmlnKS5yZWR1Y2UoXG4gICAgICAoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbR3JhcGhRTENvbmZpZ0tleV06IHtcbiAgICAgICAgICAgIC4uLmFjY1tHcmFwaFFMQ29uZmlnS2V5XSxcbiAgICAgICAgICAgIFtrZXldOiBncmFwaFFMQ29uZmlnW2tleV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICB7IFtHcmFwaFFMQ29uZmlnS2V5XToge30gfVxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLmRhdGFiYXNlQ29udHJvbGxlci51cGRhdGUoXG4gICAgICBHcmFwaFFMQ29uZmlnQ2xhc3NOYW1lLFxuICAgICAgeyBvYmplY3RJZDogR3JhcGhRTENvbmZpZ0lkIH0sXG4gICAgICB1cGRhdGUsXG4gICAgICB7IHVwc2VydDogdHJ1ZSB9XG4gICAgKTtcblxuICAgIGlmICh0aGlzLmlzTW91bnRlZCkge1xuICAgICAgdGhpcy5fcHV0Q2FjaGVkR3JhcGhRTENvbmZpZyhncmFwaFFMQ29uZmlnKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyByZXNwb25zZTogeyByZXN1bHQ6IHRydWUgfSB9O1xuICB9XG5cbiAgX2dldENhY2hlZEdyYXBoUUxDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVDb250cm9sbGVyLmdyYXBoUUwuZ2V0KHRoaXMuY29uZmlnQ2FjaGVLZXkpO1xuICB9XG5cbiAgX3B1dENhY2hlZEdyYXBoUUxDb25maWcoZ3JhcGhRTENvbmZpZzogUGFyc2VHcmFwaFFMQ29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVDb250cm9sbGVyLmdyYXBoUUwucHV0KHRoaXMuY29uZmlnQ2FjaGVLZXksIGdyYXBoUUxDb25maWcsIDYwMDAwKTtcbiAgfVxuXG4gIF92YWxpZGF0ZUdyYXBoUUxDb25maWcoZ3JhcGhRTENvbmZpZzogP1BhcnNlR3JhcGhRTENvbmZpZyk6IHZvaWQge1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZXM6IHN0cmluZyA9IFtdO1xuICAgIGlmICghZ3JhcGhRTENvbmZpZykge1xuICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKCdjYW5ub3QgYmUgdW5kZWZpbmVkLCBudWxsIG9yIGVtcHR5Jyk7XG4gICAgfSBlbHNlIGlmICghaXNWYWxpZFNpbXBsZU9iamVjdChncmFwaFFMQ29uZmlnKSkge1xuICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKCdtdXN0IGJlIGEgdmFsaWQgb2JqZWN0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZW5hYmxlZEZvckNsYXNzZXMgPSBudWxsLFxuICAgICAgICBkaXNhYmxlZEZvckNsYXNzZXMgPSBudWxsLFxuICAgICAgICBjbGFzc0NvbmZpZ3MgPSBudWxsLFxuICAgICAgICAuLi5pbnZhbGlkS2V5c1xuICAgICAgfSA9IGdyYXBoUUxDb25maWc7XG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyhpbnZhbGlkS2V5cykubGVuZ3RoKSB7XG4gICAgICAgIGVycm9yTWVzc2FnZXMucHVzaChgZW5jb3VudGVyZWQgaW52YWxpZCBrZXlzOiBbJHtPYmplY3Qua2V5cyhpbnZhbGlkS2V5cyl9XWApO1xuICAgICAgfVxuICAgICAgaWYgKGVuYWJsZWRGb3JDbGFzc2VzICE9PSBudWxsICYmICFpc1ZhbGlkU3RyaW5nQXJyYXkoZW5hYmxlZEZvckNsYXNzZXMpKSB7XG4gICAgICAgIGVycm9yTWVzc2FnZXMucHVzaChgXCJlbmFibGVkRm9yQ2xhc3Nlc1wiIGlzIG5vdCBhIHZhbGlkIGFycmF5YCk7XG4gICAgICB9XG4gICAgICBpZiAoZGlzYWJsZWRGb3JDbGFzc2VzICE9PSBudWxsICYmICFpc1ZhbGlkU3RyaW5nQXJyYXkoZGlzYWJsZWRGb3JDbGFzc2VzKSkge1xuICAgICAgICBlcnJvck1lc3NhZ2VzLnB1c2goYFwiZGlzYWJsZWRGb3JDbGFzc2VzXCIgaXMgbm90IGEgdmFsaWQgYXJyYXlgKTtcbiAgICAgIH1cbiAgICAgIGlmIChjbGFzc0NvbmZpZ3MgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2xhc3NDb25maWdzKSkge1xuICAgICAgICAgIGNsYXNzQ29uZmlncy5mb3JFYWNoKGNsYXNzQ29uZmlnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHRoaXMuX3ZhbGlkYXRlQ2xhc3NDb25maWcoY2xhc3NDb25maWcpO1xuICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICAgICAgYGNsYXNzQ29uZmlnOiR7Y2xhc3NDb25maWcuY2xhc3NOYW1lfSBpcyBpbnZhbGlkIGJlY2F1c2UgJHtlcnJvck1lc3NhZ2V9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycm9yTWVzc2FnZXMucHVzaChgXCJjbGFzc0NvbmZpZ3NcIiBpcyBub3QgYSB2YWxpZCBhcnJheWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvck1lc3NhZ2VzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdyYXBoUUxDb25maWc6ICR7ZXJyb3JNZXNzYWdlcy5qb2luKCc7ICcpfWApO1xuICAgIH1cbiAgfVxuXG4gIF92YWxpZGF0ZUNsYXNzQ29uZmlnKGNsYXNzQ29uZmlnOiA/UGFyc2VHcmFwaFFMQ2xhc3NDb25maWcpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAoIWlzVmFsaWRTaW1wbGVPYmplY3QoY2xhc3NDb25maWcpKSB7XG4gICAgICByZXR1cm4gJ2l0IG11c3QgYmUgYSB2YWxpZCBvYmplY3QnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IGNsYXNzTmFtZSwgdHlwZSA9IG51bGwsIHF1ZXJ5ID0gbnVsbCwgbXV0YXRpb24gPSBudWxsLCAuLi5pbnZhbGlkS2V5cyB9ID0gY2xhc3NDb25maWc7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoaW52YWxpZEtleXMpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gYFwiaW52YWxpZEtleXNcIiBbJHtPYmplY3Qua2V5cyhpbnZhbGlkS2V5cyl9XSBzaG91bGQgbm90IGJlIHByZXNlbnRgO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBjbGFzc05hbWUgIT09ICdzdHJpbmcnIHx8ICFjbGFzc05hbWUudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAvLyBUT0RPIGNvbnNpZGVyIGNoZWNraW5nIGNsYXNzIGV4aXN0cyBpbiBzY2hlbWE/XG4gICAgICAgIHJldHVybiBgXCJjbGFzc05hbWVcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nYDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlICE9PSBudWxsKSB7XG4gICAgICAgIGlmICghaXNWYWxpZFNpbXBsZU9iamVjdCh0eXBlKSkge1xuICAgICAgICAgIHJldHVybiBgXCJ0eXBlXCIgbXVzdCBiZSBhIHZhbGlkIG9iamVjdGA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGlucHV0RmllbGRzID0gbnVsbCxcbiAgICAgICAgICBvdXRwdXRGaWVsZHMgPSBudWxsLFxuICAgICAgICAgIGNvbnN0cmFpbnRGaWVsZHMgPSBudWxsLFxuICAgICAgICAgIHNvcnRGaWVsZHMgPSBudWxsLFxuICAgICAgICAgIC4uLmludmFsaWRLZXlzXG4gICAgICAgIH0gPSB0eXBlO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoaW52YWxpZEtleXMpLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBgXCJ0eXBlXCIgY29udGFpbnMgaW52YWxpZCBrZXlzLCBbJHtPYmplY3Qua2V5cyhpbnZhbGlkS2V5cyl9XWA7XG4gICAgICAgIH0gZWxzZSBpZiAob3V0cHV0RmllbGRzICE9PSBudWxsICYmICFpc1ZhbGlkU3RyaW5nQXJyYXkob3V0cHV0RmllbGRzKSkge1xuICAgICAgICAgIHJldHVybiBgXCJvdXRwdXRGaWVsZHNcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGFycmF5YDtcbiAgICAgICAgfSBlbHNlIGlmIChjb25zdHJhaW50RmllbGRzICE9PSBudWxsICYmICFpc1ZhbGlkU3RyaW5nQXJyYXkoY29uc3RyYWludEZpZWxkcykpIHtcbiAgICAgICAgICByZXR1cm4gYFwiY29uc3RyYWludEZpZWxkc1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgYXJyYXlgO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3J0RmllbGRzICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc29ydEZpZWxkcykpIHtcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2U7XG4gICAgICAgICAgICBzb3J0RmllbGRzLmV2ZXJ5KChzb3J0RmllbGQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIGlmICghaXNWYWxpZFNpbXBsZU9iamVjdChzb3J0RmllbGQpKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gYFwic29ydEZpZWxkXCIgYXQgaW5kZXggJHtpbmRleH0gaXMgbm90IGEgdmFsaWQgb2JqZWN0YDtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBmaWVsZCwgYXNjLCBkZXNjLCAuLi5pbnZhbGlkS2V5cyB9ID0gc29ydEZpZWxkO1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhpbnZhbGlkS2V5cykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgXCJzb3J0RmllbGRcIiBhdCBpbmRleCAke2luZGV4fSBjb250YWlucyBpbnZhbGlkIGtleXMsIFske09iamVjdC5rZXlzKFxuICAgICAgICAgICAgICAgICAgICBpbnZhbGlkS2V5c1xuICAgICAgICAgICAgICAgICAgKX1dYDtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZCAhPT0gJ3N0cmluZycgfHwgZmllbGQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgXCJzb3J0RmllbGRcIiBhdCBpbmRleCAke2luZGV4fSBkaWQgbm90IHByb3ZpZGUgdGhlIFwiZmllbGRcIiBhcyBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFzYyAhPT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBkZXNjICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gYFwic29ydEZpZWxkXCIgYXQgaW5kZXggJHtpbmRleH0gZGlkIG5vdCBwcm92aWRlIFwiYXNjXCIgb3IgXCJkZXNjXCIgYXMgYm9vbGVhbnNgO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgXCJzb3J0RmllbGRzXCIgbXVzdCBiZSBhIHZhbGlkIGFycmF5LmA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dEZpZWxkcyAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChpc1ZhbGlkU2ltcGxlT2JqZWN0KGlucHV0RmllbGRzKSkge1xuICAgICAgICAgICAgY29uc3QgeyBjcmVhdGUgPSBudWxsLCB1cGRhdGUgPSBudWxsLCAuLi5pbnZhbGlkS2V5cyB9ID0gaW5wdXRGaWVsZHM7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoaW52YWxpZEtleXMpLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gYFwiaW5wdXRGaWVsZHNcIiBjb250YWlucyBpbnZhbGlkIGtleXM6IFske09iamVjdC5rZXlzKGludmFsaWRLZXlzKX1dYDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh1cGRhdGUgIT09IG51bGwgJiYgIWlzVmFsaWRTdHJpbmdBcnJheSh1cGRhdGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBcImlucHV0RmllbGRzLnVwZGF0ZVwiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgYXJyYXlgO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNyZWF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZFN0cmluZ0FycmF5KGNyZWF0ZSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgXCJpbnB1dEZpZWxkcy5jcmVhdGVcIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGFycmF5YDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjcmVhdGUuaW5jbHVkZXMoJ3VzZXJuYW1lJykgfHwgIWNyZWF0ZS5pbmNsdWRlcygncGFzc3dvcmQnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFwiaW5wdXRGaWVsZHMuY3JlYXRlXCIgbXVzdCBpbmNsdWRlIHJlcXVpcmVkIGZpZWxkcywgdXNlcm5hbWUgYW5kIHBhc3N3b3JkYDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBcImlucHV0RmllbGRzXCIgbXVzdCBiZSBhIHZhbGlkIG9iamVjdGA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocXVlcnkgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGlzVmFsaWRTaW1wbGVPYmplY3QocXVlcnkpKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZmluZCA9IG51bGwsXG4gICAgICAgICAgICBnZXQgPSBudWxsLFxuICAgICAgICAgICAgZmluZEFsaWFzID0gbnVsbCxcbiAgICAgICAgICAgIGdldEFsaWFzID0gbnVsbCxcbiAgICAgICAgICAgIC4uLmludmFsaWRLZXlzXG4gICAgICAgICAgfSA9IHF1ZXJ5O1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhpbnZhbGlkS2V5cykubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwicXVlcnlcIiBjb250YWlucyBpbnZhbGlkIGtleXMsIFske09iamVjdC5rZXlzKGludmFsaWRLZXlzKX1dYDtcbiAgICAgICAgICB9IGVsc2UgaWYgKGZpbmQgIT09IG51bGwgJiYgdHlwZW9mIGZpbmQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIGBcInF1ZXJ5LmZpbmRcIiBtdXN0IGJlIGEgYm9vbGVhbmA7XG4gICAgICAgICAgfSBlbHNlIGlmIChnZXQgIT09IG51bGwgJiYgdHlwZW9mIGdldCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwicXVlcnkuZ2V0XCIgbXVzdCBiZSBhIGJvb2xlYW5gO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmluZEFsaWFzICE9PSBudWxsICYmIHR5cGVvZiBmaW5kQWxpYXMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwicXVlcnkuZmluZEFsaWFzXCIgbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgfSBlbHNlIGlmIChnZXRBbGlhcyAhPT0gbnVsbCAmJiB0eXBlb2YgZ2V0QWxpYXMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwicXVlcnkuZ2V0QWxpYXNcIiBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGBcInF1ZXJ5XCIgbXVzdCBiZSBhIHZhbGlkIG9iamVjdGA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtdXRhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNWYWxpZFNpbXBsZU9iamVjdChtdXRhdGlvbikpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjcmVhdGUgPSBudWxsLFxuICAgICAgICAgICAgdXBkYXRlID0gbnVsbCxcbiAgICAgICAgICAgIGRlc3Ryb3kgPSBudWxsLFxuICAgICAgICAgICAgY3JlYXRlQWxpYXMgPSBudWxsLFxuICAgICAgICAgICAgdXBkYXRlQWxpYXMgPSBudWxsLFxuICAgICAgICAgICAgZGVzdHJveUFsaWFzID0gbnVsbCxcbiAgICAgICAgICAgIC4uLmludmFsaWRLZXlzXG4gICAgICAgICAgfSA9IG11dGF0aW9uO1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhpbnZhbGlkS2V5cykubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwibXV0YXRpb25cIiBjb250YWlucyBpbnZhbGlkIGtleXMsIFske09iamVjdC5rZXlzKGludmFsaWRLZXlzKX1dYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNyZWF0ZSAhPT0gbnVsbCAmJiB0eXBlb2YgY3JlYXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCJtdXRhdGlvbi5jcmVhdGVcIiBtdXN0IGJlIGEgYm9vbGVhbmA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1cGRhdGUgIT09IG51bGwgJiYgdHlwZW9mIHVwZGF0ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwibXV0YXRpb24udXBkYXRlXCIgbXVzdCBiZSBhIGJvb2xlYW5gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gbnVsbCAmJiB0eXBlb2YgZGVzdHJveSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gYFwibXV0YXRpb24uZGVzdHJveVwiIG11c3QgYmUgYSBib29sZWFuYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNyZWF0ZUFsaWFzICE9PSBudWxsICYmIHR5cGVvZiBjcmVhdGVBbGlhcyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCJtdXRhdGlvbi5jcmVhdGVBbGlhc1wiIG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodXBkYXRlQWxpYXMgIT09IG51bGwgJiYgdHlwZW9mIHVwZGF0ZUFsaWFzICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGBcIm11dGF0aW9uLnVwZGF0ZUFsaWFzXCIgbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZXN0cm95QWxpYXMgIT09IG51bGwgJiYgdHlwZW9mIGRlc3Ryb3lBbGlhcyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCJtdXRhdGlvbi5kZXN0cm95QWxpYXNcIiBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGBcIm11dGF0aW9uXCIgbXVzdCBiZSBhIHZhbGlkIG9iamVjdGA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgaXNWYWxpZFN0cmluZ0FycmF5ID0gZnVuY3Rpb24gKGFycmF5KTogYm9vbGVhbiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFycmF5KVxuICAgID8gIWFycmF5LnNvbWUocyA9PiB0eXBlb2YgcyAhPT0gJ3N0cmluZycgfHwgcy50cmltKCkubGVuZ3RoIDwgMSlcbiAgICA6IGZhbHNlO1xufTtcbi8qKlxuICogRW5zdXJlcyB0aGUgb2JqIGlzIGEgc2ltcGxlIEpTT04ve31cbiAqIG9iamVjdCwgaS5lLiBub3QgYW4gYXJyYXksIG51bGwsIGRhdGVcbiAqIGV0Yy5cbiAqL1xuY29uc3QgaXNWYWxpZFNpbXBsZU9iamVjdCA9IGZ1bmN0aW9uIChvYmopOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KG9iaikgJiZcbiAgICBvYmogIT09IG51bGwgJiZcbiAgICBVdGlscy5pc0RhdGUob2JqKSAhPT0gdHJ1ZSAmJlxuICAgIFV0aWxzLmlzUHJvbWlzZShvYmopICE9PSB0cnVlXG4gICk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlR3JhcGhRTENvbmZpZyB7XG4gIGVuYWJsZWRGb3JDbGFzc2VzPzogc3RyaW5nW107XG4gIGRpc2FibGVkRm9yQ2xhc3Nlcz86IHN0cmluZ1tdO1xuICBjbGFzc0NvbmZpZ3M/OiBQYXJzZUdyYXBoUUxDbGFzc0NvbmZpZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlR3JhcGhRTENsYXNzQ29uZmlnIHtcbiAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIC8qIFRoZSBgdHlwZWAgb2JqZWN0IGNvbnRhaW5zIG9wdGlvbnMgZm9yIGhvdyB0aGUgY2xhc3MgdHlwZXMgYXJlIGdlbmVyYXRlZCAqL1xuICB0eXBlOiA/e1xuICAgIC8qIEZpZWxkcyB0aGF0IGFyZSBhbGxvd2VkIHdoZW4gY3JlYXRpbmcgb3IgdXBkYXRpbmcgYW4gb2JqZWN0LiAqL1xuICAgIGlucHV0RmllbGRzOiA/e1xuICAgICAgLyogTGVhdmUgYmxhbmsgdG8gYWxsb3cgYWxsIGF2YWlsYWJsZSBmaWVsZHMgaW4gdGhlIHNjaGVtYS4gKi9cbiAgICAgIGNyZWF0ZT86IHN0cmluZ1tdLFxuICAgICAgdXBkYXRlPzogc3RyaW5nW10sXG4gICAgfSxcbiAgICAvKiBGaWVsZHMgb24gdGhlIGVkZ2VzIHRoYXQgY2FuIGJlIHJlc29sdmVkIGZyb20gYSBxdWVyeSwgaS5lLiB0aGUgUmVzdWx0IFR5cGUuICovXG4gICAgb3V0cHV0RmllbGRzOiA/KHN0cmluZ1tdKSxcbiAgICAvKiBGaWVsZHMgYnkgd2hpY2ggYSBxdWVyeSBjYW4gYmUgZmlsdGVyZWQsIGkuZS4gdGhlIGB3aGVyZWAgb2JqZWN0LiAqL1xuICAgIGNvbnN0cmFpbnRGaWVsZHM6ID8oc3RyaW5nW10pLFxuICAgIC8qIEZpZWxkcyBieSB3aGljaCBhIHF1ZXJ5IGNhbiBiZSBzb3J0ZWQ7ICovXG4gICAgc29ydEZpZWxkczogPyh7XG4gICAgICBmaWVsZDogc3RyaW5nLFxuICAgICAgYXNjOiBib29sZWFuLFxuICAgICAgZGVzYzogYm9vbGVhbixcbiAgICB9W10pLFxuICB9O1xuICAvKiBUaGUgYHF1ZXJ5YCBvYmplY3QgY29udGFpbnMgb3B0aW9ucyBmb3Igd2hpY2ggY2xhc3MgcXVlcmllcyBhcmUgZ2VuZXJhdGVkICovXG4gIHF1ZXJ5OiA/e1xuICAgIGdldDogP2Jvb2xlYW4sXG4gICAgZmluZDogP2Jvb2xlYW4sXG4gICAgZmluZEFsaWFzOiA/U3RyaW5nLFxuICAgIGdldEFsaWFzOiA/U3RyaW5nLFxuICB9O1xuICAvKiBUaGUgYG11dGF0aW9uYCBvYmplY3QgY29udGFpbnMgb3B0aW9ucyBmb3Igd2hpY2ggY2xhc3MgbXV0YXRpb25zIGFyZSBnZW5lcmF0ZWQgKi9cbiAgbXV0YXRpb246ID97XG4gICAgY3JlYXRlOiA/Ym9vbGVhbixcbiAgICB1cGRhdGU6ID9ib29sZWFuLFxuICAgIC8vIGRlbGV0ZSBpcyBhIHJlc2VydmVkIGtleSB3b3JkIGluIGpzXG4gICAgZGVzdHJveTogP2Jvb2xlYW4sXG4gICAgY3JlYXRlQWxpYXM6ID9TdHJpbmcsXG4gICAgdXBkYXRlQWxpYXM6ID9TdHJpbmcsXG4gICAgZGVzdHJveUFsaWFzOiA/U3RyaW5nLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBQYXJzZUdyYXBoUUxDb250cm9sbGVyO1xuZXhwb3J0IHsgR3JhcGhRTENvbmZpZ0NsYXNzTmFtZSwgR3JhcGhRTENvbmZpZ0lkLCBHcmFwaFFMQ29uZmlnS2V5IH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLGtCQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxtQkFBQSxHQUFBSCxzQkFB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