@nlabs/reaktor 0.1.5 → 0.1.7

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 (52) hide show
  1. package/lib/config.js +20 -11
  2. package/lib/data/conversations.js +69 -39
  3. package/lib/data/dynamodb.js +60 -27
  4. package/lib/data/email.js +50 -19
  5. package/lib/data/files.js +103 -46
  6. package/lib/data/groups.js +114 -67
  7. package/lib/data/images.js +169 -102
  8. package/lib/data/index.js +234 -24
  9. package/lib/data/ios.js +48 -23
  10. package/lib/data/locations.js +45 -29
  11. package/lib/data/messages.d.ts +2 -2
  12. package/lib/data/messages.js +105 -72
  13. package/lib/data/notifications.js +31 -14
  14. package/lib/data/payments.js +164 -114
  15. package/lib/data/posts.js +144 -87
  16. package/lib/data/reactions.js +58 -33
  17. package/lib/data/s3.js +54 -24
  18. package/lib/data/search.js +32 -19
  19. package/lib/data/sms.js +35 -15
  20. package/lib/data/subscription.js +78 -51
  21. package/lib/data/tags.js +90 -51
  22. package/lib/data/users.js +119 -72
  23. package/lib/index.js +42 -8
  24. package/lib/types/apps.js +1 -1
  25. package/lib/types/arangodb.js +1 -1
  26. package/lib/types/auth.js +1 -1
  27. package/lib/types/conversations.js +1 -1
  28. package/lib/types/email.js +1 -1
  29. package/lib/types/files.js +1 -1
  30. package/lib/types/google.js +1 -1
  31. package/lib/types/groups.js +1 -1
  32. package/lib/types/images.js +1 -1
  33. package/lib/types/index.js +210 -22
  34. package/lib/types/locations.js +1 -1
  35. package/lib/types/messages.d.ts +12 -7
  36. package/lib/types/messages.js +1 -1
  37. package/lib/types/notifications.js +1 -1
  38. package/lib/types/payments.js +1 -1
  39. package/lib/types/posts.js +1 -1
  40. package/lib/types/reactions.js +1 -1
  41. package/lib/types/tags.js +1 -1
  42. package/lib/types/users.d.ts +0 -1
  43. package/lib/types/users.js +1 -1
  44. package/lib/utils/analytics.js +23 -11
  45. package/lib/utils/arangodb.js +48 -19
  46. package/lib/utils/auth.js +31 -15
  47. package/lib/utils/graphql.js +16 -4
  48. package/lib/utils/index.js +78 -11
  49. package/lib/utils/objects.js +30 -10
  50. package/lib/utils/redis.js +21 -8
  51. package/package.json +5 -5
  52. package/index.d.ts +0 -1
