@nlabs/reaktor 0.5.4 → 0.8.0

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 (135) hide show
  1. package/README.md +7 -7
  2. package/lib/actions/conversations.js +68 -69
  3. package/lib/actions/dynamodb.js +22 -33
  4. package/lib/actions/email.js +32 -30
  5. package/lib/actions/files.js +39 -58
  6. package/lib/actions/groups.js +33 -28
  7. package/lib/actions/images.js +71 -82
  8. package/lib/actions/index.js +54 -37
  9. package/lib/actions/ios.js +21 -40
  10. package/lib/actions/locations.js +25 -22
  11. package/lib/actions/messages.js +31 -45
  12. package/lib/actions/notifications.js +13 -20
  13. package/lib/actions/payments.js +40 -52
  14. package/lib/actions/posts.js +68 -48
  15. package/lib/actions/reactions.js +29 -52
  16. package/lib/actions/s3.js +21 -18
  17. package/lib/actions/search.js +26 -40
  18. package/lib/actions/sms.js +24 -21
  19. package/lib/actions/statistics.js +14 -21
  20. package/lib/actions/subscription.js +27 -24
  21. package/lib/actions/tags.js +49 -56
  22. package/lib/actions/users.js +92 -106
  23. package/lib/actions/websockets.js +28 -41
  24. package/lib/config.js +21 -18
  25. package/lib/index.js +24 -22
  26. package/lib/lambdas/actions/websockets.js +21 -45
  27. package/lib/lambdas/authorizer.js +16 -24
  28. package/lib/lambdas/connection.js +18 -43
  29. package/lib/lambdas/utils/message.js +20 -17
  30. package/lib/lambdas/utils/websocket.js +33 -25
  31. package/lib/templates/email/layout.js +16 -9
  32. package/lib/templates/email/passwordForgot.js +16 -9
  33. package/lib/templates/email/passwordRecovery.js +16 -9
  34. package/lib/templates/email/verifyEmail.js +16 -9
  35. package/lib/templates/email/welcome.js +16 -9
  36. package/lib/templates/sms/passwordForgot.js +16 -9
  37. package/lib/templates/sms/passwordRecovery.js +16 -9
  38. package/lib/templates/sms/verifyEmail.js +16 -9
  39. package/lib/templates/sms/verifyPhone.js +16 -9
  40. package/lib/templates/sms/welcome.js +16 -9
  41. package/lib/types/apps.js +14 -5
  42. package/lib/types/arangodb.js +14 -5
  43. package/lib/types/auth.js +14 -5
  44. package/lib/types/connections.js +14 -5
  45. package/lib/types/conversations.js +14 -5
  46. package/lib/types/email.js +14 -5
  47. package/lib/types/files.js +14 -5
  48. package/lib/types/google.js +14 -5
  49. package/lib/types/groups.js +14 -5
  50. package/lib/types/images.js +14 -5
  51. package/lib/types/index.js +50 -35
  52. package/lib/types/locations.js +14 -5
  53. package/lib/types/messages.js +14 -5
  54. package/lib/types/notifications.js +14 -5
  55. package/lib/types/payments.js +14 -5
  56. package/lib/types/posts.js +14 -5
  57. package/lib/types/statistics.js +14 -5
  58. package/lib/types/tags.js +14 -5
  59. package/lib/types/users.js +14 -5
  60. package/lib/types/websocket.js +14 -5
  61. package/lib/utils/analytics.js +24 -44
  62. package/lib/utils/arangodb.js +15 -22
  63. package/lib/utils/auth.js +22 -36
  64. package/lib/utils/graphql.js +20 -17
  65. package/lib/utils/index.js +26 -23
  66. package/lib/utils/objects.js +22 -19
  67. package/lib/utils/session.js +20 -17
  68. package/package.json +31 -33
  69. package/.eslintrc +0 -18
  70. package/lib/actions/conversations.d.ts +0 -14
  71. package/lib/actions/dynamodb.d.ts +0 -8
  72. package/lib/actions/email.d.ts +0 -7
  73. package/lib/actions/files.d.ts +0 -16
  74. package/lib/actions/groups.d.ts +0 -14
  75. package/lib/actions/images.d.ts +0 -22
  76. package/lib/actions/index.d.ts +0 -20
  77. package/lib/actions/ios.d.ts +0 -7
  78. package/lib/actions/locations.d.ts +0 -3
  79. package/lib/actions/messages.d.ts +0 -13
  80. package/lib/actions/notifications.d.ts +0 -5
  81. package/lib/actions/payments.d.ts +0 -10
  82. package/lib/actions/posts.d.ts +0 -19
  83. package/lib/actions/reactions.d.ts +0 -30
  84. package/lib/actions/s3.d.ts +0 -7
  85. package/lib/actions/search.d.ts +0 -3
  86. package/lib/actions/sms.d.ts +0 -3
  87. package/lib/actions/statistics.d.ts +0 -2
  88. package/lib/actions/subscription.d.ts +0 -7
  89. package/lib/actions/tags.d.ts +0 -26
  90. package/lib/actions/users.d.ts +0 -44
  91. package/lib/actions/websockets.d.ts +0 -6
  92. package/lib/config.d.ts +0 -20
  93. package/lib/index.d.ts +0 -5
  94. package/lib/lambdas/actions/websockets.d.ts +0 -6
  95. package/lib/lambdas/authorizer.d.ts +0 -20
  96. package/lib/lambdas/connection.d.ts +0 -12
  97. package/lib/lambdas/utils/message.d.ts +0 -1
  98. package/lib/lambdas/utils/websocket.d.ts +0 -7
  99. package/lib/templates/email/layout.d.ts +0 -2
  100. package/lib/templates/email/passwordForgot.d.ts +0 -2
  101. package/lib/templates/email/passwordRecovery.d.ts +0 -2
  102. package/lib/templates/email/verifyEmail.d.ts +0 -2
  103. package/lib/templates/email/welcome.d.ts +0 -2
  104. package/lib/templates/sms/passwordForgot.d.ts +0 -2
  105. package/lib/templates/sms/passwordRecovery.d.ts +0 -2
  106. package/lib/templates/sms/verifyEmail.d.ts +0 -2
  107. package/lib/templates/sms/verifyPhone.d.ts +0 -2
  108. package/lib/templates/sms/welcome.d.ts +0 -2
  109. package/lib/types/apps.d.ts +0 -44
  110. package/lib/types/arangodb.d.ts +0 -17
  111. package/lib/types/auth.d.ts +0 -7
  112. package/lib/types/connections.d.ts +0 -8
  113. package/lib/types/conversations.d.ts +0 -11
  114. package/lib/types/email.d.ts +0 -12
  115. package/lib/types/files.d.ts +0 -26
  116. package/lib/types/google.d.ts +0 -27
  117. package/lib/types/groups.d.ts +0 -22
  118. package/lib/types/images.d.ts +0 -42
  119. package/lib/types/index.d.ts +0 -18
  120. package/lib/types/locations.d.ts +0 -20
  121. package/lib/types/messages.d.ts +0 -27
  122. package/lib/types/notifications.d.ts +0 -19
  123. package/lib/types/payments.d.ts +0 -115
  124. package/lib/types/posts.d.ts +0 -47
  125. package/lib/types/statistics.d.ts +0 -3
  126. package/lib/types/tags.d.ts +0 -15
  127. package/lib/types/users.d.ts +0 -80
  128. package/lib/types/websocket.d.ts +0 -14
  129. package/lib/utils/analytics.d.ts +0 -14
  130. package/lib/utils/arangodb.d.ts +0 -9
  131. package/lib/utils/auth.d.ts +0 -5
  132. package/lib/utils/graphql.d.ts +0 -1
  133. package/lib/utils/index.d.ts +0 -6
  134. package/lib/utils/objects.d.ts +0 -3
  135. package/lib/utils/session.d.ts +0 -18
@@ -1,59 +1,32 @@
1
1
  var __create = Object.create;
2
2
  var __defProp = Object.defineProperty;
3
- var __defProps = Object.defineProperties;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
5
  var __getProtoOf = Object.getPrototypeOf;
9
6
  var __hasOwnProp = Object.prototype.hasOwnProperty;
10
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
11
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
- var __spreadValues = (a, b) => {
13
- for (var prop in b || (b = {}))
14
- if (__hasOwnProp.call(b, prop))
15
- __defNormalProp(a, prop, b[prop]);
16
- if (__getOwnPropSymbols)
17
- for (var prop of __getOwnPropSymbols(b)) {
18
- if (__propIsEnum.call(b, prop))
19
- __defNormalProp(a, prop, b[prop]);
20
- }
21
- return a;
22
- };
23
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
24
- var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
25
- var __require = typeof require !== "undefined" ? require : (x) => {
26
- throw new Error('Dynamic require of "' + x + '" is not supported');
27
- };
28
- var __objRest = (source, exclude) => {
29
- var target = {};
30
- for (var prop in source)
31
- if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
32
- target[prop] = source[prop];
33
- if (source != null && __getOwnPropSymbols)
34
- for (var prop of __getOwnPropSymbols(source)) {
35
- if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
36
- target[prop] = source[prop];
37
- }
38
- return target;
39
- };
40
7
  var __export = (target, all) => {
41
- __markAsModule(target);
42
8
  for (var name in all)
43
9
  __defProp(target, name, { get: all[name], enumerable: true });
44
10
  };
45
- var __reExport = (target, module2, desc) => {
46
- if (module2 && typeof module2 === "object" || typeof module2 === "function") {
47
- for (let key of __getOwnPropNames(module2))
48
- if (!__hasOwnProp.call(target, key) && key !== "default")
49
- __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
50
16
  }
51
- return target;
52
- };
53
- var __toModule = (module2) => {
54
- return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
17
+ return to;
55
18
  };
56
- __export(exports, {
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var users_exports = {};
29
+ __export(users_exports, {
57
30
  UserAccess: () => UserAccess,
58
31
  addUser: () => addUser,
59
32
  confirmCode: () => confirmCode,
@@ -75,24 +48,24 @@ __export(exports, {
75
48
  signOut: () => signOut,
76
49
  updateUser: () => updateUser
77
50
  });
78
- var import_utils = __toModule(require("@nlabs/utils"));
79
- var import_arangojs = __toModule(require("arangojs"));
80
- var import_isEmpty = __toModule(require("lodash/isEmpty"));
81
- var import_luxon = __toModule(require("luxon"));
82
- var import_stripe = __toModule(require("stripe"));
83
- var import_config = __toModule(require("../config"));
84
- var import_utils2 = __toModule(require("../utils"));
85
- var import_session = __toModule(require("../utils/session"));
51
+ module.exports = __toCommonJS(users_exports);
52
+ var import_utils = require("@nlabs/utils");
53
+ var import_arangojs = require("arangojs");
54
+ var import_luxon = require("luxon");
55
+ var import_stripe = __toESM(require("stripe"));
56
+ var import_config = require("../config");
57
+ var import_utils2 = require("../utils");
58
+ var import_session = require("../utils/session");
86
59
  const eventCategory = "users";
87
60
  const apiVersion = "2020-03-02";
88
- var UserAccess;
89
- (function(UserAccess2) {
61
+ var UserAccess = /* @__PURE__ */ ((UserAccess2) => {
90
62
  UserAccess2[UserAccess2["DEACTIVATED"] = 0] = "DEACTIVATED";
91
63
  UserAccess2[UserAccess2["ACTIVE"] = 1] = "ACTIVE";
92
64
  UserAccess2[UserAccess2["PREMIUM"] = 2] = "PREMIUM";
93
65
  UserAccess2[UserAccess2["CONTENT_ADMIN"] = 3] = "CONTENT_ADMIN";
94
66
  UserAccess2[UserAccess2["ADMIN"] = 4] = "ADMIN";
95
- })(UserAccess || (UserAccess = {}));
67
+ return UserAccess2;
68
+ })(UserAccess || {});
96
69
  const createToken = (userId, username, userAccess, expires = 15) => {
97
70
  const now = import_luxon.DateTime.local();
98
71
  const sessionExpires = now.plus({ minutes: expires });
@@ -122,9 +95,10 @@ const parseUserOptions = (options = {}) => {
122
95
  from = 0,
123
96
  to = 30
124
97
  } = options;
125
- return __spreadProps(__spreadValues({}, options), {
98
+ return {
99
+ ...options,
126
100
  limit: (0, import_utils2.getLimit)(from, to)
127
- });
101
+ };
128
102
  };
129
103
  const addUser = async (context, args) => {
130
104
  const action = "addUser";
@@ -136,7 +110,7 @@ const addUser = async (context, args) => {
136
110
  const formatUsername = (0, import_utils.parseUsername)(username);
137
111
  const formatEmail = (0, import_utils.parseEmail)(email);
138
112
  const formatPhone = (0, import_utils.parsePhone)(phone);
139
- if ((0, import_isEmpty.default)(formatUsername) || (0, import_isEmpty.default)(password) || !(0, import_isEmpty.default)(formatPhone) && !(0, import_isEmpty.default)(formatEmail)) {
113
+ if (!formatUsername || !password || !formatPhone && !formatEmail) {
140
114
  return (0, import_utils2.logException)({
141
115
  action,
142
116
  args: { username },
@@ -145,21 +119,23 @@ const addUser = async (context, args) => {
145
119
  }, context);
146
120
  }
147
121
  const filters = [`u.username == "${formatUsername}"`];
148
- if (!(0, import_isEmpty.default)(formatEmail)) {
122
+ if (formatEmail) {
149
123
  filters.push(`u.email == "${formatEmail}"`);
150
124
  }
151
- if (!(0, import_isEmpty.default)(formatPhone)) {
125
+ if (formatPhone) {
152
126
  filters.push(`u.phone == ${formatPhone}`);
153
127
  }
154
128
  const checkQuery = `FOR u IN users
155
129
  FILTER ${filters.join(" || ")}
156
130
  RETURN u`;
157
- const existingUsers = await database.query(checkQuery).then((cursor) => cursor.all()).catch((error) => (0, import_utils2.logError)({
158
- action,
159
- args: { username },
160
- category: eventCategory,
161
- label: import_utils2.ErrorTypes.DATABASE_ERROR
162
- }, error, context).then(() => null));
131
+ const existingUsers = await database.query(checkQuery).then((cursor) => cursor.all()).catch(
132
+ (error) => (0, import_utils2.logError)({
133
+ action,
134
+ args: { username },
135
+ category: eventCategory,
136
+ label: import_utils2.ErrorTypes.DATABASE_ERROR
137
+ }, error, context).then(() => null)
138
+ );
163
139
  if (existingUsers.length) {
164
140
  return (0, import_utils2.logException)({
165
141
  action,
@@ -186,17 +162,19 @@ const addUser = async (context, args) => {
186
162
  verifiedPhoneCode
187
163
  };
188
164
  const insertQuery = import_arangojs.aql`INSERT ${insert} IN users RETURN NEW`;
189
- return await database.query(insertQuery).then((cursor) => cursor.next() || {}).catch((error) => (0, import_utils2.logError)({
190
- action,
191
- args: { username },
192
- category: eventCategory,
193
- label: import_utils2.ErrorTypes.DATABASE_ERROR
194
- }, error, context).then(() => null));
165
+ return await database.query(insertQuery).then((cursor) => cursor.next() || {}).catch(
166
+ (error) => (0, import_utils2.logError)({
167
+ action,
168
+ args: { username },
169
+ category: eventCategory,
170
+ label: import_utils2.ErrorTypes.DATABASE_ERROR
171
+ }, error, context).then(() => null)
172
+ );
195
173
  };
196
174
  const updateUser = async (context, user) => {
197
175
  const action = "updateUser";
198
176
  const { database } = context;
199
- const _a = user, { _key, _id, id, tags = [], userId } = _a, updated = __objRest(_a, ["_key", "_id", "id", "tags", "userId"]);
177
+ const { _key, _id, id, tags = [], userId, ...updated } = user;
200
178
  let userDocId;
201
179
  if (_id || id) {
202
180
  userDocId = _id || id;
@@ -252,12 +230,14 @@ const confirmCode = async (context, args) => {
252
230
  default:
253
231
  return false;
254
232
  }
255
- }).catch((error) => (0, import_utils2.logError)({
256
- action,
257
- args: { code, type, userId: sessionId },
258
- category: eventCategory,
259
- label: import_utils2.ErrorTypes.DATABASE_ERROR
260
- }, error, context));
233
+ }).catch(
234
+ (error) => (0, import_utils2.logError)({
235
+ action,
236
+ args: { code, type, userId: sessionId },
237
+ category: eventCategory,
238
+ label: import_utils2.ErrorTypes.DATABASE_ERROR
239
+ }, error, context)
240
+ );
261
241
  } catch (error) {
262
242
  return false;
263
243
  }
@@ -311,11 +291,11 @@ const deactivateUser = (context, userId) => {
311
291
  const getDisplayName = (user = {}) => {
312
292
  const { first, last, name = "", username = "" } = user;
313
293
  const fullname = [first, last].join(" ").trim();
314
- if (!(0, import_isEmpty.default)(name)) {
294
+ if (name) {
315
295
  return name;
316
296
  } else if (fullname !== "") {
317
297
  return fullname;
318
- } else if (!(0, import_isEmpty.default)(username)) {
298
+ } else if (username) {
319
299
  return username;
320
300
  }
321
301
  return "Unknown";
@@ -358,7 +338,7 @@ const getUsers = (context, options) => {
358
338
  const { limit, username } = parseUserOptions(options);
359
339
  const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
360
340
  const filterBy = ["u.userAccess > 0"];
361
- if (!(0, import_isEmpty.default)(username)) {
341
+ if (username) {
362
342
  filterBy.push(`CONTAINS(u.username, "${(0, import_utils.parseUsername)(username)}")`);
363
343
  }
364
344
  const aqlQuery = `FOR u IN users
@@ -382,10 +362,10 @@ const getUsersByReactions = (context, { reactions = [], username }, options) =>
382
362
  const formatSessionId = `users/${sessionId}`;
383
363
  const formatUsername = (0, import_utils.parseUsername)(username);
384
364
  const filterBy = [`POSITION(${JSON.stringify(formatReactions)}, LOWER(r.name))`];
385
- if (!(0, import_isEmpty.default)(username)) {
365
+ if (username) {
386
366
  filterBy.push(`CONTAINS(u.username, "${formatUsername}")`);
387
367
  }
388
- const aqlQuery = `FOR u, r IN OUTBOUND "${formatSessionId}" hasReactions
368
+ const aqlQuery = `FOR u, r IN OUTBOUND "${formatSessionId}" hasReaction
389
369
  OPTIONS {vertexCollections: "users"}
390
370
  ${selectQueries.join("\n")}
391
371
  ${filterBy.length ? `FILTER ${filterBy.join(" && ")}` : ""}
@@ -402,7 +382,7 @@ const getUsersByTags = (context, { tags, username }, options) => {
402
382
  const action = "getUsersByTags";
403
383
  const { database, fields, session: { userId: sessionId } } = context;
404
384
  const formatTags = tags.reduce((list, tagName) => {
405
- if (!(0, import_isEmpty.default)(tagName)) {
385
+ if (tagName) {
406
386
  list.push((0, import_utils.parseChar)(tagName, 32).toLowerCase());
407
387
  }
408
388
  return list;
@@ -411,7 +391,7 @@ const getUsersByTags = (context, { tags, username }, options) => {
411
391
  const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
412
392
  const formatUsername = (0, import_utils.parseUsername)(username);
413
393
  const filterBy = [`u._key != "${sessionId}"`];
414
- if (!(0, import_isEmpty.default)(username)) {
394
+ if (username) {
415
395
  filterBy.push(`CONTAINS(u.username, "${formatUsername}")`);
416
396
  }
417
397
  const aqlQuery = `FOR t IN tags
@@ -435,7 +415,7 @@ const getUsersByLatest = (context, { username }, options) => {
435
415
  const { limit } = parseUserOptions(options);
436
416
  const filter = ["u._id != session._id"];
437
417
  const { objects: selectObjects, queries: selectQueries } = getUserOptional(fields);
438
- if (!(0, import_isEmpty.default)(username)) {
418
+ if (username) {
439
419
  filter.push(`CONTAINS(u.username, "${(0, import_utils.parseUsername)(username)}")`);
440
420
  }
441
421
  const aqlQuery = `FOR u IN users
@@ -471,7 +451,7 @@ const signIn = async (context, args) => {
471
451
  const formatPassword = (0, import_utils.parsePassword)(password);
472
452
  const formatExpires = (0, import_utils.parseNum)(expires) || 15;
473
453
  const { database } = context;
474
- if ((0, import_isEmpty.default)(formatUsername) || (0, import_isEmpty.default)(formatPassword)) {
454
+ if (!formatUsername || !formatPassword) {
475
455
  return (0, import_utils2.logException)({
476
456
  action,
477
457
  args: { username },
@@ -483,12 +463,14 @@ const signIn = async (context, args) => {
483
463
  FILTER u.username == ${formatUsername}
484
464
  LIMIT 1
485
465
  RETURN u`;
486
- const checkUser = await database.query(checkQuery).then((cursor) => cursor.next()).catch((error) => (0, import_utils2.logError)({
487
- action,
488
- args: { username: formatUsername },
489
- category: eventCategory,
490
- label: import_utils2.ErrorTypes.DATABASE_ERROR
491
- }, error, context).then(() => null));
466
+ const checkUser = await database.query(checkQuery).then((cursor) => cursor.next()).catch(
467
+ (error) => (0, import_utils2.logError)({
468
+ action,
469
+ args: { username: formatUsername },
470
+ category: eventCategory,
471
+ label: import_utils2.ErrorTypes.DATABASE_ERROR
472
+ }, error, context).then(() => null)
473
+ );
492
474
  if (!checkUser) {
493
475
  return (0, import_utils2.logException)({
494
476
  action,
@@ -522,12 +504,14 @@ const signOut = async (context, args) => {
522
504
  LIMIT 1
523
505
  RETURN NEW`;
524
506
  try {
525
- await database.query(sessionQuery).then((cursor) => cursor.next()).catch((error) => (0, import_utils2.logError)({
526
- action,
527
- args: { username, userId: sessionId },
528
- category: eventCategory,
529
- label: import_utils2.ErrorTypes.DATABASE_ERROR
530
- }, error, context));
507
+ await database.query(sessionQuery).then((cursor) => cursor.next()).catch(
508
+ (error) => (0, import_utils2.logError)({
509
+ action,
510
+ args: { username, userId: sessionId },
511
+ category: eventCategory,
512
+ label: import_utils2.ErrorTypes.DATABASE_ERROR
513
+ }, error, context)
514
+ );
531
515
  } catch (error) {
532
516
  return false;
533
517
  }
@@ -542,11 +526,13 @@ const getActiveUserCount = (context) => {
542
526
  RETURN u
543
527
  )
544
528
  RETURN LENGTH(docs)`;
545
- return database.query(countQuery).then((cursor) => cursor.next()).catch((error) => (0, import_utils2.logError)({
546
- action,
547
- category: eventCategory,
548
- label: import_utils2.ErrorTypes.DATABASE_ERROR
549
- }, error, context).then(() => 0));
529
+ return database.query(countQuery).then((cursor) => cursor.next()).catch(
530
+ (error) => (0, import_utils2.logError)({
531
+ action,
532
+ category: eventCategory,
533
+ label: import_utils2.ErrorTypes.DATABASE_ERROR
534
+ }, error, context).then(() => 0)
535
+ );
550
536
  };
551
537
  // Annotate the CommonJS export names for ESM import in node:
552
538
  0 && (module.exports = {
@@ -571,4 +557,4 @@ const getActiveUserCount = (context) => {
571
557
  signOut,
572
558
  updateUser
573
559
  });
574
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvdXNlcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge1xuICBjcmVhdGVIYXNoLFxuICBjcmVhdGVQYXNzd29yZCxcbiAgcGFyc2VDaGFyLFxuICBwYXJzZUVtYWlsLFxuICBwYXJzZUlkLFxuICBwYXJzZU51bSxcbiAgcGFyc2VQYXNzd29yZCxcbiAgcGFyc2VQaG9uZSxcbiAgcGFyc2VVc2VybmFtZVxufSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9uJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvaXNFbXB0eSc7XG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgU3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoJztcbmltcG9ydCB7VXNlcn0gZnJvbSAnLi4vdHlwZXMvdXNlcnMnO1xuaW1wb3J0IHtFcnJvclR5cGVzLCBnZXRMaW1pdCwgbG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbiwgc2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZX0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtnZXRTZXNzaW9uLCBTZXNzaW9uRXJyb3IsIFNlc3Npb25Ub2tlbiwgc2V0U2Vzc2lvbn0gZnJvbSAnLi4vdXRpbHMvc2Vzc2lvbic7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICd1c2Vycyc7XG5jb25zdCBhcGlWZXJzaW9uOiBhbnkgPSAnMjAyMC0wMy0wMic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck9wdGlvbnMge1xuICByZWFkb25seSBmcm9tPzogbnVtYmVyO1xuICByZWFkb25seSB0bz86IG51bWJlcjtcbiAgcmVhZG9ubHkgdXNlcm5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIFVzZXJBY2Nlc3Mge1xuICBERUFDVElWQVRFRCA9IDAsXG4gIEFDVElWRSA9IDEsXG4gIFBSRU1JVU0gPSAyLFxuICBDT05URU5UX0FETUlOID0gMyxcbiAgQURNSU4gPSA0XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUb2tlbiA9IChcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHVzZXJuYW1lOiBzdHJpbmcsXG4gIHVzZXJBY2Nlc3M6IG51bWJlcixcbiAgZXhwaXJlczogbnVtYmVyID0gMTVcbik6IFNlc3Npb25Ub2tlbiA9PiB7XG4gIGNvbnN0IG5vdzogRGF0ZVRpbWUgPSBEYXRlVGltZS5sb2NhbCgpO1xuICBjb25zdCBzZXNzaW9uRXhwaXJlczogRGF0ZVRpbWUgPSBub3cucGx1cyh7bWludXRlczogZXhwaXJlc30pO1xuICBjb25zdCBpYXQ6IG51bWJlciA9IE1hdGguZmxvb3Iobm93LnRvU2Vjb25kcygpKTtcbiAgY29uc3QgZXhwOiBudW1iZXIgPSBNYXRoLmZsb29yKHNlc3Npb25FeHBpcmVzLnRvU2Vjb25kcygpKTtcblxuICBjb25zdCB0b2tlbiA9IHNldFNlc3Npb24oe1xuICAgIGV4cCxcbiAgICBpYXQsXG4gICAgdXNlcm5hbWUsXG4gICAgdXNlckFjY2VzcyxcbiAgICB1c2VySWRcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBleHBpcmVzOiBzZXNzaW9uRXhwaXJlcy50b01pbGxpcygpLFxuICAgIGlzc3VlZDogbm93LnRvTWlsbGlzKCksXG4gICAgdG9rZW5cbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyT3B0aW9uYWwgPSAoZmllbGRzOiBzdHJpbmdbXSA9IFtdKSA9PlxuICBmaWVsZHMucmVkdWNlKChzZWxlY3RzOiBhbnksIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBpZihmaWVsZC5pbmNsdWRlcygnQ291bnQnKSkge1xuICAgICAgcmV0dXJuIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUoJ3VzZXJzJywgJ3UnLCBmaWVsZCwgc2VsZWN0cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdHM7XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlVXNlck9wdGlvbnMgPSAob3B0aW9uczogVXNlck9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgdG8gPSAzMFxuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKVxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXIgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgYXJnczogYW55KTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3Qge3VzZXJ9ID0gYXJncztcbiAgY29uc3Qge2VtYWlsLCBwYXNzd29yZCwgcGhvbmUsIHVzZXJuYW1lfSA9IHVzZXI7XG4gIGNvbnN0IHNhbHQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYCR7dXNlcm5hbWV9JHtwYXNzd29yZH1gLCBudWxsKTtcbiAgY29uc3QgZW5jcnlwdGVkUGFzc3dvcmQgPSBjcmVhdGVQYXNzd29yZChwYXNzd29yZCwgc2FsdCk7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZm9ybWF0RW1haWw6IHN0cmluZyA9IHBhcnNlRW1haWwoZW1haWwpO1xuICBjb25zdCBmb3JtYXRQaG9uZTogc3RyaW5nID0gcGFyc2VQaG9uZShwaG9uZSk7XG5cbiAgaWYoaXNFbXB0eShmb3JtYXRVc2VybmFtZSkgfHwgaXNFbXB0eShwYXNzd29yZCkgfHwgKCFpc0VtcHR5KGZvcm1hdFBob25lKSAmJiAhaXNFbXB0eShmb3JtYXRFbWFpbCkpKSB7XG4gICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBhcmdzOiB7dXNlcm5hbWV9LFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0FSR1VNRU5UU1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbYHUudXNlcm5hbWUgPT0gXCIke2Zvcm1hdFVzZXJuYW1lfVwiYF07XG5cbiAgaWYoIWlzRW1wdHkoZm9ybWF0RW1haWwpKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1LmVtYWlsID09IFwiJHtmb3JtYXRFbWFpbH1cImApO1xuICB9XG5cbiAgaWYoIWlzRW1wdHkoZm9ybWF0UGhvbmUpKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1LnBob25lID09ICR7Zm9ybWF0UGhvbmV9YCk7XG4gIH1cblxuICBjb25zdCBjaGVja1F1ZXJ5OiBzdHJpbmcgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyB8fCAnKX1cbiAgICBSRVRVUk4gdWA7XG4gIGNvbnN0IGV4aXN0aW5nVXNlcnMgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShjaGVja1F1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgYXJnczoge3VzZXJuYW1lfSxcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dClcbiAgICAgIC50aGVuKCgpID0+IG51bGwpXG4gICAgKTtcblxuICBpZihleGlzdGluZ1VzZXJzLmxlbmd0aCkge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgYXJnczoge3VzZXJuYW1lfSxcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuRVhJU1RJTkdfVVNFUk5BTUVcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHZlcmlmaWVkRW1haWxDb2RlOiBudW1iZXIgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG4gIGNvbnN0IHZlcmlmaWVkUGhvbmVDb2RlOiBudW1iZXIgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG5cbiAgLy8gQWRkIG5ldyB1c2VyIHByb3BlcnRpZXNcbiAgY29uc3QgaW5zZXJ0OiBVc2VyID0ge1xuICAgIF9rZXk6IGNyZWF0ZUhhc2godXNlcm5hbWUsIG51bGwpLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIGVtYWlsOiBmb3JtYXRFbWFpbCxcbiAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICBwYXNzd29yZDogZW5jcnlwdGVkUGFzc3dvcmQsXG4gICAgcGhvbmU6IGZvcm1hdFBob25lLFxuICAgIHNhbHQsXG4gICAgdXNlcm5hbWU6IGZvcm1hdFVzZXJuYW1lLFxuICAgIHVzZXJBY2Nlc3M6IDEsXG4gICAgdmVyaWZpZWRFbWFpbDogZmFsc2UsXG4gICAgdmVyaWZpZWRFbWFpbENvZGUsXG4gICAgdmVyaWZpZWRQaG9uZTogZmFsc2UsXG4gICAgdmVyaWZpZWRQaG9uZUNvZGVcbiAgfTtcblxuICAvLyBBZGQgbmV3IHVzZXIgaW4gQXJhbmdvREJcbiAgY29uc3QgaW5zZXJ0UXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gdXNlcnMgUkVUVVJOIE5FV2A7XG4gIHJldHVybiBhd2FpdCBkYXRhYmFzZS5xdWVyeShpbnNlcnRRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSB8fCB7fSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBhcmdzOiB7dXNlcm5hbWV9LFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KVxuICAgICAgLnRoZW4oKCkgPT4gbnVsbClcbiAgICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVVzZXIgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlcik6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3Qge19rZXksIF9pZCwgaWQsIHRhZ3MgPSBbXSwgdXNlcklkLCAuLi51cGRhdGVkfSA9IHVzZXI7XG4gIGxldCB1c2VyRG9jSWQ6IHN0cmluZztcblxuICBpZihfaWQgfHwgaWQpIHtcbiAgICB1c2VyRG9jSWQgPSBfaWQgfHwgaWQ7XG4gIH0gZWxzZSBpZihfa2V5IHx8IHVzZXJJZCkge1xuICAgIHVzZXJEb2NJZCA9IGB1c2Vycy8ke19rZXkgfHwgdXNlcklkfWA7XG4gIH1cblxuICBjb25zdCB1c2VyUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoJHt1c2VyRG9jSWR9KVxuICAgIFVQREFURSB1IFdJVEggJHt1cGRhdGVkfSBJTiB1c2Vyc1xuICAgIFJFVFVSTiBORVdgO1xuXG4gIGNvbnN0IHVwZGF0ZWRVc2VyID0gYXdhaXQgZGF0YWJhc2UucXVlcnkodXNlclF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuXG4gIGNvbnN0IHRhZ0NvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gZGF0YWJhc2UuY29sbGVjdGlvbignaXNUYWdnZWQnKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwodGFncy5tYXAoKHtpZDogdGFnRG9jSWQsIG5hbWV9KSA9PiB7XG4gICAgY29uc3QgZWRnZSA9IHtcbiAgICAgIF9mcm9tOiB0YWdEb2NJZCxcbiAgICAgIF9rZXk6IGNyZWF0ZUhhc2goYGlzVGFnZ2VkLSR7dGFnRG9jSWR9LSR7dXNlckRvY0lkfWApLFxuICAgICAgX3RvOiB1c2VyRG9jSWQsXG4gICAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICAgIG5hbWVcbiAgICB9O1xuICAgIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaXQgSU4gaXNUYWdnZWRcbiAgICAgIEZJTFRFUiBpdC5fZnJvbSA9PSAke3RhZ0RvY0lkfSAmJiBpdC5fdG8gPT0gJHt1c2VyRG9jSWR9ICYmIGl0Lm5hbWUgPT0gJHtuYW1lfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVUVVJOIGl0YDtcblxuICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeSh0YWdRdWVyeSlcbiAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLnRoZW4oKHRhZ0VkZ2UpID0+IHtcbiAgICAgICAgaWYoISF0YWdFZGdlKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ0VkZ2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFnQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KS50aGVuKCgpID0+IGVkZ2UpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG4gIH0pKTtcblxuICByZXR1cm4gdXBkYXRlZFVzZXI7XG59O1xuXG5leHBvcnQgY29uc3QgY29uZmlybUNvZGUgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgYXJncyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdjb25maXJtRW1haWwnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2NvZGUsIHR5cGV9ID0gYXJncztcbiAgY29uc3QgdXNlckRvY0lkOiBzdHJpbmcgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcblxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke3VzZXJEb2NJZH0pIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkgfHwge30pXG4gICAgICAudGhlbigoe3ZlcmlmaWVkRW1haWxDb2RlLCB2ZXJpZmllZFBob25lQ29kZX06IFVzZXIpID0+IHtcbiAgICAgICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgICAgICByZXR1cm4gY29kZSA9PT0gdmVyaWZpZWRFbWFpbENvZGU7XG4gICAgICAgICAgY2FzZSAncGhvbmUnOlxuICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IHZlcmlmaWVkUGhvbmVDb2RlO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgYXJnczoge2NvZGUsIHR5cGUsIHVzZXJJZDogc2Vzc2lvbklkfSxcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dClcbiAgICAgICk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGFyZ3M6IGFueSk6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlckFjY2Vzczogc2Vzc2lvbkFjY2Vzc319ID0gY29udGV4dDtcbiAgY29uc3Qge3VzZXJJZH0gPSBhcmdzO1xuICBjb25zdCBpc0FkbWluOiBib29sZWFuID0gc2Vzc2lvbkFjY2VzcyA+IDI7XG5cbiAgaWYoIWlzQWRtaW4gJiYgKHNlc3Npb25JZCAhPT0gdXNlcklkKSkge1xuICAgIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBhcmdzLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ3VuYXV0aG9yaXplZCcsXG4gICAgICB2YWx1ZTogJ2ludmFsaWRfc2Vzc2lvbidcbiAgICB9LCBjb250ZXh0KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiB1Ll9rZXkgPT0gJHt1c2VySWR9XG4gICAgTElNSVQgMVxuICAgIFJFTU9WRSB1IElOIHVzZXJzXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgLy8gU3RyaXBlXG4gIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyID0ge30pID0+IHN0cmlwZUNsaWVudC5jdXN0b21lcnMuZGVsKHVzZXIuc3RyaXBlQ3VzdG9tZXJJZClcbiAgICAgIC50aGVuKCgpID0+IHN0cmlwZUNsaWVudC5hY2NvdW50cy5kZWwodXNlci5zdHJpcGVBY2NvdW50SWQpKVxuICAgICAgLnRoZW4oKCkgPT4gdXNlcikpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYWN0aXZhdGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VyQWNjZXNzOiBzZXNzaW9uQWNjZXNzfX0gPSBjb250ZXh0O1xuICBjb25zdCBpc0FkbWluOiBib29sZWFuID0gc2Vzc2lvbkFjY2VzcyA+IDI7XG5cbiAgaWYoIWlzQWRtaW4gJiYgKHNlc3Npb25JZCAhPT0gdXNlcklkKSkge1xuICAgIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAndW5hdXRob3JpemVkJyxcbiAgICAgIHZhbHVlOiAnaW52YWxpZF9zZXNzaW9uJ1xuICAgIH0sIGNvbnRleHQpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlZDogVXNlciA9IHtcbiAgICB1c2VyQWNjZXNzOiAwXG4gIH07XG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHt1c2VySWR9IFdJVEggJHt1cGRhdGVkfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlzcGxheU5hbWUgPSAodXNlcjogVXNlciA9IHt9KTogc3RyaW5nID0+IHtcbiAgY29uc3Qge2ZpcnN0LCBsYXN0LCBuYW1lID0gJycsIHVzZXJuYW1lID0gJyd9ID0gdXNlcjtcbiAgY29uc3QgZnVsbG5hbWU6IHN0cmluZyA9IChbZmlyc3QsIGxhc3RdKS5qb2luKCcgJykudHJpbSgpO1xuXG4gIGlmKCFpc0VtcHR5KG5hbWUpKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH0gZWxzZSBpZihmdWxsbmFtZSAhPT0gJycpIHtcbiAgICByZXR1cm4gZnVsbG5hbWU7XG4gIH0gZWxzZSBpZighaXNFbXB0eSh1c2VybmFtZSkpIHtcbiAgICByZXR1cm4gdXNlcm5hbWU7XG4gIH1cblxuICByZXR1cm4gJ1Vua25vd24nO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNlc3Npb25Vc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0U2Vzc2lvblVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX19ID0gY29udGV4dDtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG5cbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBMRVQgdSA9IERPQ1VNRU5UKFwidXNlcnMvJHtzZXNzaW9uSWR9XCIpXG4gICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyID0ge30pID0+IHVzZXIpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGFyZ3M6IHt1c2VybmFtZSwgdXNlcklkOiBzZXNzaW9uSWR9LFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBhcmdzOiBhbnkpOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0VXNlcic7XG4gIGNvbnN0IHt1c2VySWR9ID0gYXJncztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBMRVQgdSA9IERPQ1VNRU5UKFwidXNlcnMvJHtmb3JtYXRVc2VySWR9XCIpXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiB1LnVzZXJBY2Nlc3MgPiAwXG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyID0ge30pID0+IHVzZXIpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGFyZ3MsXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpXG4gICAgICAudGhlbigoKSA9PiB7IH0pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VycyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogVXNlck9wdGlvbnMpOiBQcm9taXNlPFVzZXJbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRVc2VyTGlzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdXNlcm5hbWV9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG4gIGNvbnN0IGZpbHRlckJ5OiBzdHJpbmdbXSA9IFsndS51c2VyQWNjZXNzID4gMCddO1xuXG4gIGlmKCFpc0VtcHR5KHVzZXJuYW1lKSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKX1cIilgKTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiAke2ZpbHRlckJ5LmpvaW4oJyAmJiAnKX1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCB1LnVzZXJuYW1lXG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBbXSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzQnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtyZWFjdGlvbnMgPSBbXSwgdXNlcm5hbWV9OiBhbnksXG4gIG9wdGlvbnM/OiBVc2VyT3B0aW9uc1xuKTogUHJvbWlzZTxVc2VyW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0VXNlcnNCeVJlYWN0aW9ucyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uczogc3RyaW5nW10gPSAgcmVhY3Rpb25zLm1hcCgocmVhY3Rpb25OYW1lOiBzdHJpbmcpID0+IHBhcnNlQ2hhcihyZWFjdGlvbk5hbWUsIDMyKS50b0xvd2VyQ2FzZSgpKTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuXG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW2BQT1NJVElPTigke0pTT04uc3RyaW5naWZ5KGZvcm1hdFJlYWN0aW9ucyl9LCBMT1dFUihyLm5hbWUpKWBdO1xuXG4gIGlmKCFpc0VtcHR5KHVzZXJuYW1lKSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtmb3JtYXRVc2VybmFtZX1cIilgKTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSwgciBJTiBPVVRCT1VORCBcIiR7Zm9ybWF0U2Vzc2lvbklkfVwiIGhhc1JlYWN0aW9uc1xuICAgIE9QVElPTlMge3ZlcnRleENvbGxlY3Rpb25zOiBcInVzZXJzXCJ9XG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICR7ZmlsdGVyQnkubGVuZ3RoID8gYEZJTFRFUiAke2ZpbHRlckJ5LmpvaW4oJyAmJiAnKX1gIDogJyd9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgY29uc29sZS5sb2coe2FxbFF1ZXJ5fSk7XG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gW10pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2Vyc0J5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAge3RhZ3MsIHVzZXJuYW1lfTogYW55LFxuICBvcHRpb25zPzogVXNlck9wdGlvbnNcbik6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFVzZXJzQnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0VGFnczogc3RyaW5nW10gPSAgdGFncy5yZWR1Y2UoKGxpc3Q6IHN0cmluZ1tdLCB0YWdOYW1lOiBzdHJpbmcpID0+IHtcbiAgICBpZighaXNFbXB0eSh0YWdOYW1lKSkge1xuICAgICAgbGlzdC5wdXNoKHBhcnNlQ2hhcih0YWdOYW1lLCAzMikudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sIFtdKTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuXG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW2B1Ll9rZXkgIT0gXCIke3Nlc3Npb25JZH1cImBdO1xuXG4gIGlmKCFpc0VtcHR5KHVzZXJuYW1lKSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtmb3JtYXRVc2VybmFtZX1cIilgKTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdCBJTiB0YWdzXG4gICAgRklMVEVSIFBPU0lUSU9OKCR7SlNPTi5zdHJpbmdpZnkoZm9ybWF0VGFncyl9LCBMT1dFUih0Lm5hbWUpKVxuICAgIEZPUiB1LCBpdCBJTiBPVVRCT1VORCB0IGlzVGFnZ2VkXG4gICAgT1BUSU9OUyB7YmZzOiB0cnVlLCB1bmlxdWVWZXJ0aWNlczogXCJnbG9iYWxcIiwgdmVydGV4Q29sbGVjdGlvbnM6IFwidXNlcnNcIn1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgJHtmaWx0ZXJCeS5sZW5ndGggPyBgRklMVEVSICR7ZmlsdGVyQnkuam9pbignICYmICcpfWAgOiAnJ31cbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UodSwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICBjb25zb2xlLmxvZygnZ2V0VXNlcnNCeVRhZ3MnLCBhcWxRdWVyeSk7XG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gW10pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2Vyc0J5TGF0ZXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHt1c2VybmFtZX0sIG9wdGlvbnM/OiBVc2VyT3B0aW9ucyk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFVzZXJzQnlMYXRlc3QnO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZpbHRlciA9IFsndS5faWQgIT0gc2Vzc2lvbi5faWQnXTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0VXNlck9wdGlvbmFsKGZpZWxkcyk7XG5cbiAgaWYoIWlzRW1wdHkodXNlcm5hbWUpKSB7XG4gICAgZmlsdGVyLnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKX1cIilgKTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIExFVCBzZXNzaW9uID0gRE9DVU1FTlQoXCJ1c2Vycy8ke3VzZXJJZH1cIilcbiAgICBGSUxURVIgJHtmaWx0ZXIuam9pbignICYmICcpfVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRSh1LmxhdGl0dWRlIHx8IDAsIHUubG9uZ2l0dWRlIHx8IDAsIHNlc3Npb24ubGF0aXR1ZGUgfHwgMCwgc2Vzc2lvbi5sb25naXR1ZGUgfHwgMClcbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIGRpc3RhbmNlIEFTQywgdS5hZGRlZCBERVNDXG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBbXSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZnJlc2hTZXNzaW9uID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHtleHBpcmVzLCB0b2tlbn0pOiBQcm9taXNlPFNlc3Npb25Ub2tlbiB8IFNlc3Npb25FcnJvcj4gPT4ge1xuICBjb25zdCB7ZXJyb3J9ID0gZ2V0U2Vzc2lvbih0b2tlbik7XG5cbiAgaWYoZXJyb3IpIHtcbiAgICByZXR1cm4ge2Vycm9yczogW2Vycm9yXX07XG4gIH1cblxuICBjb25zdCB7ZXhwLCB1c2VySWQsIHVzZXJuYW1lLCB1c2VyQWNjZXNzfSA9IGdldFNlc3Npb24odG9rZW4pO1xuICBjb25zdCBub3c6IG51bWJlciA9IE1hdGguY2VpbChEYXRlVGltZS5sb2NhbCgpLnRvU2Vjb25kcygpKTtcblxuICBpZihleHAgPiBub3cpIHtcbiAgICByZXR1cm4gY3JlYXRlVG9rZW4odXNlcklkLCB1c2VybmFtZSwgdXNlckFjY2VzcywgZXhwaXJlcyk7XG4gIH1cblxuICByZXR1cm4ge2Vycm9yczogWydzZXNzaW9uX2V4cGlyZWQnXX07XG59O1xuXG5leHBvcnQgY29uc3Qgc2lnbkluID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIGFyZ3MpOiBQcm9taXNlPFNlc3Npb25Ub2tlbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdzaWduSW4nO1xuICBjb25zdCB7ZXhwaXJlcywgcGFzc3dvcmQsIHVzZXJuYW1lfSA9IGFyZ3M7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZm9ybWF0UGFzc3dvcmQ6IHN0cmluZyA9IHBhcnNlUGFzc3dvcmQocGFzc3dvcmQpO1xuICBjb25zdCBmb3JtYXRFeHBpcmVzOiBudW1iZXIgPSBwYXJzZU51bShleHBpcmVzKSB8fCAxNTtcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG5cbiAgaWYoaXNFbXB0eShmb3JtYXRVc2VybmFtZSkgfHwgaXNFbXB0eShmb3JtYXRQYXNzd29yZCkpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGFyZ3M6IHt1c2VybmFtZX0sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVJHVU1FTlRTXG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCBjaGVja1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiB1LnVzZXJuYW1lID09ICR7Zm9ybWF0VXNlcm5hbWV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcbiAgY29uc3QgY2hlY2tVc2VyOiBVc2VyID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoY2hlY2tRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGFyZ3M6IHt1c2VybmFtZTogZm9ybWF0VXNlcm5hbWV9LFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KVxuICAgICAgLnRoZW4oKCkgPT4gbnVsbClcbiAgICApO1xuXG4gIGlmKCFjaGVja1VzZXIpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGFyZ3M6IHt1c2VybmFtZX0sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT05cbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHtfa2V5OiB1c2VySWQsIHNhbHQsIHVzZXJBY2Nlc3N9ID0gY2hlY2tVc2VyO1xuICBjb25zdCBhdXRoUGFzc3dvcmQ6IHN0cmluZyA9IGNyZWF0ZVBhc3N3b3JkKGZvcm1hdFBhc3N3b3JkLCBzYWx0KTtcblxuICBpZihjaGVja1VzZXIucGFzc3dvcmQgIT09IGF1dGhQYXNzd29yZCkge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgYXJnczoge3VzZXJuYW1lfSxcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTlxuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVRva2VuKHVzZXJJZCwgdXNlcm5hbWUsIHVzZXJBY2Nlc3MsIGZvcm1hdEV4cGlyZXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25PdXQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgYXJncyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdzaWduT3V0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfX0gPSBjb250ZXh0O1xuICBjb25zdCB1c2VyRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuXG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBsYXN0T25saW5lOiBEYXRlLm5vdygpLFxuICAgIHNlc3Npb25JZDogbnVsbFxuICB9O1xuICBjb25zdCBzZXNzaW9uUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoJHt1c2VyRG9jSWR9KVxuICAgIFVQREFURSB1IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzXG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBORVdgO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgZGF0YWJhc2UucXVlcnkoc2Vzc2lvblF1ZXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBhcmdzOiB7dXNlcm5hbWUsIHVzZXJJZDogc2Vzc2lvbklkfSxcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dClcbiAgICAgICk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBY3RpdmVVc2VyQ291bnQgPSAoY29udGV4dDogQXBpQ29udGV4dCkgPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRBY3RpdmVVc2VyQ291bnQnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgY291bnRRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIGRvY3MgPSAoXG4gICAgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS5hY3RpdmUgPT0gdHJ1ZVxuICAgIFJFVFVSTiB1XG4gIClcbiAgUkVUVVJOIExFTkdUSChkb2NzKWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGNvdW50UXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpXG4gICAgICAudGhlbigoKSA9PiAwKVxuICAgICk7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUEsbUJBVU87QUFDUCxzQkFBa0I7QUFJbEIscUJBQW9CO0FBQ3BCLG1CQUF1QjtBQUN2QixvQkFBbUI7QUFFbkIsb0JBQXFCO0FBR3JCLG9CQUFzRjtBQUN0RixxQkFBaUU7QUFFakUsTUFBTSxnQkFBd0I7QUFDOUIsTUFBTSxhQUFrQjtBQVFqQixJQUFLO0FBQUwsVUFBSyxhQUFMO0FBQ0wsMkNBQWMsS0FBZDtBQUNBLHNDQUFTLEtBQVQ7QUFDQSx1Q0FBVSxLQUFWO0FBQ0EsNkNBQWdCLEtBQWhCO0FBQ0EscUNBQVEsS0FBUjtBQUFBLEdBTFU7QUFRTCxNQUFNLGNBQWMsQ0FDekIsUUFDQSxVQUNBLFlBQ0EsVUFBa0IsT0FDRDtBQUNqQixRQUFNLE1BQWdCLHNCQUFTO0FBQy9CLFFBQU0saUJBQTJCLElBQUksS0FB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
560
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvdXNlcnMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge1xuICBjcmVhdGVIYXNoLFxuICBjcmVhdGVQYXNzd29yZCxcbiAgcGFyc2VDaGFyLFxuICBwYXJzZUVtYWlsLFxuICBwYXJzZUlkLFxuICBwYXJzZU51bSxcbiAgcGFyc2VQYXNzd29yZCxcbiAgcGFyc2VQaG9uZSxcbiAgcGFyc2VVc2VybmFtZVxufSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9uJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgU3RyaXBlIGZyb20gJ3N0cmlwZSc7XG5cbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoJztcbmltcG9ydCB7VXNlcn0gZnJvbSAnLi4vdHlwZXMvdXNlcnMnO1xuaW1wb3J0IHtFcnJvclR5cGVzLCBnZXRMaW1pdCwgbG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbiwgc2VsZWN0UmVhY3Rpb25Db3VudEJ5VHlwZX0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtnZXRTZXNzaW9uLCBTZXNzaW9uRXJyb3IsIFNlc3Npb25Ub2tlbiwgc2V0U2Vzc2lvbn0gZnJvbSAnLi4vdXRpbHMvc2Vzc2lvbic7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICd1c2Vycyc7XG5jb25zdCBhcGlWZXJzaW9uOiBhbnkgPSAnMjAyMC0wMy0wMic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck9wdGlvbnMge1xuICByZWFkb25seSBmcm9tPzogbnVtYmVyO1xuICByZWFkb25seSB0bz86IG51bWJlcjtcbiAgcmVhZG9ubHkgdXNlcm5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIFVzZXJBY2Nlc3Mge1xuICBERUFDVElWQVRFRCA9IDAsXG4gIEFDVElWRSA9IDEsXG4gIFBSRU1JVU0gPSAyLFxuICBDT05URU5UX0FETUlOID0gMyxcbiAgQURNSU4gPSA0XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVUb2tlbiA9IChcbiAgdXNlcklkOiBzdHJpbmcsXG4gIHVzZXJuYW1lOiBzdHJpbmcsXG4gIHVzZXJBY2Nlc3M6IG51bWJlcixcbiAgZXhwaXJlczogbnVtYmVyID0gMTVcbik6IFNlc3Npb25Ub2tlbiA9PiB7XG4gIGNvbnN0IG5vdzogRGF0ZVRpbWUgPSBEYXRlVGltZS5sb2NhbCgpO1xuICBjb25zdCBzZXNzaW9uRXhwaXJlczogRGF0ZVRpbWUgPSBub3cucGx1cyh7bWludXRlczogZXhwaXJlc30pO1xuICBjb25zdCBpYXQ6IG51bWJlciA9IE1hdGguZmxvb3Iobm93LnRvU2Vjb25kcygpKTtcbiAgY29uc3QgZXhwOiBudW1iZXIgPSBNYXRoLmZsb29yKHNlc3Npb25FeHBpcmVzLnRvU2Vjb25kcygpKTtcblxuICBjb25zdCB0b2tlbiA9IHNldFNlc3Npb24oe1xuICAgIGV4cCxcbiAgICBpYXQsXG4gICAgdXNlcm5hbWUsXG4gICAgdXNlckFjY2VzcyxcbiAgICB1c2VySWRcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBleHBpcmVzOiBzZXNzaW9uRXhwaXJlcy50b01pbGxpcygpLFxuICAgIGlzc3VlZDogbm93LnRvTWlsbGlzKCksXG4gICAgdG9rZW5cbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVc2VyT3B0aW9uYWwgPSAoZmllbGRzOiBzdHJpbmdbXSA9IFtdKSA9PlxuICBmaWVsZHMucmVkdWNlKChzZWxlY3RzOiBhbnksIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBpZihmaWVsZC5pbmNsdWRlcygnQ291bnQnKSkge1xuICAgICAgcmV0dXJuIHNlbGVjdFJlYWN0aW9uQ291bnRCeVR5cGUoJ3VzZXJzJywgJ3UnLCBmaWVsZCwgc2VsZWN0cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdHM7XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlVXNlck9wdGlvbnMgPSAob3B0aW9uczogVXNlck9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgdG8gPSAzMFxuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKVxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFVzZXIgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgYXJnczogYW55KTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3Qge3VzZXJ9ID0gYXJncztcbiAgY29uc3Qge2VtYWlsLCBwYXNzd29yZCwgcGhvbmUsIHVzZXJuYW1lfSA9IHVzZXI7XG4gIGNvbnN0IHNhbHQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYCR7dXNlcm5hbWV9JHtwYXNzd29yZH1gLCBudWxsKTtcbiAgY29uc3QgZW5jcnlwdGVkUGFzc3dvcmQgPSBjcmVhdGVQYXNzd29yZChwYXNzd29yZCwgc2FsdCk7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZm9ybWF0RW1haWw6IHN0cmluZyA9IHBhcnNlRW1haWwoZW1haWwpO1xuICBjb25zdCBmb3JtYXRQaG9uZTogc3RyaW5nID0gcGFyc2VQaG9uZShwaG9uZSk7XG5cbiAgaWYoIWZvcm1hdFVzZXJuYW1lIHx8ICFwYXNzd29yZCB8fCAoIWZvcm1hdFBob25lICYmICFmb3JtYXRFbWFpbCkpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGFyZ3M6IHt1c2VybmFtZX0sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVJHVU1FTlRTXG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtgdS51c2VybmFtZSA9PSBcIiR7Zm9ybWF0VXNlcm5hbWV9XCJgXTtcblxuICBpZihmb3JtYXRFbWFpbCkge1xuICAgIGZpbHRlcnMucHVzaChgdS5lbWFpbCA9PSBcIiR7Zm9ybWF0RW1haWx9XCJgKTtcbiAgfVxuXG4gIGlmKGZvcm1hdFBob25lKSB7XG4gICAgZmlsdGVycy5wdXNoKGB1LnBob25lID09ICR7Zm9ybWF0UGhvbmV9YCk7XG4gIH1cblxuICBjb25zdCBjaGVja1F1ZXJ5OiBzdHJpbmcgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyB8fCAnKX1cbiAgICBSRVRVUk4gdWA7XG4gIGNvbnN0IGV4aXN0aW5nVXNlcnMgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShjaGVja1F1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgYXJnczoge3VzZXJuYW1lfSxcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dClcbiAgICAgIC50aGVuKCgpID0+IG51bGwpXG4gICAgKTtcblxuICBpZihleGlzdGluZ1VzZXJzLmxlbmd0aCkge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgYXJnczoge3VzZXJuYW1lfSxcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuRVhJU1RJTkdfVVNFUk5BTUVcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHZlcmlmaWVkRW1haWxDb2RlOiBudW1iZXIgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG4gIGNvbnN0IHZlcmlmaWVkUGhvbmVDb2RlOiBudW1iZXIgPSBNYXRoLmZsb29yKDEwMDAwMCArIChNYXRoLnJhbmRvbSgpICogOTAwMDAwKSk7XG5cbiAgLy8gQWRkIG5ldyB1c2VyIHByb3BlcnRpZXNcbiAgY29uc3QgaW5zZXJ0OiBVc2VyID0ge1xuICAgIF9rZXk6IGNyZWF0ZUhhc2godXNlcm5hbWUsIG51bGwpLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIGVtYWlsOiBmb3JtYXRFbWFpbCxcbiAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICBwYXNzd29yZDogZW5jcnlwdGVkUGFzc3dvcmQsXG4gICAgcGhvbmU6IGZvcm1hdFBob25lLFxuICAgIHNhbHQsXG4gICAgdXNlcm5hbWU6IGZvcm1hdFVzZXJuYW1lLFxuICAgIHVzZXJBY2Nlc3M6IDEsXG4gICAgdmVyaWZpZWRFbWFpbDogZmFsc2UsXG4gICAgdmVyaWZpZWRFbWFpbENvZGUsXG4gICAgdmVyaWZpZWRQaG9uZTogZmFsc2UsXG4gICAgdmVyaWZpZWRQaG9uZUNvZGVcbiAgfTtcblxuICAvLyBBZGQgbmV3IHVzZXIgaW4gQXJhbmdvREJcbiAgY29uc3QgaW5zZXJ0UXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gdXNlcnMgUkVUVVJOIE5FV2A7XG4gIHJldHVybiBhd2FpdCBkYXRhYmFzZS5xdWVyeShpbnNlcnRRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSB8fCB7fSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBhcmdzOiB7dXNlcm5hbWV9LFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KVxuICAgICAgLnRoZW4oKCkgPT4gbnVsbClcbiAgICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVVzZXIgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcjogVXNlcik6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3Qge19rZXksIF9pZCwgaWQsIHRhZ3MgPSBbXSwgdXNlcklkLCAuLi51cGRhdGVkfSA9IHVzZXI7XG4gIGxldCB1c2VyRG9jSWQ6IHN0cmluZztcblxuICBpZihfaWQgfHwgaWQpIHtcbiAgICB1c2VyRG9jSWQgPSBfaWQgfHwgaWQ7XG4gIH0gZWxzZSBpZihfa2V5IHx8IHVzZXJJZCkge1xuICAgIHVzZXJEb2NJZCA9IGB1c2Vycy8ke19rZXkgfHwgdXNlcklkfWA7XG4gIH1cblxuICBjb25zdCB1c2VyUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoJHt1c2VyRG9jSWR9KVxuICAgIFVQREFURSB1IFdJVEggJHt1cGRhdGVkfSBJTiB1c2Vyc1xuICAgIFJFVFVSTiBORVdgO1xuXG4gIGNvbnN0IHVwZGF0ZWRVc2VyID0gYXdhaXQgZGF0YWJhc2UucXVlcnkodXNlclF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuXG4gIGNvbnN0IHRhZ0NvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gZGF0YWJhc2UuY29sbGVjdGlvbignaXNUYWdnZWQnKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwodGFncy5tYXAoKHtpZDogdGFnRG9jSWQsIG5hbWV9KSA9PiB7XG4gICAgY29uc3QgZWRnZSA9IHtcbiAgICAgIF9mcm9tOiB0YWdEb2NJZCxcbiAgICAgIF9rZXk6IGNyZWF0ZUhhc2goYGlzVGFnZ2VkLSR7dGFnRG9jSWR9LSR7dXNlckRvY0lkfWApLFxuICAgICAgX3RvOiB1c2VyRG9jSWQsXG4gICAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICAgIG5hbWVcbiAgICB9O1xuICAgIGNvbnN0IHRhZ1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaXQgSU4gaXNUYWdnZWRcbiAgICAgIEZJTFRFUiBpdC5fZnJvbSA9PSAke3RhZ0RvY0lkfSAmJiBpdC5fdG8gPT0gJHt1c2VyRG9jSWR9ICYmIGl0Lm5hbWUgPT0gJHtuYW1lfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVUVVJOIGl0YDtcblxuICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeSh0YWdRdWVyeSlcbiAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLnRoZW4oKHRhZ0VkZ2UpID0+IHtcbiAgICAgICAgaWYoISF0YWdFZGdlKSB7XG4gICAgICAgICAgcmV0dXJuIHRhZ0VkZ2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFnQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KS50aGVuKCgpID0+IGVkZ2UpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG4gIH0pKTtcblxuICByZXR1cm4gdXBkYXRlZFVzZXI7XG59O1xuXG5leHBvcnQgY29uc3QgY29uZmlybUNvZGUgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgYXJncyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdjb25maXJtRW1haWwnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2NvZGUsIHR5cGV9ID0gYXJncztcbiAgY29uc3QgdXNlckRvY0lkOiBzdHJpbmcgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcblxuICBjb25zdCBhcWxRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHUgPSBET0NVTUVOVCgke3VzZXJEb2NJZH0pIFJFVFVSTiB1YDtcblxuICB0cnkge1xuICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkgfHwge30pXG4gICAgICAudGhlbigoe3ZlcmlmaWVkRW1haWxDb2RlLCB2ZXJpZmllZFBob25lQ29kZX06IFVzZXIpID0+IHtcbiAgICAgICAgc3dpdGNoKHR5cGUpIHtcbiAgICAgICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgICAgICByZXR1cm4gY29kZSA9PT0gdmVyaWZpZWRFbWFpbENvZGU7XG4gICAgICAgICAgY2FzZSAncGhvbmUnOlxuICAgICAgICAgICAgcmV0dXJuIGNvZGUgPT09IHZlcmlmaWVkUGhvbmVDb2RlO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgYXJnczoge2NvZGUsIHR5cGUsIHVzZXJJZDogc2Vzc2lvbklkfSxcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dClcbiAgICAgICk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGFyZ3M6IGFueSk6IFByb21pc2U8YW55PiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlckFjY2Vzczogc2Vzc2lvbkFjY2Vzc319ID0gY29udGV4dDtcbiAgY29uc3Qge3VzZXJJZH0gPSBhcmdzO1xuICBjb25zdCBpc0FkbWluOiBib29sZWFuID0gc2Vzc2lvbkFjY2VzcyA+IDI7XG5cbiAgaWYoIWlzQWRtaW4gJiYgKHNlc3Npb25JZCAhPT0gdXNlcklkKSkge1xuICAgIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBhcmdzLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ3VuYXV0aG9yaXplZCcsXG4gICAgICB2YWx1ZTogJ2ludmFsaWRfc2Vzc2lvbidcbiAgICB9LCBjb250ZXh0KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiB1Ll9rZXkgPT0gJHt1c2VySWR9XG4gICAgTElNSVQgMVxuICAgIFJFTU9WRSB1IElOIHVzZXJzXG4gICAgUkVUVVJOIE9MRGA7XG5cbiAgLy8gU3RyaXBlXG4gIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyID0ge30pID0+IHN0cmlwZUNsaWVudC5jdXN0b21lcnMuZGVsKHVzZXIuc3RyaXBlQ3VzdG9tZXJJZClcbiAgICAgIC50aGVuKCgpID0+IHN0cmlwZUNsaWVudC5hY2NvdW50cy5kZWwodXNlci5zdHJpcGVBY2NvdW50SWQpKVxuICAgICAgLnRoZW4oKCkgPT4gdXNlcikpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYWN0aXZhdGVVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkLCB1c2VyQWNjZXNzOiBzZXNzaW9uQWNjZXNzfX0gPSBjb250ZXh0O1xuICBjb25zdCBpc0FkbWluOiBib29sZWFuID0gc2Vzc2lvbkFjY2VzcyA+IDI7XG5cbiAgaWYoIWlzQWRtaW4gJiYgKHNlc3Npb25JZCAhPT0gdXNlcklkKSkge1xuICAgIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAndW5hdXRob3JpemVkJyxcbiAgICAgIHZhbHVlOiAnaW52YWxpZF9zZXNzaW9uJ1xuICAgIH0sIGNvbnRleHQpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgdXBkYXRlZDogVXNlciA9IHtcbiAgICB1c2VyQWNjZXNzOiAwXG4gIH07XG4gIGNvbnN0IGFxbFF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHt1c2VySWR9IFdJVEggJHt1cGRhdGVkfSBJTiB1c2VycyBMSU1JVCAxIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGlzcGxheU5hbWUgPSAodXNlcjogVXNlciA9IHt9KTogc3RyaW5nID0+IHtcbiAgY29uc3Qge2ZpcnN0LCBsYXN0LCBuYW1lID0gJycsIHVzZXJuYW1lID0gJyd9ID0gdXNlcjtcbiAgY29uc3QgZnVsbG5hbWU6IHN0cmluZyA9IChbZmlyc3QsIGxhc3RdKS5qb2luKCcgJykudHJpbSgpO1xuXG4gIGlmKG5hbWUpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfSBlbHNlIGlmKGZ1bGxuYW1lICE9PSAnJykge1xuICAgIHJldHVybiBmdWxsbmFtZTtcbiAgfSBlbHNlIGlmKHVzZXJuYW1lKSB7XG4gICAgcmV0dXJuIHVzZXJuYW1lO1xuICB9XG5cbiAgcmV0dXJuICdVbmtub3duJztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTZXNzaW9uVXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFNlc3Npb25Vc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgTEVUIHUgPSBET0NVTUVOVChcInVzZXJzLyR7c2Vzc2lvbklkfVwiKVxuICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodXNlciA9IHt9KSA9PiB1c2VyKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBhcmdzOiB7dXNlcm5hbWUsIHVzZXJJZDogc2Vzc2lvbklkfSxcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgYXJnczogYW55KTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFVzZXInO1xuICBjb25zdCB7dXNlcklkfSA9IGFyZ3M7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgTEVUIHUgPSBET0NVTUVOVChcInVzZXJzLyR7Zm9ybWF0VXNlcklkfVwiKVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgdS51c2VyQWNjZXNzID4gMFxuICAgIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodXNlciA9IHt9KSA9PiB1c2VyKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBhcmdzLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KVxuICAgICAgLnRoZW4oKCkgPT4geyB9KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IFVzZXJPcHRpb25zKTogUHJvbWlzZTxVc2VyW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0VXNlckxpc3QnO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkc30gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHVzZXJuYW1lfSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBmaWx0ZXJCeTogc3RyaW5nW10gPSBbJ3UudXNlckFjY2VzcyA+IDAnXTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlckJ5LnB1c2goYENPTlRBSU5TKHUudXNlcm5hbWUsIFwiJHtwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKX1cIilgKTtcbiAgfVxuXG4gIC8vIEdldCBkYXRhIGZyb20gZGF0YWJhc2VcbiAgY29uc3QgYXFsUXVlcnk6IHN0cmluZyA9IGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiAke2ZpbHRlckJ5LmpvaW4oJyAmJiAnKX1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCB1LnVzZXJuYW1lXG4gICAgUkVUVVJOIE1FUkdFKHUsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBbXSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzQnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtyZWFjdGlvbnMgPSBbXSwgdXNlcm5hbWV9OiBhbnksXG4gIG9wdGlvbnM/OiBVc2VyT3B0aW9uc1xuKTogUHJvbWlzZTxVc2VyW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0VXNlcnNCeVJlYWN0aW9ucyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uczogc3RyaW5nW10gPSAgcmVhY3Rpb25zLm1hcCgocmVhY3Rpb25OYW1lOiBzdHJpbmcpID0+IHBhcnNlQ2hhcihyZWFjdGlvbk5hbWUsIDMyKS50b0xvd2VyQ2FzZSgpKTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuXG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW2BQT1NJVElPTigke0pTT04uc3RyaW5naWZ5KGZvcm1hdFJlYWN0aW9ucyl9LCBMT1dFUihyLm5hbWUpKWBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke2Zvcm1hdFVzZXJuYW1lfVwiKWApO1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgZnJvbSBkYXRhYmFzZVxuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYEZPUiB1LCByIElOIE9VVEJPVU5EIFwiJHtmb3JtYXRTZXNzaW9uSWR9XCIgaGFzUmVhY3Rpb25cbiAgICBPUFRJT05TIHt2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2ZpbHRlckJ5Lmxlbmd0aCA/IGBGSUxURVIgJHtmaWx0ZXJCeS5qb2luKCcgJiYgJyl9YCA6ICcnfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIGNvbnNvbGUubG9nKHthcWxRdWVyeX0pO1xuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IFtdKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeVRhZ3MgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHt0YWdzLCB1c2VybmFtZX06IGFueSxcbiAgb3B0aW9ucz86IFVzZXJPcHRpb25zXG4pOiBQcm9taXNlPFVzZXJbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRVc2Vyc0J5VGFncyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFRhZ3M6IHN0cmluZ1tdID0gIHRhZ3MucmVkdWNlKChsaXN0OiBzdHJpbmdbXSwgdGFnTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgaWYodGFnTmFtZSkge1xuICAgICAgbGlzdC5wdXNoKHBhcnNlQ2hhcih0YWdOYW1lLCAzMikudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sIFtdKTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlVXNlck9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFVzZXJPcHRpb25hbChmaWVsZHMpO1xuXG4gIGNvbnN0IGZvcm1hdFVzZXJuYW1lOiBzdHJpbmcgPSBwYXJzZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgY29uc3QgZmlsdGVyQnk6IHN0cmluZ1tdID0gW2B1Ll9rZXkgIT0gXCIke3Nlc3Npb25JZH1cImBdO1xuXG4gIGlmKHVzZXJuYW1lKSB7XG4gICAgZmlsdGVyQnkucHVzaChgQ09OVEFJTlModS51c2VybmFtZSwgXCIke2Zvcm1hdFVzZXJuYW1lfVwiKWApO1xuICB9XG5cbiAgLy8gR2V0IGRhdGEgZnJvbSBkYXRhYmFzZVxuICBjb25zdCBhcWxRdWVyeTogc3RyaW5nID0gYEZPUiB0IElOIHRhZ3NcbiAgICBGSUxURVIgUE9TSVRJT04oJHtKU09OLnN0cmluZ2lmeShmb3JtYXRUYWdzKX0sIExPV0VSKHQubmFtZSkpXG4gICAgRk9SIHUsIGl0IElOIE9VVEJPVU5EIHQgaXNUYWdnZWRcbiAgICBPUFRJT05TIHtiZnM6IHRydWUsIHVuaXF1ZVZlcnRpY2VzOiBcImdsb2JhbFwiLCB2ZXJ0ZXhDb2xsZWN0aW9uczogXCJ1c2Vyc1wifVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2ZpbHRlckJ5Lmxlbmd0aCA/IGBGSUxURVIgJHtmaWx0ZXJCeS5qb2luKCcgJiYgJyl9YCA6ICcnfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIGNvbnNvbGUubG9nKCdnZXRVc2Vyc0J5VGFncycsIGFxbFF1ZXJ5KTtcbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFF1ZXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBbXSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVzZXJzQnlMYXRlc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwge3VzZXJuYW1lfSwgb3B0aW9ucz86IFVzZXJPcHRpb25zKTogUHJvbWlzZTxVc2VyW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0VXNlcnNCeUxhdGVzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXR9ID0gcGFyc2VVc2VyT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZmlsdGVyID0gWyd1Ll9pZCAhPSBzZXNzaW9uLl9pZCddO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRVc2VyT3B0aW9uYWwoZmllbGRzKTtcblxuICBpZih1c2VybmFtZSkge1xuICAgIGZpbHRlci5wdXNoKGBDT05UQUlOUyh1LnVzZXJuYW1lLCBcIiR7cGFyc2VVc2VybmFtZSh1c2VybmFtZSl9XCIpYCk7XG4gIH1cblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFF1ZXJ5OiBzdHJpbmcgPSBgRk9SIHUgSU4gdXNlcnNcbiAgICBMRVQgc2Vzc2lvbiA9IERPQ1VNRU5UKFwidXNlcnMvJHt1c2VySWR9XCIpXG4gICAgRklMVEVSICR7ZmlsdGVyLmpvaW4oJyAmJiAnKX1cbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UodS5sYXRpdHVkZSB8fCAwLCB1LmxvbmdpdHVkZSB8fCAwLCBzZXNzaW9uLmxhdGl0dWRlIHx8IDAsIHNlc3Npb24ubG9uZ2l0dWRlIHx8IDApXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBkaXN0YW5jZSBBU0MsIHUuYWRkZWQgREVTQ1xuICAgIFJFVFVSTiBNRVJHRSh1LCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gW10pKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWZyZXNoU2Vzc2lvbiA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCB7ZXhwaXJlcywgdG9rZW59KTogUHJvbWlzZTxTZXNzaW9uVG9rZW4gfCBTZXNzaW9uRXJyb3I+ID0+IHtcbiAgY29uc3Qge2Vycm9yfSA9IGdldFNlc3Npb24odG9rZW4pO1xuXG4gIGlmKGVycm9yKSB7XG4gICAgcmV0dXJuIHtlcnJvcnM6IFtlcnJvcl19O1xuICB9XG5cbiAgY29uc3Qge2V4cCwgdXNlcklkLCB1c2VybmFtZSwgdXNlckFjY2Vzc30gPSBnZXRTZXNzaW9uKHRva2VuKTtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBNYXRoLmNlaWwoRGF0ZVRpbWUubG9jYWwoKS50b1NlY29uZHMoKSk7XG5cbiAgaWYoZXhwID4gbm93KSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRva2VuKHVzZXJJZCwgdXNlcm5hbWUsIHVzZXJBY2Nlc3MsIGV4cGlyZXMpO1xuICB9XG5cbiAgcmV0dXJuIHtlcnJvcnM6IFsnc2Vzc2lvbl9leHBpcmVkJ119O1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25JbiA9IGFzeW5jIChjb250ZXh0OiBBcGlDb250ZXh0LCBhcmdzKTogUHJvbWlzZTxTZXNzaW9uVG9rZW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnc2lnbkluJztcbiAgY29uc3Qge2V4cGlyZXMsIHBhc3N3b3JkLCB1c2VybmFtZX0gPSBhcmdzO1xuICBjb25zdCBmb3JtYXRVc2VybmFtZTogc3RyaW5nID0gcGFyc2VVc2VybmFtZSh1c2VybmFtZSk7XG4gIGNvbnN0IGZvcm1hdFBhc3N3b3JkOiBzdHJpbmcgPSBwYXJzZVBhc3N3b3JkKHBhc3N3b3JkKTtcbiAgY29uc3QgZm9ybWF0RXhwaXJlczogbnVtYmVyID0gcGFyc2VOdW0oZXhwaXJlcykgfHwgMTU7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuXG4gIGlmKCFmb3JtYXRVc2VybmFtZSB8fCAhZm9ybWF0UGFzc3dvcmQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGFyZ3M6IHt1c2VybmFtZX0sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVJHVU1FTlRTXG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICBjb25zdCBjaGVja1F1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdSBJTiB1c2Vyc1xuICAgIEZJTFRFUiB1LnVzZXJuYW1lID09ICR7Zm9ybWF0VXNlcm5hbWV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiB1YDtcbiAgY29uc3QgY2hlY2tVc2VyOiBVc2VyID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoY2hlY2tRdWVyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGFyZ3M6IHt1c2VybmFtZTogZm9ybWF0VXNlcm5hbWV9LFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KVxuICAgICAgLnRoZW4oKCkgPT4gbnVsbClcbiAgICApO1xuXG4gIGlmKCFjaGVja1VzZXIpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGFyZ3M6IHt1c2VybmFtZX0sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfQVVUSEVOVElDQVRJT05cbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIGNvbnN0IHtfa2V5OiB1c2VySWQsIHNhbHQsIHVzZXJBY2Nlc3N9ID0gY2hlY2tVc2VyO1xuICBjb25zdCBhdXRoUGFzc3dvcmQ6IHN0cmluZyA9IGNyZWF0ZVBhc3N3b3JkKGZvcm1hdFBhc3N3b3JkLCBzYWx0KTtcblxuICBpZihjaGVja1VzZXIucGFzc3dvcmQgIT09IGF1dGhQYXNzd29yZCkge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgYXJnczoge3VzZXJuYW1lfSxcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9BVVRIRU5USUNBVElPTlxuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVRva2VuKHVzZXJJZCwgdXNlcm5hbWUsIHVzZXJBY2Nlc3MsIGZvcm1hdEV4cGlyZXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25PdXQgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgYXJncyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdzaWduT3V0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWQsIHVzZXJuYW1lfX0gPSBjb250ZXh0O1xuICBjb25zdCB1c2VyRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuXG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBsYXN0T25saW5lOiBEYXRlLm5vdygpLFxuICAgIHNlc3Npb25JZDogbnVsbFxuICB9O1xuICBjb25zdCBzZXNzaW9uUXVlcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCB1ID0gRE9DVU1FTlQoJHt1c2VyRG9jSWR9KVxuICAgIFVQREFURSB1IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzXG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBORVdgO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgZGF0YWJhc2UucXVlcnkoc2Vzc2lvblF1ZXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBhcmdzOiB7dXNlcm5hbWUsIHVzZXJJZDogc2Vzc2lvbklkfSxcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dClcbiAgICAgICk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBY3RpdmVVc2VyQ291bnQgPSAoY29udGV4dDogQXBpQ29udGV4dCkgPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRBY3RpdmVVc2VyQ291bnQnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgY291bnRRdWVyeTogQXFsUXVlcnkgPSBhcWxgTEVUIGRvY3MgPSAoXG4gICAgRk9SIHUgSU4gdXNlcnNcbiAgICBGSUxURVIgdS5hY3RpdmUgPT0gdHJ1ZVxuICAgIFJFVFVSTiB1XG4gIClcbiAgUkVUVVJOIExFTkdUSChkb2NzKWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGNvdW50UXVlcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpXG4gICAgICAudGhlbigoKSA9PiAwKVxuICAgICk7XG59O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUEsbUJBVU87QUFDUCxzQkFBa0I7QUFJbEIsbUJBQXVCO0FBQ3ZCLG9CQUFtQjtBQUVuQixvQkFBcUI7QUFHckIsSUFBQUEsZ0JBQXNGO0FBQ3RGLHFCQUFpRTtBQUVqRSxNQUFNLGdCQUF3QjtBQUM5QixNQUFNLGFBQWtCO0FBUWpCLElBQUssYUFBTCxrQkFBS0MsZ0JBQUw7QUFDTCxFQUFBQSx3QkFBQSxpQkFBYyxLQUFkO0FBQ0EsRUFBQUEsd0JBQUEsWUFBUyxLQUFUO0FBQ0EsRUFBQUEsd0JBQUEsYUFBVSxLQUFWO0FBQ0EsRUFBQUEsd0JBQUEsbUJBQWdCLEtBQWhCO0FBQ0EsRUFBQUEsd0JBQUEsV0FBUSxLQUFSO0FBTFUsU0FBQUE7QUFBQSxHQUFBO0FBUUwsTUFBTSxjQUFjLENBQ3pCLFFBQ0EsVUFDQSxZQUNBLFVBQWtCLE9BQ0Q7QUFDakIsUUFBTSxNQUFnQixzQkFBUyxNQUFNO0FBQ3JDLFFBQU0saUJBQTJCLElBQUksS0FBSyxFQUFDLFNBQVMsUUFBTyxDQUFDO0FBQzVELFFBQU0sTUFBYyxLQUFLLE1BQU0sSUFBSSxVQUFVLENBQUM7QUFDOUMsUUFBTSxNQUFjLEtBQUssTUFBTSxlQUFlLFVBQVUsQ0FBQztBQUV6RCxRQUFNLFlBQVEsMkJBQVc7QUFBQSxJQUN2QjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFFRCxTQUFPO0FBQUEsSUFDTCxTQUFTLGVBQWUsU0FBUztBQUFBLElBQ2pDLFFBQVEsSUFBSSxTQUFTO0FBQUEsSUFDckI7QUFBQSxFQUNGO0FBQ0Y7QUFFTyxNQUFNLGtCQUFrQixDQUFDLFNBQW1CLENBQUMsTUFDbEQsT0FBTyxPQUFPLENBQUMsU0FBYyxVQUFrQjtBQUM3QyxNQUFHLE1BQU0sU0FBUyxPQUFPLEdBQUc7QUFDMUIsZUFBTyx5Q0FBMEIsU0FBUyxLQUFLLE9BQU8sT0FBTztBQUFBLEVBQy9EO0FBRUEsU0FBTztBQUNULEdBQUcsRUFBQyxTQUFTLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBQyxDQUFDO0FBRXhCLE1BQU0sbUJBQW1CLENBQUMsVUFBdUIsQ0FBQyxNQUFNO0FBQzdELFFBQU07QUFBQSxJQUNKLE9BQU87QUFBQSxJQUNQLEtBQUs7QUFBQSxFQUNQLElBQUk7QUFFSixTQUFPO0FBQUEsSUFDTCxHQUFHO0FBQUEsSUFDSCxXQUFPLHdCQUFTLE1BQU0sRUFBRTtBQUFBLEVBQzFCO0FBQ0Y7QUFFTyxNQUFNLFVBQVUsT0FBTyxTQUFxQixTQUE2QjtBQUM5RSxRQUFNLFNBQWlCO0FBQ3ZCLFFBQU0sRUFBQyxTQUFRLElBQUk7QUFDbkIsUUFBTSxFQUFDLEtBQUksSUFBSTtBQUNmLFFBQU0sRUFBQyxPQUFPLFVBQVUsT0FBTyxTQUFRLElBQUk7QUFDM0MsUUFBTSxXQUFlLHlCQUFXLEdBQUcsUUFBUSxHQUFHLFFBQVEsSUFBSSxJQUFJO0FBQzlELFFBQU0sd0JBQW9CLDZCQUFlLFVBQVUsSUFBSTtBQUN2RCxRQUFNLHFCQUF5Qiw0QkFBYyxRQUFRO0FBQ3JELFFBQU0sa0JBQXNCLHlCQUFXLEtBQUs7QUFDNUMsUUFBTSxrQkFBc0IseUJBQVcsS0FBSztBQUU1QyxNQUFHLENBQUMsa0JBQWtCLENBQUMsWUFBYSxDQUFDLGVBQWUsQ0FBQyxhQUFjO0FBQ2pFLGVBQU8sNEJBQWE7QUFBQSxNQUNsQjtBQUFBLE1BQ0EsTUFBTSxFQUFDLFNBQVE7QUFBQSxNQUNmLFVBQVU7QUFBQSxNQUNWLE9BQU8seUJBQVc7QUFBQSxJQUNwQixHQUFHLE9BQU87QUFBQSxFQUNaO0FBRUEsUUFBTSxVQUFvQixDQUFDLGtCQUFrQixjQUFjLEdBQUc7QUFFOUQsTUFBRyxhQUFhO0FBQ2QsWUFBUSxLQUFLLGVBQWUsV0FBVyxHQUFHO0FBQUEsRUFDNUM7QUFFQSxNQUFHLGFBQWE7QUFDZCxZQUFRLEtBQUssY0FBYyxXQUFXLEVBQUU7QUFBQSxFQUMxQztBQUVBLFFBQU0sYUFBcUI7QUFBQSxhQUNoQixRQUFRLEtBQUssTUFBTSxDQUFDO0FBQUE7QUFFL0IsUUFBTSxnQkFBZ0IsTUFBTSxTQUFTLE1BQU0sVUFBVSxFQUNsRCxLQUFLLENBQUMsV0FBd0IsT0FBTyxJQUFJLENBQUMsRUFDMUM7QUFBQSxJQUFNLENBQUMsY0FBVSx3QkFBUztBQUFBLE1BQ3pCO0FBQUEsTUFDQSxNQUFNLEVBQUMsU0FBUTtBQUFBLE1BQ2YsVUFBVTtBQUFBLE1BQ1YsT0FBTyx5QkFBVztBQUFBLElBQ3BCLEdBQUcsT0FBTyxPQUFPLEVBQ2QsS0FBSyxNQUFNLElBQUk7QUFBQSxFQUNsQjtBQUVGLE1BQUcsY0FBYyxRQUFRO0FBQ3ZCLGVBQU8sNEJBQWE7QUFBQSxNQUNsQjtBQUFBLE1BQ0EsTUFBTSxFQUFDLFNBQVE7QUFBQSxNQUNmLFVBQVU7QUFBQSxNQUNWLE9BQU8seUJBQVc7QUFBQSxJQUNwQixHQUFHLE9BQU87QUFBQSxFQUNaO0FBRUEsUUFBTSxvQkFBNEIsS0FBSyxNQUFNLE1BQVUsS0FBSyxPQUFPLElBQUksR0FBTztBQUM5RSxRQUFNLG9CQUE0QixLQUFLLE1BQU0sTUFBVSxLQUFLLE9BQU8sSUFBSSxHQUFPO0FBRzlFLFFBQU0sU0FBZTtBQUFBLElBQ25CLFVBQU0seUJBQVcsVUFBVSxJQUFJO0FBQUEsSUFDL0IsT0FBTyxLQUFLLElBQUk7QUFBQSxJQUNoQixPQUFPO0FBQUEsSUFDUCxVQUFVLEtBQUssSUFBSTtBQUFBLElBQ25CLFVBQVU7QUFBQSxJQUNWLE9BQU87QUFBQSxJQUNQO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixZQUFZO0FBQUEsSUFDWixlQUFlO0FBQUEsSUFDZjtBQUFBLElBQ0EsZUFBZTtBQUFBLElBQ2Y7QUFBQSxFQUNGO0FBR0EsUUFBTSxjQUF3Qiw2QkFBYSxNQUFNO0FBQ2pELFNBQU8sTUFBTSxTQUFTLE1BQU0sV0FBVyxFQUNwQyxLQUFLLENBQUMsV0FBd0IsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQ2pEO0FBQUEsSUFBTSxDQUFDLGNBQVUsd0JBQVM7QUFBQSxNQUN6QjtBQUFBLE1BQ0EsTUFBTSxFQUFDLFNBQVE7QUFBQSxNQUNmLFVBQVU7QUFBQSxNQUNWLE9BQU8seUJBQVc7QUFBQSxJQUNwQixHQUFHLE9BQU8sT0FBTyxFQUNkLEtBQUssTUFBTSxJQUFJO0FBQUEsRUFDbEI7QUFDSjtBQUVPLE1BQU0sYUFBYSxPQUFPLFNBQXFCLFNBQTZCO0FBQ2pGLFFBQU0sU0FBaUI7QUFDdkIsUUFBTSxFQUFDLFNBQVEsSUFBSTtBQUNuQixRQUFNLEVBQUMsTUFBTSxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsUUFBUSxHQUFHLFFBQU8sSUFBSTtBQUN2RCxNQUFJO0FBRUosTUFBRyxPQUFPLElBQUk7QUFDWixnQkFBWSxPQUFPO0FBQUEsRUFDckIsV0FBVSxRQUFRLFFBQVE7QUFDeEIsZ0JBQVksU0FBUyxRQUFRLE1BQU07QUFBQSxFQUNyQztBQUVBLFFBQU0sWUFBc0IsdUNBQXVCLFNBQVM7QUFBQSxvQkFDMUMsT0FBTztBQUFBO0FBR3pCLFFBQU0sY0FBYyxNQUFNLFNBQVMsTUFBTSxTQUFTLEVBQy9DLEtBQUssQ0FBQyxXQUFXLE9BQU8sS0FBSyxDQUFDLEVBQzlCLE1BQU0sQ0FBQyxVQUFpQjtBQUN2QixZQUFRLElBQUksS0FBSztBQUNqQixVQUFNO0FBQUEsRUFDUixDQUFDO0FBRUgsUUFBTSxnQkFBZ0MsU0FBUyxXQUFXLFVBQVU7QUFDcEUsUUFBTSxRQUFRLElBQUksS0FBSyxJQUFJLENBQUMsRUFBQyxJQUFJLFVBQVUsS0FBSSxNQUFNO0FBQ25ELFVBQU0sT0FBTztBQUFBLE1BQ1gsT0FBTztBQUFBLE1BQ1AsVUFBTSx5QkFBVyxZQUFZLFFBQVEsSUFBSSxTQUFTLEVBQUU7QUFBQSxNQUNwRCxLQUFLO0FBQUEsTUFDTCxPQUFPLEtBQUssSUFBSTtBQUFBLE1BQ2hCO0FBQUEsSUFDRjtBQUNBLFVBQU0sV0FBcUI7QUFBQSwyQkFDSixRQUFRLGlCQUFpQixTQUFTLGtCQUFrQixJQUFJO0FBQUE7QUFBQTtBQUkvRSxXQUFPLFNBQVMsTUFBTSxRQUFRLEVBQzNCLEtBQUssQ0FBQyxXQUF3QixPQUFPLEtBQUssQ0FBQyxFQUMzQyxLQUFLLENBQUMsWUFBWTtBQUNqQixVQUFHLENBQUMsQ0FBQyxTQUFTO0FBQ1osZUFBTztBQUFBLE1BQ1Q7QUFFQSxhQUFPLGNBQWMsS0FBSyxNQUFNLEVBQUMsV0FBVyxLQUFJLENBQUMsRUFBRSxLQUFLLE1BQU0sSUFBSTtBQUFBLElBQ3BFLENBQUMsRUFDQSxNQUFNLENBQUMsY0FBaUIsd0JBQVM7QUFBQSxNQUNoQztBQUFBLE1BQ0EsVUFBVTtBQUFBLE1BQ1YsT0FBTztBQUFBLElBQ1QsR0FBRyxPQUFPLE9BQU8sRUFBRSxLQUFLLE1BQU0sSUFBSSxDQUFDO0FBQUEsRUFDdkMsQ0FBQyxDQUFDO0FBRUYsU0FBTztBQUNUO0FBRU8sTUFBTSxjQUFjLE9BQU8sU0FBcUIsU0FBMkI7QUFDaEYsUUFBTSxTQUFpQjtBQUN2QixRQUFNLEVBQUMsVUFBVSxTQUFTLEVBQUMsUUFBUSxVQUFTLEVBQUMsSUFBSTtBQUNqRCxRQUFNLEVBQUMsTUFBTSxLQUFJLElBQUk7QUFDckIsUUFBTSxZQUFvQixTQUFTLFNBQVM7QUFFNUMsUUFBTSxXQUFxQix1Q0FBdUIsU0FBUztBQUUzRCxNQUFJO0FBQ0YsV0FBTyxTQUFTLE1BQU0sUUFBUSxFQUMzQixLQUFLLENBQUMsV0FBVyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsRUFDcEMsS0FBSyxDQUFDLEVBQUMsbUJBQW1CLGtCQUFpQixNQUFZO0FBQ3RELGNBQU8sTUFBTTtBQUFBLFFBQ1gsS0FBSztBQUNILGlCQUFPLFNBQVM7QUFBQSxRQUNsQixLQUFLO0FBQ0gsaUJBQU8sU0FBUztBQUFBLFFBQ2xCO0FBQ0UsaUJBQU87QUFBQSxNQUNYO0FBQUEsSUFDRixDQUFDLEVBQ0E7QUFBQSxNQUFNLENBQUMsY0FBVSx3QkFBUztBQUFBLFFBQ3pCO0FBQUEsUUFDQSxNQUFNLEVBQUMsTUFBTSxNQUFNLFFBQVEsVUFBUztBQUFBLFFBQ3BDLFVBQVU7QUFBQSxRQUNWLE9BQU8seUJBQVc7QUFBQSxNQUNwQixHQUFHLE9BQU8sT0FBTztBQUFBLElBQ2pCO0FBQUEsRUFDSixTQUFRLE9BQU87QUFDYixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRU8sTUFBTSxhQUFhLENBQUMsU0FBcUIsU0FBNEI7QUFDMUUsUUFBTSxTQUFpQjtBQUN2QixRQUFNLEVBQUMsVUFBVSxTQUFTLEVBQUMsUUFBUSxXQUFXLFlBQVksY0FBYSxFQUFDLElBQUk7QUFDNUUsUUFBTSxFQUFDLE9BQU0sSUFBSTtBQUNqQixRQUFNLFVBQW1CLGdCQUFnQjtBQUV6QyxNQUFHLENBQUMsV0FBWSxjQUFjLFFBQVM7QUFDckMsb0NBQWE7QUFBQSxNQUNYO0FBQUEsTUFDQTtBQUFBLE1BQ0EsVUFBVTtBQUFBLE1BQ1YsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLElBQ1QsR0FBRyxPQUFPO0FBQ1YsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFdBQXFCO0FBQUEsdUJBQ04sTUFBTTtBQUFBO0FBQUE7QUFBQTtBQU0zQixRQUFNLGVBQWUsSUFBSSxjQUFBQyxRQUFPLHFCQUFPLElBQUksY0FBYyxHQUFHLEVBQUMsWUFBWSxZQUFZLEtBQUksQ0FBQztBQUUxRixTQUFPLFNBQVMsTUFBTSxRQUFRLEVBQzNCLEtBQUssQ0FBQyxXQUF3QixPQUFPLEtBQUssQ0FBQyxFQUMzQyxLQUFLLENBQUMsT0FBYSxDQUFDLE1BQU0sYUFBYSxVQUFVLElBQUksS0FBSyxnQkFBZ0IsRUFDeEUsS0FBSyxNQUFNLGFBQWEsU0FBUyxJQUFJLEtBQUssZUFBZSxDQUFDLEVBQzFELEtBQUssTUFBTSxJQUFJLENBQUMsRUFDbEIsTUFBTSxDQUFDLFVBQWlCO0FBQ3ZCLFVBQU07QUFBQSxFQUNSLENBQUM7QUFDTDtBQUVPLE1BQU0saUJBQWlCLENBQUMsU0FBcUIsV0FBa0M7QUFDcEYsUUFBTSxTQUFpQjtBQUN2QixRQUFNLEVBQUMsVUFBVSxTQUFTLEVBQUMsUUFBUSxXQUFXLFlBQVksY0FBYSxFQUFDLElBQUk7QUFDNUUsUUFBTSxVQUFtQixnQkFBZ0I7QUFFekMsTUFBRyxDQUFDLFdBQVksY0FBYyxRQUFTO0FBQ3JDLG9DQUFhO0FBQUEsTUFDWDtBQUFBLE1BQ0EsVUFBVTtBQUFBLE1BQ1YsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLElBQ1QsR0FBRyxPQUFPO0FBQ1YsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFVBQWdCO0FBQUEsSUFDcEIsWUFBWTtBQUFBLEVBQ2Q7QUFDQSxRQUFNLFdBQXFCLDZCQUFhLE1BQU0sU0FBUyxPQUFPO0FBRTlELFNBQU8sU0FBUyxNQUFNLFFBQVEsRUFDM0IsS0FBSyxDQUFDLFdBQXdCLE9BQU8sS0FBSyxDQUFDLEVBQzNDLE1BQU0sQ0FBQyxVQUFpQjtBQUN2QixVQUFNO0FBQUEsRUFDUixDQUFDO0FBQ0w7QUFFTyxNQUFNLGlCQUFpQixDQUFDLE9BQWEsQ0FBQyxNQUFjO0FBQ3pELFFBQU0sRUFBQyxPQUFPLE1BQU0sT0FBTyxJQUFJLFdBQVcsR0FBRSxJQUFJO0FBQ2hELFFBQU0sV0FBb0IsQ0FBQyxPQUFPLElBQUksRUFBRyxLQUFLLEdBQUcsRUFBRSxLQUFLO0FBRXhELE1BQUcsTUFBTTtBQUNQLFdBQU87QUFBQSxFQUNULFdBQVUsYUFBYSxJQUFJO0FBQ3pCLFdBQU87QUFBQSxFQUNULFdBQVUsVUFBVTtBQUNsQixXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU87QUFDVDtBQUVPLE1BQU0saUJBQWlCLENBQUMsWUFBdUM7QUFDcEUsUUFBTSxTQUFpQjtBQUN2QixRQUFNLEVBQUMsVUFBVSxRQUFRLFNBQVMsRUFBQyxRQUFRLFdBQVcsU0FBUSxFQUFDLElBQUk7QUFDbkUsUUFBTSxFQUFDLFNBQVMsZUFBZSxTQUFTLGNBQWEsSUFBSSxnQkFBZ0IsTUFBTTtBQUUvRSxRQUFNLFdBQW1CLDJCQUEyQixTQUFTO0FBQUEsSUFDM0QsY0FBYyxLQUFLLElBQUksQ0FBQztBQUFBLHFCQUNQLGNBQWMsS0FBSyxJQUFJLENBQUM7QUFFM0MsU0FBTyxTQUFTLE1BQU0sUUFBUSxFQUMzQixLQUFLLENBQUMsV0FBd0IsT0FBTyxLQUFLLENBQUMsRUFDM0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFDeEIsTUFBTSxDQUFDLGNBQWlCLHdCQUFTO0FBQUEsSUFDaEM7QUFBQSxJQUNBLE1BQU0sRUFBQyxVQUFVLFFBQVEsVUFBUztBQUFBLElBQ2xDLFVBQVU7QUFBQSxJQUNWLE9BQU8seUJBQVc7QUFBQSxFQUNwQixHQUFHLE9BQU8sT0FBTyxDQUFDO0FBQ3RCO0FBRU8sTUFBTSxVQUFVLENBQUMsU0FBcUIsU0FBNkI7QUFDeEUsUUFBTSxTQUFpQjtBQUN2QixRQUFNLEVBQUMsT0FBTSxJQUFJO0FBQ2pCLFFBQU0sRUFBQyxVQUFVLE9BQU0sSUFBSTtBQUMzQixRQUFNLG1CQUF1QixzQkFBUSxNQUFNO0FBQzNDLFFBQU0sRUFBQyxTQUFTLGVBQWUsU0FBUyxjQUFhLElBQUksZ0JBQWdCLE1BQU07QUFHL0UsUUFBTSxXQUFtQiwyQkFBMkIsWUFBWTtBQUFBLE1BQzVELGNBQWMsS0FBSyxJQUFJLENBQUM7QUFBQTtBQUFBLHVCQUVQLGNBQWMsS0FBSyxJQUFJLENBQUM7QUFFN0MsU0FBTyxTQUFTLE1BQU0sUUFBUSxFQUMzQixLQUFLLENBQUMsV0FBd0IsT0FBTyxLQUFLLENBQUMsRUFDM0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFDeEIsTUFBTSxDQUFDLGNBQWlCLHdCQUFTO0FBQUEsSUFDaEM7QUFBQSxJQUNBO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixPQUFPLHlCQUFXO0FBQUEsRUFDcEIsR0FBRyxPQUFPLE9BQU8sRUFDZCxLQUFLLE1BQU07QUFBQSxFQUFFLENBQUMsQ0FBQztBQUN0QjtBQUVPLE1BQU0sV0FBVyxDQUFDLFNBQXFCLFlBQTJDO0FBQ3ZGLFFBQU0sU0FBaUI7QUFDdkIsUUFBTSxFQUFDLFVBQVUsT0FBTSxJQUFJO0FBQzNCLFFBQU0sRUFBQyxPQUFPLFNBQVEsSUFBSSxpQkFBaUIsT0FBTztBQUNsRCxRQUFNLEVBQUMsU0FBUyxlQUFlLFNBQVMsY0FBYSxJQUFJLGdCQUFnQixNQUFNO0FBQy9FLFFBQU0sV0FBcUIsQ0FBQyxrQkFBa0I7QUFFOUMsTUFBRyxVQUFVO0FBQ1gsYUFBUyxLQUFLLDZCQUF5Qiw0QkFBYyxRQUFRLENBQUMsSUFBSTtBQUFBLEVBQ3BFO0FBR0EsUUFBTSxXQUFtQjtBQUFBLGFBQ2QsU0FBUyxLQUFLLE1BQU0sQ0FBQztBQUFBLE1BQzVCLGNBQWMsS0FBSyxJQUFJLENBQUM7QUFBQSxNQUN4QixNQUFNLEdBQUc7QUFBQTtBQUFBLHVCQUVRLGNBQWMsS0FBSyxJQUFJLENBQUM7QUFFN0MsU0FBTyxTQUFTLE1BQU0sUUFBUSxFQUMzQixLQUFLLENBQUMsV0FBd0IsT0FBTyxJQUFJLENBQUMsRUFDMUMsTUFBTSxDQUFDLGNBQWlCLHdCQUFTO0FBQUEsSUFDaEM7QUFBQSxJQUNBLFVBQVU7QUFBQSxJQUNWLE9BQU8seUJBQVc7QUFBQSxFQUNwQixHQUFHLE9BQU8sT0FBTyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNyQztBQUVPLE1BQU0sc0JBQXNCLENBQ2pDLFNBQ0EsRUFBQyxZQUFZLENBQUMsR0FBRyxTQUFRLEdBQ3pCLFlBQ29CO0FBQ3BCLFFBQU0sU0FBaUI7QUFDdkIsUUFBTSxFQUFDLFVBQVUsUUFBUSxTQUFTLEVBQUMsUUFBUSxVQUFTLEVBQUMsSUFBSTtBQUN6RCxRQUFNLGtCQUE2QixVQUFVLElBQUksQ0FBQyxxQkFBeUIsd0JBQVUsY0FBYyxFQUFFLEVBQUUsWUFBWSxDQUFDO0FBQ3BILFFBQU0sRUFBQyxNQUFLLElBQUksaUJBQWlCLE9BQU87QUFDeEMsUUFBTSxFQUFDLFNBQVMsZUFBZSxTQUFTLGNBQWEsSUFBSSxnQkFBZ0IsTUFBTTtBQUUvRSxRQUFNLGtCQUEwQixTQUFTLFNBQVM7QUFDbEQsUUFBTSxxQkFBeUIsNEJBQWMsUUFBUTtBQUNyRCxRQUFNLFdBQXFCLENBQUMsWUFBWSxLQUFLLFVBQVUsZUFBZSxDQUFDLGtCQUFrQjtBQUV6RixNQUFHLFVBQVU7QUFDWCxhQUFTLEtBQUsseUJBQXlCLGNBQWMsSUFBSTtBQUFBLEVBQzNEO0FBR0EsUUFBTSxXQUFtQix5QkFBeUIsZUFBZTtBQUFBO0FBQUEsTUFFN0QsY0FBYyxLQUFLLElBQUksQ0FBQztBQUFBLE1BQ3hCLFNBQVMsU0FBUyxVQUFVLFNBQVMsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFO0FBQUEsTUFDeEQsTUFBTSxHQUFHO0FBQUEsdUJBQ1EsY0FBYyxLQUFLLElBQUksQ0FBQztBQUU3QyxVQUFRLElBQUksRUFBQyxTQUFRLENBQUM7QUFDdEIsU0FBTyxTQUFTLE1BQU0sUUFBUSxFQUMzQixLQUFLLENBQUMsV0FBd0IsT0FBTyxJQUFJLENBQUMsRUFDMUMsTUFBTSxDQUFDLGNBQWlCLHdCQUFTO0FBQUEsSUFDaEM7QUFBQSxJQUNBLFVBQVU7QUFBQSxJQUNWLE9BQU8seUJBQVc7QUFBQSxFQUNwQixHQUFHLE9BQU8sT0FBTyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNyQztBQUVPLE1BQU0saUJBQWlCLENBQzVCLFNBQ0EsRUFBQyxNQUFNLFNBQVEsR0FDZixZQUNvQjtBQUNwQixRQUFNLFNBQWlCO0FBQ3ZCLFFBQU0sRUFBQyxVQUFVLFFBQVEsU0FBUyxFQUFDLFFBQVEsVUFBUyxFQUFDLElBQUk7QUFDekQsUUFBTSxhQUF3QixLQUFLLE9BQU8sQ0FBQyxNQUFnQixZQUFvQjtBQUM3RSxRQUFHLFNBQVM7QUFDVixXQUFLLFNBQUssd0JBQVUsU0FBUyxFQUFFLEVBQUUsWUFBWSxDQUFDO0FBQUEsSUFDaEQ7QUFFQSxXQUFPO0FBQUEsRUFDVCxHQUFHLENBQUMsQ0FBQztBQUNMLFFBQU0sRUFBQyxNQUFLLElBQUksaUJBQWlCLE9BQU87QUFDeEMsUUFBTSxFQUFDLFNBQVMsZUFBZSxTQUFTLGNBQWEsSUFBSSxnQkFBZ0IsTUFBTTtBQUUvRSxRQUFNLHFCQUF5Qiw0QkFBYyxRQUFRO0FBQ3JELFFBQU0sV0FBcUIsQ0FBQyxjQUFjLFNBQVMsR0FBRztBQUV0RCxNQUFHLFVBQVU7QUFDWCxhQUFTLEtBQUsseUJBQXlCLGNBQWMsSUFBSTtBQUFBLEVBQzNEO0FBR0EsUUFBTSxXQUFtQjtBQUFBLHNCQUNMLEtBQUssVUFBVSxVQUFVLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFHMUMsY0FBYyxLQUFLLElBQUksQ0FBQztBQUFBLE1BQ3hCLFNBQVMsU0FBUyxVQUFVLFNBQVMsS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFO0FBQUEsTUFDeEQsTUFBTSxHQUFHO0FBQUEsZ0NBQ2lCLGNBQWMsS0FBSyxJQUFJLENBQUM7QUFFdEQsVUFBUSxJQUFJLGtCQUFrQixRQUFRO0FBQ3RDLFNBQU8sU0FBUyxNQUFNLFFBQVEsRUFDM0IsS0FBSyxDQUFDLFdBQXdCLE9BQU8sSUFBSSxDQUFDLEVBQzFDLE1BQU0sQ0FBQyxjQUFpQix3QkFBUztBQUFBLElBQ2hDO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixPQUFPLHlCQUFXO0FBQUEsRUFDcEIsR0FBRyxPQUFPLE9BQU8sRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDckM7QUFFTyxNQUFNLG1CQUFtQixDQUFDLFNBQXFCLEVBQUMsU0FBUSxHQUFHLFlBQTJDO0FBQzNHLFFBQU0sU0FBaUI7QUFDdkIsUUFBTSxFQUFDLFVBQVUsUUFBUSxTQUFTLEVBQUMsT0FBTSxFQUFDLElBQUk7QUFDOUMsUUFBTSxFQUFDLE1BQUssSUFBSSxpQkFBaUIsT0FBTztBQUN4QyxRQUFNLFNBQVMsQ0FBQyxzQkFBc0I7QUFDdEMsUUFBTSxFQUFDLFNBQVMsZUFBZSxTQUFTLGNBQWEsSUFBSSxnQkFBZ0IsTUFBTTtBQUUvRSxNQUFHLFVBQVU7QUFDWCxXQUFPLEtBQUssNkJBQXlCLDRCQUFjLFFBQVEsQ0FBQyxJQUFJO0FBQUEsRUFDbEU7QUFHQSxRQUFNLFdBQW1CO0FBQUEsb0NBQ1MsTUFBTTtBQUFBLGFBQzdCLE9BQU8sS0FBSyxNQUFNLENBQUM7QUFBQSxNQUMxQixjQUFjLEtBQUssSUFBSSxDQUFDO0FBQUE7QUFBQSxNQUV4QixNQUFNLEdBQUc7QUFBQTtBQUFBLHVCQUVRLGNBQWMsS0FBSyxJQUFJLENBQUM7QUFFN0MsU0FBTyxTQUFTLE1BQU0sUUFBUSxFQUMzQixLQUFLLENBQUMsV0FBd0IsT0FBTyxJQUFJLENBQUMsRUFDMUMsTUFBTSxDQUFDLGNBQWlCLHdCQUFTO0FBQUEsSUFDaEM7QUFBQSxJQUNBLFVBQVU7QUFBQSxJQUNWLE9BQU8seUJBQVc7QUFBQSxFQUNwQixHQUFHLE9BQU8sT0FBTyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztBQUNyQztBQUVPLE1BQU0saUJBQWlCLE9BQU8sU0FBcUIsRUFBQyxTQUFTLE1BQUssTUFBNEM7QUFDbkgsUUFBTSxFQUFDLE1BQUssUUFBSSwyQkFBVyxLQUFLO0FBRWhDLE1BQUcsT0FBTztBQUNSLFdBQU8sRUFBQyxRQUFRLENBQUMsS0FBSyxFQUFDO0FBQUEsRUFDekI7QUFFQSxRQUFNLEVBQUMsS0FBSyxRQUFRLFVBQVUsV0FBVSxRQUFJLDJCQUFXLEtBQUs7QUFDNUQsUUFBTSxNQUFjLEtBQUssS0FBSyxzQkFBUyxNQUFNLEVBQUUsVUFBVSxDQUFDO0FBRTFELE1BQUcsTUFBTSxLQUFLO0FBQ1osV0FBTyxZQUFZLFFBQVEsVUFBVSxZQUFZLE9BQU87QUFBQSxFQUMxRDtBQUVBLFNBQU8sRUFBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUM7QUFDckM7QUFFTyxNQUFNLFNBQVMsT0FBTyxTQUFxQixTQUFnQztBQUNoRixRQUFNLFNBQWlCO0FBQ3ZCLFFBQU0sRUFBQyxTQUFTLFVBQVUsU0FBUSxJQUFJO0FBQ3RDLFFBQU0scUJBQXlCLDRCQUFjLFFBQVE7QUFDckQsUUFBTSxxQkFBeUIsNEJBQWMsUUFBUTtBQUNyRCxRQUFNLG9CQUF3Qix1QkFBUyxPQUFPLEtBQUs7QUFDbkQsUUFBTSxFQUFDLFNBQVEsSUFBSTtBQUVuQixNQUFHLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCO0FBQ3JDLGVBQU8sNEJBQWE7QUFBQSxNQUNsQjtBQUFBLE1BQ0EsTUFBTSxFQUFDLFNBQVE7QUFBQSxNQUNmLFVBQVU7QUFBQSxNQUNWLE9BQU8seUJBQVc7QUFBQSxJQUNwQixHQUFHLE9BQU87QUFBQSxFQUNaO0FBRUEsUUFBTSxhQUF1QjtBQUFBLDJCQUNKLGNBQWM7QUFBQTtBQUFBO0FBR3ZDLFFBQU0sWUFBa0IsTUFBTSxTQUFTLE1BQU0sVUFBVSxFQUNwRCxLQUFLLENBQUMsV0FBVyxPQUFPLEtBQUssQ0FBQyxFQUM5QjtBQUFBLElBQU0sQ0FBQyxjQUFVLHdCQUFTO0FBQUEsTUFDekI7QUFBQSxNQUNBLE1BQU0sRUFBQyxVQUFVLGVBQWM7QUFBQSxNQUMvQixVQUFVO0FBQUEsTUFDVixPQUFPLHlCQUFXO0FBQUEsSUFDcEIsR0FBRyxPQUFPLE9BQU8sRUFDZCxLQUFLLE1BQU0sSUFBSTtBQUFBLEVBQ2xCO0FBRUYsTUFBRyxDQUFDLFdBQVc7QUFDYixlQUFPLDRCQUFhO0FBQUEsTUFDbEI7QUFBQSxNQUNBLE1BQU0sRUFBQyxTQUFRO0FBQUEsTUFDZixVQUFVO0FBQUEsTUFDVixPQUFPLHlCQUFXO0FBQUEsSUFDcEIsR0FBRyxPQUFPO0FBQUEsRUFDWjtBQUVBLFFBQU0sRUFBQyxNQUFNLFFBQVEsTUFBTSxXQUFVLElBQUk7QUFDekMsUUFBTSxtQkFBdUIsNkJBQWUsZ0JBQWdCLElBQUk7QUFFaEUsTUFBRyxVQUFVLGFBQWEsY0FBYztBQUN0QyxlQUFPLDRCQUFhO0FBQUEsTUFDbEI7QUFBQSxNQUNBLE1BQU0sRUFBQyxTQUFRO0FBQUEsTUFDZixVQUFVO0FBQUEsTUFDVixPQUFPLHlCQUFXO0FBQUEsSUFDcEIsR0FBRyxPQUFPO0FBQUEsRUFDWjtBQUVBLFNBQU8sWUFBWSxRQUFRLFVBQVUsWUFBWSxhQUFhO0FBQ2hFO0FBRU8sTUFBTSxVQUFVLE9BQU8sU0FBcUIsU0FBMkI7QUFDNUUsUUFBTSxTQUFpQjtBQUN2QixRQUFNLEVBQUMsVUFBVSxTQUFTLEVBQUMsUUFBUSxXQUFXLFNBQVEsRUFBQyxJQUFJO0FBQzNELFFBQU0sWUFBb0IsU0FBUyxTQUFTO0FBRTVDLFFBQU0sU0FBUztBQUFBLElBQ2IsWUFBWSxLQUFLLElBQUk7QUFBQSxJQUNyQixXQUFXO0FBQUEsRUFDYjtBQUNBLFFBQU0sZUFBeUIsdUNBQXVCLFNBQVM7QUFBQSxvQkFDN0MsTUFBTTtBQUFBO0FBQUE7QUFJeEIsTUFBSTtBQUNGLFVBQU0sU0FBUyxNQUFNLFlBQVksRUFDOUIsS0FBSyxDQUFDLFdBQVcsT0FBTyxLQUFLLENBQUMsRUFDOUI7QUFBQSxNQUFNLENBQUMsY0FBVSx3QkFBUztBQUFBLFFBQ3pCO0FBQUEsUUFDQSxNQUFNLEVBQUMsVUFBVSxRQUFRLFVBQVM7QUFBQSxRQUNsQyxVQUFVO0FBQUEsUUFDVixPQUFPLHlCQUFXO0FBQUEsTUFDcEIsR0FBRyxPQUFPLE9BQU87QUFBQSxJQUNqQjtBQUFBLEVBQ0osU0FBUSxPQUFPO0FBQ2IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPO0FBQ1Q7QUFFTyxNQUFNLHFCQUFxQixDQUFDLFlBQXdCO0FBQ3pELFFBQU0sU0FBaUI7QUFDdkIsUUFBTSxFQUFDLFNBQVEsSUFBSTtBQUNuQixRQUFNLGFBQXVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU83QixTQUFPLFNBQVMsTUFBTSxVQUFVLEVBQzdCLEtBQUssQ0FBQyxXQUFXLE9BQU8sS0FBSyxDQUFDLEVBQzlCO0FBQUEsSUFBTSxDQUFDLGNBQVUsd0JBQVM7QUFBQSxNQUN6QjtBQUFBLE1BQ0EsVUFBVTtBQUFBLE1BQ1YsT0FBTyx5QkFBVztBQUFBLElBQ3BCLEdBQUcsT0FBTyxPQUFPLEVBQ2QsS0FBSyxNQUFNLENBQUM7QUFBQSxFQUNmO0FBQ0o7IiwKICAibmFtZXMiOiBbImltcG9ydF91dGlscyIsICJVc2VyQWNjZXNzIiwgIlN0cmlwZSJdCn0K