package/lib/data/posts.js CHANGED
@@ -1,3 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createPostEdge = exports.cleanPosts = exports.deletePost = exports.updatePost = exports.addPost = exports.getPostComments = exports.getPostListByUser = exports.getPostListByTags = exports.getPostListByLatest = exports.getPostListByGroup = exports.getPostListByArea = exports.getPostList = exports.getPost = exports.getPostOptional = exports.parsePostOptions = void 0;
7
+
8
+ var _utils = require("@nlabs/utils");
9
+
10
+ var _arangojs = require("arangojs");
11
+
12
+ var _flatten = _interopRequireDefault(require("lodash/flatten"));
13
+
14
+ var _uniqBy = _interopRequireDefault(require("lodash/uniqBy"));
15
+
16
+ var _utils2 = require("../utils");
17
+
18
+ var _files = require("./files");
19
+
20
+ var _tags = require("./tags");
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
1
24
  function _templateObject8() {
2
25
  var data = _taggedTemplateLiteral(["FOR p IN posts\n FILTER p.added < DATE_TIMESTAMP(DATE_SUBTRACT(DATE_NOW(), 60, 'day')) && p.type == \"default\"\n REMOVE p IN posts\n RETURN OLD"]);
3
26
 
@@ -84,20 +107,10 @@ function _templateObject() {
84
107
 
85
108
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
86
109
 
87
- /**
88
- * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
89
- * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
90
- */
91
- import { createHash, parseChar, parseId, parseNum, parseString, parseVarChar } from '@nlabs/utils';
92
- import { aql } from 'arangojs';
93
- import flatten from 'lodash/flatten';
94
- import uniqBy from 'lodash/uniqBy';
95
- import { getLimit, useDb } from '../utils';
96
- import { updateFiles } from './files';
97
- import { extractTags } from './tags'; // const eventCategory: string = 'posts';
98
-
110
+ // const eventCategory: string = 'posts';
99
111
  var MAX_CONTENT_LENGTH = 100000;
100
- export var parsePostOptions = function parsePostOptions() {
112
+
113
+ var parsePostOptions = function parsePostOptions() {
101
114
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
102
115
  var _options$from = options.from,
103
116
  from = _options$from === void 0 ? 0 : _options$from,
@@ -110,13 +123,16 @@ export var parsePostOptions = function parsePostOptions() {
110
123
  _options$type = options.type,
111
124
  type = _options$type === void 0 ? 'default' : _options$type;
112
125
  return {
113
- latitude: parseNum(latitude, 32),
114
- limit: getLimit(from, to),
115
- longitude: parseNum(longitude, 32),
116
- type: parseChar(type, 32)
126
+ latitude: (0, _utils.parseNum)(latitude, 32),
127
+ limit: (0, _utils2.getLimit)(from, to),
128
+ longitude: (0, _utils.parseNum)(longitude, 32),
129
+ type: (0, _utils.parseChar)(type, 32)
117
130
  };
118
131
  };
119
- export var getPostOptional = function getPostOptional(fields) {
132
+
133
+ exports.parsePostOptions = parsePostOptions;
134
+
135
+ var getPostOptional = function getPostOptional(fields) {
120
136
  return fields.reduce(function (selects, field) {
121
137
  switch (field) {
122
138
  case 'reactions':
@@ -150,19 +166,22 @@ export var getPostOptional = function getPostOptional(fields) {
150
166
  queries: []
151
167
  });
152
168
  };
153
- export var getPost = function getPost(context, itemId) {
169
+
170
+ exports.getPostOptional = getPostOptional;
171
+
172
+ var getPost = function getPost(context, itemId) {
154
173
  // const action: string = 'getItem';
155
174
  var database = context.database,
156
175
  fields = context.fields,
157
176
  sessionId = context.userId;
158
- var formatItemId = parseId(itemId);
159
- var db = useDb(database);
177
+ var formatItemId = (0, _utils.parseId)(itemId);
178
+ var db = (0, _utils2.useDb)(database);
160
179
 
161
180
  var _getPostOptional = getPostOptional(fields),
162
181
  selectObjects = _getPostOptional.objects,
163
182
  selectQueries = _getPostOptional.queries;
164
183
 
165
- var aqlQry = aql(_templateObject(), formatItemId);
184
+ var aqlQry = (0, _arangojs.aql)(_templateObject(), formatItemId);
166
185
  return db.query(aqlQry).then(function (cursor) {
167
186
  return cursor.next();
168
187
  }).then(function () {
@@ -196,7 +215,10 @@ export var getPost = function getPost(context, itemId) {
196
215
  throw error;
197
216
  });
198
217
  };
199
- export var getPostList = function getPostList(context, options) {
218
+
219
+ exports.getPost = getPost;
220
+
221
+ var getPostList = function getPostList(context, options) {
200
222
  // const action: string = 'getListByApp';
201
223
  var database = context.database,
202
224
  fields = context.fields;
@@ -210,13 +232,16 @@ export var getPostList = function getPostList(context, options) {
210
232
  selectQueries = _getPostOptional2.queries;
211
233
 
212
234
  var aqlQry = "FOR p IN posts\n FILTER p.type == \"".concat(type, "\" && p.privacy == \"public\" && p.parent == null\n ").concat(selectQueries.join('\n'), "\n ").concat(limit.aql, "\n SORT p.added\n RETURN DISTINCT MERGE(p, {").concat(selectObjects.join(', '), "})");
213
- return useDb(database).query(aqlQry).then(function (cursor) {
235
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
214
236
  return cursor.all();
215
237
  }).catch(function (error) {
216
238
  throw error;
217
239
  });
218
240
  };
219
- export var getPostListByArea = function getPostListByArea(context, latitude, longitude, options) {
241
+
242
+ exports.getPostList = getPostList;
243
+
244
+ var getPostListByArea = function getPostListByArea(context, latitude, longitude, options) {
220
245
  // const action: string = 'getListByUser';
221
246
  var database = context.database,
222
247
  fields = context.fields;
@@ -225,8 +250,8 @@ export var getPostListByArea = function getPostListByArea(context, latitude, lon
225
250
  limit = _parsePostOptions2.limit,
226
251
  type = _parsePostOptions2.type;
227
252
 
228
- var formatLatitude = parseNum(latitude);
229
- var formatLongitude = parseNum(longitude);
253
+ var formatLatitude = (0, _utils.parseNum)(latitude);
254
+ var formatLongitude = (0, _utils.parseNum)(longitude);
230
255
 
231
256
  var _getPostOptional3 = getPostOptional(fields),
232
257
  selectObjects = _getPostOptional3.objects,
@@ -235,13 +260,16 @@ export var getPostListByArea = function getPostListByArea(context, latitude, lon
235
260
  selectQueries.push("LET distance = DISTANCE(\n ".concat(formatLatitude, ",\n ").concat(formatLongitude, ",\n NOT_NULL(p.latitude, 0),\n NOT_NULL(p.longitude, 0))\n "));
236
261
  selectObjects.push('distance:distance');
237
262
  var aqlQry = "FOR p IN posts\n ".concat(selectQueries.join('\n'), "\n FILTER p.type == \"").concat(type, "\" && p.privacy == \"public\" && p.parentId == null\n ").concat(limit.aql, "\n SORT distance, p.added\n RETURN DISTINCT MERGE(p, {").concat(selectObjects.join(', '), "})");
238
- return useDb(database).query(aqlQry).then(function (cursor) {
263
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
239
264
  return cursor.all();
240
265
  }).catch(function (error) {
241
266
  throw error;
242
267
  });
243
268
  };
244
- export var getPostListByGroup = function getPostListByGroup(context, groupId, options) {
269
+
270
+ exports.getPostListByArea = getPostListByArea;
271
+
272
+ var getPostListByGroup = function getPostListByGroup(context, groupId, options) {
245
273
  // const action: string = 'getListByGroup';
246
274
  var database = context.database,
247
275
  fields = context.fields,
@@ -252,8 +280,8 @@ export var getPostListByGroup = function getPostListByGroup(context, groupId, op
252
280
  selectQueries = _getPostOptional4.queries; // Group id
253
281
 
254
282
 
255
- var formatGroupId = parseId(groupId);
256
- var db = useDb(database);
283
+ var formatGroupId = (0, _utils.parseId)(groupId);
284
+ var db = (0, _utils2.useDb)(database);
257
285
  var aqlQry = "FOR u, g IN INBOUND ".concat(formatGroupId, " hasGroup\n FILTER u._key == ").concat(sessionId, "\n RETURN g");
258
286
  return db.query(aqlQry).then(function (cursor) {
259
287
  return cursor.all();
@@ -278,7 +306,10 @@ export var getPostListByGroup = function getPostListByGroup(context, groupId, op
278
306
  throw error;
279
307
  });
280
308
  };
281
- export var getPostListByLatest = function getPostListByLatest(context, options) {
309
+
310
+ exports.getPostListByGroup = getPostListByGroup;
311
+
312
+ var getPostListByLatest = function getPostListByLatest(context, options) {
282
313
  // const action: string = 'getListByLatest';
283
314
  var database = context.database,
284
315
  fields = context.fields;
@@ -292,13 +323,16 @@ export var getPostListByLatest = function getPostListByLatest(context, options)
292
323
  selectQueries = _getPostOptional5.queries;
293
324
 
294
325
  var aqlQry = "FOR p IN posts\n FILTER p.type == \"".concat(type, "\" && p.privacy == \"public\" && p.parent == null\n ").concat(selectQueries.join('\n'), "\n ").concat(limit.aql, "\n SORT p.added\n RETURN DISTINCT MERGE(p, {").concat(selectObjects.join(', '), "})");
295
- return useDb(database).query(aqlQry).then(function (cursor) {
326
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
296
327
  return cursor.all();
297
328
  }).catch(function (error) {
298
329
  throw error;
299
330
  });
300
331
  };
301
- export var getPostListByTags = function getPostListByTags(context, tagNames, options) {
332
+
333
+ exports.getPostListByLatest = getPostListByLatest;
334
+
335
+ var getPostListByTags = function getPostListByTags(context, tagNames, options) {
302
336
  // const action: string = 'getListByTags';
303
337
  var database = context.database,
304
338
  fields = context.fields;
@@ -316,8 +350,8 @@ export var getPostListByTags = function getPostListByTags(context, tagNames, opt
316
350
  var sortBy = [];
317
351
 
318
352
  if (latitude !== undefined && longitude !== undefined) {
319
- var formatLatitude = parseNum(latitude);
320
- var formatLongitude = parseNum(longitude);
353
+ var formatLatitude = (0, _utils.parseNum)(latitude);
354
+ var formatLongitude = (0, _utils.parseNum)(longitude);
321
355
  selectQueries.push("LET distance = DISTANCE(\n ".concat(formatLatitude, ",\n ").concat(formatLongitude, ",\n NOT_NULL(p.latitude, 0),\n NOT_NULL(p.longitude, 0))\n "));
322
356
  selectObjects.push('distance:distance');
323
357
  sortBy.push('distance');
@@ -326,18 +360,21 @@ export var getPostListByTags = function getPostListByTags(context, tagNames, opt
326
360
  sortBy.push('p.added');
327
361
  return Promise.all(tagNames.map(function (tagName) {
328
362
  var aqlQry = "FOR targetTag IN tags\n FILTER targetTag.name == \"".concat(tagName, "\"\n FOR p, e IN OUTBOUND targetTag._id isTagged\n ").concat(selectQueries.join('\n'), "\n FILTER p.type = \"").concat(type, "\" && p.privacy == \"public\" && e.type == 'posts'\n ").concat(limit.aql, "\n SORT ").concat(sortBy.join(', '), "\n RETURN DISTINCT MERGE(p, {").concat(selectObjects.join(', '), "})");
329
- return useDb(database).query(aqlQry).then(function (cursor) {
363
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
330
364
  return cursor.all();
331
365
  }).catch(function () {
332
366
  return [];
333
367
  });
334
368
  })).then(function (results) {
335
- return uniqBy(flatten(results), '_key');
369
+ return (0, _uniqBy.default)((0, _flatten.default)(results), '_key');
336
370
  }).catch(function (error) {
337
371
  throw error;
338
372
  });
339
373
  };
340
- export var getPostListByUser = function getPostListByUser(context, userId, options) {
374
+
375
+ exports.getPostListByTags = getPostListByTags;
376
+
377
+ var getPostListByUser = function getPostListByUser(context, userId, options) {
341
378
  // const action: string = 'getListByUser';
342
379
  var database = context.database,
343
380
  fields = context.fields;
@@ -346,20 +383,23 @@ export var getPostListByUser = function getPostListByUser(context, userId, optio
346
383
  limit = _parsePostOptions6.limit,
347
384
  type = _parsePostOptions6.type;
348
385
 
349
- var formatUserId = parseId(userId);
386
+ var formatUserId = (0, _utils.parseId)(userId);
350
387
 
351
388
  var _getPostOptional7 = getPostOptional(fields),
352
389
  selectObjects = _getPostOptional7.objects,
353
390
  selectQueries = _getPostOptional7.queries;
354
391
 
355
392
  var aqlQry = "FOR p IN posts\n FILTER p.userId == \"".concat(formatUserId, "\" && p.type == \"").concat(type, "\" && p.privacy == \"public\" && p.parent == null\n ").concat(selectQueries.join('\n'), "\n ").concat(limit.aql, "\n SORT p.added\n RETURN DISTINCT MERGE(p, {").concat(selectObjects.join(', '), "})");
356
- return useDb(database).query(aqlQry).then(function (cursor) {
393
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
357
394
  return cursor.all();
358
395
  }).catch(function (error) {
359
396
  throw error;
360
397
  });
361
398
  };
362
- export var getPostComments = function getPostComments(context, itemId, options) {
399
+
400
+ exports.getPostListByUser = getPostListByUser;
401
+
402
+ var getPostComments = function getPostComments(context, itemId, options) {
363
403
  // const action: string = 'getComments';
364
404
  var database = context.database,
365
405
  sessionId = context.userId;
@@ -368,10 +408,10 @@ export var getPostComments = function getPostComments(context, itemId, options)
368
408
  limit = _parsePostOptions7.limit,
369
409
  type = _parsePostOptions7.type;
370
410
 
371
- var formatItemId = parseId(itemId); // Get the parent post to get restrictions
411
+ var formatItemId = (0, _utils.parseId)(itemId); // Get the parent post to get restrictions
372
412
 
373
- var db = useDb(database);
374
- var aqlQry = aql(_templateObject2(), type, formatItemId);
413
+ var db = (0, _utils2.useDb)(database);
414
+ var aqlQry = (0, _arangojs.aql)(_templateObject2(), type, formatItemId);
375
415
  return db.query(aqlQry).then(function (cursor) {
376
416
  return cursor.next();
377
417
  }).then(function () {
@@ -402,7 +442,10 @@ export var getPostComments = function getPostComments(context, itemId, options)
402
442
  throw error;
403
443
  });
404
444
  };
405
- export var addPost = function addPost(context, item) {
445
+
446
+ exports.getPostComments = getPostComments;
447
+
448
+ var addPost = function addPost(context, item) {
406
449
  // const action: string = 'add';
407
450
  var database = context.database,
408
451
  sessionId = context.userId;
@@ -423,29 +466,29 @@ export var addPost = function addPost(context, item) {
423
466
  type = _item$type === void 0 ? 'default' : _item$type;
424
467
  var now = Date.now();
425
468
  var insert = {
426
- _key: createHash("post-".concat(sessionId)),
469
+ _key: (0, _utils.createHash)("post-".concat(sessionId)),
427
470
  added: now,
428
- content: parseString(content, MAX_CONTENT_LENGTH),
429
- groupId: groupId ? parseId(groupId) : undefined,
430
- latitude: latitude !== undefined ? parseNum(latitude) : undefined,
431
- location: location ? parseString(location, 160) : undefined,
432
- longitude: longitude !== undefined ? parseNum(longitude) : undefined,
471
+ content: (0, _utils.parseString)(content, MAX_CONTENT_LENGTH),
472
+ groupId: groupId ? (0, _utils.parseId)(groupId) : undefined,
473
+ latitude: latitude !== undefined ? (0, _utils.parseNum)(latitude) : undefined,
474
+ location: location ? (0, _utils.parseString)(location, 160) : undefined,
475
+ longitude: longitude !== undefined ? (0, _utils.parseNum)(longitude) : undefined,
433
476
  modified: now,
434
- name: parseString(name, 160),
435
- parentId: parentId ? parseId(parentId) : undefined,
436
- privacy: privacy ? parseVarChar(privacy, 16) : undefined,
437
- type: parseChar(type, 32),
477
+ name: (0, _utils.parseString)(name, 160),
478
+ parentId: parentId ? (0, _utils.parseId)(parentId) : undefined,
479
+ privacy: privacy ? (0, _utils.parseVarChar)(privacy, 16) : undefined,
480
+ type: (0, _utils.parseChar)(type, 32),
438
481
  userId: sessionId
439
482
  };
440
- var db = useDb(database);
441
- var aqlQry = aql(_templateObject3(), insert);
483
+ var db = (0, _utils2.useDb)(database);
484
+ var aqlQry = (0, _arangojs.aql)(_templateObject3(), insert);
442
485
  return db.query(aqlQry).then(function (cursor) {
443
486
  return cursor.next();
444
487
  }).then(function () {
445
488
  var post = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
446
489
  var postKey = post._key; // Update linked tags within posts
447
490
 
448
- return extractTags(db, 'posts', postKey, insert.content).then(function (tagList) {
491
+ return (0, _tags.extractTags)(db, 'posts', postKey, insert.content).then(function (tagList) {
449
492
  post.tags = tagList;
450
493
  return post;
451
494
  });
@@ -453,7 +496,10 @@ export var addPost = function addPost(context, item) {
453
496
  throw error;
454
497
  });
455
498
  };
456
- export var updatePost = function updatePost(context, item) {
499
+
500
+ exports.addPost = addPost;
501
+
502
+ var updatePost = function updatePost(context, item) {
457
503
  // const action: string = 'update';
458
504
  var database = context.database,
459
505
  sessionId = context.userId;
@@ -466,16 +512,16 @@ export var updatePost = function updatePost(context, item) {
466
512
  privacy = item.privacy,
467
513
  type = item.type;
468
514
  var update = {
469
- content: content ? parseString(content, MAX_CONTENT_LENGTH) : undefined,
515
+ content: content ? (0, _utils.parseString)(content, MAX_CONTENT_LENGTH) : undefined,
470
516
  modified: now,
471
- name: name ? parseString(name, 160) : undefined,
472
- parentId: parentId ? parseString(parentId, 160) : undefined,
473
- privacy: privacy ? parseVarChar(privacy, 16) : undefined,
474
- type: type !== undefined ? parseChar(type, 16) : undefined
517
+ name: name ? (0, _utils.parseString)(name, 160) : undefined,
518
+ parentId: parentId ? (0, _utils.parseString)(parentId, 160) : undefined,
519
+ privacy: privacy ? (0, _utils.parseVarChar)(privacy, 16) : undefined,
520
+ type: type !== undefined ? (0, _utils.parseChar)(type, 16) : undefined
475
521
  };
476
- var formatId = parseId(postId);
477
- formatId = formatId === '' ? createHash("post-".concat(sessionId)) : formatId;
478
- var formatGroupId = parseId(groupId);
522
+ var formatId = (0, _utils.parseId)(postId);
523
+ formatId = formatId === '' ? (0, _utils.createHash)("post-".concat(sessionId)) : formatId;
524
+ var formatGroupId = (0, _utils.parseId)(groupId);
479
525
 
480
526
  var insert = _objectSpread({}, update, {
481
527
  _key: formatId,
@@ -485,22 +531,22 @@ export var updatePost = function updatePost(context, item) {
485
531
  userId: sessionId
486
532
  });
487
533
 
488
- var db = useDb(database);
489
- var aqlQry = aql(_templateObject4(), formatId, sessionId, insert, update);
534
+ var db = (0, _utils2.useDb)(database);
535
+ var aqlQry = (0, _arangojs.aql)(_templateObject4(), formatId, sessionId, insert, update);
490
536
  return db.query(aqlQry).then(function (cursor) {
491
537
  return cursor.next();
492
538
  }).then(function () {
493
539
  var updatedPost = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
494
540
  var updatedPostKey = updatedPost._key; // Update linked tags
495
541
 
496
- return extractTags(db, 'posts', updatedPostKey, update.content || '').then(function () {
542
+ return (0, _tags.extractTags)(db, 'posts', updatedPostKey, update.content || '').then(function () {
497
543
  var tagList = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
498
544
  updatedPost.tags = tagList; // Update linked files
499
545
 
500
546
  var files = updatedPost.files || [];
501
547
 
502
548
  if (files.length) {
503
- return updateFiles(db, formatId, files).then(function () {
549
+ return (0, _files.updateFiles)(db, formatId, files).then(function () {
504
550
  var fileList = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
505
551
  updatedPost.files = fileList;
506
552
  return updatedPost;
@@ -514,13 +560,16 @@ export var updatePost = function updatePost(context, item) {
514
560
  throw error;
515
561
  });
516
562
  };
517
- export var deletePost = function deletePost(context, itemId) {
563
+
564
+ exports.updatePost = updatePost;
565
+
566
+ var deletePost = function deletePost(context, itemId) {
518
567
  // const action: string = 'delete';
519
568
  var database = context.database,
520
569
  sessionId = context.userId;
521
- var formatItemId = parseId(itemId);
522
- var db = useDb(database);
523
- var aqlQry = aql(_templateObject5(), formatItemId, sessionId);
570
+ var formatItemId = (0, _utils.parseId)(itemId);
571
+ var db = (0, _utils2.useDb)(database);
572
+ var aqlQry = (0, _arangojs.aql)(_templateObject5(), formatItemId, sessionId);
524
573
  return db.query(aqlQry).then(function (cursor) {
525
574
  return cursor.next();
526
575
  }).then(function () {
@@ -528,10 +577,10 @@ export var deletePost = function deletePost(context, itemId) {
528
577
 
529
578
  if (post) {
530
579
  // Remove tag links
531
- var edgeAqlQry = aql(_templateObject6(), formatItemId);
580
+ var edgeAqlQry = (0, _arangojs.aql)(_templateObject6(), formatItemId);
532
581
  return db.query(edgeAqlQry).then(function () {
533
582
  // Remove attached files
534
- var fileAqlQry = aql(_templateObject7(), formatItemId);
583
+ var fileAqlQry = (0, _arangojs.aql)(_templateObject7(), formatItemId);
535
584
  return db.query(fileAqlQry).then(function () {
536
585
  return post;
537
586
  }).catch(function (error) {
@@ -547,10 +596,13 @@ export var deletePost = function deletePost(context, itemId) {
547
596
  throw error;
548
597
  });
549
598
  };
550
- export var cleanPosts = function cleanPosts(database) {
599
+
600
+ exports.deletePost = deletePost;
601
+
602
+ var cleanPosts = function cleanPosts(database) {
551
603
  // Remove all messages that are over 60 days and not saved
552
- var aqlQry = aql(_templateObject8());
553
- return useDb(database).query(aqlQry).then(function (cursor) {
604
+ var aqlQry = (0, _arangojs.aql)(_templateObject8());
605
+ return (0, _utils2.useDb)(database).query(aqlQry).then(function (cursor) {
554
606
  return cursor.all();
555
607
  }).then(function () {
556
608
  var results = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
@@ -559,13 +611,16 @@ export var cleanPosts = function cleanPosts(database) {
559
611
  throw error;
560
612
  });
561
613
  };
562
- export var createPostEdge = function createPostEdge(db, file, postId) {
614
+
615
+ exports.cleanPosts = cleanPosts;
616
+
617
+ var createPostEdge = function createPostEdge(db, file, postId) {
563
618
  var edgeCollection = db.edgeCollection('isPosted');
564
619
  var fileId = file.fileId;
565
- var formatFileId = parseId(fileId);
566
- var edgeId = createHash("file-".concat(postId, "-").concat(formatFileId));
567
- var formatPostId = parseId(postId);
568
- var fileType = parseChar(file.fileType, 16);
620
+ var formatFileId = (0, _utils.parseId)(fileId);
621
+ var edgeId = (0, _utils.createHash)("file-".concat(postId, "-").concat(formatFileId));
622
+ var formatPostId = (0, _utils.parseId)(postId);
623
+ var fileType = (0, _utils.parseChar)(file.fileType, 16);
569
624
  var edge = {
570
625
  _key: edgeId,
571
626
  added: Date.now(),
@@ -577,4 +632,6 @@ export var createPostEdge = function createPostEdge(db, file, postId) {
577
632
  throw error;
578
633
  });
579
634
  };
580
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL3Bvc3RzLnRzIl0sIm5hbWVzIjpbImNyZWF0ZUhhc2giLCJwYXJzZUNoYXIiLCJwYXJzZUlkIiwicGFyc2VOdW0iLCJwYXJzZVN0cmluZyIsInBhcnNlVmFyQ2hhciIsImFxbCIsImZsYXR0ZW4iLCJ1bmlxQnkiLCJnZXRMaW1pdCIsInVzZURiIiwidXBkYXRlRmlsZXMiLCJleHRyYWN0VGFncyIsIk1BWF9DT05URU5UX0xFTkdUSCIsInBhcnNlUG9zdE9wdGlvbnMiLCJvcHRpb25zIiwiZnJvbSIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwidG8iLCJ0eXBlIiwibGltaXQiLCJnZXRQb3N0T3B0aW9uYWwiLCJmaWVsZHMiLCJyZWR1Y2UiLCJzZWxlY3RzIiwiZmllbGQiLCJxdWVyaWVzIiwicHVzaCIsIm9iamVjdHMiLCJnZXRQb3N0IiwiY29udGV4dCIsIml0ZW1JZCIsImRhdGFiYXNlIiwic2Vzc2lvbklkIiwidXNlcklkIiwiZm9ybWF0SXRlbUlkIiwiZGIiLCJzZWxlY3RPYmplY3RzIiwic2VsZWN0UXVlcmllcyIsImFxbFFyeSIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsIm5leHQiLCJwb3N0IiwiX2tleSIsImdyb3VwSWQiLCJwcml2YWN5IiwicHJpdmFjeUFxbFFyeSIsImpvaW4iLCJmaWx0ZXJlZFBvc3QiLCJjYXRjaCIsImVycm9yIiwiZ2V0UG9zdExpc3QiLCJhbGwiLCJnZXRQb3N0TGlzdEJ5QXJlYSIsImZvcm1hdExhdGl0dWRlIiwiZm9ybWF0TG9uZ2l0dWRlIiwiZ2V0UG9zdExpc3RCeUdyb3VwIiwiZm9ybWF0R3JvdXBJZCIsImdyb3VwcyIsImxlbmd0aCIsInBvc3RBcWxRcnkiLCJnZXRQb3N0TGlzdEJ5TGF0ZXN0IiwiZ2V0UG9zdExpc3RCeVRhZ3MiLCJ0YWdOYW1lcyIsInNvcnRCeSIsInVuZGVmaW5lZCIsIlByb21pc2UiLCJtYXAiLCJ0YWdOYW1lIiwicmVzdWx0cyIsImdldFBvc3RMaXN0QnlVc2VyIiwiZm9ybWF0VXNlcklkIiwiZ2V0UG9zdENvbW1lbnRzIiwiYWRkUG9zdCIsIml0ZW0iLCJjb250ZW50IiwibG9jYXRpb24iLCJuYW1lIiwicGFyZW50SWQiLCJub3ciLCJEYXRlIiwiaW5zZXJ0IiwiYWRkZWQiLCJtb2RpZmllZCIsInBvc3RLZXkiLCJ0YWdMaXN0IiwidGFncyIsInVwZGF0ZVBvc3QiLCJwb3N0SWQiLCJ1cGRhdGUiLCJmb3JtYXRJZCIsInVwZGF0ZWRQb3N0IiwidXBkYXRlZFBvc3RLZXkiLCJmaWxlcyIsImZpbGVMaXN0IiwiZGVsZXRlUG9zdCIsImVkZ2VBcWxRcnkiLCJmaWxlQXFsUXJ5IiwiY2xlYW5Qb3N0cyIsImNyZWF0ZVBvc3RFZGdlIiwiZmlsZSIsImVkZ2VDb2xsZWN0aW9uIiwiZmlsZUlkIiwiZm9ybWF0RmlsZUlkIiwiZWRnZUlkIiwiZm9ybWF0UG9zdElkIiwiZmlsZVR5cGUiLCJlZGdlIiwic2F2ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztBQUlBLFNBQVFBLFVBQVIsRUFBb0JDLFNBQXBCLEVBQStCQyxPQUEvQixFQUF3Q0MsUUFBeEMsRUFBa0RDLFdBQWxELEVBQStEQyxZQUEvRCxRQUFrRixjQUFsRjtBQUNBLFNBQVFDLEdBQVIsUUFBNEIsVUFBNUI7QUFHQSxPQUFPQyxPQUFQLE1BQW9CLGdCQUFwQjtBQUNBLE9BQU9DLE1BQVAsTUFBbUIsZUFBbkI7QUFHQSxTQUFRQyxRQUFSLEVBQWtCQyxLQUFsQixRQUE4QixVQUE5QjtBQUNBLFNBQVFDLFdBQVIsUUFBMEIsU0FBMUI7QUFDQSxTQUFRQyxXQUFSLFFBQTBCLFFBQTFCLEMsQ0FFQTs7QUFDQSxJQUFNQyxrQkFBMEIsR0FBRyxNQUFuQztBQUVBLE9BQU8sSUFBTUMsZ0JBQWdCLEdBQUcsU0FBbkJBLGdCQUFtQixHQUErQjtBQUFBLE1BQTlCQyxPQUE4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QUFnQixFQUFoQixDQUFsQztBQUVBLE1BQU1DLElBQVMsR0FBRztBQUNoQmhFLElBQUFBLElBQUksRUFBRTZELE1BRFU7QUFFaEJ0QixJQUFBQSxLQUFLLEVBQUVGLElBQUksQ0FBQ0QsR0FBTCxFQUZTO0FBR2hCOUQsSUFBQUEsSUFBSSxFQUFFeUY7QUFIVSxHQUFsQjtBQU1BLFNBQU9MLGNBQWMsQ0FBQ08sSUFBZixDQUFvQkQsSUFBcEIsa0JBQW1DRixZQUFuQyxtQkFBNERGLFlBQTVELEdBQ0poRSxJQURJLENBQ0M7QUFBQSxXQUFNNkQsSUFBTjtBQUFBLEdBREQsRUFFSm5ELEtBRkksQ0FFRSxVQUFDQyxLQUFELEVBQWtCO0FBQ3ZCLFVBQU1BLEtBQU47QUFDRCxHQUpJLENBQVA7QUFLRCxDQW5CTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VOdW0sIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbCwgRGF0YWJhc2V9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2xpYi9janMvYXFsLXF1ZXJ5JztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2xpYi9janMvY3Vyc29yJztcbmltcG9ydCBmbGF0dGVuIGZyb20gJ2xvZGFzaC9mbGF0dGVuJztcbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoL3VuaXFCeSc7XG5cbmltcG9ydCB7QXBpQ29udGV4dCwgRmlsZVR5cGUsIEdyb3VwVHlwZSwgUG9zdE9wdGlvbnMsIFBvc3RUeXBlLCBUYWdUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2dldExpbWl0LCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHt1cGRhdGVGaWxlc30gZnJvbSAnLi9maWxlcyc7XG5pbXBvcnQge2V4dHJhY3RUYWdzfSBmcm9tICcuL3RhZ3MnO1xuXG4vLyBjb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAncG9zdHMnO1xuY29uc3QgTUFYX0NPTlRFTlRfTEVOR1RIOiBudW1iZXIgPSAxMDAwMDA7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVBvc3RPcHRpb25zID0gKG9wdGlvbnM6IFBvc3RPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIGxhdGl0dWRlID0gMCxcbiAgICBsb25naXR1ZGUgPSAwLFxuICAgIHRvID0gMzAsXG4gICAgdHlwZSA9ICdkZWZhdWx0J1xuICB9ID0gb3B0aW9ucztcblxuXG4gIHJldHVybiB7XG4gICAgbGF0aXR1ZGU6IHBhcnNlTnVtKGxhdGl0dWRlLCAzMiksXG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSxcbiAgICBsb25naXR1ZGU6IHBhcnNlTnVtKGxvbmdpdHVkZSwgMzIpLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0T3B0aW9uYWwgPSAoZmllbGRzOiBzdHJpbmdbXSkgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0czogYW55LCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgc3dpdGNoKGZpZWxkKSB7XG4gICAgICBjYXNlICdyZWFjdGlvbnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdzJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHRhZ3MgPSAoXG4gICAgICAgICAgRk9SIHQsIHBsIElOIElOQk9VTkQgcC5faWQgaXNUYWdnZWRcbiAgICAgICAgICBSRVRVUk4gdFxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCd0YWdzOnRhZ3MnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd1c2VyJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBwLnVzZXJJZCA9PSB1Ll9rZXlcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIHVcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndXNlcjp1c2VyJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldEl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IGRiID0gdXNlRGIoZGF0YWJhc2UpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIF9rZXksXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAnZGVmYXVsdCdcbiAgICAgIH06IFBvc3RUeXBlID0gcG9zdDtcblxuICAgICAgLy8gUXVlcnkgYmFzZWQgb24gcHJpdmFjeSBsZXZlbFxuICAgICAgbGV0IHByaXZhY3lBcWxRcnk6IHN0cmluZztcblxuICAgICAgaWYoZ3JvdXBJZCAmJiBwcml2YWN5ID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGSUxURVIgcC5fa2V5ID09IFwiJHtfa2V5fVwiXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgIEZPUiBncm91cCBJTiBncm91cHNcbiAgICAgICAgICBGSUxURVIgZ3JvdXAuX2tleSA9PSBwLmdyb3VwSWRcbiAgICAgICAgICBGT1IgdSwgZSBJTiBPVVRCT1VORCBncm91cC5faWQgaXNHcm91cGVkXG4gICAgICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gICAgICB9IGVsc2UgaWYocHJpdmFjeSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZJTFRFUiBwLl9rZXkgPT0gXCIke19rZXl9XCJcbiAgICAgICAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICAgICAgfVxuXG4gICAgICBpZihwcml2YWN5QXFsUXJ5KSB7XG4gICAgICAgIHJldHVybiBkYi5xdWVyeShwcml2YWN5QXFsUXJ5KVxuICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgIC50aGVuKChmaWx0ZXJlZFBvc3Q6IFBvc3RUeXBlID0ge30pID0+IGZpbHRlcmVkUG9zdClcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5QXBwJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdEJ5QXJlYSA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgbGF0aXR1ZGU6IG51bWJlcixcbiAgbG9uZ2l0dWRlOiBudW1iZXIsXG4gIG9wdGlvbnM/OiBQb3N0T3B0aW9uc1xuKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkc30gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZm9ybWF0TGF0aXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxhdGl0dWRlKTtcbiAgY29uc3QgZm9ybWF0TG9uZ2l0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsb25naXR1ZGUpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcbiAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRShcbiAgICAke2Zvcm1hdExhdGl0dWRlfSxcbiAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgTk9UX05VTEwocC5sYXRpdHVkZSwgMCksXG4gICAgTk9UX05VTEwocC5sb25naXR1ZGUsIDApKVxuICBgKTtcbiAgc2VsZWN0T2JqZWN0cy5wdXNoKCdkaXN0YW5jZTpkaXN0YW5jZScpO1xuXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnRJZCA9PSBudWxsXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBkaXN0YW5jZSwgcC5hZGRlZFxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RMaXN0QnlHcm91cCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZ3JvdXBJZDogc3RyaW5nLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlHcm91cCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcblxuICAvLyBHcm91cCBpZFxuICBjb25zdCBmb3JtYXRHcm91cElkOiBzdHJpbmcgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBkYiA9IHVzZURiKGRhdGFiYXNlKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHUsIGcgSU4gSU5CT1VORCAke2Zvcm1hdEdyb3VwSWR9IGhhc0dyb3VwXG4gICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuICAgICAgUkVUVVJOIGdgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigoZ3JvdXBzOiBHcm91cFR5cGVbXSA9IFtdKSA9PiB7XG4gICAgICBpZihncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBwb3N0QXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAuZ3JvdXBJZCA9PSBcIiR7Zm9ybWF0R3JvdXBJZH1cIiAmJiBwLnBhcmVudCA9PSBudWxsXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gICAgICAgIHJldHVybiBkYi5xdWVyeShwb3N0QXFsUXJ5KVxuICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdExpc3RCeUxhdGVzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5TGF0ZXN0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdEJ5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGFnTmFtZXM6IHN0cmluZ1tdLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xhdGl0dWRlLCBsb25naXR1ZGUsIGxpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBzb3J0Qnk6IHN0cmluZ1tdID0gW107XG5cbiAgaWYobGF0aXR1ZGUgIT09IHVuZGVmaW5lZCAmJiBsb25naXR1ZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gICAgY29uc3QgZm9ybWF0TG9uZ2l0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsb25naXR1ZGUpO1xuICAgIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UoXG4gICAgICAke2Zvcm1hdExhdGl0dWRlfSxcbiAgICAgICR7Zm9ybWF0TG9uZ2l0dWRlfSxcbiAgICAgIE5PVF9OVUxMKHAubGF0aXR1ZGUsIDApLFxuICAgICAgTk9UX05VTEwocC5sb25naXR1ZGUsIDApKVxuICAgIGApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnZGlzdGFuY2U6ZGlzdGFuY2UnKTtcbiAgICBzb3J0QnkucHVzaCgnZGlzdGFuY2UnKTtcbiAgfVxuXG4gIHNvcnRCeS5wdXNoKCdwLmFkZGVkJyk7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgIHRhZ05hbWVzLm1hcCgodGFnTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgdGFyZ2V0VGFnIElOIHRhZ3NcbiAgICAgICAgRklMVEVSIHRhcmdldFRhZy5uYW1lID09IFwiJHt0YWdOYW1lfVwiXG4gICAgICAgIEZPUiBwLCBlIElOIE9VVEJPVU5EIHRhcmdldFRhZy5faWQgaXNUYWdnZWRcbiAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICBGSUxURVIgcC50eXBlID0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgZS50eXBlID09ICdwb3N0cydcbiAgICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICAgIFNPUlQgJHtzb3J0Qnkuam9pbignLCAnKX1cbiAgICAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gW10pO1xuICAgIH0pKVxuICAgIC50aGVuKChyZXN1bHRzKSA9PiB1bmlxQnkoZmxhdHRlbihyZXN1bHRzKSwgJ19rZXknKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdExpc3RCeVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcklkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC51c2VySWQgPT0gXCIke2Zvcm1hdFVzZXJJZH1cIiAmJiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0Q29tbWVudHMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRDb21tZW50cyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChpdGVtSWQpO1xuXG4gIC8vIEdldCB0aGUgcGFyZW50IHBvc3QgdG8gZ2V0IHJlc3RyaWN0aW9uc1xuICBjb25zdCBkYiA9IHVzZURiKGRhdGFiYXNlKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gJHt0eXBlfSAmJiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIF9rZXksXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAncHVibGljJ1xuICAgICAgfTogUG9zdFR5cGUgPSBwb3N0O1xuXG4gICAgICAvLyBRdWVyeSBiYXNlZCBvbiBwcml2YWN5IGxldmVsXG4gICAgICBsZXQgcHJpdmFjeUFxbFFyeTogc3RyaW5nO1xuXG4gICAgICBpZihncm91cElkICYmIHByaXZhY3kgPT09ICdncm91cCcpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZPUiB1c2VyIElOIHVzZXJzXG4gICAgICAgICAgRklMVEVSIHAucGFyZW50ID09IFwiJHtfa2V5fVwiICYmIHVzZXIuX2tleSA9PSBwLnVzZXJJZFxuICAgICAgICAgIExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgICApXG4gICAgICAgICAgRk9SIGdyb3VwIElOIGdyb3Vwc1xuICAgICAgICAgIEZJTFRFUiBncm91cC5fa2V5ID09IHAuZ3JvdXBJZFxuICAgICAgICAgIEZPUiB1LCBlIElOIE9VVEJPVU5EIGdyb3VwLl9pZCBpc0dyb3VwZWRcbiAgICAgICAgICBGSUxURVIgdS5fa2V5ID09IFwiJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBTT1JUIHAuYWRkZWRcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwge3VzZXI6IHVzZXIsIHJlYWN0aW9uczogcmVhY3Rpb25zfSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGT1IgdXNlciBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBwLnBhcmVudCA9PSBcIiR7X2tleX1cIiAmJiB1c2VyLl9rZXkgPT0gcC51c2VySWRcbiAgICAgICAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCByZWFjdGlvbnNcbiAgICAgICAgICAgIENPTExFQ1QgcmVhY3Rpb25OYW1lID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgICAgKVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7dXNlcjogdXNlciwgcmVhY3Rpb25zOiByZWFjdGlvbnN9KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRQb3N0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW06IFBvc3RUeXBlKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG5cbiAgY29uc3Qge1xuICAgIGNvbnRlbnQgPSAnJyxcbiAgICBncm91cElkID0gJycsXG4gICAgbG9jYXRpb24sXG4gICAgbGF0aXR1ZGUsXG4gICAgbG9uZ2l0dWRlLFxuICAgIG5hbWUgPSAnJyxcbiAgICBwYXJlbnRJZCA9IG51bGwsXG4gICAgcHJpdmFjeSA9ICdwdWJsaWMnLFxuICAgIHR5cGUgPSAnZGVmYXVsdCdcbiAgfTogUG9zdFR5cGUgPSBpdGVtO1xuXG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICBjb25zdCBpbnNlcnQ6IFBvc3RUeXBlID0ge1xuICAgIF9rZXk6IGNyZWF0ZUhhc2goYHBvc3QtJHtzZXNzaW9uSWR9YCksXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBjb250ZW50OiBwYXJzZVN0cmluZyhjb250ZW50LCBNQVhfQ09OVEVOVF9MRU5HVEgpLFxuICAgIGdyb3VwSWQ6IGdyb3VwSWQgPyBwYXJzZUlkKGdyb3VwSWQpIDogdW5kZWZpbmVkLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VOdW0obGF0aXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIGxvY2F0aW9uOiBsb2NhdGlvbiA/IHBhcnNlU3RyaW5nKGxvY2F0aW9uLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlICE9PSB1bmRlZmluZWQgPyBwYXJzZU51bShsb25naXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogcGFyc2VTdHJpbmcobmFtZSwgMTYwKSxcbiAgICBwYXJlbnRJZDogcGFyZW50SWQgPyBwYXJzZUlkKHBhcmVudElkKSA6IHVuZGVmaW5lZCxcbiAgICBwcml2YWN5OiBwcml2YWN5ID8gcGFyc2VWYXJDaGFyKHByaXZhY3ksIDE2KSA6IHVuZGVmaW5lZCxcbiAgICB0eXBlOiBwYXJzZUNoYXIodHlwZSwgMzIpLFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG5cbiAgY29uc3QgZGI6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2UpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gcG9zdHMgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IHBvc3RLZXl9ID0gcG9zdDtcblxuICAgICAgLy8gVXBkYXRlIGxpbmtlZCB0YWdzIHdpdGhpbiBwb3N0c1xuICAgICAgcmV0dXJuIGV4dHJhY3RUYWdzKGRiLCAncG9zdHMnLCBwb3N0S2V5LCBpbnNlcnQuY29udGVudClcbiAgICAgICAgLnRoZW4oKHRhZ0xpc3Q6IFRhZ1R5cGVbXSkgPT4ge1xuICAgICAgICAgIHBvc3QudGFncyA9IHRhZ0xpc3Q7XG4gICAgICAgICAgcmV0dXJuIHBvc3Q7XG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVBvc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbTogUG9zdFR5cGUpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCB7XG4gICAgY29udGVudCxcbiAgICBncm91cElkLFxuICAgIG5hbWUsXG4gICAgcGFyZW50SWQsXG4gICAgcG9zdElkLFxuICAgIHByaXZhY3ksXG4gICAgdHlwZVxuICB9OiBQb3N0VHlwZSA9IGl0ZW07XG5cbiAgY29uc3QgdXBkYXRlOiBQb3N0VHlwZSA9IHtcbiAgICBjb250ZW50OiBjb250ZW50ID8gcGFyc2VTdHJpbmcoY29udGVudCwgTUFYX0NPTlRFTlRfTEVOR1RIKSA6IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWU6IG5hbWUgPyBwYXJzZVN0cmluZyhuYW1lLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIHBhcmVudElkOiBwYXJlbnRJZCA/IHBhcnNlU3RyaW5nKHBhcmVudElkLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIHByaXZhY3k6IHByaXZhY3kgPyBwYXJzZVZhckNoYXIocHJpdmFjeSwgMTYpIDogdW5kZWZpbmVkLFxuICAgIHR5cGU6IHR5cGUgIT09IHVuZGVmaW5lZCA/IHBhcnNlQ2hhcih0eXBlLCAxNikgOiB1bmRlZmluZWRcbiAgfTtcblxuICBsZXQgZm9ybWF0SWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcbiAgZm9ybWF0SWQgPSBmb3JtYXRJZCA9PT0gJycgPyBjcmVhdGVIYXNoKGBwb3N0LSR7c2Vzc2lvbklkfWApIDogZm9ybWF0SWQ7XG4gIGNvbnN0IGZvcm1hdEdyb3VwSWQ6IHN0cmluZyA9IHBhcnNlSWQoZ3JvdXBJZCk7XG4gIGNvbnN0IGluc2VydDogYW55ID0ge1xuICAgIC4uLnVwZGF0ZSxcbiAgICBfa2V5OiBmb3JtYXRJZCxcbiAgICBhZGRlZDogbm93LFxuICAgIGdyb3VwSWQ6IGZvcm1hdEdyb3VwSWQsXG4gICAgcHJpdmFjeSxcbiAgICB1c2VySWQ6IHNlc3Npb25JZFxuICB9O1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZSk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke2Zvcm1hdElkfSwgdXNlcklkOiAke3Nlc3Npb25JZH19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBwb3N0cyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1cGRhdGVkUG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IHVwZGF0ZWRQb3N0S2V5fSA9IHVwZGF0ZWRQb3N0O1xuXG4gICAgICAvLyBVcGRhdGUgbGlua2VkIHRhZ3NcbiAgICAgIHJldHVybiBleHRyYWN0VGFncyhkYiwgJ3Bvc3RzJywgdXBkYXRlZFBvc3RLZXksIHVwZGF0ZS5jb250ZW50IHx8ICcnKVxuICAgICAgICAudGhlbigodGFnTGlzdCA9IFtdKSA9PiB7XG4gICAgICAgICAgdXBkYXRlZFBvc3QudGFncyA9IHRhZ0xpc3Q7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgbGlua2VkIGZpbGVzXG4gICAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVUeXBlW10gPSB1cGRhdGVkUG9zdC5maWxlcyB8fCBbXTtcblxuICAgICAgICAgIGlmKGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUZpbGVzKGRiLCBmb3JtYXRJZCwgZmlsZXMpXG4gICAgICAgICAgICAgIC50aGVuKChmaWxlTGlzdCA9IFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFBvc3QuZmlsZXMgPSBmaWxlTGlzdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFBvc3Q7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZWRQb3N0LmZpbGVzID0gW107XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWRQb3N0O1xuICAgICAgICB9KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVQb3N0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGUnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChpdGVtSWQpO1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZSk7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgICAgRklMVEVSIHAuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH0gJiYgcC51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRU1PVkUgcCBJTiBwb3N0c1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgaWYocG9zdCkge1xuICAgICAgICAvLyBSZW1vdmUgdGFnIGxpbmtzXG4gICAgICAgIGNvbnN0IGVkZ2VBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB0IElOIGlzVGFnZ2VkXG4gICAgICAgICAgICBGSUxURVIgdC5fdG8gPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgICAgICAgICBSRU1PVkUgdCBJTiBpc1RhZ2dlZGA7XG5cbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KGVkZ2VBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGF0dGFjaGVkIGZpbGVzXG4gICAgICAgICAgICBjb25zdCBmaWxlQXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZiBJTiBoYXNGaWxlXG4gICAgICAgICAgICAgICAgRklMVEVSIGYuX3RvID09ICR7Zm9ybWF0SXRlbUlkfVxuICAgICAgICAgICAgICAgIFJFTU9WRSBmIElOIGhhc0ZpbGVgO1xuXG4gICAgICAgICAgICByZXR1cm4gZGIucXVlcnkoZmlsZUFxbFFyeSlcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gcG9zdClcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYW5Qb3N0cyA9IChkYXRhYmFzZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgLy8gUmVtb3ZlIGFsbCBtZXNzYWdlcyB0aGF0IGFyZSBvdmVyIDYwIGRheXMgYW5kIG5vdCBzYXZlZFxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBwIElOIHBvc3RzXG4gICAgICBGSUxURVIgcC5hZGRlZCA8IERBVEVfVElNRVNUQU1QKERBVEVfU1VCVFJBQ1QoREFURV9OT1coKSwgNjAsICdkYXknKSkgJiYgcC50eXBlID09IFwiZGVmYXVsdFwiXG4gICAgICBSRU1PVkUgcCBJTiBwb3N0c1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigocmVzdWx0czogUG9zdFR5cGVbXSA9IFtdKSA9PiByZXN1bHRzLmxlbmd0aClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUG9zdEVkZ2UgPSAoZGI6IERhdGFiYXNlLCBmaWxlOiBGaWxlVHlwZSwgcG9zdElkOiBzdHJpbmcpOiBQcm9taXNlPEZpbGVUeXBlPiA9PiB7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uID0gZGIuZWRnZUNvbGxlY3Rpb24oJ2lzUG9zdGVkJyk7XG4gIGNvbnN0IHtmaWxlSWR9ID0gZmlsZTtcbiAgY29uc3QgZm9ybWF0RmlsZUlkOiBzdHJpbmcgPSBwYXJzZUlkKGZpbGVJZCk7XG4gIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgZmlsZS0ke3Bvc3RJZH0tJHtmb3JtYXRGaWxlSWR9YCk7XG4gIGNvbnN0IGZvcm1hdFBvc3RJZDogc3RyaW5nID0gcGFyc2VJZChwb3N0SWQpO1xuICBjb25zdCBmaWxlVHlwZTogc3RyaW5nID0gcGFyc2VDaGFyKGZpbGUuZmlsZVR5cGUsIDE2KTtcblxuICBjb25zdCBlZGdlOiBhbnkgPSB7XG4gICAgX2tleTogZWRnZUlkLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIHR5cGU6IGZpbGVUeXBlXG4gIH07XG5cbiAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwgYHBvc3RzLyR7Zm9ybWF0UG9zdElkfWAsIGBmaWxlcy8ke2Zvcm1hdEZpbGVJZH1gKVxuICAgIC50aGVuKCgpID0+IGZpbGUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcbiJdfQ==
635
+
636
+ exports.createPostEdge = createPostEdge;
637
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL3Bvc3RzLnRzIl0sIm5hbWVzIjpbIk1BWF9DT05URU5UX0xFTkdUSCIsInBhcnNlUG9zdE9wdGlvbnMiLCJvcHRpb25zIiwiZnJvbSIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwidG8iLCJ0eXBlIiwibGltaXQiLCJnZXRQb3N0T3B0aW9uYWwiLCJmaWVsZHMiLCJyZWR1Y2UiLCJzZWxlY3RzIiwiZmllbGQiLCJxdWVyaWVzIiwicHVzaCIsIm9iamVjdHMiLCJnZXRQb3N0IiwiY29udGV4dCIsIml0ZW1JZCIsImRhdGFiYXNlIiwic2Vzc2lvbklkIiwidXNlcklkIiwiZm9ybWF0SXRlbUlkIiwiZGIiLCJzZWxlY3RPYmplY3RzIiwic2VsZWN0UXVlcmllcyIsImFxbFFyeSIsImFxbCIsInF1ZXJ5IiwidGhlbiIsImN1cnNvciIsIm5leHQiLCJwb3N0IiwiX2tleSIsImdyb3VwSWQiLCJwcml2YWN5IiwicHJpdmFjeUFxbFFyeSIsImpvaW4iLCJmaWx0ZXJlZFBvc3QiLCJjYXRjaCIsImVycm9yIiwiZ2V0UG9zdExpc3QiLCJhbGwiLCJnZXRQb3N0TGlzdEJ5QXJlYSIsImZvcm1hdExhdGl0dWRlIiwiZm9ybWF0TG9uZ2l0dWRlIiwiZ2V0UG9zdExpc3RCeUdyb3VwIiwiZm9ybWF0R3JvdXBJZCIsImdyb3VwcyIsImxlbmd0aCIsInBvc3RBcWxRcnkiLCJnZXRQb3N0TGlzdEJ5TGF0ZXN0IiwiZ2V0UG9zdExpc3RCeVRhZ3MiLCJ0YWdOYW1lcyIsInNvcnRCeSIsInVuZGVmaW5lZCIsIlByb21pc2UiLCJtYXAiLCJ0YWdOYW1lIiwicmVzdWx0cyIsImdldFBvc3RMaXN0QnlVc2VyIiwiZm9ybWF0VXNlcklkIiwiZ2V0UG9zdENvbW1lbnRzIiwiYWRkUG9zdCIsIml0ZW0iLCJjb250ZW50IiwibG9jYXRpb24iLCJuYW1lIiwicGFyZW50SWQiLCJub3ciLCJEYXRlIiwiaW5zZXJ0IiwiYWRkZWQiLCJtb2RpZmllZCIsInBvc3RLZXkiLCJ0YWdMaXN0IiwidGFncyIsInVwZGF0ZVBvc3QiLCJwb3N0SWQiLCJ1cGRhdGUiLCJmb3JtYXRJZCIsInVwZGF0ZWRQb3N0IiwidXBkYXRlZFBvc3RLZXkiLCJmaWxlcyIsImZpbGVMaXN0IiwiZGVsZXRlUG9zdCIsImVkZ2VBcWxRcnkiLCJmaWxlQXFsUXJ5IiwiY2xlYW5Qb3N0cyIsImNyZWF0ZVBvc3RFZGdlIiwiZmlsZSIsImVkZ2VDb2xsZWN0aW9uIiwiZmlsZUlkIiwiZm9ybWF0RmlsZUlkIiwiZWRnZUlkIiwiZm9ybWF0UG9zdElkIiwiZmlsZVR5cGUiLCJlZGdlIiwic2F2ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUlBOztBQUNBOztBQUdBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTtBQUNBLElBQU1BLGtCQUEwQixHQUFHLE1BQW5DOztBQUVPLElBQU1DLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBbUIsR0FBK0I7QUFBQSxNQUE5QkMsT0FBOEIsdUVBQVAsRUFBTztBQUFBLHNCQU96REEsT0FQeUQsQ0FFM0RDLElBRjJEO0FBQUEsTUFFM0RBLElBRjJELDhCQUVwRCxDQUZvRDtBQUFBLDBCQU96REQsT0FQeUQsQ0FHM0RFLFFBSDJEO0FBQUEsTUFHM0RBLFFBSDJELGtDQUdoRCxDQUhnRDtBQUFBLDJCQU96REYsT0FQeUQsQ0FJM0RHLFNBSjJEO0FBQUEsTUFJM0RBLFNBSjJELG1DQUkvQyxDQUorQztBQUFBLG9CQU96REgsT0FQeUQsQ0FLM0RJLEVBTDJEO0FBQUEsTUFLM0RBLEVBTDJELDRCQUt0RCxFQUxzRDtBQUFBLHNCQU96REosT0FQeUQsQ0FNM0RLLElBTjJEO0FBQUEsTUFNM0RBLElBTjJELDhCQU1wRCxTQU5vRDtBQVU3RCxTQUFPO0FBQ0xILElBQUFBLFFBQVEsRUFBRSxxQkFBU0EsUUFBVCxFQUFtQixFQUFuQixDQURMO0FBRUxJLElBQUFBLEtBQUssRUFBRSxzQkFBU0wsSUFBVCxFQUFlRyxFQUFmLENBRkY7QUFHTEQsSUFBQUEsU0FBUyxFQUFFLHFCQUFTQSxTQUFULEVBQW9CLEVBQXBCLENBSE47QUFJTEUsSUFBQUEsSUFBSSxFQUFFLHNCQUFVQSxJQUFWLEVBQWdCLEVBQWhCO0FBSkQsR0FBUDtBQU1ELENBaEJNOzs7O0FBa0JBLElBQU1FLGVBQWUsR0FBRyxTQUFsQkEsZUFBa0IsQ0FBQ0MsTUFBRDtBQUFBLFNBQzdCQSxNQUFNLENBQUNDLE1BQVAsQ0FBYyxVQUFDQyxPQUFELEVBQWVDLEtBQWYsRUFBaUM7QUFDN0MsWUFBT0EsS0FBUDtBQUNFLFdBQUssV0FBTDtBQUFrQjtBQUNoQkQsVUFBQUEsT0FBTyxDQUFDRSxPQUFSLENBQWdCQyxJQUFoQjtBQUtBSCxVQUFBQSxPQUFPLENBQUNJLE9BQVIsQ0FBZ0JELElBQWhCLENBQXFCLHFCQUFyQjtBQUNBLGlCQUFPSCxPQUFQO0FBQ0Q7O0FBQ0QsV0FBSyxNQUFMO0FBQWE7QUFDWEEsVUFBQUEsT0FBTyxDQUFDRSxPQUFSLENBQWdCQyxJQUFoQjtBQUlBSCxVQUFBQSxPQUFPLENBQUNJLE9BQVIsQ0FBZ0JELElBQWhCLENBQXFCLFdBQXJCO0FBQ0EsaUJBQU9ILE9BQVA7QUFDRDs7QUFDRCxXQUFLLE1BQUw7QUFBYTtBQUNYQSxVQUFBQSxPQUFPLENBQUNFLE9BQVIsQ0FBZ0JDLElBQWhCO0FBTUFILFVBQUFBLE9BQU8sQ0FBQ0ksT0FBUixDQUFnQkQsSUFBaEIsQ0FBcUIsV0FBckI7QUFDQSxpQkFBT0gsT0FBUDtBQUNEOztBQUNEO0FBQVM7QUFDUCxpQkFBT0EsT0FBUDtBQUNEO0FBOUJIO0FBZ0NELEdBakNELEVBaUNHO0FBQUNJLElBQUFBLE9BQU8sRUFBRSxFQUFWO0FBQWNGLElBQUFBLE9BQU8sRUFBRTtBQUF2QixHQWpDSCxDQUQ2QjtBQUFBLENBQXhCOzs7O0FBb0NBLElBQU1HLE9BQU8sR0FBRyxTQUFWQSxPQUFVLENBQUNDLE9BQUQsRUFBc0JDLE1BQXRCLEVBQTREO0FBQ2pGO0FBRGlGLE1BRTFFQyxRQUYwRSxHQUVuQ0YsT0FGbUMsQ0FFMUVFLFFBRjBFO0FBQUEsTUFFaEVWLE1BRmdFLEdBRW5DUSxPQUZtQyxDQUVoRVIsTUFGZ0U7QUFBQSxNQUVoRFcsU0FGZ0QsR0FFbkNILE9BRm1DLENBRXhESSxNQUZ3RDtBQUdqRixNQUFNQyxZQUFvQixHQUFHLG9CQUFRSixNQUFSLENBQTdCO0FBQ0EsTUFBTUssRUFBRSxHQUFHLG1CQUFNSixRQUFOLENBQVg7O0FBSmlGLHlCQUt4QlgsZUFBZSxDQUFDQyxNQUFELENBTFM7QUFBQSxNQUtqRWUsYUFMaUUsb0JBSzFFVCxPQUwwRTtBQUFBLE1BS3pDVSxhQUx5QyxvQkFLbERaLE9BTGtEOztBQU1qRixNQUFNYSxNQUFnQixPQUFHQyxhQUFILHFCQUNETCxZQURDLENBQXRCO0FBS0EsU0FBT0MsRUFBRSxDQUFDSyxLQUFILENBQVNGLE1BQVQsRUFDSkcsSUFESSxDQUNDLFVBQUNDLE1BQUQ7QUFBQSxXQUF5QkEsTUFBTSxDQUFDQyxJQUFQLEVBQXpCO0FBQUEsR0FERCxFQUVKRixJQUZJLENBRUMsWUFBeUI7QUFBQSxRQUF4QkcsSUFBd0IsdUVBQVAsRUFBTztBQUFBLFFBRTNCQyxJQUYyQixHQUtmRCxJQUxlLENBRTNCQyxJQUYyQjtBQUFBLFFBRzNCQyxPQUgyQixHQUtmRixJQUxlLENBRzNCRSxPQUgyQjtBQUFBLHdCQUtmRixJQUxlLENBSTNCRyxPQUoyQjtBQUFBLFFBSTNCQSxPQUoyQiw4QkFJakIsU0FKaUIsa0JBTzdCOztBQUNBLFFBQUlDLGFBQUo7O0FBRUEsUUFBR0YsT0FBTyxJQUFJQyxPQUFPLEtBQUssT0FBMUIsRUFBbUM7QUFDakNDLE1BQUFBLGFBQWEsMERBQ1NILElBRFQsMkJBRVRSLGFBQWEsQ0FBQ1ksSUFBZCxDQUFtQixJQUFuQixDQUZTLHVLQU1RakIsU0FOUiw2REFRUUksYUFBYSxDQUFDYSxJQUFkLENBQW1CLElBQW5CLENBUlIsT0FBYjtBQVNELEtBVkQsTUFVTyxJQUFHRixPQUFPLEtBQUssUUFBZixFQUF5QjtBQUM5QkMsTUFBQUEsYUFBYSwwREFDU0gsSUFEVCwyQkFFVFIsYUFBYSxDQUFDWSxJQUFkLENBQW1CLElBQW5CLENBRlMsNkRBSVFiLGFBQWEsQ0FBQ2EsSUFBZCxDQUFtQixJQUFuQixDQUpSLE9BQWI7QUFLRDs7QUFFRCxRQUFHRCxhQUFILEVBQWtCO0FBQ2hCLGFBQU9iLEVBQUUsQ0FBQ0ssS0FBSCxDQUFTUSxhQUFULEVBQ0pQLElBREksQ0FDQyxVQUFDQyxNQUFEO0FBQUEsZUFBeUJBLE1BQU0sQ0FBQ0MsSUFBUCxFQUF6QjtBQUFBLE9BREQsRUFFSkYsSUFGSSxDQUVDO0FBQUEsWUFBQ1MsWUFBRCx1RUFBMEIsRUFBMUI7QUFBQSxlQUFpQ0EsWUFBakM7QUFBQSxPQUZELEVBR0pDLEtBSEksQ0FHRSxVQUFDQyxLQUFELEVBQWtCO0FBQ3ZCLGNBQU1BLEtBQU47QUFDRCxPQUxJLENBQVA7QUFNRDs7QUFFRCxXQUFPLEVBQVA7QUFDRCxHQXhDSSxFQXlDSkQsS0F6Q0ksQ0F5Q0UsVUFBQ0MsS0FBRCxFQUFrQjtBQUN2QixVQUFNQSxLQUFOO0FBQ0QsR0EzQ0ksQ0FBUDtBQTRDRCxDQXZETTs7OztBQXlEQSxJQUFNQyxXQUFXLEdBQUcsU0FBZEEsV0FBYyxDQUFDeEIsT0FBRCxFQUFzQmhCLE9BQXRCLEVBQXFFO0FBQzlGO0FBRDhGLE1BRXZGa0IsUUFGdUYsR0FFbkVGLE9BRm1FLENBRXZGRSxRQUZ1RjtBQUFBLE1BRTdFVixNQUY2RSxHQUVuRVEsT0FGbUUsQ0FFN0VSLE1BRjZFOztBQUFBLDBCQUd4RVQsZ0JBQWdCLENBQUNDLE9BQUQsQ0FId0Q7QUFBQSxNQUd2Rk0sS0FIdUYscUJBR3ZGQSxLQUh1RjtBQUFBLE1BR2hGRCxJQUhnRixxQkFHaEZBLElBSGdGOztBQUFBLDBCQUlyQ0UsZUFBZSxDQUFDQyxNQUFELENBSnNCO0FBQUEsTUFJOUVlLGFBSjhFLHFCQUl2RlQsT0FKdUY7QUFBQSxNQUl0RFUsYUFKc0QscUJBSS9EWixPQUorRDs7QUFLOUYsTUFBTWEsTUFBYyxvREFDRXBCLElBREYsb0VBRWhCbUIsYUFBYSxDQUFDWSxJQUFkLENBQW1CLElBQW5CLENBRmdCLG1CQUdoQjlCLEtBQUssQ0FBQ29CLEdBSFUsK0RBS1VILGFBQWEsQ0FBQ2EsSUFBZCxDQUFtQixJQUFuQixDQUxWLE9BQXBCO0FBT0EsU0FBTyxtQkFBTWxCLFFBQU4sRUFBZ0JTLEtBQWhCLENBQXNCRixNQUF0QixFQUNKRyxJQURJLENBQ0MsVUFBQ0MsTUFBRDtBQUFBLFdBQXlCQSxNQUFNLENBQUNZLEdBQVAsRUFBekI7QUFBQSxHQURELEVBRUpILEtBRkksQ0FFRSxVQUFDQyxLQUFELEVBQWtCO0FBQ3ZCLFVBQU1BLEtBQU47QUFDRCxHQUpJLENBQVA7QUFLRCxDQWpCTTs7OztBQW1CQSxJQUFNRyxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQW9CLENBQy9CMUIsT0FEK0IsRUFFL0JkLFFBRitCLEVBRy9CQyxTQUgrQixFQUkvQkgsT0FKK0IsRUFLUDtBQUN4QjtBQUR3QixNQUVqQmtCLFFBRmlCLEdBRUdGLE9BRkgsQ0FFakJFLFFBRmlCO0FBQUEsTUFFUFYsTUFGTyxHQUVHUSxPQUZILENBRVBSLE1BRk87O0FBQUEsMkJBR0ZULGdCQUFnQixDQUFDQyxPQUFELENBSGQ7QUFBQSxNQUdqQk0sS0FIaUIsc0JBR2pCQSxLQUhpQjtBQUFBLE1BR1ZELElBSFUsc0JBR1ZBLElBSFU7O0FBSXhCLE1BQU1zQyxjQUFzQixHQUFHLHFCQUFTekMsUUFBVCxDQUEvQjtBQUNBLE1BQU0wQyxlQUF1QixHQUFHLHFCQUFTekMsU0FBVCxDQUFoQzs7QUFMd0IsMEJBTWlDSSxlQUFlLENBQUNDLE1BQUQsQ0FOaEQ7QUFBQSxNQU1SZSxhQU5RLHFCQU1qQlQsT0FOaUI7QUFBQSxNQU1nQlUsYUFOaEIscUJBTU9aLE9BTlA7O0FBT3hCWSxFQUFBQSxhQUFhLENBQUNYLElBQWQseUNBQ0k4QixjQURKLG9CQUVJQyxlQUZKO0FBTUFyQixFQUFBQSxhQUFhLENBQUNWLElBQWQsQ0FBbUIsbUJBQW5CO0FBRUEsTUFBTVksTUFBYyxpQ0FDaEJELGFBQWEsQ0FBQ1ksSUFBZCxDQUFtQixJQUFuQixDQURnQixzQ0FFRS9CLElBRkYsc0VBR2hCQyxLQUFLLENBQUNvQixHQUhVLHlFQUtVSCxhQUFhLENBQUNhLElBQWQsQ0FBbUIsSUFBbkIsQ0FMVixPQUFwQjtBQU9BLFNBQU8sbUJBQU1sQixRQUFOLEVBQWdCUyxLQUFoQixDQUFzQkYsTUFBdEIsRUFDSkcsSUFESSxDQUNDLFVBQUNDLE1BQUQ7QUFBQSxXQUF5QkEsTUFBTSxDQUFDWSxHQUFQLEVBQXpCO0FBQUEsR0FERCxFQUVKSCxLQUZJLENBRUUsVUFBQ0MsS0FBRCxFQUFrQjtBQUN2QixVQUFNQSxLQUFOO0FBQ0QsR0FKSSxDQUFQO0FBS0QsQ0FoQ007Ozs7QUFrQ0EsSUFBTU0sa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFxQixDQUNoQzdCLE9BRGdDLEVBRWhDaUIsT0FGZ0MsRUFHaENqQyxPQUhnQyxFQUlSO0FBQ3hCO0FBRHdCLE1BRWpCa0IsUUFGaUIsR0FFc0JGLE9BRnRCLENBRWpCRSxRQUZpQjtBQUFBLE1BRVBWLE1BRk8sR0FFc0JRLE9BRnRCLENBRVBSLE1BRk87QUFBQSxNQUVTVyxTQUZULEdBRXNCSCxPQUZ0QixDQUVDSSxNQUZEOztBQUFBLDBCQUdpQ2IsZUFBZSxDQUFDQyxNQUFELENBSGhEO0FBQUEsTUFHUmUsYUFIUSxxQkFHakJULE9BSGlCO0FBQUEsTUFHZ0JVLGFBSGhCLHFCQUdPWixPQUhQLEVBS3hCOzs7QUFDQSxNQUFNa0MsYUFBcUIsR0FBRyxvQkFBUWIsT0FBUixDQUE5QjtBQUNBLE1BQU1YLEVBQUUsR0FBRyxtQkFBTUosUUFBTixDQUFYO0FBQ0EsTUFBTU8sTUFBYyxpQ0FBMEJxQixhQUExQiwrQ0FDRzNCLFNBREgscUJBQXBCO0FBSUEsU0FBT0csRUFBRSxDQUFDSyxLQUFILENBQVNGLE1BQVQsRUFDSkcsSUFESSxDQUNDLFVBQUNDLE1BQUQ7QUFBQSxXQUF5QkEsTUFBTSxDQUFDWSxHQUFQLEVBQXpCO0FBQUEsR0FERCxFQUVKYixJQUZJLENBRUMsWUFBOEI7QUFBQSxRQUE3Qm1CLE1BQTZCLHVFQUFQLEVBQU87O0FBQ2xDLFFBQUdBLE1BQU0sQ0FBQ0MsTUFBVixFQUFrQjtBQUFBLCtCQUNNakQsZ0JBQWdCLENBQUNDLE9BQUQsQ0FEdEI7QUFBQSxVQUNUTSxLQURTLHNCQUNUQSxLQURTO0FBQUEsVUFDRkQsSUFERSxzQkFDRkEsSUFERTs7QUFFaEIsVUFBTTRDLFVBQWtCLDBEQUNGNUMsSUFERSxrQ0FDd0J5QyxhQUR4QiwrQ0FFcEJ0QixhQUFhLENBQUNZLElBQWQsQ0FBbUIsSUFBbkIsQ0FGb0IseUJBR3BCOUIsS0FBSyxDQUFDb0IsR0FIYywyRUFLTUgsYUFBYSxDQUFDYSxJQUFkLENBQW1CLElBQW5CLENBTE4sT0FBeEI7QUFPQSxhQUFPZCxFQUFFLENBQUNLLEtBQUgsQ0FBU3NCLFVBQVQsRUFDSnJCLElBREksQ0FDQyxVQUFDQyxNQUFEO0FBQUEsZUFBeUJBLE1BQU0sQ0FBQ1ksR0FBUCxFQUF6QjtBQUFBLE9BREQsRUFFSkgsS0FGSSxDQUVFLFVBQUNDLEtBQUQsRUFBa0I7QUFDdkIsY0FBTUEsS0FBTjtBQUNELE9BSkksQ0FBUDtBQUtEOztBQUVELFdBQU8sRUFBUDtBQUNELEdBcEJJLEVBcUJKRCxLQXJCSSxDQXFCRSxVQUFDQyxLQUFELEVBQWtCO0FBQ3ZCLFVBQU1BLEtBQU47QUFDRCxHQXZCSSxDQUFQO0FBd0JELENBeENNOzs7O0FBMENBLElBQU1XLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBc0IsQ0FBQ2xDLE9BQUQsRUFBc0JoQixPQUF0QixFQUFxRTtBQUN0RztBQURzRyxNQUUvRmtCLFFBRitGLEdBRTNFRixPQUYyRSxDQUUvRkUsUUFGK0Y7QUFBQSxNQUVyRlYsTUFGcUYsR0FFM0VRLE9BRjJFLENBRXJGUixNQUZxRjs7QUFBQSwyQkFHaEZULGdCQUFnQixDQUFDQyxPQUFELENBSGdFO0FBQUEsTUFHL0ZNLEtBSCtGLHNCQUcvRkEsS0FIK0Y7QUFBQSxNQUd4RkQsSUFId0Ysc0JBR3hGQSxJQUh3Rjs7QUFBQSwwQkFJN0NFLGVBQWUsQ0FBQ0MsTUFBRCxDQUo4QjtBQUFBLE1BSXRGZSxhQUpzRixxQkFJL0ZULE9BSitGO0FBQUEsTUFJOURVLGFBSjhELHFCQUl2RVosT0FKdUU7O0FBS3RHLE1BQU1hLE1BQWMsb0RBQ0VwQixJQURGLG9FQUVoQm1CLGFBQWEsQ0FBQ1ksSUFBZCxDQUFtQixJQUFuQixDQUZnQixtQkFHaEI5QixLQUFLLENBQUNvQixHQUhVLCtEQUtVSCxhQUFhLENBQUNhLElBQWQsQ0FBbUIsSUFBbkIsQ0FMVixPQUFwQjtBQU9BLFNBQU8sbUJBQU1sQixRQUFOLEVBQWdCUyxLQUFoQixDQUFzQkYsTUFBdEIsRUFDSkcsSUFESSxDQUNDLFVBQUNDLE1BQUQ7QUFBQSxXQUF5QkEsTUFBTSxDQUFDWSxHQUFQLEVBQXpCO0FBQUEsR0FERCxFQUVKSCxLQUZJLENBRUUsVUFBQ0MsS0FBRCxFQUFrQjtBQUN2QixVQUFNQSxLQUFOO0FBQ0QsR0FKSSxDQUFQO0FBS0QsQ0FqQk07Ozs7QUFtQkEsSUFBTVksaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQixDQUMvQm5DLE9BRCtCLEVBRS9Cb0MsUUFGK0IsRUFHL0JwRCxPQUgrQixFQUlQO0FBQ3hCO0FBRHdCLE1BRWpCa0IsUUFGaUIsR0FFR0YsT0FGSCxDQUVqQkUsUUFGaUI7QUFBQSxNQUVQVixNQUZPLEdBRUdRLE9BRkgsQ0FFUFIsTUFGTzs7QUFBQSwyQkFHbUJULGdCQUFnQixDQUFDQyxPQUFELENBSG5DO0FBQUEsTUFHakJFLFFBSGlCLHNCQUdqQkEsUUFIaUI7QUFBQSxNQUdQQyxTQUhPLHNCQUdQQSxTQUhPO0FBQUEsTUFHSUcsS0FISixzQkFHSUEsS0FISjtBQUFBLE1BR1dELElBSFgsc0JBR1dBLElBSFg7O0FBQUEsMEJBSWlDRSxlQUFlLENBQUNDLE1BQUQsQ0FKaEQ7QUFBQSxNQUlSZSxhQUpRLHFCQUlqQlQsT0FKaUI7QUFBQSxNQUlnQlUsYUFKaEIscUJBSU9aLE9BSlA7O0FBS3hCLE1BQU15QyxNQUFnQixHQUFHLEVBQXpCOztBQUVBLE1BQUduRCxRQUFRLEtBQUtvRCxTQUFiLElBQTBCbkQsU0FBUyxLQUFLbUQsU0FBM0MsRUFBc0Q7QUFDcEQsUUFBTVgsY0FBc0IsR0FBRyxxQkFBU3pDLFFBQVQsQ0FBL0I7QUFDQSxRQUFNMEMsZUFBdUIsR0FBRyxxQkFBU3pDLFNBQVQsQ0FBaEM7QUFDQXFCLElBQUFBLGFBQWEsQ0FBQ1gsSUFBZCwyQ0FDSThCLGNBREosc0JBRUlDLGVBRko7QUFNQXJCLElBQUFBLGFBQWEsQ0FBQ1YsSUFBZCxDQUFtQixtQkFBbkI7QUFDQXdDLElBQUFBLE1BQU0sQ0FBQ3hDLElBQVAsQ0FBWSxVQUFaO0FBQ0Q7O0FBRUR3QyxFQUFBQSxNQUFNLENBQUN4QyxJQUFQLENBQVksU0FBWjtBQUVBLFNBQU8wQyxPQUFPLENBQUNkLEdBQVIsQ0FDTFcsUUFBUSxDQUFDSSxHQUFULENBQWEsVUFBQ0MsT0FBRCxFQUFxQjtBQUNoQyxRQUFNaEMsTUFBYyx1RUFDVWdDLE9BRFYsOEVBR2hCakMsYUFBYSxDQUFDWSxJQUFkLENBQW1CLElBQW5CLENBSGdCLHlDQUlDL0IsSUFKRCx5RUFLaEJDLEtBQUssQ0FBQ29CLEdBTFUsNEJBTVgyQixNQUFNLENBQUNqQixJQUFQLENBQVksSUFBWixDQU5XLGlEQU9VYixhQUFhLENBQUNhLElBQWQsQ0FBbUIsSUFBbkIsQ0FQVixPQUFwQjtBQVNBLFdBQU8sbUJBQU1sQixRQUFOLEVBQWdCUyxLQUFoQixDQUFzQkYsTUFBdEIsRUFDSkcsSUFESSxDQUNDLFVBQUNDLE1BQUQ7QUFBQSxhQUF5QkEsTUFBTSxDQUFDWSxHQUFQLEVBQXpCO0FBQUEsS0FERCxFQUVKSCxLQUZJLENBRUU7QUFBQSxhQUFNLEVBQU47QUFBQSxLQUZGLENBQVA7QUFHRCxHQWJELENBREssRUFlSlYsSUFmSSxDQWVDLFVBQUM4QixPQUFEO0FBQUEsV0FBYSxxQkFBTyxzQkFBUUEsT0FBUixDQUFQLEVBQXlCLE1BQXpCLENBQWI7QUFBQSxHQWZELEVBZ0JKcEIsS0FoQkksQ0FnQkUsVUFBQ0MsS0FBRCxFQUFrQjtBQUN2QixVQUFNQSxLQUFOO0FBQ0QsR0FsQkksQ0FBUDtBQW1CRCxDQTdDTTs7OztBQStDQSxJQUFNb0IsaUJBQWlCLEdBQUcsU0FBcEJBLGlCQUFvQixDQUFDM0MsT0FBRCxFQUFzQkksTUFBdEIsRUFBc0NwQixPQUF0QyxFQUFxRjtBQUNwSDtBQURvSCxNQUU3R2tCLFFBRjZHLEdBRXpGRixPQUZ5RixDQUU3R0UsUUFGNkc7QUFBQSxNQUVuR1YsTUFGbUcsR0FFekZRLE9BRnlGLENBRW5HUixNQUZtRzs7QUFBQSwyQkFHOUZULGdCQUFnQixDQUFDQyxPQUFELENBSDhFO0FBQUEsTUFHN0dNLEtBSDZHLHNCQUc3R0EsS0FINkc7QUFBQSxNQUd0R0QsSUFIc0csc0JBR3RHQSxJQUhzRzs7QUFJcEgsTUFBTXVELFlBQW9CLEdBQUcsb0JBQVF4QyxNQUFSLENBQTdCOztBQUpvSCwwQkFLM0RiLGVBQWUsQ0FBQ0MsTUFBRCxDQUw0QztBQUFBLE1BS3BHZSxhQUxvRyxxQkFLN0dULE9BTDZHO0FBQUEsTUFLNUVVLGFBTDRFLHFCQUtyRlosT0FMcUY7O0FBTXBILE1BQU1hLE1BQWMsc0RBQ0ltQyxZQURKLCtCQUNtQ3ZELElBRG5DLG9FQUVoQm1CLGFBQWEsQ0FBQ1ksSUFBZCxDQUFtQixJQUFuQixDQUZnQixtQkFHaEI5QixLQUFLLENBQUNvQixHQUhVLCtEQUtVSCxhQUFhLENBQUNhLElBQWQsQ0FBbUIsSUFBbkIsQ0FMVixPQUFwQjtBQU9BLFNBQU8sbUJBQU1sQixRQUFOLEVBQWdCUyxLQUFoQixDQUFzQkYsTUFBdEIsRUFDSkcsSUFESSxDQUNDLFVBQUNDLE1BQUQ7QUFBQSxXQUF5QkEsTUFBTSxDQUFDWSxHQUFQLEVBQXpCO0FBQUEsR0FERCxFQUVKSCxLQUZJLENBRUUsVUFBQ0MsS0FBRCxFQUFrQjtBQUN2QixVQUFNQSxLQUFOO0FBQ0QsR0FKSSxDQUFQO0FBS0QsQ0FsQk07Ozs7QUFvQkEsSUFBTXNCLGVBQWUsR0FBRyxTQUFsQkEsZUFBa0IsQ0FBQzdDLE9BQUQsRUFBc0JDLE1BQXRCLEVBQXNDakIsT0FBdEMsRUFBcUY7QUFDbEg7QUFEa0gsTUFFM0drQixRQUYyRyxHQUU1RUYsT0FGNEUsQ0FFM0dFLFFBRjJHO0FBQUEsTUFFekZDLFNBRnlGLEdBRTVFSCxPQUY0RSxDQUVqR0ksTUFGaUc7O0FBQUEsMkJBRzVGckIsZ0JBQWdCLENBQUNDLE9BQUQsQ0FINEU7QUFBQSxNQUczR00sS0FIMkcsc0JBRzNHQSxLQUgyRztBQUFBLE1BR3BHRCxJQUhvRyxzQkFHcEdBLElBSG9HOztBQUlsSCxNQUFNZ0IsWUFBb0IsR0FBRyxvQkFBUUosTUFBUixDQUE3QixDQUprSCxDQU1sSDs7QUFDQSxNQUFNSyxFQUFFLEdBQUcsbUJBQU1KLFFBQU4sQ0FBWDtBQUNBLE1BQU1PLE1BQWdCLE9BQUdDLGFBQUgsc0JBQ0RyQixJQURDLEVBQ29CZ0IsWUFEcEIsQ0FBdEI7QUFLQSxTQUFPQyxFQUFFLENBQUNLLEtBQUgsQ0FBU0YsTUFBVCxFQUNKRyxJQURJLENBQ0MsVUFBQ0MsTUFBRDtBQUFBLFdBQXlCQSxNQUFNLENBQUNDLElBQVAsRUFBekI7QUFBQSxHQURELEVBRUpGLElBRkksQ0FFQyxZQUF5QjtBQUFBLFFBQXhCRyxJQUF3Qix1RUFBUCxFQUFPO0FBQUEsUUFFM0JDLElBRjJCLEdBS2ZELElBTGUsQ0FFM0JDLElBRjJCO0FBQUEsUUFHM0JDLE9BSDJCLEdBS2ZGLElBTGUsQ0FHM0JFLE9BSDJCO0FBQUEseUJBS2ZGLElBTGUsQ0FJM0JHLE9BSjJCO0FBQUEsUUFJM0JBLE9BSjJCLCtCQUlqQixRQUppQixtQkFPN0I7O0FBQ0EsUUFBSUMsYUFBSjs7QUFFQSxRQUFHRixPQUFPLElBQUlDLE9BQU8sS0FBSyxPQUExQixFQUFtQztBQUNqQ0MsTUFBQUEsYUFBYSx5RkFFV0gsSUFGWCxtYkFXU2IsU0FYVCxtREFhVGIsS0FBSyxDQUFDb0IsR0FiRyxvRUFBYjtBQWVELEtBaEJELE1BZ0JPLElBQUdRLE9BQU8sS0FBSyxRQUFmLEVBQXlCO0FBQzlCQyxNQUFBQSxhQUFhLHlGQUVXSCxJQUZYLDJUQVNUMUIsS0FBSyxDQUFDb0IsR0FURyxvRUFBYjtBQVdEOztBQUVELFFBQUdTLGFBQUgsRUFBa0I7QUFDaEIsYUFBT2IsRUFBRSxDQUFDSyxLQUFILENBQVNRLGFBQVQsRUFDSlAsSUFESSxDQUNDLFVBQUNDLE1BQUQ7QUFBQSxlQUF5QkEsTUFBTSxDQUFDWSxHQUFQLEVBQXpCO0FBQUEsT0FERCxFQUVKSCxLQUZJLENBRUUsVUFBQ0MsS0FBRCxFQUFrQjtBQUN2QixjQUFNQSxLQUFOO0FBQ0QsT0FKSSxDQUFQO0FBS0Q7O0FBRUQsV0FBTyxFQUFQO0FBQ0QsR0FuREksRUFvREpELEtBcERJLENBb0RFLFVBQUNDLEtBQUQsRUFBa0I7QUFDdkIsVUFBTUEsS0FBTjtBQUNELEdBdERJLENBQVA7QUF1REQsQ0FwRU07Ozs7QUFzRUEsSUFBTXVCLE9BQU8sR0FBRyxTQUFWQSxPQUFVLENBQUM5QyxPQUFELEVBQXNCK0MsSUFBdEIsRUFBNEQ7QUFDakY7QUFEaUYsTUFFMUU3QyxRQUYwRSxHQUUzQ0YsT0FGMkMsQ0FFMUVFLFFBRjBFO0FBQUEsTUFFeERDLFNBRndELEdBRTNDSCxPQUYyQyxDQUVoRUksTUFGZ0U7QUFBQSxzQkFjbkUyQyxJQWRtRSxDQUsvRUMsT0FMK0U7QUFBQSxNQUsvRUEsT0FMK0UsOEJBS3JFLEVBTHFFO0FBQUEsc0JBY25FRCxJQWRtRSxDQU0vRTlCLE9BTitFO0FBQUEsTUFNL0VBLE9BTitFLDhCQU1yRSxFQU5xRTtBQUFBLE1BTy9FZ0MsUUFQK0UsR0FjbkVGLElBZG1FLENBTy9FRSxRQVArRTtBQUFBLE1BUS9FL0QsUUFSK0UsR0FjbkU2RCxJQWRtRSxDQVEvRTdELFFBUitFO0FBQUEsTUFTL0VDLFNBVCtFLEdBY25FNEQsSUFkbUUsQ0FTL0U1RCxTQVQrRTtBQUFBLG1CQWNuRTRELElBZG1FLENBVS9FRyxJQVYrRTtBQUFBLE1BVS9FQSxJQVYrRSwyQkFVeEUsRUFWd0U7QUFBQSx1QkFjbkVILElBZG1FLENBVy9FSSxRQVgrRTtBQUFBLE1BVy9FQSxRQVgrRSwrQkFXcEUsSUFYb0U7QUFBQSxzQkFjbkVKLElBZG1FLENBWS9FN0IsT0FaK0U7QUFBQSxNQVkvRUEsT0FaK0UsOEJBWXJFLFFBWnFFO0FBQUEsbUJBY25FNkIsSUFkbUUsQ0FhL0UxRCxJQWIrRTtBQUFBLE1BYS9FQSxJQWIrRSwyQkFheEUsU0Fid0U7QUFnQmpGLE1BQU0rRCxHQUFXLEdBQUdDLElBQUksQ0FBQ0QsR0FBTCxFQUFwQjtBQUVBLE1BQU1FLE1BQWdCLEdBQUc7QUFDdkJ0QyxJQUFBQSxJQUFJLEVBQUUsc0NBQW1CYixTQUFuQixFQURpQjtBQUV2Qm9ELElBQUFBLEtBQUssRUFBRUgsR0FGZ0I7QUFHdkJKLElBQUFBLE9BQU8sRUFBRSx3QkFBWUEsT0FBWixFQUFxQmxFLGtCQUFyQixDQUhjO0FBSXZCbUMsSUFBQUEsT0FBTyxFQUFFQSxPQUFPLEdBQUcsb0JBQVFBLE9BQVIsQ0FBSCxHQUFzQnFCLFNBSmY7QUFLdkJwRCxJQUFBQSxRQUFRLEVBQUVBLFFBQVEsS0FBS29ELFNBQWIsR0FBeUIscUJBQVNwRCxRQUFULENBQXpCLEdBQThDb0QsU0FMakM7QUFNdkJXLElBQUFBLFFBQVEsRUFBRUEsUUFBUSxHQUFHLHdCQUFZQSxRQUFaLEVBQXNCLEdBQXRCLENBQUgsR0FBZ0NYLFNBTjNCO0FBT3ZCbkQsSUFBQUEsU0FBUyxFQUFFQSxTQUFTLEtBQUttRCxTQUFkLEdBQTBCLHFCQUFTbkQsU0FBVCxDQUExQixHQUFnRG1ELFNBUHBDO0FBUXZCa0IsSUFBQUEsUUFBUSxFQUFFSixHQVJhO0FBU3ZCRixJQUFBQSxJQUFJLEVBQUUsd0JBQVlBLElBQVosRUFBa0IsR0FBbEIsQ0FUaUI7QUFVdkJDLElBQUFBLFFBQVEsRUFBRUEsUUFBUSxHQUFHLG9CQUFRQSxRQUFSLENBQUgsR0FBdUJiLFNBVmxCO0FBV3ZCcEIsSUFBQUEsT0FBTyxFQUFFQSxPQUFPLEdBQUcseUJBQWFBLE9BQWIsRUFBc0IsRUFBdEIsQ0FBSCxHQUErQm9CLFNBWHhCO0FBWXZCakQsSUFBQUEsSUFBSSxFQUFFLHNCQUFVQSxJQUFWLEVBQWdCLEVBQWhCLENBWmlCO0FBYXZCZSxJQUFBQSxNQUFNLEVBQUVEO0FBYmUsR0FBekI7QUFnQkEsTUFBTUcsRUFBWSxHQUFHLG1CQUFNSixRQUFOLENBQXJCO0FBQ0EsTUFBTU8sTUFBZ0IsT0FBR0MsYUFBSCxzQkFBZ0I0QyxNQUFoQixDQUF0QjtBQUVBLFNBQU9oRCxFQUFFLENBQUNLLEtBQUgsQ0FBU0YsTUFBVCxFQUNKRyxJQURJLENBQ0MsVUFBQ0MsTUFBRDtBQUFBLFdBQXlCQSxNQUFNLENBQUNDLElBQVAsRUFBekI7QUFBQSxHQURELEVBRUpGLElBRkksQ0FFQyxZQUF5QjtBQUFBLFFBQXhCRyxJQUF3Qix1RUFBUCxFQUFPO0FBQUEsUUFDaEIwQyxPQURnQixHQUNMMUMsSUFESyxDQUN0QkMsSUFEc0IsRUFHN0I7O0FBQ0EsV0FBTyx1QkFBWVYsRUFBWixFQUFnQixPQUFoQixFQUF5Qm1ELE9BQXpCLEVBQWtDSCxNQUFNLENBQUNOLE9BQXpDLEVBQ0pwQyxJQURJLENBQ0MsVUFBQzhDLE9BQUQsRUFBd0I7QUFDNUIzQyxNQUFBQSxJQUFJLENBQUM0QyxJQUFMLEdBQVlELE9BQVo7QUFDQSxhQUFPM0MsSUFBUDtBQUNELEtBSkksQ0FBUDtBQUtELEdBWEksRUFZSk8sS0FaSSxDQVlFLFVBQUNDLEtBQUQsRUFBa0I7QUFDdkIsVUFBTUEsS0FBTjtBQUNELEdBZEksQ0FBUDtBQWVELENBcERNOzs7O0FBc0RBLElBQU1xQyxVQUFVLEdBQUcsU0FBYkEsVUFBYSxDQUFDNUQsT0FBRCxFQUFzQitDLElBQXRCLEVBQTREO0FBQ3BGO0FBRG9GLE1BRTdFN0MsUUFGNkUsR0FFOUNGLE9BRjhDLENBRTdFRSxRQUY2RTtBQUFBLE1BRTNEQyxTQUYyRCxHQUU5Q0gsT0FGOEMsQ0FFbkVJLE1BRm1FO0FBR3BGLE1BQU1nRCxHQUFXLEdBQUdDLElBQUksQ0FBQ0QsR0FBTCxFQUFwQjtBQUhvRixNQUtsRkosT0FMa0YsR0FZdEVELElBWnNFLENBS2xGQyxPQUxrRjtBQUFBLE1BTWxGL0IsT0FOa0YsR0FZdEU4QixJQVpzRSxDQU1sRjlCLE9BTmtGO0FBQUEsTUFPbEZpQyxJQVBrRixHQVl0RUgsSUFac0UsQ0FPbEZHLElBUGtGO0FBQUEsTUFRbEZDLFFBUmtGLEdBWXRFSixJQVpzRSxDQVFsRkksUUFSa0Y7QUFBQSxNQVNsRlUsTUFUa0YsR0FZdEVkLElBWnNFLENBU2xGYyxNQVRrRjtBQUFBLE1BVWxGM0MsT0FWa0YsR0FZdEU2QixJQVpzRSxDQVVsRjdCLE9BVmtGO0FBQUEsTUFXbEY3QixJQVhrRixHQVl0RTBELElBWnNFLENBV2xGMUQsSUFYa0Y7QUFjcEYsTUFBTXlFLE1BQWdCLEdBQUc7QUFDdkJkLElBQUFBLE9BQU8sRUFBRUEsT0FBTyxHQUFHLHdCQUFZQSxPQUFaLEVBQXFCbEUsa0JBQXJCLENBQUgsR0FBOEN3RCxTQUR2QztBQUV2QmtCLElBQUFBLFFBQVEsRUFBRUosR0FGYTtBQUd2QkYsSUFBQUEsSUFBSSxFQUFFQSxJQUFJLEdBQUcsd0JBQVlBLElBQVosRUFBa0IsR0FBbEIsQ0FBSCxHQUE0QlosU0FIZjtBQUl2QmEsSUFBQUEsUUFBUSxFQUFFQSxRQUFRLEdBQUcsd0JBQVlBLFFBQVosRUFBc0IsR0FBdEIsQ0FBSCxHQUFnQ2IsU0FKM0I7QUFLdkJwQixJQUFBQSxPQUFPLEVBQUVBLE9BQU8sR0FBRyx5QkFBYUEsT0FBYixFQUFzQixFQUF0QixDQUFILEdBQStCb0IsU0FMeEI7QUFNdkJqRCxJQUFBQSxJQUFJLEVBQUVBLElBQUksS0FBS2lELFNBQVQsR0FBcUIsc0JBQVVqRCxJQUFWLEVBQWdCLEVBQWhCLENBQXJCLEdBQTJDaUQ7QUFOMUIsR0FBekI7QUFTQSxNQUFJeUIsUUFBZ0IsR0FBRyxvQkFBUUYsTUFBUixDQUF2QjtBQUNBRSxFQUFBQSxRQUFRLEdBQUdBLFFBQVEsS0FBSyxFQUFiLEdBQWtCLHNDQUFtQjVELFNBQW5CLEVBQWxCLEdBQW9ENEQsUUFBL0Q7QUFDQSxNQUFNakMsYUFBcUIsR0FBRyxvQkFBUWIsT0FBUixDQUE5Qjs7QUFDQSxNQUFNcUMsTUFBVyxxQkFDWlEsTUFEWTtBQUVmOUMsSUFBQUEsSUFBSSxFQUFFK0MsUUFGUztBQUdmUixJQUFBQSxLQUFLLEVBQUVILEdBSFE7QUFJZm5DLElBQUFBLE9BQU8sRUFBRWEsYUFKTTtBQUtmWixJQUFBQSxPQUFPLEVBQVBBLE9BTGU7QUFNZmQsSUFBQUEsTUFBTSxFQUFFRDtBQU5PLElBQWpCOztBQVFBLE1BQU1HLEVBQVksR0FBRyxtQkFBTUosUUFBTixDQUFyQjtBQUNBLE1BQU1PLE1BQWdCLE9BQUdDLGFBQUgsc0JBQXVCcUQsUUFBdkIsRUFBNEM1RCxTQUE1QyxFQUNYbUQsTUFEVyxFQUVYUSxNQUZXLENBQXRCO0FBS0EsU0FBT3hELEVBQUUsQ0FBQ0ssS0FBSCxDQUFTRixNQUFULEVBQ0pHLElBREksQ0FDQyxVQUFDQyxNQUFEO0FBQUEsV0FBeUJBLE1BQU0sQ0FBQ0MsSUFBUCxFQUF6QjtBQUFBLEdBREQsRUFFSkYsSUFGSSxDQUVDLFlBQWdDO0FBQUEsUUFBL0JvRCxXQUErQix1RUFBUCxFQUFPO0FBQUEsUUFDdkJDLGNBRHVCLEdBQ0xELFdBREssQ0FDN0JoRCxJQUQ2QixFQUdwQzs7QUFDQSxXQUFPLHVCQUFZVixFQUFaLEVBQWdCLE9BQWhCLEVBQXlCMkQsY0FBekIsRUFBeUNILE1BQU0sQ0FBQ2QsT0FBUCxJQUFrQixFQUEzRCxFQUNKcEMsSUFESSxDQUNDLFlBQWtCO0FBQUEsVUFBakI4QyxPQUFpQix1RUFBUCxFQUFPO0FBQ3RCTSxNQUFBQSxXQUFXLENBQUNMLElBQVosR0FBbUJELE9BQW5CLENBRHNCLENBR3RCOztBQUNBLFVBQU1RLEtBQWlCLEdBQUdGLFdBQVcsQ0FBQ0UsS0FBWixJQUFxQixFQUEvQzs7QUFFQSxVQUFHQSxLQUFLLENBQUNsQyxNQUFULEVBQWlCO0FBQ2YsZUFBTyx3QkFBWTFCLEVBQVosRUFBZ0J5RCxRQUFoQixFQUEwQkcsS0FBMUIsRUFDSnRELElBREksQ0FDQyxZQUFtQjtBQUFBLGNBQWxCdUQsUUFBa0IsdUVBQVAsRUFBTztBQUN2QkgsVUFBQUEsV0FBVyxDQUFDRSxLQUFaLEdBQW9CQyxRQUFwQjtBQUNBLGlCQUFPSCxXQUFQO0FBQ0QsU0FKSSxDQUFQO0FBS0Q7O0FBRURBLE1BQUFBLFdBQVcsQ0FBQ0UsS0FBWixHQUFvQixFQUFwQjtBQUNBLGFBQU9GLFdBQVA7QUFDRCxLQWpCSSxDQUFQO0FBa0JELEdBeEJJLEVBeUJKMUMsS0F6QkksQ0F5QkUsVUFBQ0MsS0FBRCxFQUFrQjtBQUN2QixVQUFNQSxLQUFOO0FBQ0QsR0EzQkksQ0FBUDtBQTRCRCxDQXBFTTs7OztBQXNFQSxJQUFNNkMsVUFBVSxHQUFHLFNBQWJBLFVBQWEsQ0FBQ3BFLE9BQUQsRUFBc0JDLE1BQXRCLEVBQTREO0FBQ3BGO0FBRG9GLE1BRTdFQyxRQUY2RSxHQUU5Q0YsT0FGOEMsQ0FFN0VFLFFBRjZFO0FBQUEsTUFFM0RDLFNBRjJELEdBRTlDSCxPQUY4QyxDQUVuRUksTUFGbUU7QUFHcEYsTUFBTUMsWUFBb0IsR0FBRyxvQkFBUUosTUFBUixDQUE3QjtBQUNBLE1BQU1LLEVBQVksR0FBRyxtQkFBTUosUUFBTixDQUFyQjtBQUNBLE1BQU1PLE1BQU0sT0FBR0MsYUFBSCxzQkFDV0wsWUFEWCxFQUMwQ0YsU0FEMUMsQ0FBWjtBQU1BLFNBQU9HLEVBQUUsQ0FBQ0ssS0FBSCxDQUFTRixNQUFULEVBQ0pHLElBREksQ0FDQyxVQUFDQyxNQUFEO0FBQUEsV0FBeUJBLE1BQU0sQ0FBQ0MsSUFBUCxFQUF6QjtBQUFBLEdBREQsRUFFSkYsSUFGSSxDQUVDLFlBQXlCO0FBQUEsUUFBeEJHLElBQXdCLHVFQUFQLEVBQU87O0FBQzdCLFFBQUdBLElBQUgsRUFBUztBQUNQO0FBQ0EsVUFBTXNELFVBQW9CLE9BQUczRCxhQUFILHNCQUNKTCxZQURJLENBQTFCO0FBSUEsYUFBT0MsRUFBRSxDQUFDSyxLQUFILENBQVMwRCxVQUFULEVBQ0p6RCxJQURJLENBQ0MsWUFBTTtBQUNWO0FBQ0EsWUFBTTBELFVBQW9CLE9BQUc1RCxhQUFILHNCQUNKTCxZQURJLENBQTFCO0FBSUEsZUFBT0MsRUFBRSxDQUFDSyxLQUFILENBQVMyRCxVQUFULEVBQ0oxRCxJQURJLENBQ0M7QUFBQSxpQkFBTUcsSUFBTjtBQUFBLFNBREQsRUFFSk8sS0FGSSxDQUVFLFVBQUNDLEtBQUQsRUFBa0I7QUFDdkIsZ0JBQU1BLEtBQU47QUFDRCxTQUpJLENBQVA7QUFLRCxPQVpJLEVBYUpELEtBYkksQ0FhRSxVQUFDQyxLQUFELEVBQWtCO0FBQ3ZCLGNBQU1BLEtBQU47QUFDRCxPQWZJLENBQVA7QUFnQkQ7O0FBQ0QsV0FBTyxFQUFQO0FBQ0QsR0EzQkksRUE0QkpELEtBNUJJLENBNEJFLFVBQUNDLEtBQUQsRUFBa0I7QUFDdkIsVUFBTUEsS0FBTjtBQUNELEdBOUJJLENBQVA7QUErQkQsQ0ExQ007Ozs7QUE0Q0EsSUFBTWdELFVBQVUsR0FBRyxTQUFiQSxVQUFhLENBQUNyRSxRQUFELEVBQXVDO0FBQy9EO0FBQ0EsTUFBTU8sTUFBZ0IsT0FBR0MsYUFBSCxxQkFBdEI7QUFLQSxTQUFPLG1CQUFNUixRQUFOLEVBQWdCUyxLQUFoQixDQUFzQkYsTUFBdEIsRUFDSkcsSUFESSxDQUNDLFVBQUNDLE1BQUQ7QUFBQSxXQUF5QkEsTUFBTSxDQUFDWSxHQUFQLEVBQXpCO0FBQUEsR0FERCxFQUVKYixJQUZJLENBRUM7QUFBQSxRQUFDOEIsT0FBRCx1RUFBdUIsRUFBdkI7QUFBQSxXQUE4QkEsT0FBTyxDQUFDVixNQUF0QztBQUFBLEdBRkQsRUFHSlYsS0FISSxDQUdFLFVBQUNDLEtBQUQsRUFBa0I7QUFDdkIsVUFBTUEsS0FBTjtBQUNELEdBTEksQ0FBUDtBQU1ELENBYk07Ozs7QUFlQSxJQUFNaUQsY0FBYyxHQUFHLFNBQWpCQSxjQUFpQixDQUFDbEUsRUFBRCxFQUFlbUUsSUFBZixFQUErQlosTUFBL0IsRUFBcUU7QUFDakcsTUFBTWEsY0FBYyxHQUFHcEUsRUFBRSxDQUFDb0UsY0FBSCxDQUFrQixVQUFsQixDQUF2QjtBQURpRyxNQUUxRkMsTUFGMEYsR0FFaEZGLElBRmdGLENBRTFGRSxNQUYwRjtBQUdqRyxNQUFNQyxZQUFvQixHQUFHLG9CQUFRRCxNQUFSLENBQTdCO0FBQ0EsTUFBTUUsTUFBYyxHQUFHLHNDQUFtQmhCLE1BQW5CLGNBQTZCZSxZQUE3QixFQUF2QjtBQUNBLE1BQU1FLFlBQW9CLEdBQUcsb0JBQVFqQixNQUFSLENBQTdCO0FBQ0EsTUFBTWtCLFFBQWdCLEdBQUcsc0JBQVVOLElBQUksQ0FBQ00sUUFBZixFQUF5QixFQUF6QixDQUF6QjtBQUVBLE1BQU1DLElBQVMsR0FBRztBQUNoQmhFLElBQUFBLElBQUksRUFBRTZELE1BRFU7QUFFaEJ0QixJQUFBQSxLQUFLLEVBQUVGLElBQUksQ0FBQ0QsR0FBTCxFQUZTO0FBR2hCL0QsSUFBQUEsSUFBSSxFQUFFMEY7QUFIVSxHQUFsQjtBQU1BLFNBQU9MLGNBQWMsQ0FBQ08sSUFBZixDQUFvQkQsSUFBcEIsa0JBQW1DRixZQUFuQyxtQkFBNERGLFlBQTVELEdBQ0poRSxJQURJLENBQ0M7QUFBQSxXQUFNNkQsSUFBTjtBQUFBLEdBREQsRUFFSm5ELEtBRkksQ0FFRSxVQUFDQyxLQUFELEVBQWtCO0FBQ3ZCLFVBQU1BLEtBQU47QUFDRCxHQUpJLENBQVA7QUFLRCxDQW5CTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VOdW0sIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbCwgRGF0YWJhc2V9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2xpYi9janMvYXFsLXF1ZXJ5JztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2xpYi9janMvY3Vyc29yJztcbmltcG9ydCBmbGF0dGVuIGZyb20gJ2xvZGFzaC9mbGF0dGVuJztcbmltcG9ydCB1bmlxQnkgZnJvbSAnbG9kYXNoL3VuaXFCeSc7XG5cbmltcG9ydCB7QXBpQ29udGV4dCwgRmlsZVR5cGUsIEdyb3VwVHlwZSwgUG9zdE9wdGlvbnMsIFBvc3RUeXBlLCBUYWdUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2dldExpbWl0LCB1c2VEYn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHt1cGRhdGVGaWxlc30gZnJvbSAnLi9maWxlcyc7XG5pbXBvcnQge2V4dHJhY3RUYWdzfSBmcm9tICcuL3RhZ3MnO1xuXG4vLyBjb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAncG9zdHMnO1xuY29uc3QgTUFYX0NPTlRFTlRfTEVOR1RIOiBudW1iZXIgPSAxMDAwMDA7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVBvc3RPcHRpb25zID0gKG9wdGlvbnM6IFBvc3RPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIGxhdGl0dWRlID0gMCxcbiAgICBsb25naXR1ZGUgPSAwLFxuICAgIHRvID0gMzAsXG4gICAgdHlwZSA9ICdkZWZhdWx0J1xuICB9ID0gb3B0aW9ucztcblxuXG4gIHJldHVybiB7XG4gICAgbGF0aXR1ZGU6IHBhcnNlTnVtKGxhdGl0dWRlLCAzMiksXG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSxcbiAgICBsb25naXR1ZGU6IHBhcnNlTnVtKGxvbmdpdHVkZSwgMzIpLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0T3B0aW9uYWwgPSAoZmllbGRzOiBzdHJpbmdbXSkgPT5cbiAgZmllbGRzLnJlZHVjZSgoc2VsZWN0czogYW55LCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgc3dpdGNoKGZpZWxkKSB7XG4gICAgICBjYXNlICdyZWFjdGlvbnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdzJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHRhZ3MgPSAoXG4gICAgICAgICAgRk9SIHQsIHBsIElOIElOQk9VTkQgcC5faWQgaXNUYWdnZWRcbiAgICAgICAgICBSRVRVUk4gdFxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCd0YWdzOnRhZ3MnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd1c2VyJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgICBGT1IgdSBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBwLnVzZXJJZCA9PSB1Ll9rZXlcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIHVcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndXNlcjp1c2VyJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldEl0ZW0nO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IGRiID0gdXNlRGIoZGF0YWJhc2UpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIF9rZXksXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAnZGVmYXVsdCdcbiAgICAgIH06IFBvc3RUeXBlID0gcG9zdDtcblxuICAgICAgLy8gUXVlcnkgYmFzZWQgb24gcHJpdmFjeSBsZXZlbFxuICAgICAgbGV0IHByaXZhY3lBcWxRcnk6IHN0cmluZztcblxuICAgICAgaWYoZ3JvdXBJZCAmJiBwcml2YWN5ID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGSUxURVIgcC5fa2V5ID09IFwiJHtfa2V5fVwiXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgIEZPUiBncm91cCBJTiBncm91cHNcbiAgICAgICAgICBGSUxURVIgZ3JvdXAuX2tleSA9PSBwLmdyb3VwSWRcbiAgICAgICAgICBGT1IgdSwgZSBJTiBPVVRCT1VORCBncm91cC5faWQgaXNHcm91cGVkXG4gICAgICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gICAgICB9IGVsc2UgaWYocHJpdmFjeSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZJTFRFUiBwLl9rZXkgPT0gXCIke19rZXl9XCJcbiAgICAgICAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICAgICAgfVxuXG4gICAgICBpZihwcml2YWN5QXFsUXJ5KSB7XG4gICAgICAgIHJldHVybiBkYi5xdWVyeShwcml2YWN5QXFsUXJ5KVxuICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgIC50aGVuKChmaWx0ZXJlZFBvc3Q6IFBvc3RUeXBlID0ge30pID0+IGZpbHRlcmVkUG9zdClcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5QXBwJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdEJ5QXJlYSA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgbGF0aXR1ZGU6IG51bWJlcixcbiAgbG9uZ2l0dWRlOiBudW1iZXIsXG4gIG9wdGlvbnM/OiBQb3N0T3B0aW9uc1xuKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkc30gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZm9ybWF0TGF0aXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxhdGl0dWRlKTtcbiAgY29uc3QgZm9ybWF0TG9uZ2l0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsb25naXR1ZGUpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcbiAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRShcbiAgICAke2Zvcm1hdExhdGl0dWRlfSxcbiAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgTk9UX05VTEwocC5sYXRpdHVkZSwgMCksXG4gICAgTk9UX05VTEwocC5sb25naXR1ZGUsIDApKVxuICBgKTtcbiAgc2VsZWN0T2JqZWN0cy5wdXNoKCdkaXN0YW5jZTpkaXN0YW5jZScpO1xuXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnRJZCA9PSBudWxsXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBkaXN0YW5jZSwgcC5hZGRlZFxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RMaXN0QnlHcm91cCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZ3JvdXBJZDogc3RyaW5nLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlHcm91cCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcblxuICAvLyBHcm91cCBpZFxuICBjb25zdCBmb3JtYXRHcm91cElkOiBzdHJpbmcgPSBwYXJzZUlkKGdyb3VwSWQpO1xuICBjb25zdCBkYiA9IHVzZURiKGRhdGFiYXNlKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHUsIGcgSU4gSU5CT1VORCAke2Zvcm1hdEdyb3VwSWR9IGhhc0dyb3VwXG4gICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuICAgICAgUkVUVVJOIGdgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigoZ3JvdXBzOiBHcm91cFR5cGVbXSA9IFtdKSA9PiB7XG4gICAgICBpZihncm91cHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBwb3N0QXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAuZ3JvdXBJZCA9PSBcIiR7Zm9ybWF0R3JvdXBJZH1cIiAmJiBwLnBhcmVudCA9PSBudWxsXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gICAgICAgIHJldHVybiBkYi5xdWVyeShwb3N0QXFsUXJ5KVxuICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW107XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdExpc3RCeUxhdGVzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5TGF0ZXN0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0TGlzdEJ5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGFnTmFtZXM6IHN0cmluZ1tdLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xhdGl0dWRlLCBsb25naXR1ZGUsIGxpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMpO1xuICBjb25zdCBzb3J0Qnk6IHN0cmluZ1tdID0gW107XG5cbiAgaWYobGF0aXR1ZGUgIT09IHVuZGVmaW5lZCAmJiBsb25naXR1ZGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gICAgY29uc3QgZm9ybWF0TG9uZ2l0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsb25naXR1ZGUpO1xuICAgIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UoXG4gICAgICAke2Zvcm1hdExhdGl0dWRlfSxcbiAgICAgICR7Zm9ybWF0TG9uZ2l0dWRlfSxcbiAgICAgIE5PVF9OVUxMKHAubGF0aXR1ZGUsIDApLFxuICAgICAgTk9UX05VTEwocC5sb25naXR1ZGUsIDApKVxuICAgIGApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnZGlzdGFuY2U6ZGlzdGFuY2UnKTtcbiAgICBzb3J0QnkucHVzaCgnZGlzdGFuY2UnKTtcbiAgfVxuXG4gIHNvcnRCeS5wdXNoKCdwLmFkZGVkJyk7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgIHRhZ05hbWVzLm1hcCgodGFnTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgdGFyZ2V0VGFnIElOIHRhZ3NcbiAgICAgICAgRklMVEVSIHRhcmdldFRhZy5uYW1lID09IFwiJHt0YWdOYW1lfVwiXG4gICAgICAgIEZPUiBwLCBlIElOIE9VVEJPVU5EIHRhcmdldFRhZy5faWQgaXNUYWdnZWRcbiAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICBGSUxURVIgcC50eXBlID0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgZS50eXBlID09ICdwb3N0cydcbiAgICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICAgIFNPUlQgJHtzb3J0Qnkuam9pbignLCAnKX1cbiAgICAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgICAgICAuY2F0Y2goKCkgPT4gW10pO1xuICAgIH0pKVxuICAgIC50aGVuKChyZXN1bHRzKSA9PiB1bmlxQnkoZmxhdHRlbihyZXN1bHRzKSwgJ19rZXknKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdExpc3RCeVVzZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdXNlcklkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHN9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC51c2VySWQgPT0gXCIke2Zvcm1hdFVzZXJJZH1cIiAmJiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0Q29tbWVudHMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRDb21tZW50cyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChpdGVtSWQpO1xuXG4gIC8vIEdldCB0aGUgcGFyZW50IHBvc3QgdG8gZ2V0IHJlc3RyaWN0aW9uc1xuICBjb25zdCBkYiA9IHVzZURiKGRhdGFiYXNlKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gJHt0eXBlfSAmJiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIF9rZXksXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAncHVibGljJ1xuICAgICAgfTogUG9zdFR5cGUgPSBwb3N0O1xuXG4gICAgICAvLyBRdWVyeSBiYXNlZCBvbiBwcml2YWN5IGxldmVsXG4gICAgICBsZXQgcHJpdmFjeUFxbFFyeTogc3RyaW5nO1xuXG4gICAgICBpZihncm91cElkICYmIHByaXZhY3kgPT09ICdncm91cCcpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZPUiB1c2VyIElOIHVzZXJzXG4gICAgICAgICAgRklMVEVSIHAucGFyZW50ID09IFwiJHtfa2V5fVwiICYmIHVzZXIuX2tleSA9PSBwLnVzZXJJZFxuICAgICAgICAgIExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgICApXG4gICAgICAgICAgRk9SIGdyb3VwIElOIGdyb3Vwc1xuICAgICAgICAgIEZJTFRFUiBncm91cC5fa2V5ID09IHAuZ3JvdXBJZFxuICAgICAgICAgIEZPUiB1LCBlIElOIE9VVEJPVU5EIGdyb3VwLl9pZCBpc0dyb3VwZWRcbiAgICAgICAgICBGSUxURVIgdS5fa2V5ID09IFwiJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBTT1JUIHAuYWRkZWRcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwge3VzZXI6IHVzZXIsIHJlYWN0aW9uczogcmVhY3Rpb25zfSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGT1IgdXNlciBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBwLnBhcmVudCA9PSBcIiR7X2tleX1cIiAmJiB1c2VyLl9rZXkgPT0gcC51c2VySWRcbiAgICAgICAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCByZWFjdGlvbnNcbiAgICAgICAgICAgIENPTExFQ1QgcmVhY3Rpb25OYW1lID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgICAgKVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7dXNlcjogdXNlciwgcmVhY3Rpb25zOiByZWFjdGlvbnN9KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRQb3N0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW06IFBvc3RUeXBlKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG5cbiAgY29uc3Qge1xuICAgIGNvbnRlbnQgPSAnJyxcbiAgICBncm91cElkID0gJycsXG4gICAgbG9jYXRpb24sXG4gICAgbGF0aXR1ZGUsXG4gICAgbG9uZ2l0dWRlLFxuICAgIG5hbWUgPSAnJyxcbiAgICBwYXJlbnRJZCA9IG51bGwsXG4gICAgcHJpdmFjeSA9ICdwdWJsaWMnLFxuICAgIHR5cGUgPSAnZGVmYXVsdCdcbiAgfTogUG9zdFR5cGUgPSBpdGVtO1xuXG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICBjb25zdCBpbnNlcnQ6IFBvc3RUeXBlID0ge1xuICAgIF9rZXk6IGNyZWF0ZUhhc2goYHBvc3QtJHtzZXNzaW9uSWR9YCksXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBjb250ZW50OiBwYXJzZVN0cmluZyhjb250ZW50LCBNQVhfQ09OVEVOVF9MRU5HVEgpLFxuICAgIGdyb3VwSWQ6IGdyb3VwSWQgPyBwYXJzZUlkKGdyb3VwSWQpIDogdW5kZWZpbmVkLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VOdW0obGF0aXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIGxvY2F0aW9uOiBsb2NhdGlvbiA/IHBhcnNlU3RyaW5nKGxvY2F0aW9uLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlICE9PSB1bmRlZmluZWQgPyBwYXJzZU51bShsb25naXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogcGFyc2VTdHJpbmcobmFtZSwgMTYwKSxcbiAgICBwYXJlbnRJZDogcGFyZW50SWQgPyBwYXJzZUlkKHBhcmVudElkKSA6IHVuZGVmaW5lZCxcbiAgICBwcml2YWN5OiBwcml2YWN5ID8gcGFyc2VWYXJDaGFyKHByaXZhY3ksIDE2KSA6IHVuZGVmaW5lZCxcbiAgICB0eXBlOiBwYXJzZUNoYXIodHlwZSwgMzIpLFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG5cbiAgY29uc3QgZGI6IERhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2UpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gcG9zdHMgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IHBvc3RLZXl9ID0gcG9zdDtcblxuICAgICAgLy8gVXBkYXRlIGxpbmtlZCB0YWdzIHdpdGhpbiBwb3N0c1xuICAgICAgcmV0dXJuIGV4dHJhY3RUYWdzKGRiLCAncG9zdHMnLCBwb3N0S2V5LCBpbnNlcnQuY29udGVudClcbiAgICAgICAgLnRoZW4oKHRhZ0xpc3Q6IFRhZ1R5cGVbXSkgPT4ge1xuICAgICAgICAgIHBvc3QudGFncyA9IHRhZ0xpc3Q7XG4gICAgICAgICAgcmV0dXJuIHBvc3Q7XG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVBvc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgaXRlbTogUG9zdFR5cGUpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCB7XG4gICAgY29udGVudCxcbiAgICBncm91cElkLFxuICAgIG5hbWUsXG4gICAgcGFyZW50SWQsXG4gICAgcG9zdElkLFxuICAgIHByaXZhY3ksXG4gICAgdHlwZVxuICB9OiBQb3N0VHlwZSA9IGl0ZW07XG5cbiAgY29uc3QgdXBkYXRlOiBQb3N0VHlwZSA9IHtcbiAgICBjb250ZW50OiBjb250ZW50ID8gcGFyc2VTdHJpbmcoY29udGVudCwgTUFYX0NPTlRFTlRfTEVOR1RIKSA6IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWU6IG5hbWUgPyBwYXJzZVN0cmluZyhuYW1lLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIHBhcmVudElkOiBwYXJlbnRJZCA/IHBhcnNlU3RyaW5nKHBhcmVudElkLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIHByaXZhY3k6IHByaXZhY3kgPyBwYXJzZVZhckNoYXIocHJpdmFjeSwgMTYpIDogdW5kZWZpbmVkLFxuICAgIHR5cGU6IHR5cGUgIT09IHVuZGVmaW5lZCA/IHBhcnNlQ2hhcih0eXBlLCAxNikgOiB1bmRlZmluZWRcbiAgfTtcblxuICBsZXQgZm9ybWF0SWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcbiAgZm9ybWF0SWQgPSBmb3JtYXRJZCA9PT0gJycgPyBjcmVhdGVIYXNoKGBwb3N0LSR7c2Vzc2lvbklkfWApIDogZm9ybWF0SWQ7XG4gIGNvbnN0IGZvcm1hdEdyb3VwSWQ6IHN0cmluZyA9IHBhcnNlSWQoZ3JvdXBJZCk7XG4gIGNvbnN0IGluc2VydDogYW55ID0ge1xuICAgIC4uLnVwZGF0ZSxcbiAgICBfa2V5OiBmb3JtYXRJZCxcbiAgICBhZGRlZDogbm93LFxuICAgIGdyb3VwSWQ6IGZvcm1hdEdyb3VwSWQsXG4gICAgcHJpdmFjeSxcbiAgICB1c2VySWQ6IHNlc3Npb25JZFxuICB9O1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZSk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke2Zvcm1hdElkfSwgdXNlcklkOiAke3Nlc3Npb25JZH19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBwb3N0cyBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKCh1cGRhdGVkUG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge19rZXk6IHVwZGF0ZWRQb3N0S2V5fSA9IHVwZGF0ZWRQb3N0O1xuXG4gICAgICAvLyBVcGRhdGUgbGlua2VkIHRhZ3NcbiAgICAgIHJldHVybiBleHRyYWN0VGFncyhkYiwgJ3Bvc3RzJywgdXBkYXRlZFBvc3RLZXksIHVwZGF0ZS5jb250ZW50IHx8ICcnKVxuICAgICAgICAudGhlbigodGFnTGlzdCA9IFtdKSA9PiB7XG4gICAgICAgICAgdXBkYXRlZFBvc3QudGFncyA9IHRhZ0xpc3Q7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgbGlua2VkIGZpbGVzXG4gICAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVUeXBlW10gPSB1cGRhdGVkUG9zdC5maWxlcyB8fCBbXTtcblxuICAgICAgICAgIGlmKGZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUZpbGVzKGRiLCBmb3JtYXRJZCwgZmlsZXMpXG4gICAgICAgICAgICAgIC50aGVuKChmaWxlTGlzdCA9IFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlZFBvc3QuZmlsZXMgPSBmaWxlTGlzdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFBvc3Q7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZWRQb3N0LmZpbGVzID0gW107XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWRQb3N0O1xuICAgICAgICB9KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVQb3N0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGUnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChpdGVtSWQpO1xuICBjb25zdCBkYjogRGF0YWJhc2UgPSB1c2VEYihkYXRhYmFzZSk7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgICAgRklMVEVSIHAuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH0gJiYgcC51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRU1PVkUgcCBJTiBwb3N0c1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgaWYocG9zdCkge1xuICAgICAgICAvLyBSZW1vdmUgdGFnIGxpbmtzXG4gICAgICAgIGNvbnN0IGVkZ2VBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB0IElOIGlzVGFnZ2VkXG4gICAgICAgICAgICBGSUxURVIgdC5fdG8gPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgICAgICAgICBSRU1PVkUgdCBJTiBpc1RhZ2dlZGA7XG5cbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KGVkZ2VBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGF0dGFjaGVkIGZpbGVzXG4gICAgICAgICAgICBjb25zdCBmaWxlQXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZiBJTiBoYXNGaWxlXG4gICAgICAgICAgICAgICAgRklMVEVSIGYuX3RvID09ICR7Zm9ybWF0SXRlbUlkfVxuICAgICAgICAgICAgICAgIFJFTU9WRSBmIElOIGhhc0ZpbGVgO1xuXG4gICAgICAgICAgICByZXR1cm4gZGIucXVlcnkoZmlsZUFxbFFyeSlcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gcG9zdClcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYW5Qb3N0cyA9IChkYXRhYmFzZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgLy8gUmVtb3ZlIGFsbCBtZXNzYWdlcyB0aGF0IGFyZSBvdmVyIDYwIGRheXMgYW5kIG5vdCBzYXZlZFxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBwIElOIHBvc3RzXG4gICAgICBGSUxURVIgcC5hZGRlZCA8IERBVEVfVElNRVNUQU1QKERBVEVfU1VCVFJBQ1QoREFURV9OT1coKSwgNjAsICdkYXknKSkgJiYgcC50eXBlID09IFwiZGVmYXVsdFwiXG4gICAgICBSRU1PVkUgcCBJTiBwb3N0c1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAudGhlbigocmVzdWx0czogUG9zdFR5cGVbXSA9IFtdKSA9PiByZXN1bHRzLmxlbmd0aClcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUG9zdEVkZ2UgPSAoZGI6IERhdGFiYXNlLCBmaWxlOiBGaWxlVHlwZSwgcG9zdElkOiBzdHJpbmcpOiBQcm9taXNlPEZpbGVUeXBlPiA9PiB7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uID0gZGIuZWRnZUNvbGxlY3Rpb24oJ2lzUG9zdGVkJyk7XG4gIGNvbnN0IHtmaWxlSWR9ID0gZmlsZTtcbiAgY29uc3QgZm9ybWF0RmlsZUlkOiBzdHJpbmcgPSBwYXJzZUlkKGZpbGVJZCk7XG4gIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgZmlsZS0ke3Bvc3RJZH0tJHtmb3JtYXRGaWxlSWR9YCk7XG4gIGNvbnN0IGZvcm1hdFBvc3RJZDogc3RyaW5nID0gcGFyc2VJZChwb3N0SWQpO1xuICBjb25zdCBmaWxlVHlwZTogc3RyaW5nID0gcGFyc2VDaGFyKGZpbGUuZmlsZVR5cGUsIDE2KTtcblxuICBjb25zdCBlZGdlOiBhbnkgPSB7XG4gICAgX2tleTogZWRnZUlkLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIHR5cGU6IGZpbGVUeXBlXG4gIH07XG5cbiAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwgYHBvc3RzLyR7Zm9ybWF0UG9zdElkfWAsIGBmaWxlcy8ke2Zvcm1hdEZpbGVJZH1gKVxuICAgIC50aGVuKCgpID0+IGZpbGUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcbiJdfQ==