@nlabs/metropolisjs 1.0.8 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,9 +5,9 @@
5
5
  import { USER_CONSTANTS } from '../../stores/userStore.js';
6
6
  import { appMutation, appQuery, publicMutation, publicQuery, refreshSession } from '../../utils/api.js';
7
7
  import { createBaseActions } from '../../utils/baseActionFactory.js';
8
- import { clearPersistedSession, hydrateSessionFromStorage, isLoggedIn as isLoggedInWithStorage, normalizeSession, storeSession } from '../../utils/session.js';
9
8
  import { getConfigFromFlux } from '../../utils/configUtils.js';
10
9
  import { clearCachedRequest, getCachedRequest, setCachedRequest } from '../../utils/requestCache.js';
10
+ import { clearPersistedSession, hydrateSessionFromStorage, isLoggedIn as isLoggedInWithStorage, normalizeSession, storeSession } from '../../utils/session.js';
11
11
  import { syncPersonaTagsToSession } from '../personaActions/personaActions.js';
12
12
  const DATA_TYPE = 'users';
13
13
  const DEFAULT_USER_QUERY_FIELDS = [
@@ -23,7 +23,10 @@ const SENSITIVE_USER_FIELDS = new Set([
23
23
  'verifiedSmsCode'
24
24
  ]);
25
25
  const INVALID_FIELD_REGEX = /Cannot query field "([^"]+)"/g;
26
- const hasSessionIdentity = (user)=>!!(user && (user._id || user.userId || user.username || user.email));
26
+ const hasSessionIdentity = (user)=>{
27
+ const sessionUser = user;
28
+ return Boolean(sessionUser && (Reflect.get(sessionUser, '_id') || sessionUser.userId || sessionUser.username || sessionUser.email));
29
+ };
27
30
  const sanitizeUpdateUserInput = (userInput = {}, currentSession = {})=>{
28
31
  const nextUser = Object.entries(userInput).reduce((user, [field, value])=>{
29
32
  if (value === undefined || value === null) {
@@ -106,9 +109,13 @@ const getInvalidFields = (error)=>{
106
109
  };
107
110
  const getPasswordResetIdentifier = (request)=>{
108
111
  const identifier = typeof request === 'string' ? String(request || '').trim() : String(request.email || request.phone || request.username || '').trim();
112
+ let type = identifier.includes('@') ? 'email' : 'username';
113
+ if (typeof request !== 'string' && request.phone) {
114
+ type = 'phone';
115
+ }
109
116
  return {
110
117
  identifier,
111
- type: typeof request !== 'string' && request.phone ? 'phone' : identifier.includes('@') ? 'email' : 'username'
118
+ type
112
119
  };
113
120
  };
114
121
  const getPasswordResetType = (confirmation)=>confirmation.type || (confirmation.phone ? 'phone' : 'email');
@@ -188,7 +195,8 @@ export const createUserActions = (flux, options)=>{
188
195
  ]);
189
196
  try {
190
197
  return await publicMutation(flux, 'addUser', DATA_TYPE, queryVariables, returnProps, {
191
- onSuccess
198
+ onSuccess,
199
+ ...requestOptions
192
200
  });
193
201
  } finally{
194
202
  await clearUserRequestCaches();
@@ -226,7 +234,8 @@ export const createUserActions = (flux, options)=>{
226
234
  ]);
227
235
  try {
228
236
  return await publicMutation(flux, 'signUp', DATA_TYPE, queryVariables, returnProps, {
229
- onSuccess
237
+ onSuccess,
238
+ ...requestOptions
230
239
  });
231
240
  } catch (error) {
232
241
  flux.dispatch({
@@ -294,13 +303,14 @@ export const createUserActions = (flux, options)=>{
294
303
  ]);
295
304
  try {
296
305
  return await appMutation(flux, 'updateUser', DATA_TYPE, queryVariables, returnProps, {
297
- onSuccess
306
+ onSuccess,
307
+ ...requestOptions
298
308
  });
299
309
  } finally{
300
310
  await clearUserRequestCaches(String(userId || ''));
301
311
  }
302
312
  };
303
- const confirmCode = async (code, { type, value }, requestOptions = {})=>{
313
+ const confirmCode = async (code, { type, value }, _requestOptions = {})=>{
304
314
  const queryVariables = {
305
315
  code: {
306
316
  type: 'Int!',
@@ -339,13 +349,14 @@ export const createUserActions = (flux, options)=>{
339
349
  };
340
350
  try {
341
351
  return await appMutation(flux, 'remove', DATA_TYPE, queryVariables, [], {
342
- onSuccess
352
+ onSuccess,
353
+ ...requestOptions
343
354
  });
344
355
  } finally{
345
356
  await clearUserRequestCaches(userId);
346
357
  }
347
358
  };
348
- const session = async (userProps = [], requestOptions = {})=>withInvalidFieldRetry(async (sessionProps)=>{
359
+ const session = async (userProps = [], _requestOptions = {})=>withInvalidFieldRetry(async (sessionProps)=>{
349
360
  const data = await appQuery(flux, 'getUserBySession', DATA_TYPE, {}, sessionProps);
350
361
  const sessionData = data?.users?.getUserBySession || {};
351
362
  if (!hasSessionIdentity(sessionData)) {
@@ -434,21 +445,47 @@ export const createUserActions = (flux, options)=>{
434
445
  value: normalizedValue
435
446
  }, matchingUser, requestOptions);
436
447
  };
437
- const saveBillingCard = async (card, userProps = [], requestOptions = {})=>{
438
- const queryVariables = {
439
- card: {
440
- type: 'CreditCardInput!',
441
- value: card
442
- }
448
+ const createBillingSetupSession = async (returnUrl, requestOptions = {})=>{
449
+ const normalizedReturnUrl = String(returnUrl || '').trim();
450
+ if (!normalizedReturnUrl) {
451
+ throw new Error('A returnUrl is required to create a billing setup session');
452
+ }
453
+ let checkoutUrl = '';
454
+ const onSuccess = (data = {})=>{
455
+ checkoutUrl = String(data?.users?.createBillingSetupSession || '');
456
+ return flux.dispatch({
457
+ checkoutUrl,
458
+ type: USER_CONSTANTS.BILLING_SETUP_SESSION_SUCCESS
459
+ });
443
460
  };
461
+ await appMutation(flux, 'createBillingSetupSession', DATA_TYPE, {
462
+ returnUrl: {
463
+ type: 'String!',
464
+ value: normalizedReturnUrl
465
+ }
466
+ }, [], {
467
+ onSuccess,
468
+ ...requestOptions
469
+ });
470
+ if (!checkoutUrl) {
471
+ throw new Error('Billing setup session did not return a checkout URL');
472
+ }
473
+ return checkoutUrl;
474
+ };
475
+ const completeBillingSetupSession = async (sessionId, userProps = [], requestOptions = {})=>{
476
+ const normalizedSessionId = String(sessionId || '').trim();
477
+ if (!normalizedSessionId) {
478
+ throw new Error('A sessionId is required to complete a billing setup session');
479
+ }
480
+ let updatedUser = {};
444
481
  const onSuccess = (data = {})=>{
445
- const user = data?.users?.saveBillingCard || {};
446
- if (user?.userId && user.userId === flux.getState('user.session.userId')) {
447
- syncStoredSession(flux, user);
482
+ updatedUser = data?.users?.completeBillingSetupSession || {};
483
+ if (updatedUser?.userId && updatedUser.userId === flux.getState('user.session.userId')) {
484
+ syncStoredSession(flux, updatedUser);
448
485
  }
449
486
  return flux.dispatch({
450
487
  type: USER_CONSTANTS.UPDATE_ITEM_SUCCESS,
451
- user
488
+ user: updatedUser
452
489
  });
453
490
  };
454
491
  const returnProps = sanitizeUserProps([
@@ -462,9 +499,16 @@ export const createUserActions = (flux, options)=>{
462
499
  ]);
463
500
  const sessionUserId = String(flux.getState('user.session.userId') || '');
464
501
  try {
465
- return await appMutation(flux, 'saveBillingCard', DATA_TYPE, queryVariables, returnProps, {
466
- onSuccess
502
+ await appMutation(flux, 'completeBillingSetupSession', DATA_TYPE, {
503
+ sessionId: {
504
+ type: 'ID!',
505
+ value: normalizedSessionId
506
+ }
507
+ }, returnProps, {
508
+ onSuccess,
509
+ ...requestOptions
467
510
  });
511
+ return updatedUser;
468
512
  } finally{
469
513
  await clearUserRequestCaches(sessionUserId);
470
514
  }
@@ -492,7 +536,8 @@ export const createUserActions = (flux, options)=>{
492
536
  const sessionUserId = String(flux.getState('user.session.userId') || '');
493
537
  try {
494
538
  return await appMutation(flux, 'deleteBillingCard', DATA_TYPE, {}, returnProps, {
495
- onSuccess
539
+ onSuccess,
540
+ ...requestOptions
496
541
  });
497
542
  } finally{
498
543
  await clearUserRequestCaches(sessionUserId);
@@ -536,7 +581,8 @@ export const createUserActions = (flux, options)=>{
536
581
  const sessionUserId = String(flux.getState('user.session.userId') || '');
537
582
  try {
538
583
  return await appMutation(flux, 'updatePlan', DATA_TYPE, queryVariables, returnProps, {
539
- onSuccess
584
+ onSuccess,
585
+ ...requestOptions
540
586
  });
541
587
  } finally{
542
588
  await clearUserRequestCaches(sessionUserId);
@@ -564,12 +610,13 @@ export const createUserActions = (flux, options)=>{
564
610
  }, result, requestOptions);
565
611
  };
566
612
  const listByLatest = async (username = '', from = 0, to = 10, userProps = [], requestOptions = {})=>{
567
- const cachedResult = getCachedRequest(flux, 'user.listByLatest', {
568
- username,
613
+ const cacheKey = {
569
614
  from,
570
615
  to,
571
- userProps
572
- }, requestOptions);
616
+ userProps,
617
+ username
618
+ };
619
+ const cachedResult = getCachedRequest(flux, 'user.listByLatest', cacheKey, requestOptions);
573
620
  if (cachedResult !== undefined) {
574
621
  return cachedResult;
575
622
  }
@@ -597,23 +644,19 @@ export const createUserActions = (flux, options)=>{
597
644
  const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'listByLatest', DATA_TYPE, queryVariables, safeUserProps, {
598
645
  onSuccess
599
646
  }), userProps, DEFAULT_USER_QUERY_FIELDS);
600
- return setCachedRequest(flux, 'user.listByLatest', {
601
- username,
602
- from,
603
- to,
604
- userProps
605
- }, result, requestOptions);
647
+ return setCachedRequest(flux, 'user.listByLatest', cacheKey, result, requestOptions);
606
648
  };
607
- const listByConnection = async (userId, from = 0, to = 10, userProps = [], requestOptions = {})=>[];
608
- const listByReactions = async (username, reactionNames, from = 0, to = 10, personaProps = [], requestOptions = {})=>[];
649
+ const listByConnection = async (userId, _from = 0, _to = 10, _userProps = [], _requestOptions = {})=>[];
650
+ const listByReactions = async (username, reactionNames, _from = 0, _to = 10, _personaProps = [], _requestOptions = {})=>[];
609
651
  const listByTags = async (username, tagNames, from = 0, to = 10, personaProps = [], requestOptions = {})=>{
610
- const cachedResult = getCachedRequest(flux, 'user.listByTags', {
611
- username,
612
- tagNames,
652
+ const cacheKey = {
613
653
  from,
654
+ personaProps,
655
+ tagNames,
614
656
  to,
615
- personaProps
616
- }, requestOptions);
657
+ username
658
+ };
659
+ const cachedResult = getCachedRequest(flux, 'user.listByTags', cacheKey, requestOptions);
617
660
  if (cachedResult !== undefined) {
618
661
  return cachedResult;
619
662
  }
@@ -645,13 +688,7 @@ export const createUserActions = (flux, options)=>{
645
688
  const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'listByTags', DATA_TYPE, queryVariables, safeUserProps, {
646
689
  onSuccess
647
690
  }), personaProps, DEFAULT_USER_QUERY_FIELDS);
648
- return setCachedRequest(flux, 'user.listByTags', {
649
- username,
650
- tagNames,
651
- from,
652
- to,
653
- personaProps
654
- }, result, requestOptions);
691
+ return setCachedRequest(flux, 'user.listByTags', cacheKey, result, requestOptions);
655
692
  };
656
693
  const search = async (query, userProps = [], requestOptions = {})=>{
657
694
  const cachedResult = getCachedRequest(flux, 'user.search', {
@@ -683,11 +720,11 @@ export const createUserActions = (flux, options)=>{
683
720
  }, result, requestOptions);
684
721
  };
685
722
  const isLoggedIn = ()=>isLoggedInWithStorage(flux);
686
- const currentAuthenticatedUser = async (requestOptions = {})=>{
723
+ const currentAuthenticatedUser = async (_requestOptions = {})=>{
687
724
  const session = await hydrateSessionFromStorage(flux);
688
725
  return session || {};
689
726
  };
690
- const refreshSessionAction = async (token, expires, requestOptions = {})=>{
727
+ const refreshSessionAction = async (token, expires, _requestOptions = {})=>{
691
728
  const result = await refreshSession(flux, token, expires);
692
729
  return result?.refreshSession || {};
693
730
  };
@@ -728,10 +765,11 @@ export const createUserActions = (flux, options)=>{
728
765
  const users = data?.users;
729
766
  const sessionData = normalizeSession(users?.signIn || {});
730
767
  const storedSession = await syncStoredSession(flux, sessionData);
731
- return {
768
+ const action = {
732
769
  session: storedSession,
733
770
  type: USER_CONSTANTS.SIGN_IN_SUCCESS
734
771
  };
772
+ return action;
735
773
  };
736
774
  const performSignIn = async (queryVariables)=>{
737
775
  const sessionResult = await publicMutation(flux, 'signIn', DATA_TYPE, queryVariables, [
@@ -752,7 +790,7 @@ export const createUserActions = (flux, options)=>{
752
790
  'username'
753
791
  ], requestOptions);
754
792
  await syncPersonaTagsToSession(flux, String(hydratedSession?.personaId || ''));
755
- } catch (error) {
793
+ } catch {
756
794
  const fallbackSession = await syncStoredSession(flux, baseSession);
757
795
  await flux.dispatch({
758
796
  session: fallbackSession,
@@ -779,7 +817,7 @@ export const createUserActions = (flux, options)=>{
779
817
  await clearUserRequestCaches(String(user?.userId || ''));
780
818
  }
781
819
  };
782
- const signOut = async (requestOptions = {})=>{
820
+ const signOut = async (_requestOptions = {})=>{
783
821
  await clearPersistedSession(flux);
784
822
  await flux.dispatch({
785
823
  session: {},
@@ -788,11 +826,16 @@ export const createUserActions = (flux, options)=>{
788
826
  await clearUserRequestCaches();
789
827
  return true;
790
828
  };
791
- const confirmSignUp = async (code, type, requestOptions = {})=>true;
829
+ const confirmSignUp = async (_code, _type, _requestOptions = {})=>true;
792
830
  const requestPasswordReset = async (request, requestOptions = {})=>{
793
831
  let forgotPasswordSucceeded = false;
794
832
  const { identifier, type } = getPasswordResetIdentifier(request);
795
- const attribute = type === 'phone' ? 'phone' : type === 'email' ? 'email' : 'username';
833
+ let attribute = 'username';
834
+ if (type === 'phone') {
835
+ attribute = 'phone';
836
+ } else if (type === 'email') {
837
+ attribute = 'email';
838
+ }
796
839
  const queryVariables = {
797
840
  user: {
798
841
  type: 'UserInput!',
@@ -809,7 +852,8 @@ export const createUserActions = (flux, options)=>{
809
852
  });
810
853
  };
811
854
  await publicMutation(flux, 'forgotPassword', DATA_TYPE, queryVariables, [], {
812
- onSuccess
855
+ onSuccess,
856
+ ...requestOptions
813
857
  });
814
858
  if (!forgotPasswordSucceeded) {
815
859
  throw new Error('forgot_password_failed');
@@ -842,7 +886,8 @@ export const createUserActions = (flux, options)=>{
842
886
  });
843
887
  };
844
888
  return publicMutation(flux, 'sendVerificationEmail', DATA_TYPE, queryVariables, [], {
845
- onSuccess
889
+ onSuccess,
890
+ ...requestOptions
846
891
  }).then((data)=>{
847
892
  const success = !!data?.users?.sendVerificationEmail;
848
893
  if (!success) {
@@ -877,7 +922,8 @@ export const createUserActions = (flux, options)=>{
877
922
  });
878
923
  };
879
924
  return publicMutation(flux, 'resetPassword', DATA_TYPE, queryVariables, [], {
880
- onSuccess
925
+ onSuccess,
926
+ ...requestOptions
881
927
  }).then((data)=>{
882
928
  const success = !!data?.users?.resetPassword;
883
929
  if (!success) {
@@ -891,19 +937,21 @@ export const createUserActions = (flux, options)=>{
891
937
  const type = getPasswordResetType(confirmation);
892
938
  return resetPassword(username, confirmation.password, confirmation.code, type, requestOptions);
893
939
  };
894
- const updatePassword = async (password, newPassword, requestOptions = {})=>true;
940
+ const updatePassword = async (_password, _newPassword, _requestOptions = {})=>true;
895
941
  return {
896
942
  addUser,
943
+ completeBillingSetupSession,
944
+ completePasswordReset,
897
945
  confirmCode,
898
946
  confirmSignUp,
899
- completePasswordReset,
947
+ createBillingSetupSession,
900
948
  currentAuthenticatedUser,
901
949
  deleteBillingCard,
902
- list,
903
950
  forgotPassword,
951
+ getUserByAttribute,
904
952
  isLoggedIn,
905
953
  itemById,
906
- getUserByAttribute,
954
+ list,
907
955
  listByConnection,
908
956
  listByLatest,
909
957
  listByReactions,
@@ -912,7 +960,6 @@ export const createUserActions = (flux, options)=>{
912
960
  remove,
913
961
  requestPasswordReset,
914
962
  resetPassword,
915
- saveBillingCard,
916
963
  search,
917
964
  sendVerificationEmail,
918
965
  session,
@@ -920,11 +967,11 @@ export const createUserActions = (flux, options)=>{
920
967
  signOut,
921
968
  signUp,
922
969
  updatePassword,
923
- updateUser,
924
970
  updatePlan,
971
+ updateUser,
925
972
  updateUserAdapter: userBase.updateAdapter,
926
973
  updateUserAdapterOptions: userBase.updateOptions
927
974
  };
928
975
  };
929
976
 
930
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy91c2VyQWN0aW9ucy91c2VyQWN0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt2YWxpZGF0ZVVzZXJJbnB1dH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHtVU0VSX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vc3RvcmVzL3VzZXJTdG9yZS5qcyc7XG5pbXBvcnQge2FwcE11dGF0aW9uLCBhcHBRdWVyeSwgcHVibGljTXV0YXRpb24sIHB1YmxpY1F1ZXJ5LCByZWZyZXNoU2Vzc2lvbn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB7Y3JlYXRlQmFzZUFjdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL2Jhc2VBY3Rpb25GYWN0b3J5LmpzJztcbmltcG9ydCB7XG4gIGNsZWFyUGVyc2lzdGVkU2Vzc2lvbixcbiAgaHlkcmF0ZVNlc3Npb25Gcm9tU3RvcmFnZSxcbiAgaXNMb2dnZWRJbiBhcyBpc0xvZ2dlZEluV2l0aFN0b3JhZ2UsXG4gIG5vcm1hbGl6ZVNlc3Npb24sXG4gIHN0b3JlU2Vzc2lvblxufSBmcm9tICcuLi8uLi91dGlscy9zZXNzaW9uLmpzJztcbmltcG9ydCB7Z2V0Q29uZmlnRnJvbUZsdXh9IGZyb20gJy4uLy4uL3V0aWxzL2NvbmZpZ1V0aWxzLmpzJztcbmltcG9ydCB7Y2xlYXJDYWNoZWRSZXF1ZXN0LCBnZXRDYWNoZWRSZXF1ZXN0LCBzZXRDYWNoZWRSZXF1ZXN0fSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0Q2FjaGUuanMnO1xuaW1wb3J0IHtzeW5jUGVyc29uYVRhZ3NUb1Nlc3Npb259IGZyb20gJy4uL3BlcnNvbmFBY3Rpb25zL3BlcnNvbmFBY3Rpb25zLmpzJztcblxuaW1wb3J0IHR5cGUge0ZsdXhBY3Rpb24sIEZsdXhGcmFtZXdvcmt9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5pbXBvcnQgdHlwZSB7VXNlcn0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHR5cGUge0FwaVJlc3VsdHNUeXBlLCBTZXNzaW9uVHlwZX0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB0eXBlIHtCYXNlQWRhcHRlck9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3ZhbGlkYXRvckZhY3RvcnkuanMnO1xuaW1wb3J0IHR5cGUge0FjdGlvblJlcXVlc3RPcHRpb25zfSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0Q2FjaGUuanMnO1xuXG5jb25zdCBEQVRBX1RZUEUgPSAndXNlcnMnO1xuY29uc3QgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEUyA9IFsndXNlcklkJywgJ3VzZXJuYW1lJ107XG5jb25zdCBTRU5TSVRJVkVfVVNFUl9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgJ3Bhc3N3b3JkJyxcbiAgJ3NhbHQnLFxuICAndG9rZW4nLFxuICAncmVmcmVzaFRva2VuJyxcbiAgJ3ZlcmlmaWVkRW1haWxDb2RlJyxcbiAgJ3ZlcmlmaWVkU21zQ29kZSdcbl0pO1xuY29uc3QgSU5WQUxJRF9GSUVMRF9SRUdFWCA9IC9DYW5ub3QgcXVlcnkgZmllbGQgXCIoW15cIl0rKVwiL2c7XG5jb25zdCBoYXNTZXNzaW9uSWRlbnRpdHkgPSAodXNlcj86IFBhcnRpYWw8VXNlcj4gfCBudWxsKTogYm9vbGVhbiA9PlxuICAhISh1c2VyICYmICgodXNlciBhcyBhbnkpLl9pZCB8fCAodXNlciBhcyBhbnkpLnVzZXJJZCB8fCAodXNlciBhcyBhbnkpLnVzZXJuYW1lIHx8ICh1c2VyIGFzIGFueSkuZW1haWwpKTtcblxuY29uc3Qgc2FuaXRpemVVcGRhdGVVc2VySW5wdXQgPSAodXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+ID0ge30sIGN1cnJlbnRTZXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9KTogUGFydGlhbDxVc2VyPiA9PiB7XG4gIGNvbnN0IG5leHRVc2VyID0gT2JqZWN0LmVudHJpZXModXNlcklucHV0KS5yZWR1Y2UoKHVzZXI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBbZmllbGQsIHZhbHVlXSkgPT4ge1xuICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGlmKGZpZWxkID09PSAncGFzc3dvcmQnKSB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpO1xuXG4gICAgICBpZihwYXNzd29yZCkge1xuICAgICAgICB1c2VyLnBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGlmKGZpZWxkID09PSAndXNlcklkJykge1xuICAgICAgdXNlci51c2VySWQgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRTZXNzaW9uW2ZpZWxkXTtcblxuICAgIGlmKFN0cmluZyh2YWx1ZSkgIT09IFN0cmluZyhjdXJyZW50VmFsdWUgPz8gJycpKSB7XG4gICAgICB1c2VyW2ZpZWxkXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB1c2VyO1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIG5leHRVc2VyIGFzIFBhcnRpYWw8VXNlcj47XG59O1xuXG5jb25zdCBzeW5jU3RvcmVkU2Vzc2lvbiA9IGFzeW5jIChmbHV4OiBGbHV4RnJhbWV3b3JrLCBzZXNzaW9uUGF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBQcm9taXNlPFNlc3Npb25UeXBlPiA9PiB7XG4gIGNvbnN0IGN1cnJlbnRTZXNzaW9uID0gKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbicsIHt9KSB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiBzdG9yZVNlc3Npb24oZmx1eCwgey4uLmN1cnJlbnRTZXNzaW9uLCAuLi5zZXNzaW9uUGF0Y2h9KTtcbn07XG5cbmNvbnN0IGdldFNlc3Npb25QYXlsb2FkID0gKHBheWxvYWQ6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGlmKHBheWxvYWQgJiYgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnICYmICdzZXNzaW9uJyBpbiAocGF5bG9hZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICByZXR1cm4gKCgocGF5bG9hZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuc2Vzc2lvbikgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgcmV0dXJuIChwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0JyA/IHBheWxvYWQgOiB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xuXG5jb25zdCBnZXRGaWVsZFJvb3QgPSAoZmllbGQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRyaW1tZWQgPSBmaWVsZC50cmltKCk7XG4gIGNvbnN0IG1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXltBLVphLXpfXVtBLVphLXowLTlfXSovKTtcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMF0gOiAnJztcbn07XG5cbmNvbnN0IHNhbml0aXplVXNlclByb3BzID0gKHByb3BzOiBzdHJpbmdbXSA9IFtdLCBmYWxsYmFja1Byb3BzOiBzdHJpbmdbXSA9IERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFMpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgc2FuaXRpemVkID0gcHJvcHMucmVkdWNlKChsaXN0OiBzdHJpbmdbXSwgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvb3QgPSBnZXRGaWVsZFJvb3QoZmllbGQpO1xuXG4gICAgaWYoIXJvb3QgfHwgU0VOU0lUSVZFX1VTRVJfRklFTERTLmhhcyhyb290KSB8fCBzZWVuLmhhcyhmaWVsZCkpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIHNlZW4uYWRkKGZpZWxkKTtcbiAgICBsaXN0LnB1c2goZmllbGQpO1xuICAgIHJldHVybiBsaXN0O1xuICB9LCBbXSk7XG5cbiAgaWYoc2FuaXRpemVkLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgcmV0dXJuIGZhbGxiYWNrUHJvcHMucmVkdWNlKChsaXN0OiBzdHJpbmdbXSwgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvb3QgPSBnZXRGaWVsZFJvb3QoZmllbGQpO1xuXG4gICAgaWYoIXJvb3QgfHwgU0VOU0lUSVZFX1VTRVJfRklFTERTLmhhcyhyb290KSB8fCBzZWVuLmhhcyhmaWVsZCkpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIHNlZW4uYWRkKGZpZWxkKTtcbiAgICBsaXN0LnB1c2goZmllbGQpO1xuICAgIHJldHVybiBsaXN0O1xuICB9LCBbXSk7XG59O1xuXG5jb25zdCBnZXRJbnZhbGlkRmllbGRzID0gKGVycm9yOiB1bmtub3duKTogU2V0PHN0cmluZz4gPT4ge1xuICBjb25zdCBlcnJvcnMgPSAoZXJyb3IgYXMgYW55KT8uZXJyb3JzIHx8IChlcnJvciBhcyBhbnkpPy5zb3VyY2U/LmVycm9ycyB8fCBbXTtcbiAgY29uc3QgaW52YWxpZEZpZWxkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGVycm9ycy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnID8gaXRlbSA6IGl0ZW0/Lm1lc3NhZ2UgfHwgJyc7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsID0gSU5WQUxJRF9GSUVMRF9SRUdFWC5leGVjKG1lc3NhZ2UpO1xuXG4gICAgd2hpbGUobWF0Y2gpIHtcbiAgICAgIGludmFsaWRGaWVsZHMuYWRkKG1hdGNoWzFdKTtcbiAgICAgIG1hdGNoID0gSU5WQUxJRF9GSUVMRF9SRUdFWC5leGVjKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIElOVkFMSURfRklFTERfUkVHRVgubGFzdEluZGV4ID0gMDtcbiAgfSk7XG5cbiAgcmV0dXJuIGludmFsaWRGaWVsZHM7XG59O1xuXG5jb25zdCBnZXRQYXNzd29yZFJlc2V0SWRlbnRpZmllciA9IChyZXF1ZXN0OiBzdHJpbmcgfCBQYXNzd29yZFJlc2V0UmVxdWVzdCk6IHtcbiAgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuICByZWFkb25seSB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJyB8ICd1c2VybmFtZSc7XG59ID0+IHtcbiAgY29uc3QgaWRlbnRpZmllciA9IHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJ1xuICAgID8gU3RyaW5nKHJlcXVlc3QgfHwgJycpLnRyaW0oKVxuICAgIDogU3RyaW5nKHJlcXVlc3QuZW1haWwgfHwgcmVxdWVzdC5waG9uZSB8fCByZXF1ZXN0LnVzZXJuYW1lIHx8ICcnKS50cmltKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBpZGVudGlmaWVyLFxuICAgIHR5cGU6IHR5cGVvZiByZXF1ZXN0ICE9PSAnc3RyaW5nJyAmJiByZXF1ZXN0LnBob25lID8gJ3Bob25lJyA6IGlkZW50aWZpZXIuaW5jbHVkZXMoJ0AnKSA/ICdlbWFpbCcgOiAndXNlcm5hbWUnXG4gIH07XG59O1xuXG5jb25zdCBnZXRQYXNzd29yZFJlc2V0VHlwZSA9IChjb25maXJtYXRpb246IFBhc3N3b3JkUmVzZXRDb25maXJtYXRpb24pOiAnZW1haWwnIHwgJ3Bob25lJyA9PlxuICBjb25maXJtYXRpb24udHlwZSB8fCAoY29uZmlybWF0aW9uLnBob25lID8gJ3Bob25lJyA6ICdlbWFpbCcpO1xuXG5jb25zdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkgPSBhc3luYyA8VD4oXG4gIHJlcXVlc3RXaXRoUHJvcHM6IChwcm9wczogc3RyaW5nW10pID0+IFByb21pc2U8VD4sXG4gIHByb3BzOiBzdHJpbmdbXSxcbiAgZmFsbGJhY2tQcm9wczogc3RyaW5nW10gPSBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTXG4pOiBQcm9taXNlPFQ+ID0+IHtcbiAgY29uc3Qgc2FmZVByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RXaXRoUHJvcHMoc2FmZVByb3BzKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGNvbnN0IGludmFsaWRGaWVsZHMgPSBnZXRJbnZhbGlkRmllbGRzKGVycm9yKTtcblxuICAgIGlmKGludmFsaWRGaWVsZHMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0cnlQcm9wcyA9IHNhZmVQcm9wcy5maWx0ZXIoKGZpZWxkKSA9PiAhaW52YWxpZEZpZWxkcy5oYXMoZ2V0RmllbGRSb290KGZpZWxkKSkpO1xuXG4gICAgaWYocmV0cnlQcm9wcy5sZW5ndGggPT09IDAgfHwgcmV0cnlQcm9wcy5sZW5ndGggPT09IHNhZmVQcm9wcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0V2l0aFByb3BzKHJldHJ5UHJvcHMpO1xuICB9XG59O1xuXG5leHBvcnQgdHlwZSBVc2VyQWRhcHRlck9wdGlvbnMgPSBCYXNlQWRhcHRlck9wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjdGlvbnNPcHRpb25zIHtcbiAgcmVhZG9ubHkgdXNlckFkYXB0ZXI/OiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBVc2VyQWRhcHRlck9wdGlvbnMpID0+IGFueTtcbiAgcmVhZG9ubHkgdXNlckFkYXB0ZXJPcHRpb25zPzogVXNlckFkYXB0ZXJPcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWNhdGlvbkVtYWlsT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHN1YmplY3Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRlbXBsYXRlPzogc3RyaW5nO1xuICByZWFkb25seSB0ZXh0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkUmVzZXRSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgZW1haWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBob25lPzogc3RyaW5nO1xuICByZWFkb25seSB1c2VybmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZFJlc2V0Q29uZmlybWF0aW9uIGV4dGVuZHMgUGFzc3dvcmRSZXNldFJlcXVlc3Qge1xuICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhc3N3b3JkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU/OiAnZW1haWwnIHwgJ3Bob25lJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQXBpUmVzdWx0c1R5cGUge1xuICByZWFkb25seSB1c2Vyczoge1xuICAgIHJlYWRvbmx5IGFjdGl2ZUNvdW50PzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGFkZFVzZXI/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGNvbmZpcm1Db2RlPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBkZWFjdGl2YXRlPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBmb3Jnb3RQYXNzd29yZD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgaXRlbUJ5SWQ/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGdldFVzZXJCeUF0dHJpYnV0ZT86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgZ2V0VXNlckJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5VG9rZW4/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGl0ZW1CeVVzZXJuYW1lPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBnZXRVc2VyTGlzdD86IFVzZXJbXTtcbiAgICByZWFkb25seSBsaXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeUNvbm5lY3Rpb24/OiBVc2VyW107XG4gICAgcmVhZG9ubHkgbGlzdEJ5TGF0ZXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeVJlYWN0aW9ucz86IFVzZXJbXTtcbiAgICByZWFkb25seSBsaXN0QnlUYWdzPzogVXNlcltdO1xuICAgIHJlYWRvbmx5IHNlYXJjaD86IFVzZXJbXTtcbiAgICByZWFkb25seSByZWZyZXNoU2Vzc2lvbj86IFNlc3Npb25UeXBlO1xuICAgIHJlYWRvbmx5IHJlbW92ZT86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgcmVzZXRQYXNzd29yZD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgc2F2ZUJpbGxpbmdDYXJkPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBzZW5kVmVyaWZpY2F0aW9uRW1haWw/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHNlc3Npb24/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHNpZ25Jbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgc2lnblVwPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBkZWxldGVCaWxsaW5nQ2FyZD86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgdXBkYXRlVXNlcj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgdXBkYXRlUGFzc3dvcmQ/OiBQYXJ0aWFsPGJvb2xlYW4+O1xuICAgIHJlYWRvbmx5IHVwZGF0ZVBsYW4/OiBQYXJ0aWFsPFVzZXI+O1xuICB9O1xufVxuXG5jb25zdCBkZWZhdWx0VXNlclZhbGlkYXRvciA9IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4ge1xuICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZGF0ZVVzZXJJbnB1dChpbnB1dCk7XG5cbiAgaWYob3B0aW9ucz8uc3RyaWN0ICYmICF2YWxpZGF0ZWQudXNlcm5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXJuYW1lIGlzIHJlcXVpcmVkIGluIHN0cmljdCBtb2RlJyk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSB1c2VyQWN0aW9ucyB7XG4gIGFkZFVzZXI6ICh1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICBjb25maXJtQ29kZTogKGNvZGU6IG51bWJlciwge3R5cGUsIHZhbHVlfToge3R5cGU6ICdlbWFpbCcgfCAncGhvbmUnOyB2YWx1ZTogc3RyaW5nfSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgY29uZmlybVNpZ25VcDogKGNvZGU6IHN0cmluZywgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGN1cnJlbnRBdXRoZW50aWNhdGVkVXNlcjogKHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIGxpc3Q6ICh1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBsaXN0QnlDb25uZWN0aW9uOiAodXNlcklkOiBzdHJpbmcsIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBpdGVtQnlJZDogKHVzZXJJZDogc3RyaW5nLCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgZ2V0VXNlckJ5QXR0cmlidXRlOiAoXG4gICAgYXR0cmlidXRlOiAnZW1haWwnIHwgJ3VzZXJuYW1lJyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIHVzZXJQcm9wcz86IHN0cmluZ1tdLFxuICAgIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnNcbiAgKSA9PiBQcm9taXNlPFVzZXI+O1xuICBkZWxldGVCaWxsaW5nQ2FyZDogKHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICBsaXN0QnlMYXRlc3Q6ICh1c2VybmFtZT86IHN0cmluZywgZnJvbT86IG51bWJlciwgdG8/OiBudW1iZXIsIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXJbXT47XG4gIGxpc3RCeVJlYWN0aW9uczogKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcmVhY3Rpb25OYW1lczogc3RyaW5nW10sXG4gICAgZnJvbT86IG51bWJlcixcbiAgICB0bz86IG51bWJlcixcbiAgICBwZXJzb25hUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBsaXN0QnlUYWdzOiAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lczogc3RyaW5nW10sXG4gICAgZnJvbT86IG51bWJlcixcbiAgICB0bz86IG51bWJlcixcbiAgICBwZXJzb25hUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBmb3Jnb3RQYXNzd29yZDogKHVzZXJuYW1lOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHJlcXVlc3RQYXNzd29yZFJlc2V0OiAocmVxdWVzdDogc3RyaW5nIHwgUGFzc3dvcmRSZXNldFJlcXVlc3QsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGlzTG9nZ2VkSW46ICgpID0+IGJvb2xlYW47XG4gIHJlZnJlc2hTZXNzaW9uOiAodG9rZW4/OiBzdHJpbmcsIGV4cGlyZXM/OiBudW1iZXIsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8U2Vzc2lvblR5cGU+O1xuICByZW1vdmU6ICh1c2VySWQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgcmVzZXRQYXNzd29yZDogKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGNvbXBsZXRlUGFzc3dvcmRSZXNldDogKGNvbmZpcm1hdGlvbjogUGFzc3dvcmRSZXNldENvbmZpcm1hdGlvbiwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgc2VhcmNoOiAocXVlcnk6IHN0cmluZywgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcltdPjtcbiAgc2VuZFZlcmlmaWNhdGlvbkVtYWlsOiAoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBlbWFpbE9wdGlvbnM/OiBWZXJpZmljYXRpb25FbWFpbE9wdGlvbnMsXG4gICAgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9uc1xuICApID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHNlc3Npb246ICh1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgc2F2ZUJpbGxpbmdDYXJkOiAoY2FyZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICBzaWduSW46ICh1c2VyOiBQYXJ0aWFsPFVzZXI+LCBleHBpcmVzPzogbnVtYmVyLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFNlc3Npb25UeXBlPjtcbiAgc2lnbk91dDogKHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHNpZ25VcDogKHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPiwgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIHVwZGF0ZVBhc3N3b3JkOiAocGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgdXBkYXRlVXNlcjogKHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPiwgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIHVwZGF0ZVBsYW46IChwbGFuSWQ6IHN0cmluZywgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIHVwZGF0ZVVzZXJBZGFwdGVyOiAoYWRhcHRlcjogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogVXNlckFkYXB0ZXJPcHRpb25zKSA9PiBhbnkpID0+IHZvaWQ7XG4gIHVwZGF0ZVVzZXJBZGFwdGVyT3B0aW9uczogKG9wdGlvbnM6IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVVzZXJBY3Rpb25zID0gKFxuICBmbHV4OiBGbHV4RnJhbWV3b3JrLFxuICBvcHRpb25zPzogVXNlckFjdGlvbnNPcHRpb25zXG4pOiB1c2VyQWN0aW9ucyA9PiB7XG4gIGNvbnN0IHVzZXJCYXNlID0gY3JlYXRlQmFzZUFjdGlvbnMoZmx1eCwgZGVmYXVsdFVzZXJWYWxpZGF0b3IsIHtcbiAgICBhZGFwdGVyOiBvcHRpb25zPy51c2VyQWRhcHRlcixcbiAgICBhZGFwdGVyT3B0aW9uczogb3B0aW9ucz8udXNlckFkYXB0ZXJPcHRpb25zXG4gIH0pO1xuICBjb25zdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzID0gYXN5bmMgKHVzZXJJZCA9ICcnKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd1c2VyLmxpc3QnKTtcbiAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3VzZXIubGlzdEJ5TGF0ZXN0Jyk7XG4gICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd1c2VyLmxpc3RCeVRhZ3MnKTtcbiAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3VzZXIuc2VhcmNoJyk7XG4gICAgaWYodXNlcklkKSB7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgYHVzZXIuaXRlbUJ5SWQ6JHt1c2VySWR9YCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFkZFVzZXIgPSBhc3luYyAoXG4gICAgdXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCB7dXNlcm5hbWUsIGVtYWlsLCBwYXNzd29yZH0gPSB1c2VySW5wdXQ7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIHR5cGU6ICdVc2VySW5wdXQhJyxcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICB1c2VybmFtZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBVc2VyQXBpUmVzdWx0c1R5cGUpOiBQcm9taXNlPEZsdXhBY3Rpb24+ID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSBkYXRhPy51c2Vycz8uYWRkVXNlciB8fCB7fTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuQUREX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHModXNlclByb3BzLCBbXG4gICAgICAnYWRkZWQnLFxuICAgICAgJ2FkZHJlc3MnLFxuICAgICAgJ2RvYicsXG4gICAgICAnY2l0eScsXG4gICAgICAnY291bnRyeScsXG4gICAgICAnZ2VuZGVyJyxcbiAgICAgICdpbWFnZVVybCcsXG4gICAgICAnbGF0aXR1ZGUnLFxuICAgICAgJ2xvbmdpdHVkZScsXG4gICAgICAnbWFpbGluZ0xpc3QnLFxuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICdzdGF0ZScsXG4gICAgICAndGh1bWJVcmwnLFxuICAgICAgJ3VzZXJBY2Nlc3MnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnXG4gICAgXSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHB1YmxpY011dGF0aW9uPFVzZXJBcGlSZXN1bHRzVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdhZGRVc2VyJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHNpZ25VcCA9IGFzeW5jIChcbiAgICB1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHt1c2VybmFtZSwgZW1haWwsIHBhc3N3b3JkfSA9IHVzZXJJbnB1dDtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIGV4cGlyZXM6IHtcbiAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgIHZhbHVlOiAxNVxuICAgICAgfSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgIHVzZXJuYW1lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IFVzZXJBcGlSZXN1bHRzVHlwZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4gPT4ge1xuICAgICAgY29uc3QgdXNlciA9IGRhdGE/LnVzZXJzPy5zaWduVXAgfHwge307XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fVVBfU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ2FkZGVkJyxcbiAgICAgICdtb2RpZmllZCcsXG4gICAgICAndXNlcklkJyxcbiAgICAgICd1c2VybmFtZScsXG4gICAgICAuLi51c2VyUHJvcHNcbiAgICBdKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcHVibGljTXV0YXRpb248VXNlckFwaVJlc3VsdHNUeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3NpZ25VcCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIHJldHVyblByb3BzLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9VUF9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlVXNlciA9IGFzeW5jIChcbiAgICB1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHVwZGF0ZUlucHV0ID0gc2FuaXRpemVVcGRhdGVVc2VySW5wdXQodXNlcklucHV0LCAoZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJywge30pIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgY29uc3Qge1xuICAgICAgYmlydGhkYXRlLFxuICAgICAgZG9iLFxuICAgICAgZW1haWwsXG4gICAgICBmaXJzdE5hbWUsXG4gICAgICBnZW5kZXIsXG4gICAgICBsYXN0TmFtZSxcbiAgICAgIG1haWxpbmdMaXN0LFxuICAgICAgcGFzc3dvcmQsXG4gICAgICBwaG9uZSxcbiAgICAgIHVzZXJJZCxcbiAgICAgIHVzZXJuYW1lXG4gICAgfSA9IHVwZGF0ZUlucHV0O1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgYmlydGhkYXRlOiBiaXJ0aGRhdGUgPz8gZG9iLFxuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIGZpcnN0TmFtZSxcbiAgICAgICAgICBnZW5kZXIsXG4gICAgICAgICAgbGFzdE5hbWUsXG4gICAgICAgICAgbWFpbGluZ0xpc3QsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgcGhvbmUsXG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHVzZXJuYW1lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHVzZXJzID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2VycztcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2Vycz8udXBkYXRlVXNlciB8fCB7fTtcblxuICAgICAgaWYoKHVzZXIgYXMgYW55KT8udXNlcklkICYmICh1c2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXNlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ2FkZGVkJyxcbiAgICAgICdiaXJ0aGRhdGUnLFxuICAgICAgJ2NpdHknLFxuICAgICAgJ2NvdW50cnknLFxuICAgICAgJ2VtYWlsJyxcbiAgICAgICdmaXJzdE5hbWUnLFxuICAgICAgJ2dlbmRlcicsXG4gICAgICAnaW1hZ2VDb3VudCcsXG4gICAgICAnaW1hZ2VVcmwnLFxuICAgICAgJ2xhc3ROYW1lJyxcbiAgICAgICdsYXRpdHVkZScsXG4gICAgICAnbG9uZ2l0dWRlJyxcbiAgICAgICdtYWlsaW5nTGlzdCcsXG4gICAgICAnbW9kaWZpZWQnLFxuICAgICAgJ3Bob25lJyxcbiAgICAgICdzdGF0ZScsXG4gICAgICAndGh1bWJVcmwnLFxuICAgICAgJ3VzZXJBY2Nlc3MnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uKFxuICAgICAgICBmbHV4LFxuICAgICAgICAndXBkYXRlVXNlcicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIHJldHVyblByb3BzLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJVc2VyUmVxdWVzdENhY2hlcyhTdHJpbmcodXNlcklkIHx8ICcnKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNvbmZpcm1Db2RlID0gYXN5bmMgKFxuICAgIGNvZGU6IG51bWJlcixcbiAgICB7dHlwZSwgdmFsdWV9OiB7dHlwZTogJ2VtYWlsJyB8ICdwaG9uZSc7IHZhbHVlOiBzdHJpbmd9LFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgY29kZToge1xuICAgICAgICB0eXBlOiAnSW50IScsXG4gICAgICAgIHZhbHVlOiBjb2RlXG4gICAgICB9LFxuICAgICAgdHlwZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgIHZhbHVlOiB0eXBlXG4gICAgICB9LFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcHVibGljTXV0YXRpb248VXNlckFwaVJlc3VsdHNUeXBlPihmbHV4LCAnY29uZmlybUNvZGUnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBbXSk7XG4gICAgY29uc3QgY29uZmlybWVkID0gISFkYXRhPy51c2Vycz8uY29uZmlybUNvZGU7XG5cbiAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtjb25maXJtZWQsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkNPTkZJUk1fU0lHTl9VUF9TVUNDRVNTfSk7XG5cbiAgICByZXR1cm4gY29uZmlybWVkO1xuICB9O1xuXG4gIGNvbnN0IHJlbW92ZSA9IGFzeW5jICh1c2VySWQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXJJZDoge1xuICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgdmFsdWU6IHVzZXJJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM/LnJlbW92ZSB8fCB7fTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHt0eXBlOiBVU0VSX0NPTlNUQU5UUy5SRU1PVkVfSVRFTV9TVUNDRVNTLCB1c2VyfSk7XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYXBwTXV0YXRpb24oZmx1eCwgJ3JlbW92ZScsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFtdLCB7b25TdWNjZXNzfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXModXNlcklkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2Vzc2lvbiA9IGFzeW5jICh1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxVc2VyPiA9PiB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgYXN5bmMgKHNlc3Npb25Qcm9wcykgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwcFF1ZXJ5KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnZ2V0VXNlckJ5U2Vzc2lvbicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAge30sXG4gICAgICAgIHNlc3Npb25Qcm9wc1xuICAgICAgKSBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgdXNlcnM/OiB7Z2V0VXNlckJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj59O1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gZGF0YT8udXNlcnM/LmdldFVzZXJCeVNlc3Npb24gfHwge307XG5cbiAgICAgIGlmKCFoYXNTZXNzaW9uSWRlbnRpdHkoc2Vzc2lvbkRhdGEpKSB7XG4gICAgICAgIGF3YWl0IGNsZWFyUGVyc2lzdGVkU2Vzc2lvbihmbHV4KTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX1NFU1NJT05fRVJST1J9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkX3Nlc3Npb24nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dFNlc3Npb24gPSBhd2FpdCBzeW5jU3RvcmVkU2Vzc2lvbihmbHV4LCBzZXNzaW9uRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtzZXNzaW9uOiBuZXh0U2Vzc2lvbiwgdHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX1NFU1NJT05fU1VDQ0VTU30pO1xuICAgICAgYXdhaXQgc3luY1BlcnNvbmFUYWdzVG9TZXNzaW9uKGZsdXgsIFN0cmluZygobmV4dFNlc3Npb24gYXMgYW55KT8ucGVyc29uYUlkIHx8ICcnKSk7XG4gICAgICByZXR1cm4gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbicsIG5leHRTZXNzaW9uKSB8fCBuZXh0U2Vzc2lvbikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIGFzIFVzZXI7XG4gICAgfSxcbiAgICB1c2VyUHJvcHMsXG4gICAgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEU1xuICApO1xuXG4gIGNvbnN0IGl0ZW1CeUlkID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyPihmbHV4LCBgdXNlci5pdGVtQnlJZDoke3VzZXJJZH1gLCB7dXNlcklkLCB1c2VyUHJvcHN9LCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICBpZihjYWNoZWRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXJJZDoge1xuICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgdmFsdWU6IHVzZXJJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgZ2V0VXNlckJ5SWQgPSAoKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUgJiB7XG4gICAgICAgIHVzZXJzPzoge2dldFVzZXJCeUlkPzogUGFydGlhbDxVc2VyPn07XG4gICAgICB9KT8udXNlcnM/LmdldFVzZXJCeUlkKSB8fCB7fTtcblxuICAgICAgaWYodXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgZ2V0VXNlckJ5SWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0lURU1fU1VDQ0VTUywgdXNlcjogZ2V0VXNlckJ5SWR9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgICAgKHNhZmVVc2VyUHJvcHMpID0+IGFwcFF1ZXJ5KGZsdXgsICdnZXRVc2VyQnlJZCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHVzZXJQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcj4oZmx1eCwgYHVzZXIuaXRlbUJ5SWQ6JHt1c2VySWR9YCwge3VzZXJJZCwgdXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXIsIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBnZXRVc2VyQnlBdHRyaWJ1dGUgPSBhc3luYyAoXG4gICAgYXR0cmlidXRlOiAnZW1haWwnIHwgJ3VzZXJuYW1lJyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkQXR0cmlidXRlID0gU3RyaW5nKGF0dHJpYnV0ZSB8fCAnJykudHJpbSgpIGFzICdlbWFpbCcgfCAndXNlcm5hbWUnO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGxldCBtYXRjaGluZ1VzZXI6IFBhcnRpYWw8VXNlcj4gPSB7fTtcbiAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFVzZXI+KFxuICAgICAgZmx1eCxcbiAgICAgIGB1c2VyLmdldFVzZXJCeUF0dHJpYnV0ZToke25vcm1hbGl6ZWRBdHRyaWJ1dGV9OiR7bm9ybWFsaXplZFZhbHVlfWAsXG4gICAgICB7YXR0cmlidXRlOiBub3JtYWxpemVkQXR0cmlidXRlLCB1c2VyUHJvcHMsIHZhbHVlOiBub3JtYWxpemVkVmFsdWV9LFxuICAgICAgcmVxdWVzdE9wdGlvbnNcbiAgICApO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBhdHRyaWJ1dGU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogbm9ybWFsaXplZEF0dHJpYnV0ZVxuICAgICAgfSxcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgdmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9ICgoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSAmIHtcbiAgICAgICAgdXNlcnM/OiB7Z2V0VXNlckJ5QXR0cmlidXRlPzogUGFydGlhbDxVc2VyPn07XG4gICAgICB9KT8udXNlcnM/LmdldFVzZXJCeUF0dHJpYnV0ZSkgfHwge307XG4gICAgICBtYXRjaGluZ1VzZXIgPSB1c2VyO1xuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0lURU1fU1VDQ0VTUywgdXNlcn0pO1xuICAgIH07XG5cbiAgICBhd2FpdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgICAoc2FmZVVzZXJQcm9wcykgPT4gcHVibGljUXVlcnkoZmx1eCwgJ2dldFVzZXJCeUF0dHJpYnV0ZScsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHVzZXJQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcj4oXG4gICAgICBmbHV4LFxuICAgICAgYHVzZXIuZ2V0VXNlckJ5QXR0cmlidXRlOiR7bm9ybWFsaXplZEF0dHJpYnV0ZX06JHtub3JtYWxpemVkVmFsdWV9YCxcbiAgICAgIHthdHRyaWJ1dGU6IG5vcm1hbGl6ZWRBdHRyaWJ1dGUsIHVzZXJQcm9wcywgdmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZX0sXG4gICAgICBtYXRjaGluZ1VzZXIgYXMgVXNlcixcbiAgICAgIHJlcXVlc3RPcHRpb25zXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBzYXZlQmlsbGluZ0NhcmQgPSBhc3luYyAoXG4gICAgY2FyZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgY2FyZDoge1xuICAgICAgICB0eXBlOiAnQ3JlZGl0Q2FyZElucHV0IScsXG4gICAgICAgIHZhbHVlOiBjYXJkXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gKChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM/LnNhdmVCaWxsaW5nQ2FyZCkgfHwge307XG5cbiAgICAgIGlmKCh1c2VyIGFzIGFueSk/LnVzZXJJZCAmJiAodXNlciBhcyBhbnkpLnVzZXJJZCA9PT0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uLnVzZXJJZCcpKSB7XG4gICAgICAgIHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIHVzZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlVQREFURV9JVEVNX1NVQ0NFU1MsXG4gICAgICAgIHVzZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXR1cm5Qcm9wcyA9IHNhbml0aXplVXNlclByb3BzKFtcbiAgICAgICdtb2RpZmllZCcsXG4gICAgICAnc3RyaXBlQ2FyZEJyYW5kJyxcbiAgICAgICdzdHJpcGVDYXJkSWQnLFxuICAgICAgJ3N0cmlwZUNhcmRMYXN0NCcsXG4gICAgICAndXNlcklkJyxcbiAgICAgICd1c2VybmFtZScsXG4gICAgICAuLi51c2VyUHJvcHNcbiAgICBdKTtcbiAgICBjb25zdCBzZXNzaW9uVXNlcklkID0gU3RyaW5nKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbi51c2VySWQnKSB8fCAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uKFxuICAgICAgICBmbHV4LFxuICAgICAgICAnc2F2ZUJpbGxpbmdDYXJkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKHNlc3Npb25Vc2VySWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBkZWxldGVCaWxsaW5nQ2FyZCA9IGFzeW5jIChcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSAoKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8uZGVsZXRlQmlsbGluZ0NhcmQpIHx8IHt9O1xuXG4gICAgICBpZigodXNlciBhcyBhbnkpPy51c2VySWQgJiYgKHVzZXIgYXMgYW55KS51c2VySWQgPT09IGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbi51c2VySWQnKSkge1xuICAgICAgICBzeW5jU3RvcmVkU2Vzc2lvbihmbHV4LCB1c2VyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5VUERBVEVfSVRFTV9TVUNDRVNTLFxuICAgICAgICB1c2VyXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV0dXJuUHJvcHMgPSBzYW5pdGl6ZVVzZXJQcm9wcyhbXG4gICAgICAnbW9kaWZpZWQnLFxuICAgICAgJ3N0cmlwZUNhcmRCcmFuZCcsXG4gICAgICAnc3RyaXBlQ2FyZElkJyxcbiAgICAgICdzdHJpcGVDYXJkTGFzdDQnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJJZCA9IFN0cmluZyhmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykgfHwgJycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2RlbGV0ZUJpbGxpbmdDYXJkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICB7fSxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKHNlc3Npb25Vc2VySWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1cGRhdGVQbGFuID0gYXN5bmMgKFxuICAgIHBsYW5JZDogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBuZXh0UGxhbklkID0gU3RyaW5nKHBsYW5JZCB8fCAnJykudHJpbSgpO1xuXG4gICAgaWYoIW5leHRQbGFuSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzdWJzY3JpcHRpb24gcGxhbklkIGlzIHJlcXVpcmVkIHRvIHVwZGF0ZSBhIHVzZXIgcGxhbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgcGxhbklkOiB7XG4gICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICB2YWx1ZTogbmV4dFBsYW5JZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9ICgoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy51cGRhdGVQbGFuKSB8fCB7fTtcblxuICAgICAgaWYoKHVzZXIgYXMgYW55KT8udXNlcklkICYmICh1c2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXNlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICdwbGFuRXhwaXJlcycsXG4gICAgICAncGxhbklkJyxcbiAgICAgICdwbGFuU3RhdHVzJyxcbiAgICAgICdwbGFuU3Vic2NyaXB0aW9uSWQnLFxuICAgICAgJ3N0cmlwZUNhcmRCcmFuZCcsXG4gICAgICAnc3RyaXBlQ2FyZElkJyxcbiAgICAgICdzdHJpcGVDYXJkTGFzdDQnLFxuICAgICAgJ3VzZXJBY2Nlc3MnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJJZCA9IFN0cmluZyhmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykgfHwgJycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3VwZGF0ZVBsYW4nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICByZXR1cm5Qcm9wcyxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoc2Vzc2lvblVzZXJJZCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3QgPSBhc3luYyAodXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3QnLCB7dXNlclByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IGxpc3QgPSAoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5nZXRVc2VyTGlzdCB8fCBbXTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsaXN0LCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhJbnZhbGlkRmllbGRSZXRyeShcbiAgICAgIChzYWZlVXNlclByb3BzKSA9PiBhcHBRdWVyeShmbHV4LCAnZ2V0VXNlckxpc3QnLCBEQVRBX1RZUEUsIHt9LCBzYWZlVXNlclByb3BzLCB7b25TdWNjZXNzfSksXG4gICAgICB1c2VyUHJvcHMsXG4gICAgICBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTXG4gICAgKTtcblxuICAgIHJldHVybiBzZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdCcsIHt1c2VyUHJvcHN9LCByZXN1bHQgYXMgVXNlcltdLCByZXF1ZXN0T3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3QgbGlzdEJ5TGF0ZXN0ID0gYXN5bmMgKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcgPSAnJyxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyW10+ID0+IHtcbiAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdEJ5TGF0ZXN0Jywge3VzZXJuYW1lLCBmcm9tLCB0bywgdXNlclByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBmcm9tOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogZnJvbVxuICAgICAgfSxcbiAgICAgIHRvOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogdG9cbiAgICAgIH0sXG4gICAgICB1c2VybmFtZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgdmFsdWU6IHVzZXJuYW1lXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8ubGlzdEJ5TGF0ZXN0IHx8IFtdO1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2xpc3QsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1N9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgICAgKHNhZmVVc2VyUHJvcHMpID0+IGFwcFF1ZXJ5KGZsdXgsICdsaXN0QnlMYXRlc3QnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBzYWZlVXNlclByb3BzLCB7b25TdWNjZXNzfSksXG4gICAgICB1c2VyUHJvcHMsXG4gICAgICBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTXG4gICAgKTtcblxuICAgIHJldHVybiBzZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdEJ5TGF0ZXN0Jywge3VzZXJuYW1lLCBmcm9tLCB0bywgdXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXJbXSwgcmVxdWVzdE9wdGlvbnMpO1xuICB9O1xuXG4gIGNvbnN0IGxpc3RCeUNvbm5lY3Rpb24gPSBhc3luYyAoXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcltdPiA9PlxuICAgIFtdXG4gIDtcblxuICBjb25zdCBsaXN0QnlSZWFjdGlvbnMgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICByZWFjdGlvbk5hbWVzOiBzdHJpbmdbXSxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICBwZXJzb25hUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyW10+ID0+XG4gICAgW11cbiAgO1xuXG4gIGNvbnN0IGxpc3RCeVRhZ3MgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lczogc3RyaW5nW10sXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgcGVyc29uYVByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3RCeVRhZ3MnLCB7dXNlcm5hbWUsIHRhZ05hbWVzLCBmcm9tLCB0bywgcGVyc29uYVByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBmcm9tOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogZnJvbVxuICAgICAgfSxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgdHlwZTogJ1tTdHJpbmchXScsXG4gICAgICAgIHZhbHVlOiB0YWdOYW1lc1xuICAgICAgfSxcbiAgICAgIHRvOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogdG9cbiAgICAgIH0sXG4gICAgICB1c2VybmFtZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgdmFsdWU6IHVzZXJuYW1lXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8ubGlzdEJ5VGFncyB8fCBbXTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsaXN0LCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhJbnZhbGlkRmllbGRSZXRyeShcbiAgICAgIChzYWZlVXNlclByb3BzKSA9PiBhcHBRdWVyeShmbHV4LCAnbGlzdEJ5VGFncycsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHBlcnNvbmFQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5saXN0QnlUYWdzJywge3VzZXJuYW1lLCB0YWdOYW1lcywgZnJvbSwgdG8sIHBlcnNvbmFQcm9wc30sIHJlc3VsdCBhcyBVc2VyW10sIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBzZWFyY2ggPSBhc3luYyAocXVlcnk6IHN0cmluZywgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLnNlYXJjaCcsIHtxdWVyeSwgdXNlclByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBxdWVyeToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgIHZhbHVlOiBxdWVyeVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgbGlzdCA9IChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM/LnNlYXJjaCB8fCBbXTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsaXN0LCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhJbnZhbGlkRmllbGRSZXRyeShcbiAgICAgIChzYWZlVXNlclByb3BzKSA9PiBhcHBRdWVyeShmbHV4LCAnc2VhcmNoJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgc2FmZVVzZXJQcm9wcywge29uU3VjY2Vzc30pLFxuICAgICAgdXNlclByb3BzLFxuICAgICAgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEU1xuICAgICk7XG5cbiAgICByZXR1cm4gc2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLnNlYXJjaCcsIHtxdWVyeSwgdXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXJbXSwgcmVxdWVzdE9wdGlvbnMpO1xuICB9O1xuXG4gIGNvbnN0IGlzTG9nZ2VkSW4gPSAoKTogYm9vbGVhbiA9PiBpc0xvZ2dlZEluV2l0aFN0b3JhZ2UoZmx1eCk7XG5cbiAgY29uc3QgY3VycmVudEF1dGhlbnRpY2F0ZWRVc2VyID0gYXN5bmMgKHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGh5ZHJhdGVTZXNzaW9uRnJvbVN0b3JhZ2UoZmx1eCk7XG4gICAgcmV0dXJuIChzZXNzaW9uIHx8IHt9KSBhcyBVc2VyO1xuICB9O1xuXG4gIGNvbnN0IHJlZnJlc2hTZXNzaW9uQWN0aW9uID0gYXN5bmMgKHRva2VuPzogc3RyaW5nLCBleHBpcmVzPzogbnVtYmVyLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWZyZXNoU2Vzc2lvbihmbHV4LCB0b2tlbiwgZXhwaXJlcyk7XG4gICAgcmV0dXJuIChyZXN1bHQ/LnJlZnJlc2hTZXNzaW9uIHx8IHt9KSBhcyBTZXNzaW9uVHlwZTtcbiAgfTtcblxuICBjb25zdCBzaWduSW4gPSBhc3luYyAoXG4gICAgdXNlcjogUGFydGlhbDxVc2VyPixcbiAgICBleHBpcmVzPzogbnVtYmVyLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgICBjb25zdCB7ZW1haWwsIHBob25lLCB1c2VybmFtZSwgcGFzc3dvcmR9ID0gdXNlcjtcbiAgICBsZXQgdXNlcklucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZih1c2VybmFtZSAmJiBwYXNzd29yZCkge1xuICAgICAgdXNlcklucHV0ID0ge1xuICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgdXNlcm5hbWVcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmKGVtYWlsICYmIHBhc3N3b3JkKSB7XG4gICAgICB1c2VySW5wdXQgPSB7XG4gICAgICAgIGVtYWlsLFxuICAgICAgICBwYXNzd29yZFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYocGhvbmUgJiYgcGFzc3dvcmQpIHtcbiAgICAgIHVzZXJJbnB1dCA9IHtcbiAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgIHBob25lXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXJuYW1lLCBlbWFpbCwgb3IgcGhvbmUgbnVtYmVyIGFuZCBwYXNzd29yZCBhcmUgcmVxdWlyZWQgdG8gc2lnbiBpbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zyb21GbHV4KGZsdXgpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEV4cGlyZXMgPSBNYXRoLm1heCgxLCBOdW1iZXIoZXhwaXJlcyB8fCBjb25maWcuYXBwPy5zZXNzaW9uPy5tYXhNaW51dGVzIHx8IDE1KSk7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXNXaXRoVXNlcklucHV0ID0ge1xuICAgICAgZXhwaXJlczoge1xuICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgdmFsdWU6IHJlcXVlc3RlZEV4cGlyZXNcbiAgICAgIH0sXG4gICAgICB1c2VyOiB7XG4gICAgICAgIHR5cGU6ICdVc2VySW5wdXQhJyxcbiAgICAgICAgdmFsdWU6IHVzZXJJbnB1dFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSk6IFByb21pc2U8Rmx1eEFjdGlvbj4gPT4ge1xuICAgICAgY29uc3QgdXNlcnMgPSAoZGF0YSBhcyBhbnkpPy51c2VycztcbiAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gbm9ybWFsaXplU2Vzc2lvbih1c2Vycz8uc2lnbkluIHx8IHt9KTtcbiAgICAgIGNvbnN0IHN0b3JlZFNlc3Npb24gPSBhd2FpdCBzeW5jU3RvcmVkU2Vzc2lvbihmbHV4LCBzZXNzaW9uRGF0YSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXNzaW9uOiBzdG9yZWRTZXNzaW9uLFxuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX0lOX1NVQ0NFU1NcbiAgICAgIH0gYXMgRmx1eEFjdGlvbjtcbiAgICB9O1xuXG4gICAgY29uc3QgcGVyZm9ybVNpZ25JbiA9IGFzeW5jIChxdWVyeVZhcmlhYmxlczogYW55KTogUHJvbWlzZTxTZXNzaW9uVHlwZT4gPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvblJlc3VsdCA9IGF3YWl0IHB1YmxpY011dGF0aW9uPFNlc3Npb25UeXBlICYgVXNlckFwaVJlc3VsdHNUeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3NpZ25JbicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFsnZXhwaXJlcycsICdpc3N1ZWQnLCAndG9rZW4nLCAndXNlcklkJywgJ3VzZXJuYW1lJ10sXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgICAgY29uc3QgYmFzZVNlc3Npb24gPSBhd2FpdCBzeW5jU3RvcmVkU2Vzc2lvbihmbHV4LCBnZXRTZXNzaW9uUGF5bG9hZChzZXNzaW9uUmVzdWx0KSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGh5ZHJhdGVkU2Vzc2lvbiA9IGF3YWl0IHNlc3Npb24oWyd1c2VySWQnLCAncGVyc29uYUlkJywgJ3VzZXJBY2Nlc3MnLCAndXNlcm5hbWUnXSwgcmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICBhd2FpdCBzeW5jUGVyc29uYVRhZ3NUb1Nlc3Npb24oZmx1eCwgU3RyaW5nKChoeWRyYXRlZFNlc3Npb24gYXMgYW55KT8ucGVyc29uYUlkIHx8ICcnKSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrU2Vzc2lvbiA9IGF3YWl0IHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIGJhc2VTZXNzaW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgICAgc2Vzc2lvbjogZmFsbGJhY2tTZXNzaW9uLFxuICAgICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fSU5fU1VDQ0VTU1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrU2Vzc2lvbjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmluYWxTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oXG4gICAgICAgIGZsdXgsXG4gICAgICAgIChmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24nLCBiYXNlU2Vzc2lvbikgfHwgYmFzZVNlc3Npb24pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICApO1xuICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHNlc3Npb246IGZpbmFsU2Vzc2lvbixcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9JTl9TVUNDRVNTXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmaW5hbFNlc3Npb247XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcGVyZm9ybVNpZ25JbihxdWVyeVZhcmlhYmxlc1dpdGhVc2VySW5wdXQpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX0lOX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJVc2VyUmVxdWVzdENhY2hlcyhTdHJpbmcoKHVzZXIgYXMgYW55KT8udXNlcklkIHx8ICcnKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHNpZ25PdXQgPSBhc3luYyAocmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBhd2FpdCBjbGVhclBlcnNpc3RlZFNlc3Npb24oZmx1eCk7XG4gICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7c2Vzc2lvbjoge30sIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fT1VUX1NVQ0NFU1N9KTtcbiAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgY29uZmlybVNpZ25VcCA9IGFzeW5jIChjb2RlOiBzdHJpbmcsIHR5cGU6ICdlbWFpbCcgfCAncGhvbmUnLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4gPT5cbiAgICB0cnVlO1xuXG4gIGNvbnN0IHJlcXVlc3RQYXNzd29yZFJlc2V0ID0gYXN5bmMgKFxuICAgIHJlcXVlc3Q6IHN0cmluZyB8IFBhc3N3b3JkUmVzZXRSZXF1ZXN0LFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGxldCBmb3Jnb3RQYXNzd29yZFN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHtpZGVudGlmaWVyLCB0eXBlfSA9IGdldFBhc3N3b3JkUmVzZXRJZGVudGlmaWVyKHJlcXVlc3QpO1xuICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHR5cGUgPT09ICdwaG9uZScgPyAncGhvbmUnIDogdHlwZSA9PT0gJ2VtYWlsJyA/ICdlbWFpbCcgOiAndXNlcm5hbWUnO1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgW2F0dHJpYnV0ZV06IGlkZW50aWZpZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YT86IFVzZXJBcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LmZvcmdvdFBhc3N3b3JkO1xuICAgICAgZm9yZ290UGFzc3dvcmRTdWNjZWVkZWQgPSBzdWNjZXNzO1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBzdWNjZXNzID8gVVNFUl9DT05TVEFOVFMuRk9SR09UX1BBU1NXT1JEX1NVQ0NFU1MgOiBVU0VSX0NPTlNUQU5UUy5GT1JHT1RfUEFTU1dPUkRfRVJST1JcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhd2FpdCBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KGZsdXgsICdmb3Jnb3RQYXNzd29yZCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFtdLCB7b25TdWNjZXNzfSk7XG5cbiAgICBpZighZm9yZ290UGFzc3dvcmRTdWNjZWVkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9yZ290X3Bhc3N3b3JkX2ZhaWxlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IGZvcmdvdFBhc3N3b3JkID0gYXN5bmMgKHVzZXJuYW1lOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIHJlcXVlc3RQYXNzd29yZFJlc2V0KHVzZXJuYW1lLCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgY29uc3Qgc2VuZFZlcmlmaWNhdGlvbkVtYWlsID0gYXN5bmMgKFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgZW1haWxPcHRpb25zOiBWZXJpZmljYXRpb25FbWFpbE9wdGlvbnMgPSB7fSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIC4uLihlbWFpbE9wdGlvbnMuc3ViamVjdCA/IHt2ZXJpZmljYXRpb25FbWFpbFN1YmplY3Q6IGVtYWlsT3B0aW9ucy5zdWJqZWN0fSA6IHt9KSxcbiAgICAgICAgICAuLi4oZW1haWxPcHRpb25zLnRlbXBsYXRlID8ge3ZlcmlmaWNhdGlvbkVtYWlsVGVtcGxhdGU6IGVtYWlsT3B0aW9ucy50ZW1wbGF0ZX0gOiB7fSksXG4gICAgICAgICAgLi4uKGVtYWlsT3B0aW9ucy50ZXh0ID8ge3ZlcmlmaWNhdGlvbkVtYWlsVGV4dDogZW1haWxPcHRpb25zLnRleHR9IDoge30pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE/OiBVc2VyQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAhIWRhdGE/LnVzZXJzPy5zZW5kVmVyaWZpY2F0aW9uRW1haWw7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IHN1Y2Nlc3MgPyBVU0VSX0NPTlNUQU5UUy5DT05GSVJNX1NJR05fVVBfU1VDQ0VTUyA6IFVTRVJfQ09OU1RBTlRTLkNPTkZJUk1fU0lHTl9VUF9FUlJPUlxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgZmx1eCxcbiAgICAgICdzZW5kVmVyaWZpY2F0aW9uRW1haWwnLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICBbXSxcbiAgICAgIHtvblN1Y2Nlc3N9XG4gICAgKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gISFkYXRhPy51c2Vycz8uc2VuZFZlcmlmaWNhdGlvbkVtYWlsO1xuICAgICAgaWYoIXN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZW5kX3ZlcmlmaWNhdGlvbl9lbWFpbF9mYWlsZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHJlc2V0UGFzc3dvcmQgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICBwYXNzd29yZDogc3RyaW5nLFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJyxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIGNvZGU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogY29kZVxuICAgICAgfSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIC4uLih0eXBlID09PSAnZW1haWwnID8ge2VtYWlsOiB1c2VybmFtZX0gOiB7cGhvbmU6IHVzZXJuYW1lfSksXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YT86IFVzZXJBcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LnJlc2V0UGFzc3dvcmQ7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IHN1Y2Nlc3MgPyBVU0VSX0NPTlNUQU5UUy5SRVNFVF9QQVNTV09SRF9TVUNDRVNTIDogVVNFUl9DT05TVEFOVFMuUkVTRVRfUEFTU1dPUkRfRVJST1JcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gcHVibGljTXV0YXRpb248VXNlckFwaVJlc3VsdHNUeXBlPihmbHV4LCAncmVzZXRQYXNzd29yZCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFtdLCB7b25TdWNjZXNzfSkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LnJlc2V0UGFzc3dvcmQ7XG4gICAgICBpZighc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jlc2V0X3Bhc3N3b3JkX2ZhaWxlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY29tcGxldGVQYXNzd29yZFJlc2V0ID0gYXN5bmMgKFxuICAgIGNvbmZpcm1hdGlvbjogUGFzc3dvcmRSZXNldENvbmZpcm1hdGlvbixcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCB1c2VybmFtZSA9IFN0cmluZyhjb25maXJtYXRpb24uZW1haWwgfHwgY29uZmlybWF0aW9uLnBob25lIHx8IGNvbmZpcm1hdGlvbi51c2VybmFtZSB8fCAnJykudHJpbSgpO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRQYXNzd29yZFJlc2V0VHlwZShjb25maXJtYXRpb24pO1xuICAgIHJldHVybiByZXNldFBhc3N3b3JkKHVzZXJuYW1lLCBjb25maXJtYXRpb24ucGFzc3dvcmQsIGNvbmZpcm1hdGlvbi5jb2RlLCB0eXBlLCByZXF1ZXN0T3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlUGFzc3dvcmQgPSBhc3luYyAocGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPGJvb2xlYW4+ID0+XG4gICAgdHJ1ZVxuICA7XG5cbiAgcmV0dXJuIHtcbiAgICBhZGRVc2VyLFxuICAgIGNvbmZpcm1Db2RlLFxuICAgIGNvbmZpcm1TaWduVXAsXG4gICAgY29tcGxldGVQYXNzd29yZFJlc2V0LFxuICAgIGN1cnJlbnRBdXRoZW50aWNhdGVkVXNlcixcbiAgICBkZWxldGVCaWxsaW5nQ2FyZCxcbiAgICBsaXN0LFxuICAgIGZvcmdvdFBhc3N3b3JkLFxuICAgIGlzTG9nZ2VkSW4sXG4gICAgaXRlbUJ5SWQsXG4gICAgZ2V0VXNlckJ5QXR0cmlidXRlLFxuICAgIGxpc3RCeUNvbm5lY3Rpb24sXG4gICAgbGlzdEJ5TGF0ZXN0LFxuICAgIGxpc3RCeVJlYWN0aW9ucyxcbiAgICBsaXN0QnlUYWdzLFxuICAgIHJlZnJlc2hTZXNzaW9uOiByZWZyZXNoU2Vzc2lvbkFjdGlvbixcbiAgICByZW1vdmUsXG4gICAgcmVxdWVzdFBhc3N3b3JkUmVzZXQsXG4gICAgcmVzZXRQYXNzd29yZCxcbiAgICBzYXZlQmlsbGluZ0NhcmQsXG4gICAgc2VhcmNoLFxuICAgIHNlbmRWZXJpZmljYXRpb25FbWFpbCxcbiAgICBzZXNzaW9uLFxuICAgIHNpZ25JbixcbiAgICBzaWduT3V0LFxuICAgIHNpZ25VcCxcbiAgICB1cGRhdGVQYXNzd29yZCxcbiAgICB1cGRhdGVVc2VyLFxuICAgIHVwZGF0ZVBsYW4sXG4gICAgdXBkYXRlVXNlckFkYXB0ZXI6IHVzZXJCYXNlLnVwZGF0ZUFkYXB0ZXIsXG4gICAgdXBkYXRlVXNlckFkYXB0ZXJPcHRpb25zOiB1c2VyQmFzZS51cGRhdGVPcHRpb25zXG4gIH07XG59O1xuIl0sIm5hbWVzIjpbInZhbGlkYXRlVXNlcklucHV0IiwiVVNFUl9DT05TVEFOVFMiLCJhcHBNdXRhdGlvbiIsImFwcFF1ZXJ5IiwicHVibGljTXV0YXRpb24iLCJwdWJsaWNRdWVyeSIsInJlZnJlc2hTZXNzaW9uIiwiY3JlYXRlQmFzZUFjdGlvbnMiLCJjbGVhclBlcnNpc3RlZFNlc3Npb24iLCJoeWRyYXRlU2Vzc2lvbkZyb21TdG9yYWdlIiwiaXNMb2dnZWRJbiIsImlzTG9nZ2VkSW5XaXRoU3RvcmFnZSIsIm5vcm1hbGl6ZVNlc3Npb24iLCJzdG9yZVNlc3Npb24iLCJnZXRDb25maWdGcm9tRmx1eCIsImNsZWFyQ2FjaGVkUmVxdWVzdCIsImdldENhY2hlZFJlcXVlc3QiLCJzZXRDYWNoZWRSZXF1ZXN0Iiwic3luY1BlcnNvbmFUYWdzVG9TZXNzaW9uIiwiREFUQV9UWVBFIiwiREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEUyIsIlNFTlNJVElWRV9VU0VSX0ZJRUxEUyIsIlNldCIsIklOVkFMSURfRklFTERfUkVHRVgiLCJoYXNTZXNzaW9uSWRlbnRpdHkiLCJ1c2VyIiwiX2lkIiwidXNlcklkIiwidXNlcm5hbWUiLCJlbWFpbCIsInNhbml0aXplVXBkYXRlVXNlcklucHV0IiwidXNlcklucHV0IiwiY3VycmVudFNlc3Npb24iLCJuZXh0VXNlciIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJmaWVsZCIsInZhbHVlIiwidW5kZWZpbmVkIiwicGFzc3dvcmQiLCJTdHJpbmciLCJ0cmltIiwiY3VycmVudFZhbHVlIiwic3luY1N0b3JlZFNlc3Npb24iLCJmbHV4Iiwic2Vzc2lvblBhdGNoIiwiZ2V0U3RhdGUiLCJnZXRTZXNzaW9uUGF5bG9hZCIsInBheWxvYWQiLCJzZXNzaW9uIiwiZ2V0RmllbGRSb290IiwidHJpbW1lZCIsIm1hdGNoIiwic2FuaXRpemVVc2VyUHJvcHMiLCJwcm9wcyIsImZhbGxiYWNrUHJvcHMiLCJzZWVuIiwic2FuaXRpemVkIiwibGlzdCIsInJvb3QiLCJoYXMiLCJhZGQiLCJwdXNoIiwibGVuZ3RoIiwiZ2V0SW52YWxpZEZpZWxkcyIsImVycm9yIiwiZXJyb3JzIiwic291cmNlIiwiaW52YWxpZEZpZWxkcyIsImZvckVhY2giLCJpdGVtIiwibWVzc2FnZSIsImV4ZWMiLCJsYXN0SW5kZXgiLCJnZXRQYXNzd29yZFJlc2V0SWRlbnRpZmllciIsInJlcXVlc3QiLCJpZGVudGlmaWVyIiwicGhvbmUiLCJ0eXBlIiwiaW5jbHVkZXMiLCJnZXRQYXNzd29yZFJlc2V0VHlwZSIsImNvbmZpcm1hdGlvbiIsIndpdGhJbnZhbGlkRmllbGRSZXRyeSIsInJlcXVlc3RXaXRoUHJvcHMiLCJzYWZlUHJvcHMiLCJzaXplIiwicmV0cnlQcm9wcyIsImZpbHRlciIsImRlZmF1bHRVc2VyVmFsaWRhdG9yIiwiaW5wdXQiLCJvcHRpb25zIiwidmFsaWRhdGVkIiwic3RyaWN0IiwiRXJyb3IiLCJjcmVhdGVVc2VyQWN0aW9ucyIsInVzZXJCYXNlIiwiYWRhcHRlciIsInVzZXJBZGFwdGVyIiwiYWRhcHRlck9wdGlvbnMiLCJ1c2VyQWRhcHRlck9wdGlvbnMiLCJjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzIiwiYWRkVXNlciIsInVzZXJQcm9wcyIsInJlcXVlc3RPcHRpb25zIiwicXVlcnlWYXJpYWJsZXMiLCJvblN1Y2Nlc3MiLCJkYXRhIiwidXNlcnMiLCJkaXNwYXRjaCIsIkFERF9JVEVNX1NVQ0NFU1MiLCJyZXR1cm5Qcm9wcyIsInNpZ25VcCIsImV4cGlyZXMiLCJTSUdOX1VQX1NVQ0NFU1MiLCJTSUdOX1VQX0VSUk9SIiwidXBkYXRlVXNlciIsInVwZGF0ZUlucHV0IiwiYmlydGhkYXRlIiwiZG9iIiwiZmlyc3ROYW1lIiwiZ2VuZGVyIiwibGFzdE5hbWUiLCJtYWlsaW5nTGlzdCIsIlVQREFURV9JVEVNX1NVQ0NFU1MiLCJjb25maXJtQ29kZSIsImNvZGUiLCJjb25maXJtZWQiLCJDT05GSVJNX1NJR05fVVBfU1VDQ0VTUyIsInJlbW92ZSIsIlJFTU9WRV9JVEVNX1NVQ0NFU1MiLCJzZXNzaW9uUHJvcHMiLCJzZXNzaW9uRGF0YSIsImdldFVzZXJCeVNlc3Npb24iLCJHRVRfU0VTU0lPTl9FUlJPUiIsIm5leHRTZXNzaW9uIiwiR0VUX1NFU1NJT05fU1VDQ0VTUyIsInBlcnNvbmFJZCIsIml0ZW1CeUlkIiwiY2FjaGVkUmVzdWx0IiwiZ2V0VXNlckJ5SWQiLCJHRVRfSVRFTV9TVUNDRVNTIiwicmVzdWx0Iiwic2FmZVVzZXJQcm9wcyIsImdldFVzZXJCeUF0dHJpYnV0ZSIsImF0dHJpYnV0ZSIsIm5vcm1hbGl6ZWRBdHRyaWJ1dGUiLCJub3JtYWxpemVkVmFsdWUiLCJtYXRjaGluZ1VzZXIiLCJzYXZlQmlsbGluZ0NhcmQiLCJjYXJkIiwic2Vzc2lvblVzZXJJZCIsImRlbGV0ZUJpbGxpbmdDYXJkIiwidXBkYXRlUGxhbiIsInBsYW5JZCIsIm5leHRQbGFuSWQiLCJnZXRVc2VyTGlzdCIsIkdFVF9MSVNUX1NVQ0NFU1MiLCJsaXN0QnlMYXRlc3QiLCJmcm9tIiwidG8iLCJsaXN0QnlDb25uZWN0aW9uIiwibGlzdEJ5UmVhY3Rpb25zIiwicmVhY3Rpb25OYW1lcyIsInBlcnNvbmFQcm9wcyIsImxpc3RCeVRhZ3MiLCJ0YWdOYW1lcyIsInRhZ3MiLCJzZWFyY2giLCJxdWVyeSIsImN1cnJlbnRBdXRoZW50aWNhdGVkVXNlciIsInJlZnJlc2hTZXNzaW9uQWN0aW9uIiwidG9rZW4iLCJzaWduSW4iLCJjb25maWciLCJyZXF1ZXN0ZWRFeHBpcmVzIiwiTWF0aCIsIm1heCIsIk51bWJlciIsImFwcCIsIm1heE1pbnV0ZXMiLCJxdWVyeVZhcmlhYmxlc1dpdGhVc2VySW5wdXQiLCJzdG9yZWRTZXNzaW9uIiwiU0lHTl9JTl9TVUNDRVNTIiwicGVyZm9ybVNpZ25JbiIsInNlc3Npb25SZXN1bHQiLCJiYXNlU2Vzc2lvbiIsImh5ZHJhdGVkU2Vzc2lvbiIsImZhbGxiYWNrU2Vzc2lvbiIsImZpbmFsU2Vzc2lvbiIsIlNJR05fSU5fRVJST1IiLCJzaWduT3V0IiwiU0lHTl9PVVRfU1VDQ0VTUyIsImNvbmZpcm1TaWduVXAiLCJyZXF1ZXN0UGFzc3dvcmRSZXNldCIsImZvcmdvdFBhc3N3b3JkU3VjY2VlZGVkIiwic3VjY2VzcyIsImZvcmdvdFBhc3N3b3JkIiwiRk9SR09UX1BBU1NXT1JEX1NVQ0NFU1MiLCJGT1JHT1RfUEFTU1dPUkRfRVJST1IiLCJzZW5kVmVyaWZpY2F0aW9uRW1haWwiLCJlbWFpbE9wdGlvbnMiLCJzdWJqZWN0IiwidmVyaWZpY2F0aW9uRW1haWxTdWJqZWN0IiwidGVtcGxhdGUiLCJ2ZXJpZmljYXRpb25FbWFpbFRlbXBsYXRlIiwidGV4dCIsInZlcmlmaWNhdGlvbkVtYWlsVGV4dCIsIkNPTkZJUk1fU0lHTl9VUF9FUlJPUiIsInRoZW4iLCJyZXNldFBhc3N3b3JkIiwiUkVTRVRfUEFTU1dPUkRfU1VDQ0VTUyIsIlJFU0VUX1BBU1NXT1JEX0VSUk9SIiwiY29tcGxldGVQYXNzd29yZFJlc2V0IiwidXBkYXRlUGFzc3dvcmQiLCJuZXdQYXNzd29yZCIsInVwZGF0ZVVzZXJBZGFwdGVyIiwidXBkYXRlQWRhcHRlciIsInVwZGF0ZVVzZXJBZGFwdGVyT3B0aW9ucyIsInVwZGF0ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLGlCQUFpQixRQUFPLDRDQUE0QztBQUM1RSxTQUFRQyxjQUFjLFFBQU8sNEJBQTRCO0FBQ3pELFNBQVFDLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxjQUFjLEVBQUVDLFdBQVcsRUFBRUMsY0FBYyxRQUFPLHFCQUFxQjtBQUN0RyxTQUFRQyxpQkFBaUIsUUFBTyxtQ0FBbUM7QUFDbkUsU0FDRUMscUJBQXFCLEVBQ3JCQyx5QkFBeUIsRUFDekJDLGNBQWNDLHFCQUFxQixFQUNuQ0MsZ0JBQWdCLEVBQ2hCQyxZQUFZLFFBQ1AseUJBQXlCO0FBQ2hDLFNBQVFDLGlCQUFpQixRQUFPLDZCQUE2QjtBQUM3RCxTQUFRQyxrQkFBa0IsRUFBRUMsZ0JBQWdCLEVBQUVDLGdCQUFnQixRQUFPLDhCQUE4QjtBQUNuRyxTQUFRQyx3QkFBd0IsUUFBTyxzQ0FBc0M7QUFRN0UsTUFBTUMsWUFBWTtBQUNsQixNQUFNQyw0QkFBNEI7SUFBQztJQUFVO0NBQVc7QUFDeEQsTUFBTUMsd0JBQXdCLElBQUlDLElBQUk7SUFDcEM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0NBQ0Q7QUFDRCxNQUFNQyxzQkFBc0I7QUFDNUIsTUFBTUMscUJBQXFCLENBQUNDLE9BQzFCLENBQUMsQ0FBRUEsQ0FBQUEsUUFBUyxDQUFBLEFBQUNBLEtBQWFDLEdBQUcsSUFBSSxBQUFDRCxLQUFhRSxNQUFNLElBQUksQUFBQ0YsS0FBYUcsUUFBUSxJQUFJLEFBQUNILEtBQWFJLEtBQUssQUFBRCxDQUFDO0FBRXhHLE1BQU1DLDBCQUEwQixDQUFDQyxZQUEyQixDQUFDLENBQUMsRUFBRUMsaUJBQTBDLENBQUMsQ0FBQztJQUMxRyxNQUFNQyxXQUFXQyxPQUFPQyxPQUFPLENBQUNKLFdBQVdLLE1BQU0sQ0FBQyxDQUFDWCxNQUErQixDQUFDWSxPQUFPQyxNQUFNO1FBQzlGLElBQUdBLFVBQVVDLGFBQWFELFVBQVUsTUFBTTtZQUN4QyxPQUFPYjtRQUNUO1FBRUEsSUFBR1ksVUFBVSxZQUFZO1lBQ3ZCLE1BQU1HLFdBQVdDLE9BQU9ILFNBQVMsSUFBSUksSUFBSTtZQUV6QyxJQUFHRixVQUFVO2dCQUNYZixLQUFLZSxRQUFRLEdBQUdBO1lBQ2xCO1lBRUEsT0FBT2Y7UUFDVDtRQUVBLElBQUdZLFVBQVUsVUFBVTtZQUNyQlosS0FBS0UsTUFBTSxHQUFHVztZQUNkLE9BQU9iO1FBQ1Q7UUFFQSxNQUFNa0IsZUFBZVgsY0FBYyxDQUFDSyxNQUFNO1FBRTFDLElBQUdJLE9BQU9ILFdBQVdHLE9BQU9FLGdCQUFnQixLQUFLO1lBQy9DbEIsSUFBSSxDQUFDWSxNQUFNLEdBQUdDO1FBQ2hCO1FBRUEsT0FBT2I7SUFDVCxHQUFHLENBQUM7SUFFSixPQUFPUTtBQUNUO0FBRUEsTUFBTVcsb0JBQW9CLE9BQU9DLE1BQXFCQyxlQUF3QyxDQUFDLENBQUM7SUFDOUYsTUFBTWQsaUJBQWtCYSxLQUFLRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO0lBQzlELE9BQU9sQyxhQUFhZ0MsTUFBTTtRQUFDLEdBQUdiLGNBQWM7UUFBRSxHQUFHYyxZQUFZO0lBQUE7QUFDL0Q7QUFFQSxNQUFNRSxvQkFBb0IsQ0FBQ0M7SUFDekIsSUFBR0EsV0FBVyxPQUFPQSxZQUFZLFlBQVksYUFBY0EsU0FBcUM7UUFDOUYsT0FBUSxBQUFDLEFBQUNBLFFBQW9DQyxPQUFPLElBQUssQ0FBQztJQUM3RDtJQUVBLE9BQVFELFdBQVcsT0FBT0EsWUFBWSxXQUFXQSxVQUFVLENBQUM7QUFDOUQ7QUFFQSxNQUFNRSxlQUFlLENBQUNkO0lBQ3BCLE1BQU1lLFVBQVVmLE1BQU1LLElBQUk7SUFDMUIsTUFBTVcsUUFBUUQsUUFBUUMsS0FBSyxDQUFDO0lBQzVCLE9BQU9BLFFBQVFBLEtBQUssQ0FBQyxFQUFFLEdBQUc7QUFDNUI7QUFFQSxNQUFNQyxvQkFBb0IsQ0FBQ0MsUUFBa0IsRUFBRSxFQUFFQyxnQkFBMEJwQyx5QkFBeUI7SUFDbEcsTUFBTXFDLE9BQU8sSUFBSW5DO0lBQ2pCLE1BQU1vQyxZQUFZSCxNQUFNbkIsTUFBTSxDQUFDLENBQUN1QixNQUFnQnRCO1FBQzlDLE1BQU11QixPQUFPVCxhQUFhZDtRQUUxQixJQUFHLENBQUN1QixRQUFRdkMsc0JBQXNCd0MsR0FBRyxDQUFDRCxTQUFTSCxLQUFLSSxHQUFHLENBQUN4QixRQUFRO1lBQzlELE9BQU9zQjtRQUNUO1FBRUFGLEtBQUtLLEdBQUcsQ0FBQ3pCO1FBQ1RzQixLQUFLSSxJQUFJLENBQUMxQjtRQUNWLE9BQU9zQjtJQUNULEdBQUcsRUFBRTtJQUVMLElBQUdELFVBQVVNLE1BQU0sR0FBRyxHQUFHO1FBQ3ZCLE9BQU9OO0lBQ1Q7SUFFQSxPQUFPRixjQUFjcEIsTUFBTSxDQUFDLENBQUN1QixNQUFnQnRCO1FBQzNDLE1BQU11QixPQUFPVCxhQUFhZDtRQUUxQixJQUFHLENBQUN1QixRQUFRdkMsc0JBQXNCd0MsR0FBRyxDQUFDRCxTQUFTSCxLQUFLSSxHQUFHLENBQUN4QixRQUFRO1lBQzlELE9BQU9zQjtRQUNUO1FBRUFGLEtBQUtLLEdBQUcsQ0FBQ3pCO1FBQ1RzQixLQUFLSSxJQUFJLENBQUMxQjtRQUNWLE9BQU9zQjtJQUNULEdBQUcsRUFBRTtBQUNQO0FBRUEsTUFBTU0sbUJBQW1CLENBQUNDO0lBQ3hCLE1BQU1DLFNBQVMsQUFBQ0QsT0FBZUMsVUFBV0QsT0FBZUUsUUFBUUQsVUFBVSxFQUFFO0lBQzdFLE1BQU1FLGdCQUFnQixJQUFJL0M7SUFFMUI2QyxPQUFPRyxPQUFPLENBQUMsQ0FBQ0M7UUFDZCxNQUFNQyxVQUFVLE9BQU9ELFNBQVMsV0FBV0EsT0FBT0EsTUFBTUMsV0FBVztRQUNuRSxJQUFJbkIsUUFBZ0M5QixvQkFBb0JrRCxJQUFJLENBQUNEO1FBRTdELE1BQU1uQixNQUFPO1lBQ1hnQixjQUFjUCxHQUFHLENBQUNULEtBQUssQ0FBQyxFQUFFO1lBQzFCQSxRQUFROUIsb0JBQW9Ca0QsSUFBSSxDQUFDRDtRQUNuQztRQUVBakQsb0JBQW9CbUQsU0FBUyxHQUFHO0lBQ2xDO0lBRUEsT0FBT0w7QUFDVDtBQUVBLE1BQU1NLDZCQUE2QixDQUFDQztJQUlsQyxNQUFNQyxhQUFhLE9BQU9ELFlBQVksV0FDbENuQyxPQUFPbUMsV0FBVyxJQUFJbEMsSUFBSSxLQUMxQkQsT0FBT21DLFFBQVEvQyxLQUFLLElBQUkrQyxRQUFRRSxLQUFLLElBQUlGLFFBQVFoRCxRQUFRLElBQUksSUFBSWMsSUFBSTtJQUV6RSxPQUFPO1FBQ0xtQztRQUNBRSxNQUFNLE9BQU9ILFlBQVksWUFBWUEsUUFBUUUsS0FBSyxHQUFHLFVBQVVELFdBQVdHLFFBQVEsQ0FBQyxPQUFPLFVBQVU7SUFDdEc7QUFDRjtBQUVBLE1BQU1DLHVCQUF1QixDQUFDQyxlQUM1QkEsYUFBYUgsSUFBSSxJQUFLRyxDQUFBQSxhQUFhSixLQUFLLEdBQUcsVUFBVSxPQUFNO0FBRTdELE1BQU1LLHdCQUF3QixPQUM1QkMsa0JBQ0E3QixPQUNBQyxnQkFBMEJwQyx5QkFBeUI7SUFFbkQsTUFBTWlFLFlBQVkvQixrQkFBa0JDLE9BQU9DO0lBRTNDLElBQUk7UUFDRixPQUFPLE1BQU00QixpQkFBaUJDO0lBQ2hDLEVBQUUsT0FBTW5CLE9BQU87UUFDYixNQUFNRyxnQkFBZ0JKLGlCQUFpQkM7UUFFdkMsSUFBR0csY0FBY2lCLElBQUksS0FBSyxHQUFHO1lBQzNCLE1BQU1wQjtRQUNSO1FBRUEsTUFBTXFCLGFBQWFGLFVBQVVHLE1BQU0sQ0FBQyxDQUFDbkQsUUFBVSxDQUFDZ0MsY0FBY1IsR0FBRyxDQUFDVixhQUFhZDtRQUUvRSxJQUFHa0QsV0FBV3ZCLE1BQU0sS0FBSyxLQUFLdUIsV0FBV3ZCLE1BQU0sS0FBS3FCLFVBQVVyQixNQUFNLEVBQUU7WUFDcEUsTUFBTUU7UUFDUjtRQUVBLE9BQU9rQixpQkFBaUJHO0lBQzFCO0FBQ0Y7QUE4REEsTUFBTUUsdUJBQXVCLENBQUNDLE9BQWdCQztJQUM1QyxNQUFNQyxZQUFZNUYsa0JBQWtCMEY7SUFFcEMsSUFBR0MsU0FBU0UsVUFBVSxDQUFDRCxVQUFVaEUsUUFBUSxFQUFFO1FBQ3pDLE1BQU0sSUFBSWtFLE1BQU07SUFDbEI7SUFFQSxPQUFPRjtBQUNUO0FBMkRBLE9BQU8sTUFBTUcsb0JBQW9CLENBQy9CbEQsTUFDQThDO0lBRUEsTUFBTUssV0FBV3pGLGtCQUFrQnNDLE1BQU00QyxzQkFBc0I7UUFDN0RRLFNBQVNOLFNBQVNPO1FBQ2xCQyxnQkFBZ0JSLFNBQVNTO0lBQzNCO0lBQ0EsTUFBTUMseUJBQXlCLE9BQU8xRSxTQUFTLEVBQUU7UUFDL0MsTUFBTVosbUJBQW1COEIsTUFBTTtRQUMvQixNQUFNOUIsbUJBQW1COEIsTUFBTTtRQUMvQixNQUFNOUIsbUJBQW1COEIsTUFBTTtRQUMvQixNQUFNOUIsbUJBQW1COEIsTUFBTTtRQUMvQixJQUFHbEIsUUFBUTtZQUNULE1BQU1aLG1CQUFtQjhCLE1BQU0sQ0FBQyxjQUFjLEVBQUVsQixRQUFRO1FBQzFEO0lBQ0Y7SUFFQSxNQUFNMkUsVUFBVSxPQUNkdkUsV0FDQXdFLFlBQXNCLEVBQUUsRUFDeEJDLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsTUFBTSxFQUFDNUUsUUFBUSxFQUFFQyxLQUFLLEVBQUVXLFFBQVEsRUFBQyxHQUFHVDtRQUNwQyxNQUFNMEUsaUJBQWlCO1lBQ3JCaEYsTUFBTTtnQkFDSnNELE1BQU07Z0JBQ056QyxPQUFPO29CQUNMVDtvQkFDQVc7b0JBQ0FaO2dCQUNGO1lBQ0Y7UUFDRjtRQUVBLE1BQU04RSxZQUFZLENBQUNDO1lBQ2pCLE1BQU1sRixPQUFPa0YsTUFBTUMsT0FBT04sV0FBVyxDQUFDO1lBQ3RDLE9BQU96RCxLQUFLZ0UsUUFBUSxDQUFDO2dCQUNuQjlCLE1BQU05RSxlQUFlNkcsZ0JBQWdCO2dCQUNyQ3JGO1lBQ0Y7UUFDRjtRQUVBLE1BQU1zRixjQUFjekQsa0JBQWtCaUQsV0FBVztZQUMvQztZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtTQUNEO1FBRUQsSUFBSTtZQUNGLE9BQU8sTUFBTW5HLGVBQ1h5QyxNQUNBLFdBQ0ExQixXQUNBc0YsZ0JBQ0FNLGFBQ0E7Z0JBQUNMO1lBQVM7UUFFZCxTQUFVO1lBQ1IsTUFBTUw7UUFDUjtJQUNGO0lBRUEsTUFBTVcsU0FBUyxPQUNiakYsV0FDQXdFLFlBQXNCLEVBQUUsRUFDeEJDLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsTUFBTSxFQUFDNUUsUUFBUSxFQUFFQyxLQUFLLEVBQUVXLFFBQVEsRUFBQyxHQUFHVDtRQUNwQyxNQUFNMEUsaUJBQWlCO1lBQ3JCUSxTQUFTO2dCQUNQbEMsTUFBTTtnQkFDTnpDLE9BQU87WUFDVDtZQUNBYixNQUFNO2dCQUNKc0QsTUFBTTtnQkFDTnpDLE9BQU87b0JBQ0xUO29CQUNBVztvQkFDQVo7Z0JBQ0Y7WUFDRjtRQUNGO1FBRUEsTUFBTThFLFlBQVksQ0FBQ0M7WUFDakIsTUFBTWxGLE9BQU9rRixNQUFNQyxPQUFPSSxVQUFVLENBQUM7WUFDckMsT0FBT25FLEtBQUtnRSxRQUFRLENBQUM7Z0JBQ25COUIsTUFBTTlFLGVBQWVpSCxlQUFlO2dCQUNwQ3pGO1lBQ0Y7UUFDRjtRQUVBLE1BQU1zRixjQUFjekQsa0JBQWtCO1lBQ3BDO1lBQ0E7WUFDQTtZQUNBO2VBQ0dpRDtTQUNKO1FBRUQsSUFBSTtZQUNGLE9BQU8sTUFBTW5HLGVBQ1h5QyxNQUNBLFVBQ0ExQixXQUNBc0YsZ0JBQ0FNLGFBQ0E7Z0JBQUNMO1lBQVM7UUFFZCxFQUFFLE9BQU14QyxPQUFPO1lBQ2JyQixLQUFLZ0UsUUFBUSxDQUFDO2dCQUFDM0M7Z0JBQU9hLE1BQU05RSxlQUFla0gsYUFBYTtZQUFBO1lBQ3hELE1BQU1qRDtRQUNSLFNBQVU7WUFDUixNQUFNbUM7UUFDUjtJQUNGO0lBRUEsTUFBTWUsYUFBYSxPQUNqQnJGLFdBQ0F3RSxZQUFzQixFQUFFLEVBQ3hCQyxpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLE1BQU1hLGNBQWN2Rix3QkFBd0JDLFdBQVljLEtBQUtFLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7UUFDOUYsTUFBTSxFQUNKdUUsU0FBUyxFQUNUQyxHQUFHLEVBQ0gxRixLQUFLLEVBQ0wyRixTQUFTLEVBQ1RDLE1BQU0sRUFDTkMsUUFBUSxFQUNSQyxXQUFXLEVBQ1huRixRQUFRLEVBQ1JzQyxLQUFLLEVBQ0xuRCxNQUFNLEVBQ05DLFFBQVEsRUFDVCxHQUFHeUY7UUFDSixNQUFNWixpQkFBaUI7WUFDckJoRixNQUFNO2dCQUNKc0QsTUFBTTtnQkFDTnpDLE9BQU87b0JBQ0xnRixXQUFXQSxhQUFhQztvQkFDeEIxRjtvQkFDQTJGO29CQUNBQztvQkFDQUM7b0JBQ0FDO29CQUNBbkY7b0JBQ0FzQztvQkFDQW5EO29CQUNBQztnQkFDRjtZQUNGO1FBQ0Y7UUFFQSxNQUFNOEUsWUFBWSxDQUFDQyxPQUF1QixDQUFDLENBQUM7WUFDMUMsTUFBTUMsUUFBU0QsTUFBd0NDO1lBQ3ZELE1BQU1uRixPQUFPbUYsT0FBT1EsY0FBYyxDQUFDO1lBRW5DLElBQUcsQUFBQzNGLE1BQWNFLFVBQVUsQUFBQ0YsS0FBYUUsTUFBTSxLQUFLa0IsS0FBS0UsUUFBUSxDQUFDLHdCQUF3QjtnQkFDekZILGtCQUFrQkMsTUFBTXBCO1lBQzFCO1lBRUEsT0FBT29CLEtBQUtnRSxRQUFRLENBQUM7Z0JBQ25COUIsTUFBTTlFLGVBQWUySCxtQkFBbUI7Z0JBQ3hDbkc7WUFDRjtRQUNGO1FBRUEsTUFBTXNGLGNBQWN6RCxrQkFBa0I7WUFDcEM7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtlQUNHaUQ7U0FDSjtRQUVELElBQUk7WUFDRixPQUFPLE1BQU1yRyxZQUNYMkMsTUFDQSxjQUNBMUIsV0FDQXNGLGdCQUNBTSxhQUNBO2dCQUFDTDtZQUFTO1FBRWQsU0FBVTtZQUNSLE1BQU1MLHVCQUF1QjVELE9BQU9kLFVBQVU7UUFDaEQ7SUFDRjtJQUVBLE1BQU1rRyxjQUFjLE9BQ2xCQyxNQUNBLEVBQUMvQyxJQUFJLEVBQUV6QyxLQUFLLEVBQTJDLEVBQ3ZEa0UsaUJBQXVDLENBQUMsQ0FBQztRQUV6QyxNQUFNQyxpQkFBaUI7WUFDckJxQixNQUFNO2dCQUNKL0MsTUFBTTtnQkFDTnpDLE9BQU93RjtZQUNUO1lBQ0EvQyxNQUFNO2dCQUNKQSxNQUFNO2dCQUNOekMsT0FBT3lDO1lBQ1Q7WUFDQXpDLE9BQU87Z0JBQ0x5QyxNQUFNO2dCQUNOekM7WUFDRjtRQUNGO1FBRUEsTUFBTXFFLE9BQU8sTUFBTXZHLGVBQW1DeUMsTUFBTSxlQUFlMUIsV0FBV3NGLGdCQUFnQixFQUFFO1FBQ3hHLE1BQU1zQixZQUFZLENBQUMsQ0FBQ3BCLE1BQU1DLE9BQU9pQjtRQUVqQyxNQUFNaEYsS0FBS2dFLFFBQVEsQ0FBQztZQUFDa0I7WUFBV2hELE1BQU05RSxlQUFlK0gsdUJBQXVCO1FBQUE7UUFFNUUsT0FBT0Q7SUFDVDtJQUVBLE1BQU1FLFNBQVMsT0FBT3RHLFFBQWdCNkUsaUJBQXVDLENBQUMsQ0FBQztRQUM3RSxNQUFNQyxpQkFBaUI7WUFDckI5RSxRQUFRO2dCQUNOb0QsTUFBTTtnQkFDTnpDLE9BQU9YO1lBQ1Q7UUFDRjtRQUVBLE1BQU0rRSxZQUFZLENBQUNDLE9BQXVCLENBQUMsQ0FBQztZQUMxQyxNQUFNbEYsT0FBTyxBQUFDa0YsTUFBd0NDLE9BQU9xQixVQUFVLENBQUM7WUFDeEUsT0FBT3BGLEtBQUtnRSxRQUFRLENBQUM7Z0JBQUM5QixNQUFNOUUsZUFBZWlJLG1CQUFtQjtnQkFBRXpHO1lBQUk7UUFDdEU7UUFFQSxJQUFJO1lBQ0YsT0FBTyxNQUFNdkIsWUFBWTJDLE1BQU0sVUFBVTFCLFdBQVdzRixnQkFBZ0IsRUFBRSxFQUFFO2dCQUFDQztZQUFTO1FBQ3BGLFNBQVU7WUFDUixNQUFNTCx1QkFBdUIxRTtRQUMvQjtJQUNGO0lBRUEsTUFBTXVCLFVBQVUsT0FBT3FELFlBQXNCLEVBQUUsRUFBRUMsaUJBQXVDLENBQUMsQ0FBQyxHQUFvQnJCLHNCQUM1RyxPQUFPZ0Q7WUFDTCxNQUFNeEIsT0FBTyxNQUFNeEcsU0FDakIwQyxNQUNBLG9CQUNBMUIsV0FDQSxDQUFDLEdBQ0RnSDtZQUlGLE1BQU1DLGNBQWN6QixNQUFNQyxPQUFPeUIsb0JBQW9CLENBQUM7WUFFdEQsSUFBRyxDQUFDN0csbUJBQW1CNEcsY0FBYztnQkFDbkMsTUFBTTVILHNCQUFzQnFDO2dCQUM1QixNQUFNQSxLQUFLZ0UsUUFBUSxDQUFDO29CQUFDOUIsTUFBTTlFLGVBQWVxSSxpQkFBaUI7Z0JBQUE7Z0JBQzNELE1BQU0sSUFBSXhDLE1BQU07WUFDbEI7WUFFQSxNQUFNeUMsY0FBYyxNQUFNM0Ysa0JBQWtCQyxNQUFNdUY7WUFDbEQsTUFBTXZGLEtBQUtnRSxRQUFRLENBQUM7Z0JBQUMzRCxTQUFTcUY7Z0JBQWF4RCxNQUFNOUUsZUFBZXVJLG1CQUFtQjtZQUFBO1lBQ25GLE1BQU10SCx5QkFBeUIyQixNQUFNSixPQUFPLEFBQUM4RixhQUFxQkUsYUFBYTtZQUMvRSxPQUFPLE1BQU03RixrQkFBa0JDLE1BQU9BLEtBQUtFLFFBQVEsQ0FBQyxnQkFBZ0J3RixnQkFBZ0JBO1FBQ3RGLEdBQ0FoQyxXQUNBbkY7SUFHRixNQUFNc0gsV0FBVyxPQUFPL0csUUFBZ0I0RSxZQUFzQixFQUFFLEVBQUVDLGlCQUF1QyxDQUFDLENBQUM7UUFDekcsTUFBTW1DLGVBQWUzSCxpQkFBdUI2QixNQUFNLENBQUMsY0FBYyxFQUFFbEIsUUFBUSxFQUFFO1lBQUNBO1lBQVE0RTtRQUFTLEdBQUdDO1FBRWxHLElBQUdtQyxpQkFBaUJwRyxXQUFXO1lBQzdCLE9BQU9vRztRQUNUO1FBRUEsTUFBTWxDLGlCQUFpQjtZQUNyQjlFLFFBQVE7Z0JBQ05vRCxNQUFNO2dCQUNOekMsT0FBT1g7WUFDVDtRQUNGO1FBRUEsTUFBTStFLFlBQVksQ0FBQ0MsT0FBdUIsQ0FBQyxDQUFDO1lBQzFDLE1BQU1pQyxjQUFjLEFBQUVqQyxNQUVsQkMsT0FBT2dDLGVBQWdCLENBQUM7WUFFNUIsSUFBR2pILFdBQVdrQixLQUFLRSxRQUFRLENBQUMsd0JBQXdCO2dCQUNsREgsa0JBQWtCQyxNQUFNK0Y7WUFDMUI7WUFFQSxPQUFPL0YsS0FBS2dFLFFBQVEsQ0FBQztnQkFBQzlCLE1BQU05RSxlQUFlNEksZ0JBQWdCO2dCQUFFcEgsTUFBTW1IO1lBQVc7UUFDaEY7UUFFQSxNQUFNRSxTQUFTLE1BQU0zRCxzQkFDbkIsQ0FBQzRELGdCQUFrQjVJLFNBQVMwQyxNQUFNLGVBQWUxQixXQUFXc0YsZ0JBQWdCc0MsZUFBZTtnQkFBQ3JDO1lBQVMsSUFDckdILFdBQ0FuRjtRQUdGLE9BQU9ILGlCQUF1QjRCLE1BQU0sQ0FBQyxjQUFjLEVBQUVsQixRQUFRLEVBQUU7WUFBQ0E7WUFBUTRFO1FBQVMsR0FBR3VDLFFBQWdCdEM7SUFDdEc7SUFFQSxNQUFNd0MscUJBQXFCLE9BQ3pCQyxXQUNBM0csT0FDQWlFLFlBQXNCLEVBQUUsRUFDeEJDLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsTUFBTTBDLHNCQUFzQnpHLE9BQU93RyxhQUFhLElBQUl2RyxJQUFJO1FBQ3hELE1BQU15RyxrQkFBa0IxRyxPQUFPSCxTQUFTLElBQUlJLElBQUk7UUFDaEQsSUFBSTBHLGVBQThCLENBQUM7UUFDbkMsTUFBTVQsZUFBZTNILGlCQUNuQjZCLE1BQ0EsQ0FBQyx3QkFBd0IsRUFBRXFHLG9CQUFvQixDQUFDLEVBQUVDLGlCQUFpQixFQUNuRTtZQUFDRixXQUFXQztZQUFxQjNDO1lBQVdqRSxPQUFPNkc7UUFBZSxHQUNsRTNDO1FBR0YsSUFBR21DLGlCQUFpQnBHLFdBQVc7WUFDN0IsT0FBT29HO1FBQ1Q7UUFFQSxNQUFNbEMsaUJBQWlCO1lBQ3JCd0MsV0FBVztnQkFDVGxFLE1BQU07Z0JBQ056QyxPQUFPNEc7WUFDVDtZQUNBNUcsT0FBTztnQkFDTHlDLE1BQU07Z0JBQ056QyxPQUFPNkc7WUFDVDtRQUNGO1FBRUEsTUFBTXpDLFlBQVksQ0FBQ0MsT0FBdUIsQ0FBQyxDQUFDO1lBQzFDLE1BQU1sRixPQUFPLEFBQUVrRixNQUVYQyxPQUFPb0Msc0JBQXVCLENBQUM7WUFDbkNJLGVBQWUzSDtZQUVmLE9BQU9vQixLQUFLZ0UsUUFBUSxDQUFDO2dCQUFDOUIsTUFBTTlFLGVBQWU0SSxnQkFBZ0I7Z0JBQUVwSDtZQUFJO1FBQ25FO1FBRUEsTUFBTTBELHNCQUNKLENBQUM0RCxnQkFBa0IxSSxZQUFZd0MsTUFBTSxzQkFBc0IxQixXQUFXc0YsZ0JBQWdCc0MsZUFBZTtnQkFBQ3JDO1lBQVMsSUFDL0dILFdBQ0FuRjtRQUdGLE9BQU9ILGlCQUNMNEIsTUFDQSxDQUFDLHdCQUF3QixFQUFFcUcsb0JBQW9CLENBQUMsRUFBRUMsaUJBQWlCLEVBQ25FO1lBQUNGLFdBQVdDO1lBQXFCM0M7WUFBV2pFLE9BQU82RztRQUFlLEdBQ2xFQyxjQUNBNUM7SUFFSjtJQUVBLE1BQU02QyxrQkFBa0IsT0FDdEJDLE1BQ0EvQyxZQUFzQixFQUFFLEVBQ3hCQyxpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLE1BQU1DLGlCQUFpQjtZQUNyQjZDLE1BQU07Z0JBQ0p2RSxNQUFNO2dCQUNOekMsT0FBT2dIO1lBQ1Q7UUFDRjtRQUVBLE1BQU01QyxZQUFZLENBQUNDLE9BQXVCLENBQUMsQ0FBQztZQUMxQyxNQUFNbEYsT0FBTyxBQUFFa0YsTUFBd0NDLE9BQU95QyxtQkFBb0IsQ0FBQztZQUVuRixJQUFHLEFBQUM1SCxNQUFjRSxVQUFVLEFBQUNGLEtBQWFFLE1BQU0sS0FBS2tCLEtBQUtFLFFBQVEsQ0FBQyx3QkFBd0I7Z0JBQ3pGSCxrQkFBa0JDLE1BQU1wQjtZQUMxQjtZQUVBLE9BQU9vQixLQUFLZ0UsUUFBUSxDQUFDO2dCQUNuQjlCLE1BQU05RSxlQUFlMkgsbUJBQW1CO2dCQUN4Q25HO1lBQ0Y7UUFDRjtRQUVBLE1BQU1zRixjQUFjekQsa0JBQWtCO1lBQ3BDO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtlQUNHaUQ7U0FDSjtRQUNELE1BQU1nRCxnQkFBZ0I5RyxPQUFPSSxLQUFLRSxRQUFRLENBQUMsMEJBQTBCO1FBRXJFLElBQUk7WUFDRixPQUFPLE1BQU03QyxZQUNYMkMsTUFDQSxtQkFDQTFCLFdBQ0FzRixnQkFDQU0sYUFDQTtnQkFBQ0w7WUFBUztRQUVkLFNBQVU7WUFDUixNQUFNTCx1QkFBdUJrRDtRQUMvQjtJQUNGO0lBRUEsTUFBTUMsb0JBQW9CLE9BQ3hCakQsWUFBc0IsRUFBRSxFQUN4QkMsaUJBQXVDLENBQUMsQ0FBQztRQUV6QyxNQUFNRSxZQUFZLENBQUNDLE9BQXVCLENBQUMsQ0FBQztZQUMxQyxNQUFNbEYsT0FBTyxBQUFFa0YsTUFBd0NDLE9BQU80QyxxQkFBc0IsQ0FBQztZQUVyRixJQUFHLEFBQUMvSCxNQUFjRSxVQUFVLEFBQUNGLEtBQWFFLE1BQU0sS0FBS2tCLEtBQUtFLFFBQVEsQ0FBQyx3QkFBd0I7Z0JBQ3pGSCxrQkFBa0JDLE1BQU1wQjtZQUMxQjtZQUVBLE9BQU9vQixLQUFLZ0UsUUFBUSxDQUFDO2dCQUNuQjlCLE1BQU05RSxlQUFlMkgsbUJBQW1CO2dCQUN4Q25HO1lBQ0Y7UUFDRjtRQUVBLE1BQU1zRixjQUFjekQsa0JBQWtCO1lBQ3BDO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtlQUNHaUQ7U0FDSjtRQUNELE1BQU1nRCxnQkFBZ0I5RyxPQUFPSSxLQUFLRSxRQUFRLENBQUMsMEJBQTBCO1FBRXJFLElBQUk7WUFDRixPQUFPLE1BQU03QyxZQUNYMkMsTUFDQSxxQkFDQTFCLFdBQ0EsQ0FBQyxHQUNENEYsYUFDQTtnQkFBQ0w7WUFBUztRQUVkLFNBQVU7WUFDUixNQUFNTCx1QkFBdUJrRDtRQUMvQjtJQUNGO0lBRUEsTUFBTUUsYUFBYSxPQUNqQkMsUUFDQW5ELFlBQXNCLEVBQUUsRUFDeEJDLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsTUFBTW1ELGFBQWFsSCxPQUFPaUgsVUFBVSxJQUFJaEgsSUFBSTtRQUU1QyxJQUFHLENBQUNpSCxZQUFZO1lBQ2QsTUFBTSxJQUFJN0QsTUFBTTtRQUNsQjtRQUVBLE1BQU1XLGlCQUFpQjtZQUNyQmlELFFBQVE7Z0JBQ04zRSxNQUFNO2dCQUNOekMsT0FBT3FIO1lBQ1Q7UUFDRjtRQUVBLE1BQU1qRCxZQUFZLENBQUNDLE9BQXVCLENBQUMsQ0FBQztZQUMxQyxNQUFNbEYsT0FBTyxBQUFFa0YsTUFBd0NDLE9BQU82QyxjQUFlLENBQUM7WUFFOUUsSUFBRyxBQUFDaEksTUFBY0UsVUFBVSxBQUFDRixLQUFhRSxNQUFNLEtBQUtrQixLQUFLRSxRQUFRLENBQUMsd0JBQXdCO2dCQUN6Rkgsa0JBQWtCQyxNQUFNcEI7WUFDMUI7WUFFQSxPQUFPb0IsS0FBS2dFLFFBQVEsQ0FBQztnQkFDbkI5QixNQUFNOUUsZUFBZTJILG1CQUFtQjtnQkFDeENuRztZQUNGO1FBQ0Y7UUFFQSxNQUFNc0YsY0FBY3pELGtCQUFrQjtZQUNwQztZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO2VBQ0dpRDtTQUNKO1FBQ0QsTUFBTWdELGdCQUFnQjlHLE9BQU9JLEtBQUtFLFFBQVEsQ0FBQywwQkFBMEI7UUFFckUsSUFBSTtZQUNGLE9BQU8sTUFBTTdDLFlBQ1gyQyxNQUNBLGNBQ0ExQixXQUNBc0YsZ0JBQ0FNLGFBQ0E7Z0JBQUNMO1lBQVM7UUFFZCxTQUFVO1lBQ1IsTUFBTUwsdUJBQXVCa0Q7UUFDL0I7SUFDRjtJQUVBLE1BQU01RixPQUFPLE9BQU80QyxZQUFzQixFQUFFLEVBQUVDLGlCQUF1QyxDQUFDLENBQUM7UUFDckYsTUFBTW1DLGVBQWUzSCxpQkFBeUI2QixNQUFNLGFBQWE7WUFBQzBEO1FBQVMsR0FBR0M7UUFFOUUsSUFBR21DLGlCQUFpQnBHLFdBQVc7WUFDN0IsT0FBT29HO1FBQ1Q7UUFFQSxNQUFNakMsWUFBWSxDQUFDQyxPQUF1QixDQUFDLENBQUM7WUFDMUMsTUFBTWhELE9BQU8sQUFBQ2dELE1BQXdDQyxPQUFPZ0QsZUFBZSxFQUFFO1lBQzlFLE9BQU8vRyxLQUFLZ0UsUUFBUSxDQUFDO2dCQUFDbEQ7Z0JBQU1vQixNQUFNOUUsZUFBZTRKLGdCQUFnQjtZQUFBO1FBQ25FO1FBRUEsTUFBTWYsU0FBUyxNQUFNM0Qsc0JBQ25CLENBQUM0RCxnQkFBa0I1SSxTQUFTMEMsTUFBTSxlQUFlMUIsV0FBVyxDQUFDLEdBQUc0SCxlQUFlO2dCQUFDckM7WUFBUyxJQUN6RkgsV0FDQW5GO1FBR0YsT0FBT0gsaUJBQXlCNEIsTUFBTSxhQUFhO1lBQUMwRDtRQUFTLEdBQUd1QyxRQUFrQnRDO0lBQ3BGO0lBRUEsTUFBTXNELGVBQWUsT0FDbkJsSSxXQUFtQixFQUFFLEVBQ3JCbUksT0FBZSxDQUFDLEVBQ2hCQyxLQUFhLEVBQUUsRUFDZnpELFlBQXNCLEVBQUUsRUFDeEJDLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsTUFBTW1DLGVBQWUzSCxpQkFBeUI2QixNQUFNLHFCQUFxQjtZQUFDakI7WUFBVW1JO1lBQU1DO1lBQUl6RDtRQUFTLEdBQUdDO1FBRTFHLElBQUdtQyxpQkFBaUJwRyxXQUFXO1lBQzdCLE9BQU9vRztRQUNUO1FBRUEsTUFBTWxDLGlCQUFpQjtZQUNyQnNELE1BQU07Z0JBQ0poRixNQUFNO2dCQUNOekMsT0FBT3lIO1lBQ1Q7WUFDQUMsSUFBSTtnQkFDRmpGLE1BQU07Z0JBQ056QyxPQUFPMEg7WUFDVDtZQUNBcEksVUFBVTtnQkFDUm1ELE1BQU07Z0JBQ056QyxPQUFPVjtZQUNUO1FBQ0Y7UUFFQSxNQUFNOEUsWUFBWSxDQUFDQyxPQUF1QixDQUFDLENBQUM7WUFDMUMsTUFBTWhELE9BQU8sQUFBQ2dELE1BQXdDQyxPQUFPa0QsZ0JBQWdCLEVBQUU7WUFDL0UsT0FBT2pILEtBQUtnRSxRQUFRLENBQUM7Z0JBQUNsRDtnQkFBTW9CLE1BQU05RSxlQUFlNEosZ0JBQWdCO1lBQUE7UUFDbkU7UUFFQSxNQUFNZixTQUFTLE1BQU0zRCxzQkFDbkIsQ0FBQzRELGdCQUFrQjVJLFNBQVMwQyxNQUFNLGdCQUFnQjFCLFdBQVdzRixnQkFBZ0JzQyxlQUFlO2dCQUFDckM7WUFBUyxJQUN0R0gsV0FDQW5GO1FBR0YsT0FBT0gsaUJBQXlCNEIsTUFBTSxxQkFBcUI7WUFBQ2pCO1lBQVVtSTtZQUFNQztZQUFJekQ7UUFBUyxHQUFHdUMsUUFBa0J0QztJQUNoSDtJQUVBLE1BQU15RCxtQkFBbUIsT0FDdkJ0SSxRQUNBb0ksT0FBZSxDQUFDLEVBQ2hCQyxLQUFhLEVBQUUsRUFDZnpELFlBQXNCLEVBQUUsRUFDeEJDLGlCQUF1QyxDQUFDLENBQUMsR0FFekMsRUFBRTtJQUdKLE1BQU0wRCxrQkFBa0IsT0FDdEJ0SSxVQUNBdUksZUFDQUosT0FBZSxDQUFDLEVBQ2hCQyxLQUFhLEVBQUUsRUFDZkksZUFBeUIsRUFBRSxFQUMzQjVELGlCQUF1QyxDQUFDLENBQUMsR0FFekMsRUFBRTtJQUdKLE1BQU02RCxhQUFhLE9BQ2pCekksVUFDQTBJLFVBQ0FQLE9BQWUsQ0FBQyxFQUNoQkMsS0FBYSxFQUFFLEVBQ2ZJLGVBQXlCLEVBQUUsRUFDM0I1RCxpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLE1BQU1tQyxlQUFlM0gsaUJBQXlCNkIsTUFBTSxtQkFBbUI7WUFBQ2pCO1lBQVUwSTtZQUFVUDtZQUFNQztZQUFJSTtRQUFZLEdBQUc1RDtRQUVySCxJQUFHbUMsaUJBQWlCcEcsV0FBVztZQUM3QixPQUFPb0c7UUFDVDtRQUVBLE1BQU1sQyxpQkFBaUI7WUFDckJzRCxNQUFNO2dCQUNKaEYsTUFBTTtnQkFDTnpDLE9BQU95SDtZQUNUO1lBQ0FRLE1BQU07Z0JBQ0p4RixNQUFNO2dCQUNOekMsT0FBT2dJO1lBQ1Q7WUFDQU4sSUFBSTtnQkFDRmpGLE1BQU07Z0JBQ056QyxPQUFPMEg7WUFDVDtZQUNBcEksVUFBVTtnQkFDUm1ELE1BQU07Z0JBQ056QyxPQUFPVjtZQUNUO1FBQ0Y7UUFFQSxNQUFNOEUsWUFBWSxDQUFDQyxPQUF1QixDQUFDLENBQUM7WUFDMUMsTUFBTWhELE9BQU8sQUFBQ2dELE1BQXdDQyxPQUFPeUQsY0FBYyxFQUFFO1lBQzdFLE9BQU94SCxLQUFLZ0UsUUFBUSxDQUFDO2dCQUFDbEQ7Z0JBQU1vQixNQUFNOUUsZUFBZTRKLGdCQUFnQjtZQUFBO1FBQ25FO1FBRUEsTUFBTWYsU0FBUyxNQUFNM0Qsc0JBQ25CLENBQUM0RCxnQkFBa0I1SSxTQUFTMEMsTUFBTSxjQUFjMUIsV0FBV3NGLGdCQUFnQnNDLGVBQWU7Z0JBQUNyQztZQUFTLElBQ3BHMEQsY0FDQWhKO1FBR0YsT0FBT0gsaUJBQXlCNEIsTUFBTSxtQkFBbUI7WUFBQ2pCO1lBQVUwSTtZQUFVUDtZQUFNQztZQUFJSTtRQUFZLEdBQUd0QixRQUFrQnRDO0lBQzNIO0lBRUEsTUFBTWdFLFNBQVMsT0FBT0MsT0FBZWxFLFlBQXNCLEVBQUUsRUFBRUMsaUJBQXVDLENBQUMsQ0FBQztRQUN0RyxNQUFNbUMsZUFBZTNILGlCQUF5QjZCLE1BQU0sZUFBZTtZQUFDNEg7WUFBT2xFO1FBQVMsR0FBR0M7UUFFdkYsSUFBR21DLGlCQUFpQnBHLFdBQVc7WUFDN0IsT0FBT29HO1FBQ1Q7UUFFQSxNQUFNbEMsaUJBQWlCO1lBQ3JCZ0UsT0FBTztnQkFDTDFGLE1BQU07Z0JBQ056QyxPQUFPbUk7WUFDVDtRQUNGO1FBRUEsTUFBTS9ELFlBQVksQ0FBQ0MsT0FBdUIsQ0FBQyxDQUFDO1lBQzFDLE1BQU1oRCxPQUFPLEFBQUNnRCxNQUF3Q0MsT0FBTzRELFVBQVUsRUFBRTtZQUN6RSxPQUFPM0gsS0FBS2dFLFFBQVEsQ0FBQztnQkFBQ2xEO2dCQUFNb0IsTUFBTTlFLGVBQWU0SixnQkFBZ0I7WUFBQTtRQUNuRTtRQUVBLE1BQU1mLFNBQVMsTUFBTTNELHNCQUNuQixDQUFDNEQsZ0JBQWtCNUksU0FBUzBDLE1BQU0sVUFBVTFCLFdBQVdzRixnQkFBZ0JzQyxlQUFlO2dCQUFDckM7WUFBUyxJQUNoR0gsV0FDQW5GO1FBR0YsT0FBT0gsaUJBQXlCNEIsTUFBTSxlQUFlO1lBQUM0SDtZQUFPbEU7UUFBUyxHQUFHdUMsUUFBa0J0QztJQUM3RjtJQUVBLE1BQU05RixhQUFhLElBQWVDLHNCQUFzQmtDO0lBRXhELE1BQU02SCwyQkFBMkIsT0FBT2xFLGlCQUF1QyxDQUFDLENBQUM7UUFDL0UsTUFBTXRELFVBQVUsTUFBTXpDLDBCQUEwQm9DO1FBQ2hELE9BQVFLLFdBQVcsQ0FBQztJQUN0QjtJQUVBLE1BQU15SCx1QkFBdUIsT0FBT0MsT0FBZ0IzRCxTQUFrQlQsaUJBQXVDLENBQUMsQ0FBQztRQUM3RyxNQUFNc0MsU0FBUyxNQUFNeEksZUFBZXVDLE1BQU0rSCxPQUFPM0Q7UUFDakQsT0FBUTZCLFFBQVF4SSxrQkFBa0IsQ0FBQztJQUNyQztJQUVBLE1BQU11SyxTQUFTLE9BQ2JwSixNQUNBd0YsU0FDQVQsaUJBQXVDLENBQUMsQ0FBQztRQUV6QyxNQUFNLEVBQUMzRSxLQUFLLEVBQUVpRCxLQUFLLEVBQUVsRCxRQUFRLEVBQUVZLFFBQVEsRUFBQyxHQUFHZjtRQUMzQyxJQUFJTTtRQUNKLElBQUdILFlBQVlZLFVBQVU7WUFDdkJULFlBQVk7Z0JBQ1ZTO2dCQUNBWjtZQUNGO1FBQ0YsT0FBTyxJQUFHQyxTQUFTVyxVQUFVO1lBQzNCVCxZQUFZO2dCQUNWRjtnQkFDQVc7WUFDRjtRQUNGLE9BQU8sSUFBR3NDLFNBQVN0QyxVQUFVO1lBQzNCVCxZQUFZO2dCQUNWUztnQkFDQXNDO1lBQ0Y7UUFDRixPQUFPO1lBQ0wsTUFBTSxJQUFJZ0IsTUFBTTtRQUNsQjtRQUVBLE1BQU1nRixTQUFTaEssa0JBQWtCK0I7UUFDakMsTUFBTWtJLG1CQUFtQkMsS0FBS0MsR0FBRyxDQUFDLEdBQUdDLE9BQU9qRSxXQUFXNkQsT0FBT0ssR0FBRyxFQUFFakksU0FBU2tJLGNBQWM7UUFDMUYsTUFBTUMsOEJBQThCO1lBQ2xDcEUsU0FBUztnQkFDUGxDLE1BQU07Z0JBQ056QyxPQUFPeUk7WUFDVDtZQUNBdEosTUFBTTtnQkFDSnNELE1BQU07Z0JBQ056QyxPQUFPUDtZQUNUO1FBQ0Y7UUFFQSxNQUFNMkUsWUFBWSxPQUFPQyxPQUF1QixDQUFDLENBQUM7WUFDaEQsTUFBTUMsUUFBU0QsTUFBY0M7WUFDN0IsTUFBTXdCLGNBQWN4SCxpQkFBaUJnRyxPQUFPaUUsVUFBVSxDQUFDO1lBQ3ZELE1BQU1TLGdCQUFnQixNQUFNMUksa0JBQWtCQyxNQUFNdUY7WUFDcEQsT0FBTztnQkFDTGxGLFNBQVNvSTtnQkFDVHZHLE1BQU05RSxlQUFlc0wsZUFBZTtZQUN0QztRQUNGO1FBRUEsTUFBTUMsZ0JBQWdCLE9BQU8vRTtZQUMzQixNQUFNZ0YsZ0JBQWdCLE1BQU1yTCxlQUMxQnlDLE1BQ0EsVUFDQTFCLFdBQ0FzRixnQkFDQTtnQkFBQztnQkFBVztnQkFBVTtnQkFBUztnQkFBVTthQUFXLEVBQ3BEO2dCQUFDQztZQUFTO1lBRVosTUFBTWdGLGNBQWMsTUFBTTlJLGtCQUFrQkMsTUFBTUcsa0JBQWtCeUk7WUFFcEUsSUFBSTtnQkFDRixNQUFNRSxrQkFBa0IsTUFBTXpJLFFBQVE7b0JBQUM7b0JBQVU7b0JBQWE7b0JBQWM7aUJBQVcsRUFBRXNEO2dCQUN6RixNQUFNdEYseUJBQXlCMkIsTUFBTUosT0FBTyxBQUFDa0osaUJBQXlCbEQsYUFBYTtZQUNyRixFQUFFLE9BQU12RSxPQUFPO2dCQUNiLE1BQU0wSCxrQkFBa0IsTUFBTWhKLGtCQUFrQkMsTUFBTTZJO2dCQUN0RCxNQUFNN0ksS0FBS2dFLFFBQVEsQ0FBQztvQkFDbEIzRCxTQUFTMEk7b0JBQ1Q3RyxNQUFNOUUsZUFBZXNMLGVBQWU7Z0JBQ3RDO2dCQUNBLE9BQU9LO1lBQ1Q7WUFFQSxNQUFNQyxlQUFlLE1BQU1qSixrQkFDekJDLE1BQ0NBLEtBQUtFLFFBQVEsQ0FBQyxnQkFBZ0IySSxnQkFBZ0JBO1lBRWpELE1BQU03SSxLQUFLZ0UsUUFBUSxDQUFDO2dCQUNsQjNELFNBQVMySTtnQkFDVDlHLE1BQU05RSxlQUFlc0wsZUFBZTtZQUN0QztZQUNBLE9BQU9NO1FBQ1Q7UUFFQSxJQUFJO1lBQ0YsT0FBTyxNQUFNTCxjQUFjSDtRQUM3QixFQUFFLE9BQU1uSCxPQUFPO1lBQ2JyQixLQUFLZ0UsUUFBUSxDQUFDO2dCQUFDM0M7Z0JBQU9hLE1BQU05RSxlQUFlNkwsYUFBYTtZQUFBO1lBQ3hELE1BQU01SDtRQUNSLFNBQVU7WUFDUixNQUFNbUMsdUJBQXVCNUQsT0FBTyxBQUFDaEIsTUFBY0UsVUFBVTtRQUMvRDtJQUNGO0lBRUEsTUFBTW9LLFVBQVUsT0FBT3ZGLGlCQUF1QyxDQUFDLENBQUM7UUFDOUQsTUFBTWhHLHNCQUFzQnFDO1FBQzVCLE1BQU1BLEtBQUtnRSxRQUFRLENBQUM7WUFBQzNELFNBQVMsQ0FBQztZQUFHNkIsTUFBTTlFLGVBQWUrTCxnQkFBZ0I7UUFBQTtRQUN2RSxNQUFNM0Y7UUFDTixPQUFPO0lBQ1Q7SUFFQSxNQUFNNEYsZ0JBQWdCLE9BQU9uRSxNQUFjL0MsTUFBeUJ5QixpQkFBdUMsQ0FBQyxDQUFDLEdBQzNHO0lBRUYsTUFBTTBGLHVCQUF1QixPQUMzQnRILFNBQ0E0QixpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLElBQUkyRiwwQkFBMEI7UUFDOUIsTUFBTSxFQUFDdEgsVUFBVSxFQUFFRSxJQUFJLEVBQUMsR0FBR0osMkJBQTJCQztRQUN0RCxNQUFNcUUsWUFBWWxFLFNBQVMsVUFBVSxVQUFVQSxTQUFTLFVBQVUsVUFBVTtRQUM1RSxNQUFNMEIsaUJBQWlCO1lBQ3JCaEYsTUFBTTtnQkFDSnNELE1BQU07Z0JBQ056QyxPQUFPO29CQUNMLENBQUMyRyxVQUFVLEVBQUVwRTtnQkFDZjtZQUNGO1FBQ0Y7UUFFQSxNQUFNNkIsWUFBWSxDQUFDQztZQUNqQixNQUFNeUYsVUFBVSxDQUFDLENBQUN6RixNQUFNQyxPQUFPeUY7WUFDL0JGLDBCQUEwQkM7WUFDMUIsT0FBT3ZKLEtBQUtnRSxRQUFRLENBQUM7Z0JBQ25COUIsTUFBTXFILFVBQVVuTSxlQUFlcU0sdUJBQXVCLEdBQUdyTSxlQUFlc00scUJBQXFCO1lBQy9GO1FBQ0Y7UUFFQSxNQUFNbk0sZUFBbUN5QyxNQUFNLGtCQUFrQjFCLFdBQVdzRixnQkFBZ0IsRUFBRSxFQUFFO1lBQUNDO1FBQVM7UUFFMUcsSUFBRyxDQUFDeUYseUJBQXlCO1lBQzNCLE1BQU0sSUFBSXJHLE1BQU07UUFDbEI7UUFFQSxPQUFPO0lBQ1Q7SUFFQSxNQUFNdUcsaUJBQWlCLE9BQU96SyxVQUFrQjRFLGlCQUF1QyxDQUFDLENBQUMsR0FDdkYwRixxQkFBcUJ0SyxVQUFVNEU7SUFFakMsTUFBTWdHLHdCQUF3QixPQUM1QjNLLE9BQ0E0SyxlQUF5QyxDQUFDLENBQUMsRUFDM0NqRyxpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLE1BQU1DLGlCQUFpQjtZQUNyQmhGLE1BQU07Z0JBQ0pzRCxNQUFNO2dCQUNOekMsT0FBTztvQkFDTFQ7b0JBQ0EsR0FBSTRLLGFBQWFDLE9BQU8sR0FBRzt3QkFBQ0MsMEJBQTBCRixhQUFhQyxPQUFPO29CQUFBLElBQUksQ0FBQyxDQUFDO29CQUNoRixHQUFJRCxhQUFhRyxRQUFRLEdBQUc7d0JBQUNDLDJCQUEyQkosYUFBYUcsUUFBUTtvQkFBQSxJQUFJLENBQUMsQ0FBQztvQkFDbkYsR0FBSUgsYUFBYUssSUFBSSxHQUFHO3dCQUFDQyx1QkFBdUJOLGFBQWFLLElBQUk7b0JBQUEsSUFBSSxDQUFDLENBQUM7Z0JBQ3pFO1lBQ0Y7UUFDRjtRQUVBLE1BQU1wRyxZQUFZLENBQUNDO1lBQ2pCLE1BQU15RixVQUFVLENBQUMsQ0FBQ3pGLE1BQU1DLE9BQU80RjtZQUMvQixPQUFPM0osS0FBS2dFLFFBQVEsQ0FBQztnQkFDbkI5QixNQUFNcUgsVUFBVW5NLGVBQWUrSCx1QkFBdUIsR0FBRy9ILGVBQWUrTSxxQkFBcUI7WUFDL0Y7UUFDRjtRQUVBLE9BQU81TSxlQUNMeUMsTUFDQSx5QkFDQTFCLFdBQ0FzRixnQkFDQSxFQUFFLEVBQ0Y7WUFBQ0M7UUFBUyxHQUNWdUcsSUFBSSxDQUFDLENBQUN0RztZQUNOLE1BQU15RixVQUFVLENBQUMsQ0FBQ3pGLE1BQU1DLE9BQU80RjtZQUMvQixJQUFHLENBQUNKLFNBQVM7Z0JBQ1gsTUFBTSxJQUFJdEcsTUFBTTtZQUNsQjtZQUNBLE9BQU87UUFDVDtJQUNGO0lBRUEsTUFBTW9ILGdCQUFnQixPQUNwQnRMLFVBQ0FZLFVBQ0FzRixNQUNBL0MsTUFDQXlCLGlCQUF1QyxDQUFDLENBQUM7UUFFekMsTUFBTUMsaUJBQWlCO1lBQ3JCcUIsTUFBTTtnQkFDSi9DLE1BQU07Z0JBQ056QyxPQUFPd0Y7WUFDVDtZQUNBckcsTUFBTTtnQkFDSnNELE1BQU07Z0JBQ056QyxPQUFPO29CQUNMLEdBQUl5QyxTQUFTLFVBQVU7d0JBQUNsRCxPQUFPRDtvQkFBUSxJQUFJO3dCQUFDa0QsT0FBT2xEO29CQUFRLENBQUM7b0JBQzVEWTtvQkFDQVo7Z0JBQ0Y7WUFDRjtRQUNGO1FBRUEsTUFBTThFLFlBQVksQ0FBQ0M7WUFDakIsTUFBTXlGLFVBQVUsQ0FBQyxDQUFDekYsTUFBTUMsT0FBT3NHO1lBQy9CLE9BQU9ySyxLQUFLZ0UsUUFBUSxDQUFDO2dCQUNuQjlCLE1BQU1xSCxVQUFVbk0sZUFBZWtOLHNCQUFzQixHQUFHbE4sZUFBZW1OLG9CQUFvQjtZQUM3RjtRQUNGO1FBRUEsT0FBT2hOLGVBQW1DeUMsTUFBTSxpQkFBaUIxQixXQUFXc0YsZ0JBQWdCLEVBQUUsRUFBRTtZQUFDQztRQUFTLEdBQUd1RyxJQUFJLENBQUMsQ0FBQ3RHO1lBQ2pILE1BQU15RixVQUFVLENBQUMsQ0FBQ3pGLE1BQU1DLE9BQU9zRztZQUMvQixJQUFHLENBQUNkLFNBQVM7Z0JBQ1gsTUFBTSxJQUFJdEcsTUFBTTtZQUNsQjtZQUNBLE9BQU87UUFDVDtJQUNGO0lBRUEsTUFBTXVILHdCQUF3QixPQUM1Qm5JLGNBQ0FzQixpQkFBdUMsQ0FBQyxDQUFDO1FBRXpDLE1BQU01RSxXQUFXYSxPQUFPeUMsYUFBYXJELEtBQUssSUFBSXFELGFBQWFKLEtBQUssSUFBSUksYUFBYXRELFFBQVEsSUFBSSxJQUFJYyxJQUFJO1FBQ3JHLE1BQU1xQyxPQUFPRSxxQkFBcUJDO1FBQ2xDLE9BQU9nSSxjQUFjdEwsVUFBVXNELGFBQWExQyxRQUFRLEVBQUUwQyxhQUFhNEMsSUFBSSxFQUFFL0MsTUFBTXlCO0lBQ2pGO0lBRUEsTUFBTThHLGlCQUFpQixPQUFPOUssVUFBa0IrSyxhQUFxQi9HLGlCQUF1QyxDQUFDLENBQUMsR0FDNUc7SUFHRixPQUFPO1FBQ0xGO1FBQ0F1QjtRQUNBb0U7UUFDQW9CO1FBQ0EzQztRQUNBbEI7UUFDQTdGO1FBQ0EwSTtRQUNBM0w7UUFDQWdJO1FBQ0FNO1FBQ0FpQjtRQUNBSDtRQUNBSTtRQUNBRztRQUNBL0osZ0JBQWdCcUs7UUFDaEIxQztRQUNBaUU7UUFDQWdCO1FBQ0E3RDtRQUNBbUI7UUFDQWdDO1FBQ0F0SjtRQUNBMkg7UUFDQWtCO1FBQ0EvRTtRQUNBc0c7UUFDQWxHO1FBQ0FxQztRQUNBK0QsbUJBQW1CeEgsU0FBU3lILGFBQWE7UUFDekNDLDBCQUEwQjFILFNBQVMySCxhQUFhO0lBQ2xEO0FBQ0YsRUFBRSJ9
977
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy91c2VyQWN0aW9ucy91c2VyQWN0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt2YWxpZGF0ZVVzZXJJbnB1dH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHtVU0VSX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vc3RvcmVzL3VzZXJTdG9yZS5qcyc7XG5pbXBvcnQge2FwcE11dGF0aW9uLCBhcHBRdWVyeSwgcHVibGljTXV0YXRpb24sIHB1YmxpY1F1ZXJ5LCByZWZyZXNoU2Vzc2lvbn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB7Y3JlYXRlQmFzZUFjdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL2Jhc2VBY3Rpb25GYWN0b3J5LmpzJztcbmltcG9ydCB7Z2V0Q29uZmlnRnJvbUZsdXh9IGZyb20gJy4uLy4uL3V0aWxzL2NvbmZpZ1V0aWxzLmpzJztcbmltcG9ydCB7Y2xlYXJDYWNoZWRSZXF1ZXN0LCBnZXRDYWNoZWRSZXF1ZXN0LCBzZXRDYWNoZWRSZXF1ZXN0fSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0Q2FjaGUuanMnO1xuaW1wb3J0IHtcbiAgY2xlYXJQZXJzaXN0ZWRTZXNzaW9uLFxuICBoeWRyYXRlU2Vzc2lvbkZyb21TdG9yYWdlLFxuICBpc0xvZ2dlZEluIGFzIGlzTG9nZ2VkSW5XaXRoU3RvcmFnZSxcbiAgbm9ybWFsaXplU2Vzc2lvbixcbiAgc3RvcmVTZXNzaW9uXG59IGZyb20gJy4uLy4uL3V0aWxzL3Nlc3Npb24uanMnO1xuaW1wb3J0IHtzeW5jUGVyc29uYVRhZ3NUb1Nlc3Npb259IGZyb20gJy4uL3BlcnNvbmFBY3Rpb25zL3BlcnNvbmFBY3Rpb25zLmpzJztcblxuaW1wb3J0IHR5cGUge0ZsdXhBY3Rpb24sIEZsdXhGcmFtZXdvcmt9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5pbXBvcnQgdHlwZSB7VXNlcn0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHR5cGUge0FwaVJlc3VsdHNUeXBlLCBTZXNzaW9uVHlwZX0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB0eXBlIHtBY3Rpb25SZXF1ZXN0T3B0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdENhY2hlLmpzJztcbmltcG9ydCB0eXBlIHtCYXNlQWRhcHRlck9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3ZhbGlkYXRvckZhY3RvcnkuanMnO1xuXG5jb25zdCBEQVRBX1RZUEUgPSAndXNlcnMnO1xuY29uc3QgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEUyA9IFsndXNlcklkJywgJ3VzZXJuYW1lJ107XG5jb25zdCBTRU5TSVRJVkVfVVNFUl9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgJ3Bhc3N3b3JkJyxcbiAgJ3NhbHQnLFxuICAndG9rZW4nLFxuICAncmVmcmVzaFRva2VuJyxcbiAgJ3ZlcmlmaWVkRW1haWxDb2RlJyxcbiAgJ3ZlcmlmaWVkU21zQ29kZSdcbl0pO1xuY29uc3QgSU5WQUxJRF9GSUVMRF9SRUdFWCA9IC9DYW5ub3QgcXVlcnkgZmllbGQgXCIoW15cIl0rKVwiL2c7XG5jb25zdCBoYXNTZXNzaW9uSWRlbnRpdHkgPSAodXNlcj86IFBhcnRpYWw8VXNlcj4gfCBudWxsKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHNlc3Npb25Vc2VyID0gdXNlciBhcyAoUGFydGlhbDxVc2VyPiAmIHtyZWFkb25seSBfaWQ/OiBzdHJpbmd9KSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIHJldHVybiBCb29sZWFuKHNlc3Npb25Vc2VyICYmIChcbiAgICBSZWZsZWN0LmdldChzZXNzaW9uVXNlciwgJ19pZCcpIHx8IHNlc3Npb25Vc2VyLnVzZXJJZCB8fCBzZXNzaW9uVXNlci51c2VybmFtZSB8fCBzZXNzaW9uVXNlci5lbWFpbFxuICApKTtcbn07XG5cbmNvbnN0IHNhbml0aXplVXBkYXRlVXNlcklucHV0ID0gKFxuICB1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4gPSB7fSxcbiAgY3VycmVudFNlc3Npb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbik6IFBhcnRpYWw8VXNlcj4gPT4ge1xuICBjb25zdCBuZXh0VXNlciA9IE9iamVjdC5lbnRyaWVzKHVzZXJJbnB1dCkucmVkdWNlKCh1c2VyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgW2ZpZWxkLCB2YWx1ZV0pID0+IHtcbiAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBpZihmaWVsZCA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSBTdHJpbmcodmFsdWUgfHwgJycpLnRyaW0oKTtcblxuICAgICAgaWYocGFzc3dvcmQpIHtcbiAgICAgICAgdXNlci5wYXNzd29yZCA9IHBhc3N3b3JkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBpZihmaWVsZCA9PT0gJ3VzZXJJZCcpIHtcbiAgICAgIHVzZXIudXNlcklkID0gdmFsdWU7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjdXJyZW50U2Vzc2lvbltmaWVsZF07XG5cbiAgICBpZihTdHJpbmcodmFsdWUpICE9PSBTdHJpbmcoY3VycmVudFZhbHVlID8/ICcnKSkge1xuICAgICAgdXNlcltmaWVsZF0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXNlcjtcbiAgfSwge30pO1xuXG4gIHJldHVybiBuZXh0VXNlciBhcyBQYXJ0aWFsPFVzZXI+O1xufTtcblxuY29uc3Qgc3luY1N0b3JlZFNlc3Npb24gPSBhc3luYyAoXG4gIGZsdXg6IEZsdXhGcmFtZXdvcmssXG4gIHNlc3Npb25QYXRjaDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuKTogUHJvbWlzZTxTZXNzaW9uVHlwZT4gPT4ge1xuICBjb25zdCBjdXJyZW50U2Vzc2lvbiA9IChmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24nLCB7fSkgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gc3RvcmVTZXNzaW9uKGZsdXgsIHsuLi5jdXJyZW50U2Vzc2lvbiwgLi4uc2Vzc2lvblBhdGNofSk7XG59O1xuXG5jb25zdCBnZXRTZXNzaW9uUGF5bG9hZCA9IChwYXlsb2FkOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBpZihwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0JyAmJiAnc2Vzc2lvbicgaW4gKHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgcmV0dXJuICgoKHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnNlc3Npb24pIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIHJldHVybiAocGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcgPyBwYXlsb2FkIDoge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcblxuY29uc3QgZ2V0RmllbGRSb290ID0gKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0cmltbWVkID0gZmllbGQudHJpbSgpO1xuICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goL15bQS1aYS16X11bQS1aYS16MC05X10qLyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzBdIDogJyc7XG59O1xuXG5jb25zdCBzYW5pdGl6ZVVzZXJQcm9wcyA9IChwcm9wczogc3RyaW5nW10gPSBbXSwgZmFsbGJhY2tQcm9wczogc3RyaW5nW10gPSBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHNhbml0aXplZCA9IHByb3BzLnJlZHVjZSgobGlzdDogc3RyaW5nW10sIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb290ID0gZ2V0RmllbGRSb290KGZpZWxkKTtcblxuICAgIGlmKCFyb290IHx8IFNFTlNJVElWRV9VU0VSX0ZJRUxEUy5oYXMocm9vdCkgfHwgc2Vlbi5oYXMoZmllbGQpKSB7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBzZWVuLmFkZChmaWVsZCk7XG4gICAgbGlzdC5wdXNoKGZpZWxkKTtcbiAgICByZXR1cm4gbGlzdDtcbiAgfSwgW10pO1xuXG4gIGlmKHNhbml0aXplZC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuXG4gIHJldHVybiBmYWxsYmFja1Byb3BzLnJlZHVjZSgobGlzdDogc3RyaW5nW10sIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb290ID0gZ2V0RmllbGRSb290KGZpZWxkKTtcblxuICAgIGlmKCFyb290IHx8IFNFTlNJVElWRV9VU0VSX0ZJRUxEUy5oYXMocm9vdCkgfHwgc2Vlbi5oYXMoZmllbGQpKSB7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBzZWVuLmFkZChmaWVsZCk7XG4gICAgbGlzdC5wdXNoKGZpZWxkKTtcbiAgICByZXR1cm4gbGlzdDtcbiAgfSwgW10pO1xufTtcblxuY29uc3QgZ2V0SW52YWxpZEZpZWxkcyA9IChlcnJvcjogdW5rbm93bik6IFNldDxzdHJpbmc+ID0+IHtcbiAgY29uc3QgZXJyb3JzID0gKGVycm9yIGFzIGFueSk/LmVycm9ycyB8fCAoZXJyb3IgYXMgYW55KT8uc291cmNlPy5lcnJvcnMgfHwgW107XG4gIGNvbnN0IGludmFsaWRGaWVsZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBlcnJvcnMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyA/IGl0ZW0gOiBpdGVtPy5tZXNzYWdlIHx8ICcnO1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbCA9IElOVkFMSURfRklFTERfUkVHRVguZXhlYyhtZXNzYWdlKTtcblxuICAgIHdoaWxlKG1hdGNoKSB7XG4gICAgICBpbnZhbGlkRmllbGRzLmFkZChtYXRjaFsxXSk7XG4gICAgICBtYXRjaCA9IElOVkFMSURfRklFTERfUkVHRVguZXhlYyhtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBJTlZBTElEX0ZJRUxEX1JFR0VYLmxhc3RJbmRleCA9IDA7XG4gIH0pO1xuXG4gIHJldHVybiBpbnZhbGlkRmllbGRzO1xufTtcblxuY29uc3QgZ2V0UGFzc3dvcmRSZXNldElkZW50aWZpZXIgPSAocmVxdWVzdDogc3RyaW5nIHwgUGFzc3dvcmRSZXNldFJlcXVlc3QpOiB7XG4gIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZScgfCAndXNlcm5hbWUnO1xufSA9PiB7XG4gIGNvbnN0IGlkZW50aWZpZXIgPSB0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZydcbiAgICA/IFN0cmluZyhyZXF1ZXN0IHx8ICcnKS50cmltKClcbiAgICA6IFN0cmluZyhyZXF1ZXN0LmVtYWlsIHx8IHJlcXVlc3QucGhvbmUgfHwgcmVxdWVzdC51c2VybmFtZSB8fCAnJykudHJpbSgpO1xuXG4gIGxldCB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJyB8ICd1c2VybmFtZScgPSBpZGVudGlmaWVyLmluY2x1ZGVzKCdAJykgPyAnZW1haWwnIDogJ3VzZXJuYW1lJztcblxuICBpZih0eXBlb2YgcmVxdWVzdCAhPT0gJ3N0cmluZycgJiYgcmVxdWVzdC5waG9uZSkge1xuICAgIHR5cGUgPSAncGhvbmUnO1xuICB9XG5cbiAgcmV0dXJuIHtpZGVudGlmaWVyLCB0eXBlfTtcbn07XG5cbmNvbnN0IGdldFBhc3N3b3JkUmVzZXRUeXBlID0gKGNvbmZpcm1hdGlvbjogUGFzc3dvcmRSZXNldENvbmZpcm1hdGlvbik6ICdlbWFpbCcgfCAncGhvbmUnID0+XG4gIGNvbmZpcm1hdGlvbi50eXBlIHx8IChjb25maXJtYXRpb24ucGhvbmUgPyAncGhvbmUnIDogJ2VtYWlsJyk7XG5cbmNvbnN0IHdpdGhJbnZhbGlkRmllbGRSZXRyeSA9IGFzeW5jIDxUPihcbiAgcmVxdWVzdFdpdGhQcm9wczogKHByb3BzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxUPixcbiAgcHJvcHM6IHN0cmluZ1tdLFxuICBmYWxsYmFja1Byb3BzOiBzdHJpbmdbXSA9IERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbik6IFByb21pc2U8VD4gPT4ge1xuICBjb25zdCBzYWZlUHJvcHMgPSBzYW5pdGl6ZVVzZXJQcm9wcyhwcm9wcywgZmFsbGJhY2tQcm9wcyk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdFdpdGhQcm9wcyhzYWZlUHJvcHMpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgY29uc3QgaW52YWxpZEZpZWxkcyA9IGdldEludmFsaWRGaWVsZHMoZXJyb3IpO1xuXG4gICAgaWYoaW52YWxpZEZpZWxkcy5zaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBjb25zdCByZXRyeVByb3BzID0gc2FmZVByb3BzLmZpbHRlcigoZmllbGQpID0+ICFpbnZhbGlkRmllbGRzLmhhcyhnZXRGaWVsZFJvb3QoZmllbGQpKSk7XG5cbiAgICBpZihyZXRyeVByb3BzLmxlbmd0aCA9PT0gMCB8fCByZXRyeVByb3BzLmxlbmd0aCA9PT0gc2FmZVByb3BzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3RXaXRoUHJvcHMocmV0cnlQcm9wcyk7XG4gIH1cbn07XG5cbmV4cG9ydCB0eXBlIFVzZXJBZGFwdGVyT3B0aW9ucyA9IEJhc2VBZGFwdGVyT3B0aW9ucztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQWN0aW9uc09wdGlvbnMge1xuICByZWFkb25seSB1c2VyQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gYW55O1xuICByZWFkb25seSB1c2VyQWRhcHRlck9wdGlvbnM/OiBVc2VyQWRhcHRlck9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uRW1haWxPcHRpb25zIHtcbiAgcmVhZG9ubHkgc3ViamVjdD86IHN0cmluZztcbiAgcmVhZG9ubHkgdGVtcGxhdGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRleHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc3dvcmRSZXNldFJlcXVlc3Qge1xuICByZWFkb25seSBlbWFpbD86IHN0cmluZztcbiAgcmVhZG9ubHkgcGhvbmU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkUmVzZXRDb25maXJtYXRpb24gZXh0ZW5kcyBQYXNzd29yZFJlc2V0UmVxdWVzdCB7XG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGFzc3dvcmQ6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwZT86ICdlbWFpbCcgfCAncGhvbmUnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBcGlSZXN1bHRzVHlwZSB7XG4gIHJlYWRvbmx5IHVzZXJzOiB7XG4gICAgcmVhZG9ubHkgYWN0aXZlQ291bnQ/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgYWRkVXNlcj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgY29uZmlybUNvZGU/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGNvbXBsZXRlQmlsbGluZ1NldHVwU2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgY3JlYXRlQmlsbGluZ1NldHVwU2Vzc2lvbj86IHN0cmluZztcbiAgICByZWFkb25seSBkZWFjdGl2YXRlPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBmb3Jnb3RQYXNzd29yZD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgaXRlbUJ5SWQ/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGdldFVzZXJCeUF0dHJpYnV0ZT86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgZ2V0VXNlckJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5VG9rZW4/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGl0ZW1CeVVzZXJuYW1lPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBnZXRVc2VyTGlzdD86IFVzZXJbXTtcbiAgICByZWFkb25seSBsaXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeUNvbm5lY3Rpb24/OiBVc2VyW107XG4gICAgcmVhZG9ubHkgbGlzdEJ5TGF0ZXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeVJlYWN0aW9ucz86IFVzZXJbXTtcbiAgICByZWFkb25seSBsaXN0QnlUYWdzPzogVXNlcltdO1xuICAgIHJlYWRvbmx5IHNlYXJjaD86IFVzZXJbXTtcbiAgICByZWFkb25seSByZWZyZXNoU2Vzc2lvbj86IFNlc3Npb25UeXBlO1xuICAgIHJlYWRvbmx5IHJlbW92ZT86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgcmVzZXRQYXNzd29yZD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgc2VuZFZlcmlmaWNhdGlvbkVtYWlsPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBzZXNzaW9uPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBzaWduSW4/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHNpZ25VcD86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgZGVsZXRlQmlsbGluZ0NhcmQ/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHVwZGF0ZVVzZXI/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHVwZGF0ZVBhc3N3b3JkPzogUGFydGlhbDxib29sZWFuPjtcbiAgICByZWFkb25seSB1cGRhdGVQbGFuPzogUGFydGlhbDxVc2VyPjtcbiAgfTtcbn1cblxuY29uc3QgZGVmYXVsdFVzZXJWYWxpZGF0b3IgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBVc2VyQWRhcHRlck9wdGlvbnMpID0+IHtcbiAgY29uc3QgdmFsaWRhdGVkID0gdmFsaWRhdGVVc2VySW5wdXQoaW5wdXQpO1xuXG4gIGlmKG9wdGlvbnM/LnN0cmljdCAmJiAhdmFsaWRhdGVkLnVzZXJuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVc2VybmFtZSBpcyByZXF1aXJlZCBpbiBzdHJpY3QgbW9kZScpO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjdGlvbnMge1xuICBhZGRVc2VyOiAodXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgY29uZmlybUNvZGU6IChjb2RlOiBudW1iZXIsIHt0eXBlLCB2YWx1ZX06IHt0eXBlOiAnZW1haWwnIHwgJ3Bob25lJzsgdmFsdWU6IHN0cmluZ30sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGNvbmZpcm1TaWduVXA6IChjb2RlOiBzdHJpbmcsIHR5cGU6ICdlbWFpbCcgfCAncGhvbmUnLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBjb21wbGV0ZUJpbGxpbmdTZXR1cFNlc3Npb246IChcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICB1c2VyUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxVc2VyPjtcbiAgY3JlYXRlQmlsbGluZ1NldHVwU2Vzc2lvbjogKHJldHVyblVybDogc3RyaW5nLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPHN0cmluZz47XG4gIGN1cnJlbnRBdXRoZW50aWNhdGVkVXNlcjogKHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIGxpc3Q6ICh1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBsaXN0QnlDb25uZWN0aW9uOiAoXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgZnJvbT86IG51bWJlcixcbiAgICB0bz86IG51bWJlcixcbiAgICB1c2VyUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBpdGVtQnlJZDogKHVzZXJJZDogc3RyaW5nLCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgZ2V0VXNlckJ5QXR0cmlidXRlOiAoXG4gICAgYXR0cmlidXRlOiAnZW1haWwnIHwgJ3VzZXJuYW1lJyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIHVzZXJQcm9wcz86IHN0cmluZ1tdLFxuICAgIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnNcbiAgKSA9PiBQcm9taXNlPFVzZXI+O1xuICBkZWxldGVCaWxsaW5nQ2FyZDogKHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICBsaXN0QnlMYXRlc3Q6IChcbiAgICB1c2VybmFtZT86IHN0cmluZyxcbiAgICBmcm9tPzogbnVtYmVyLFxuICAgIHRvPzogbnVtYmVyLFxuICAgIHVzZXJQcm9wcz86IHN0cmluZ1tdLFxuICAgIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnNcbiAgKSA9PiBQcm9taXNlPFVzZXJbXT47XG4gIGxpc3RCeVJlYWN0aW9uczogKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcmVhY3Rpb25OYW1lczogc3RyaW5nW10sXG4gICAgZnJvbT86IG51bWJlcixcbiAgICB0bz86IG51bWJlcixcbiAgICBwZXJzb25hUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBsaXN0QnlUYWdzOiAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lczogc3RyaW5nW10sXG4gICAgZnJvbT86IG51bWJlcixcbiAgICB0bz86IG51bWJlcixcbiAgICBwZXJzb25hUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBmb3Jnb3RQYXNzd29yZDogKHVzZXJuYW1lOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHJlcXVlc3RQYXNzd29yZFJlc2V0OiAoXG4gICAgcmVxdWVzdDogc3RyaW5nIHwgUGFzc3dvcmRSZXNldFJlcXVlc3QsXG4gICAgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9uc1xuICApID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGlzTG9nZ2VkSW46ICgpID0+IGJvb2xlYW47XG4gIHJlZnJlc2hTZXNzaW9uOiAodG9rZW4/OiBzdHJpbmcsIGV4cGlyZXM/OiBudW1iZXIsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8U2Vzc2lvblR5cGU+O1xuICByZW1vdmU6ICh1c2VySWQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgcmVzZXRQYXNzd29yZDogKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsXG4gICAgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9uc1xuICApID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGNvbXBsZXRlUGFzc3dvcmRSZXNldDogKFxuICAgIGNvbmZpcm1hdGlvbjogUGFzc3dvcmRSZXNldENvbmZpcm1hdGlvbixcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgc2VhcmNoOiAocXVlcnk6IHN0cmluZywgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcltdPjtcbiAgc2VuZFZlcmlmaWNhdGlvbkVtYWlsOiAoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBlbWFpbE9wdGlvbnM/OiBWZXJpZmljYXRpb25FbWFpbE9wdGlvbnMsXG4gICAgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9uc1xuICApID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHNlc3Npb246ICh1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgc2lnbkluOiAodXNlcjogUGFydGlhbDxVc2VyPiwgZXhwaXJlcz86IG51bWJlciwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxTZXNzaW9uVHlwZT47XG4gIHNpZ25PdXQ6IChyZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBzaWduVXA6ICh1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICB1cGRhdGVQYXNzd29yZDogKHBhc3N3b3JkOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHVwZGF0ZVVzZXI6ICh1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICB1cGRhdGVQbGFuOiAocGxhbklkOiBzdHJpbmcsIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICB1cGRhdGVVc2VyQWRhcHRlcjogKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICB1cGRhdGVVc2VyQWRhcHRlck9wdGlvbnM6IChvcHRpb25zOiBVc2VyQWRhcHRlck9wdGlvbnMpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVVc2VyQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9ucz86IFVzZXJBY3Rpb25zT3B0aW9uc1xuKTogVXNlckFjdGlvbnMgPT4ge1xuICBjb25zdCB1c2VyQmFzZSA9IGNyZWF0ZUJhc2VBY3Rpb25zKGZsdXgsIGRlZmF1bHRVc2VyVmFsaWRhdG9yLCB7XG4gICAgYWRhcHRlcjogb3B0aW9ucz8udXNlckFkYXB0ZXIsXG4gICAgYWRhcHRlck9wdGlvbnM6IG9wdGlvbnM/LnVzZXJBZGFwdGVyT3B0aW9uc1xuICB9KTtcbiAgY29uc3QgY2xlYXJVc2VyUmVxdWVzdENhY2hlcyA9IGFzeW5jICh1c2VySWQgPSAnJyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndXNlci5saXN0Jyk7XG4gICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd1c2VyLmxpc3RCeUxhdGVzdCcpO1xuICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndXNlci5saXN0QnlUYWdzJyk7XG4gICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd1c2VyLnNlYXJjaCcpO1xuICAgIGlmKHVzZXJJZCkge1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsIGB1c2VyLml0ZW1CeUlkOiR7dXNlcklkfWApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBhZGRVc2VyID0gYXN5bmMgKFxuICAgIHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPixcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3Qge3VzZXJuYW1lLCBlbWFpbCwgcGFzc3dvcmR9ID0gdXNlcklucHV0O1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogVXNlckFwaVJlc3VsdHNUeXBlKTogUHJvbWlzZTxGbHV4QWN0aW9uPiA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gZGF0YT8udXNlcnM/LmFkZFVzZXIgfHwge307XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkFERF9JVEVNX1NVQ0NFU1MsXG4gICAgICAgIHVzZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXR1cm5Qcm9wcyA9IHNhbml0aXplVXNlclByb3BzKHVzZXJQcm9wcywgW1xuICAgICAgJ2FkZGVkJyxcbiAgICAgICdhZGRyZXNzJyxcbiAgICAgICdkb2InLFxuICAgICAgJ2NpdHknLFxuICAgICAgJ2NvdW50cnknLFxuICAgICAgJ2dlbmRlcicsXG4gICAgICAnaW1hZ2VVcmwnLFxuICAgICAgJ2xhdGl0dWRlJyxcbiAgICAgICdsb25naXR1ZGUnLFxuICAgICAgJ21haWxpbmdMaXN0JyxcbiAgICAgICdtb2RpZmllZCcsXG4gICAgICAnc3RhdGUnLFxuICAgICAgJ3RodW1iVXJsJyxcbiAgICAgICd1c2VyQWNjZXNzJyxcbiAgICAgICd1c2VySWQnLFxuICAgICAgJ3VzZXJuYW1lJ1xuICAgIF0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnYWRkVXNlcicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIHJldHVyblByb3BzLFxuICAgICAgICB7b25TdWNjZXNzLCAuLi5yZXF1ZXN0T3B0aW9uc31cbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2lnblVwID0gYXN5bmMgKFxuICAgIHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPixcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3Qge3VzZXJuYW1lLCBlbWFpbCwgcGFzc3dvcmR9ID0gdXNlcklucHV0O1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgZXhwaXJlczoge1xuICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgdmFsdWU6IDE1XG4gICAgICB9LFxuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogVXNlckFwaVJlc3VsdHNUeXBlKTogUHJvbWlzZTxGbHV4QWN0aW9uPiA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gZGF0YT8udXNlcnM/LnNpZ25VcCB8fCB7fTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9VUF9TVUNDRVNTLFxuICAgICAgICB1c2VyXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV0dXJuUHJvcHMgPSBzYW5pdGl6ZVVzZXJQcm9wcyhbXG4gICAgICAnYWRkZWQnLFxuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICd1c2VySWQnLFxuICAgICAgJ3VzZXJuYW1lJyxcbiAgICAgIC4uLnVzZXJQcm9wc1xuICAgIF0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnc2lnblVwJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3MsIC4uLnJlcXVlc3RPcHRpb25zfVxuICAgICAgKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9VUF9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlVXNlciA9IGFzeW5jIChcbiAgICB1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHVwZGF0ZUlucHV0ID0gc2FuaXRpemVVcGRhdGVVc2VySW5wdXQodXNlcklucHV0LCAoZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJywge30pIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgY29uc3Qge1xuICAgICAgYmlydGhkYXRlLFxuICAgICAgZG9iLFxuICAgICAgZW1haWwsXG4gICAgICBmaXJzdE5hbWUsXG4gICAgICBnZW5kZXIsXG4gICAgICBsYXN0TmFtZSxcbiAgICAgIG1haWxpbmdMaXN0LFxuICAgICAgcGFzc3dvcmQsXG4gICAgICBwaG9uZSxcbiAgICAgIHVzZXJJZCxcbiAgICAgIHVzZXJuYW1lXG4gICAgfSA9IHVwZGF0ZUlucHV0O1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgYmlydGhkYXRlOiBiaXJ0aGRhdGUgPz8gZG9iLFxuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIGZpcnN0TmFtZSxcbiAgICAgICAgICBnZW5kZXIsXG4gICAgICAgICAgbGFzdE5hbWUsXG4gICAgICAgICAgbWFpbGluZ0xpc3QsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgcGhvbmUsXG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHVzZXJuYW1lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHVzZXJzID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2VycztcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2Vycz8udXBkYXRlVXNlciB8fCB7fTtcblxuICAgICAgaWYoKHVzZXIgYXMgYW55KT8udXNlcklkICYmICh1c2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXNlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ2FkZGVkJyxcbiAgICAgICdiaXJ0aGRhdGUnLFxuICAgICAgJ2NpdHknLFxuICAgICAgJ2NvdW50cnknLFxuICAgICAgJ2VtYWlsJyxcbiAgICAgICdmaXJzdE5hbWUnLFxuICAgICAgJ2dlbmRlcicsXG4gICAgICAnaW1hZ2VDb3VudCcsXG4gICAgICAnaW1hZ2VVcmwnLFxuICAgICAgJ2xhc3ROYW1lJyxcbiAgICAgICdsYXRpdHVkZScsXG4gICAgICAnbG9uZ2l0dWRlJyxcbiAgICAgICdtYWlsaW5nTGlzdCcsXG4gICAgICAnbW9kaWZpZWQnLFxuICAgICAgJ3Bob25lJyxcbiAgICAgICdzdGF0ZScsXG4gICAgICAndGh1bWJVcmwnLFxuICAgICAgJ3VzZXJBY2Nlc3MnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uKFxuICAgICAgICBmbHV4LFxuICAgICAgICAndXBkYXRlVXNlcicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIHJldHVyblByb3BzLFxuICAgICAgICB7b25TdWNjZXNzLCAuLi5yZXF1ZXN0T3B0aW9uc31cbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoU3RyaW5nKHVzZXJJZCB8fCAnJykpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBjb25maXJtQ29kZSA9IGFzeW5jIChcbiAgICBjb2RlOiBudW1iZXIsXG4gICAge3R5cGUsIHZhbHVlfToge3R5cGU6ICdlbWFpbCcgfCAncGhvbmUnOyB2YWx1ZTogc3RyaW5nfSxcbiAgICBfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBjb2RlOiB7XG4gICAgICAgIHR5cGU6ICdJbnQhJyxcbiAgICAgICAgdmFsdWU6IGNvZGVcbiAgICAgIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgIH0sXG4gICAgICB2YWx1ZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgIHZhbHVlXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KGZsdXgsICdjb25maXJtQ29kZScsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFtdKTtcbiAgICBjb25zdCBjb25maXJtZWQgPSAhIWRhdGE/LnVzZXJzPy5jb25maXJtQ29kZTtcblxuICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2NvbmZpcm1lZCwgdHlwZTogVVNFUl9DT05TVEFOVFMuQ09ORklSTV9TSUdOX1VQX1NVQ0NFU1N9KTtcblxuICAgIHJldHVybiBjb25maXJtZWQ7XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgdXNlcklkOiB7XG4gICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICB2YWx1ZTogdXNlcklkXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8ucmVtb3ZlIHx8IHt9O1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe3R5cGU6IFVTRVJfQ09OU1RBTlRTLlJFTU9WRV9JVEVNX1NVQ0NFU1MsIHVzZXJ9KTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbihmbHV4LCAncmVtb3ZlJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgW10sIHtvblN1Y2Nlc3MsIC4uLnJlcXVlc3RPcHRpb25zfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXModXNlcklkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2Vzc2lvbiA9IGFzeW5jIChcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgX3JlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4gd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgIGFzeW5jIChzZXNzaW9uUHJvcHMpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcHBRdWVyeShcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2dldFVzZXJCeVNlc3Npb24nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHt9LFxuICAgICAgICBzZXNzaW9uUHJvcHNcbiAgICAgICkgYXMgdW5rbm93biBhcyB7XG4gICAgICAgIHVzZXJzPzoge2dldFVzZXJCeVNlc3Npb24/OiBQYXJ0aWFsPFVzZXI+fTtcbiAgICAgIH07XG4gICAgICBjb25zdCBzZXNzaW9uRGF0YSA9IGRhdGE/LnVzZXJzPy5nZXRVc2VyQnlTZXNzaW9uIHx8IHt9O1xuXG4gICAgICBpZighaGFzU2Vzc2lvbklkZW50aXR5KHNlc3Npb25EYXRhKSkge1xuICAgICAgICBhd2FpdCBjbGVhclBlcnNpc3RlZFNlc3Npb24oZmx1eCk7XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe3R5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9TRVNTSU9OX0VSUk9SfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZF9zZXNzaW9uJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgc2Vzc2lvbkRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7c2Vzc2lvbjogbmV4dFNlc3Npb24sIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9TRVNTSU9OX1NVQ0NFU1N9KTtcbiAgICAgIGF3YWl0IHN5bmNQZXJzb25hVGFnc1RvU2Vzc2lvbihmbHV4LCBTdHJpbmcoKG5leHRTZXNzaW9uIGFzIGFueSk/LnBlcnNvbmFJZCB8fCAnJykpO1xuICAgICAgcmV0dXJuIGF3YWl0IHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIChmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24nLCBuZXh0U2Vzc2lvbikgfHwgbmV4dFNlc3Npb24pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSBhcyBVc2VyO1xuICAgIH0sXG4gICAgdXNlclByb3BzLFxuICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgKTtcblxuICBjb25zdCBpdGVtQnlJZCA9IGFzeW5jIChcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyPihmbHV4LCBgdXNlci5pdGVtQnlJZDoke3VzZXJJZH1gLCB7dXNlcklkLCB1c2VyUHJvcHN9LCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICBpZihjYWNoZWRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXJJZDoge1xuICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgdmFsdWU6IHVzZXJJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgZ2V0VXNlckJ5SWQgPSAoKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUgJiB7XG4gICAgICAgIHVzZXJzPzoge2dldFVzZXJCeUlkPzogUGFydGlhbDxVc2VyPn07XG4gICAgICB9KT8udXNlcnM/LmdldFVzZXJCeUlkKSB8fCB7fTtcblxuICAgICAgaWYodXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgZ2V0VXNlckJ5SWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0lURU1fU1VDQ0VTUywgdXNlcjogZ2V0VXNlckJ5SWR9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgICAgKHNhZmVVc2VyUHJvcHMpID0+IGFwcFF1ZXJ5KGZsdXgsICdnZXRVc2VyQnlJZCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHVzZXJQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcj4oZmx1eCwgYHVzZXIuaXRlbUJ5SWQ6JHt1c2VySWR9YCwge3VzZXJJZCwgdXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXIsIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBnZXRVc2VyQnlBdHRyaWJ1dGUgPSBhc3luYyAoXG4gICAgYXR0cmlidXRlOiAnZW1haWwnIHwgJ3VzZXJuYW1lJyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkQXR0cmlidXRlID0gU3RyaW5nKGF0dHJpYnV0ZSB8fCAnJykudHJpbSgpIGFzICdlbWFpbCcgfCAndXNlcm5hbWUnO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGxldCBtYXRjaGluZ1VzZXI6IFBhcnRpYWw8VXNlcj4gPSB7fTtcbiAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFVzZXI+KFxuICAgICAgZmx1eCxcbiAgICAgIGB1c2VyLmdldFVzZXJCeUF0dHJpYnV0ZToke25vcm1hbGl6ZWRBdHRyaWJ1dGV9OiR7bm9ybWFsaXplZFZhbHVlfWAsXG4gICAgICB7YXR0cmlidXRlOiBub3JtYWxpemVkQXR0cmlidXRlLCB1c2VyUHJvcHMsIHZhbHVlOiBub3JtYWxpemVkVmFsdWV9LFxuICAgICAgcmVxdWVzdE9wdGlvbnNcbiAgICApO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBhdHRyaWJ1dGU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogbm9ybWFsaXplZEF0dHJpYnV0ZVxuICAgICAgfSxcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgdmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9ICgoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSAmIHtcbiAgICAgICAgdXNlcnM/OiB7Z2V0VXNlckJ5QXR0cmlidXRlPzogUGFydGlhbDxVc2VyPn07XG4gICAgICB9KT8udXNlcnM/LmdldFVzZXJCeUF0dHJpYnV0ZSkgfHwge307XG4gICAgICBtYXRjaGluZ1VzZXIgPSB1c2VyO1xuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0lURU1fU1VDQ0VTUywgdXNlcn0pO1xuICAgIH07XG5cbiAgICBhd2FpdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgICAoc2FmZVVzZXJQcm9wcykgPT4gcHVibGljUXVlcnkoZmx1eCwgJ2dldFVzZXJCeUF0dHJpYnV0ZScsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHVzZXJQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcj4oXG4gICAgICBmbHV4LFxuICAgICAgYHVzZXIuZ2V0VXNlckJ5QXR0cmlidXRlOiR7bm9ybWFsaXplZEF0dHJpYnV0ZX06JHtub3JtYWxpemVkVmFsdWV9YCxcbiAgICAgIHthdHRyaWJ1dGU6IG5vcm1hbGl6ZWRBdHRyaWJ1dGUsIHVzZXJQcm9wcywgdmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZX0sXG4gICAgICBtYXRjaGluZ1VzZXIgYXMgVXNlcixcbiAgICAgIHJlcXVlc3RPcHRpb25zXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBjcmVhdGVCaWxsaW5nU2V0dXBTZXNzaW9uID0gYXN5bmMgKFxuICAgIHJldHVyblVybDogc3RyaW5nLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJldHVyblVybCA9IFN0cmluZyhyZXR1cm5VcmwgfHwgJycpLnRyaW0oKTtcblxuICAgIGlmKCFub3JtYWxpemVkUmV0dXJuVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgcmV0dXJuVXJsIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIGJpbGxpbmcgc2V0dXAgc2Vzc2lvbicpO1xuICAgIH1cblxuICAgIGxldCBjaGVja291dFVybCA9ICcnO1xuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjaGVja291dFVybCA9IFN0cmluZygoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5jcmVhdGVCaWxsaW5nU2V0dXBTZXNzaW9uIHx8ICcnKTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtjaGVja291dFVybCwgdHlwZTogVVNFUl9DT05TVEFOVFMuQklMTElOR19TRVRVUF9TRVNTSU9OX1NVQ0NFU1N9KTtcbiAgICB9O1xuXG4gICAgYXdhaXQgYXBwTXV0YXRpb24oXG4gICAgICBmbHV4LFxuICAgICAgJ2NyZWF0ZUJpbGxpbmdTZXR1cFNlc3Npb24nLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAge1xuICAgICAgICByZXR1cm5Vcmw6IHtcbiAgICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgICAgdmFsdWU6IG5vcm1hbGl6ZWRSZXR1cm5VcmxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtdLFxuICAgICAge29uU3VjY2VzcywgLi4ucmVxdWVzdE9wdGlvbnN9XG4gICAgKTtcblxuICAgIGlmKCFjaGVja291dFVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaWxsaW5nIHNldHVwIHNlc3Npb24gZGlkIG5vdCByZXR1cm4gYSBjaGVja291dCBVUkwnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hlY2tvdXRVcmw7XG4gIH07XG5cbiAgY29uc3QgY29tcGxldGVCaWxsaW5nU2V0dXBTZXNzaW9uID0gYXN5bmMgKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2Vzc2lvbklkID0gU3RyaW5nKHNlc3Npb25JZCB8fCAnJykudHJpbSgpO1xuXG4gICAgaWYoIW5vcm1hbGl6ZWRTZXNzaW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzZXNzaW9uSWQgaXMgcmVxdWlyZWQgdG8gY29tcGxldGUgYSBiaWxsaW5nIHNldHVwIHNlc3Npb24nKTtcbiAgICB9XG5cbiAgICBsZXQgdXBkYXRlZFVzZXI6IFBhcnRpYWw8VXNlcj4gPSB7fTtcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgdXBkYXRlZFVzZXIgPSAoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5jb21wbGV0ZUJpbGxpbmdTZXR1cFNlc3Npb24gfHwge307XG5cbiAgICAgIGlmKCh1cGRhdGVkVXNlciBhcyBhbnkpPy51c2VySWQgJiYgKHVwZGF0ZWRVc2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXBkYXRlZFVzZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUywgdXNlcjogdXBkYXRlZFVzZXJ9KTtcbiAgICB9O1xuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICdzdHJpcGVDYXJkQnJhbmQnLFxuICAgICAgJ3N0cmlwZUNhcmRJZCcsXG4gICAgICAnc3RyaXBlQ2FyZExhc3Q0JyxcbiAgICAgICd1c2VySWQnLFxuICAgICAgJ3VzZXJuYW1lJyxcbiAgICAgIC4uLnVzZXJQcm9wc1xuICAgIF0pO1xuICAgIGNvbnN0IHNlc3Npb25Vc2VySWQgPSBTdHJpbmcoZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uLnVzZXJJZCcpIHx8ICcnKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhcHBNdXRhdGlvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2NvbXBsZXRlQmlsbGluZ1NldHVwU2Vzc2lvbicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAge1xuICAgICAgICAgIHNlc3Npb25JZDoge1xuICAgICAgICAgICAgdHlwZTogJ0lEIScsXG4gICAgICAgICAgICB2YWx1ZTogbm9ybWFsaXplZFNlc3Npb25JZFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3MsIC4uLnJlcXVlc3RPcHRpb25zfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHVwZGF0ZWRVc2VyIGFzIFVzZXI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoc2Vzc2lvblVzZXJJZCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGRlbGV0ZUJpbGxpbmdDYXJkID0gYXN5bmMgKFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9ICgoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5kZWxldGVCaWxsaW5nQ2FyZCkgfHwge307XG5cbiAgICAgIGlmKCh1c2VyIGFzIGFueSk/LnVzZXJJZCAmJiAodXNlciBhcyBhbnkpLnVzZXJJZCA9PT0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uLnVzZXJJZCcpKSB7XG4gICAgICAgIHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIHVzZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlVQREFURV9JVEVNX1NVQ0NFU1MsXG4gICAgICAgIHVzZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXR1cm5Qcm9wcyA9IHNhbml0aXplVXNlclByb3BzKFtcbiAgICAgICdtb2RpZmllZCcsXG4gICAgICAnc3RyaXBlQ2FyZEJyYW5kJyxcbiAgICAgICdzdHJpcGVDYXJkSWQnLFxuICAgICAgJ3N0cmlwZUNhcmRMYXN0NCcsXG4gICAgICAndXNlcklkJyxcbiAgICAgICd1c2VybmFtZScsXG4gICAgICAuLi51c2VyUHJvcHNcbiAgICBdKTtcbiAgICBjb25zdCBzZXNzaW9uVXNlcklkID0gU3RyaW5nKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbi51c2VySWQnKSB8fCAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uKFxuICAgICAgICBmbHV4LFxuICAgICAgICAnZGVsZXRlQmlsbGluZ0NhcmQnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHt9LFxuICAgICAgICByZXR1cm5Qcm9wcyxcbiAgICAgICAge29uU3VjY2VzcywgLi4ucmVxdWVzdE9wdGlvbnN9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKHNlc3Npb25Vc2VySWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1cGRhdGVQbGFuID0gYXN5bmMgKFxuICAgIHBsYW5JZDogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBuZXh0UGxhbklkID0gU3RyaW5nKHBsYW5JZCB8fCAnJykudHJpbSgpO1xuXG4gICAgaWYoIW5leHRQbGFuSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzdWJzY3JpcHRpb24gcGxhbklkIGlzIHJlcXVpcmVkIHRvIHVwZGF0ZSBhIHVzZXIgcGxhbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgcGxhbklkOiB7XG4gICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICB2YWx1ZTogbmV4dFBsYW5JZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9ICgoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy51cGRhdGVQbGFuKSB8fCB7fTtcblxuICAgICAgaWYoKHVzZXIgYXMgYW55KT8udXNlcklkICYmICh1c2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXNlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICdwbGFuRXhwaXJlcycsXG4gICAgICAncGxhbklkJyxcbiAgICAgICdwbGFuU3RhdHVzJyxcbiAgICAgICdwbGFuU3Vic2NyaXB0aW9uSWQnLFxuICAgICAgJ3N0cmlwZUNhcmRCcmFuZCcsXG4gICAgICAnc3RyaXBlQ2FyZElkJyxcbiAgICAgICdzdHJpcGVDYXJkTGFzdDQnLFxuICAgICAgJ3VzZXJBY2Nlc3MnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJJZCA9IFN0cmluZyhmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykgfHwgJycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3VwZGF0ZVBsYW4nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICByZXR1cm5Qcm9wcyxcbiAgICAgICAge29uU3VjY2VzcywgLi4ucmVxdWVzdE9wdGlvbnN9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKHNlc3Npb25Vc2VySWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsaXN0ID0gYXN5bmMgKHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSwgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFVzZXJbXT4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5saXN0Jywge3VzZXJQcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8uZ2V0VXNlckxpc3QgfHwgW107XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7bGlzdCwgdHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0xJU1RfU1VDQ0VTU30pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgICAoc2FmZVVzZXJQcm9wcykgPT4gYXBwUXVlcnkoZmx1eCwgJ2dldFVzZXJMaXN0JywgREFUQV9UWVBFLCB7fSwgc2FmZVVzZXJQcm9wcywge29uU3VjY2Vzc30pLFxuICAgICAgdXNlclByb3BzLFxuICAgICAgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEU1xuICAgICk7XG5cbiAgICByZXR1cm4gc2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3QnLCB7dXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXJbXSwgcmVxdWVzdE9wdGlvbnMpO1xuICB9O1xuXG4gIGNvbnN0IGxpc3RCeUxhdGVzdCA9IGFzeW5jIChcbiAgICB1c2VybmFtZTogc3RyaW5nID0gJycsXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSB7ZnJvbSwgdG8sIHVzZXJQcm9wcywgdXNlcm5hbWV9O1xuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5saXN0QnlMYXRlc3QnLCBjYWNoZUtleSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBmcm9tOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogZnJvbVxuICAgICAgfSxcbiAgICAgIHRvOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogdG9cbiAgICAgIH0sXG4gICAgICB1c2VybmFtZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgdmFsdWU6IHVzZXJuYW1lXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8ubGlzdEJ5TGF0ZXN0IHx8IFtdO1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2xpc3QsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1N9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgICAgKHNhZmVVc2VyUHJvcHMpID0+IGFwcFF1ZXJ5KGZsdXgsICdsaXN0QnlMYXRlc3QnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBzYWZlVXNlclByb3BzLCB7b25TdWNjZXNzfSksXG4gICAgICB1c2VyUHJvcHMsXG4gICAgICBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTXG4gICAgKTtcblxuICAgIHJldHVybiBzZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdEJ5TGF0ZXN0JywgY2FjaGVLZXksIHJlc3VsdCBhcyBVc2VyW10sIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBsaXN0QnlDb25uZWN0aW9uID0gYXN5bmMgKFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIF9mcm9tOiBudW1iZXIgPSAwLFxuICAgIF90bzogbnVtYmVyID0gMTAsXG4gICAgX3VzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICBfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyW10+ID0+XG4gICAgW11cbiAgO1xuXG4gIGNvbnN0IGxpc3RCeVJlYWN0aW9ucyA9IGFzeW5jIChcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHJlYWN0aW9uTmFtZXM6IHN0cmluZ1tdLFxuICAgIF9mcm9tOiBudW1iZXIgPSAwLFxuICAgIF90bzogbnVtYmVyID0gMTAsXG4gICAgX3BlcnNvbmFQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICBfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyW10+ID0+XG4gICAgW11cbiAgO1xuXG4gIGNvbnN0IGxpc3RCeVRhZ3MgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lczogc3RyaW5nW10sXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgcGVyc29uYVByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSB7ZnJvbSwgcGVyc29uYVByb3BzLCB0YWdOYW1lcywgdG8sIHVzZXJuYW1lfTtcbiAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdEJ5VGFncycsIGNhY2hlS2V5LCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICBpZihjYWNoZWRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIGZyb206IHtcbiAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgIHZhbHVlOiBmcm9tXG4gICAgICB9LFxuICAgICAgdGFnczoge1xuICAgICAgICB0eXBlOiAnW1N0cmluZyFdJyxcbiAgICAgICAgdmFsdWU6IHRhZ05hbWVzXG4gICAgICB9LFxuICAgICAgdG86IHtcbiAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgIHZhbHVlOiB0b1xuICAgICAgfSxcbiAgICAgIHVzZXJuYW1lOiB7XG4gICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICB2YWx1ZTogdXNlcm5hbWVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IGxpc3QgPSAoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5saXN0QnlUYWdzIHx8IFtdO1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2xpc3QsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1N9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgICAgKHNhZmVVc2VyUHJvcHMpID0+IGFwcFF1ZXJ5KGZsdXgsICdsaXN0QnlUYWdzJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgc2FmZVVzZXJQcm9wcywge29uU3VjY2Vzc30pLFxuICAgICAgcGVyc29uYVByb3BzLFxuICAgICAgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEU1xuICAgICk7XG5cbiAgICByZXR1cm4gc2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3RCeVRhZ3MnLCBjYWNoZUtleSwgcmVzdWx0IGFzIFVzZXJbXSwgcmVxdWVzdE9wdGlvbnMpO1xuICB9O1xuXG4gIGNvbnN0IHNlYXJjaCA9IGFzeW5jIChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXJbXT4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5zZWFyY2gnLCB7cXVlcnksIHVzZXJQcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgcXVlcnk6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogcXVlcnlcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IGxpc3QgPSAoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5zZWFyY2ggfHwgW107XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7bGlzdCwgdHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0xJU1RfU1VDQ0VTU30pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgICAoc2FmZVVzZXJQcm9wcykgPT4gYXBwUXVlcnkoZmx1eCwgJ3NlYXJjaCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHVzZXJQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5zZWFyY2gnLCB7cXVlcnksIHVzZXJQcm9wc30sIHJlc3VsdCBhcyBVc2VyW10sIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBpc0xvZ2dlZEluID0gKCk6IGJvb2xlYW4gPT4gaXNMb2dnZWRJbldpdGhTdG9yYWdlKGZsdXgpO1xuXG4gIGNvbnN0IGN1cnJlbnRBdXRoZW50aWNhdGVkVXNlciA9IGFzeW5jIChfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgaHlkcmF0ZVNlc3Npb25Gcm9tU3RvcmFnZShmbHV4KTtcbiAgICByZXR1cm4gKHNlc3Npb24gfHwge30pIGFzIFVzZXI7XG4gIH07XG5cbiAgY29uc3QgcmVmcmVzaFNlc3Npb25BY3Rpb24gPSBhc3luYyAoXG4gICAgdG9rZW4/OiBzdHJpbmcsXG4gICAgZXhwaXJlcz86IG51bWJlcixcbiAgICBfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxTZXNzaW9uVHlwZT4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZnJlc2hTZXNzaW9uKGZsdXgsIHRva2VuLCBleHBpcmVzKTtcbiAgICByZXR1cm4gKHJlc3VsdD8ucmVmcmVzaFNlc3Npb24gfHwge30pIGFzIFNlc3Npb25UeXBlO1xuICB9O1xuXG4gIGNvbnN0IHNpZ25JbiA9IGFzeW5jIChcbiAgICB1c2VyOiBQYXJ0aWFsPFVzZXI+LFxuICAgIGV4cGlyZXM/OiBudW1iZXIsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxTZXNzaW9uVHlwZT4gPT4ge1xuICAgIGNvbnN0IHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lLCBwYXNzd29yZH0gPSB1c2VyO1xuICAgIGxldCB1c2VySW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmKHVzZXJuYW1lICYmIHBhc3N3b3JkKSB7XG4gICAgICB1c2VySW5wdXQgPSB7XG4gICAgICAgIHBhc3N3b3JkLFxuICAgICAgICB1c2VybmFtZVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYoZW1haWwgJiYgcGFzc3dvcmQpIHtcbiAgICAgIHVzZXJJbnB1dCA9IHtcbiAgICAgICAgZW1haWwsXG4gICAgICAgIHBhc3N3b3JkXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZihwaG9uZSAmJiBwYXNzd29yZCkge1xuICAgICAgdXNlcklucHV0ID0ge1xuICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgcGhvbmVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXNlcm5hbWUsIGVtYWlsLCBvciBwaG9uZSBudW1iZXIgYW5kIHBhc3N3b3JkIGFyZSByZXF1aXJlZCB0byBzaWduIGluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRnJvbUZsdXgoZmx1eCk7XG4gICAgY29uc3QgcmVxdWVzdGVkRXhwaXJlcyA9IE1hdGgubWF4KDEsIE51bWJlcihleHBpcmVzIHx8IGNvbmZpZy5hcHA/LnNlc3Npb24/Lm1heE1pbnV0ZXMgfHwgMTUpKTtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlc1dpdGhVc2VySW5wdXQgPSB7XG4gICAgICBleHBpcmVzOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogcmVxdWVzdGVkRXhwaXJlc1xuICAgICAgfSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZTogdXNlcklucHV0XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KTogUHJvbWlzZTxGbHV4QWN0aW9uPiA9PiB7XG4gICAgICBjb25zdCB1c2VycyA9IChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM7XG4gICAgICBjb25zdCBzZXNzaW9uRGF0YSA9IG5vcm1hbGl6ZVNlc3Npb24odXNlcnM/LnNpZ25JbiB8fCB7fSk7XG4gICAgICBjb25zdCBzdG9yZWRTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgc2Vzc2lvbkRhdGEpO1xuICAgICAgY29uc3QgYWN0aW9uOiBGbHV4QWN0aW9uID0ge1xuICAgICAgICBzZXNzaW9uOiBzdG9yZWRTZXNzaW9uLFxuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX0lOX1NVQ0NFU1NcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfTtcblxuICAgIGNvbnN0IHBlcmZvcm1TaWduSW4gPSBhc3luYyAocXVlcnlWYXJpYWJsZXM6IGFueSk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb25SZXN1bHQgPSBhd2FpdCBwdWJsaWNNdXRhdGlvbjxTZXNzaW9uVHlwZSAmIFVzZXJBcGlSZXN1bHRzVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdzaWduSW4nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbJ2V4cGlyZXMnLCAnaXNzdWVkJywgJ3Rva2VuJywgJ3VzZXJJZCcsICd1c2VybmFtZSddLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJhc2VTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgZ2V0U2Vzc2lvblBheWxvYWQoc2Vzc2lvblJlc3VsdCkpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoeWRyYXRlZFNlc3Npb24gPSBhd2FpdCBzZXNzaW9uKFsndXNlcklkJywgJ3BlcnNvbmFJZCcsICd1c2VyQWNjZXNzJywgJ3VzZXJuYW1lJ10sIHJlcXVlc3RPcHRpb25zKTtcbiAgICAgICAgYXdhaXQgc3luY1BlcnNvbmFUYWdzVG9TZXNzaW9uKGZsdXgsIFN0cmluZygoaHlkcmF0ZWRTZXNzaW9uIGFzIGFueSk/LnBlcnNvbmFJZCB8fCAnJykpO1xuICAgICAgfSBjYXRjaHtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgYmFzZVNlc3Npb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgICBzZXNzaW9uOiBmYWxsYmFja1Nlc3Npb24sXG4gICAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9JTl9TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2tTZXNzaW9uO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaW5hbFNlc3Npb24gPSBhd2FpdCBzeW5jU3RvcmVkU2Vzc2lvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbicsIGJhc2VTZXNzaW9uKSB8fCBiYXNlU2Vzc2lvbikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICk7XG4gICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgc2Vzc2lvbjogZmluYWxTZXNzaW9uLFxuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX0lOX1NVQ0NFU1NcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZpbmFsU2Vzc2lvbjtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwZXJmb3JtU2lnbkluKHF1ZXJ5VmFyaWFibGVzV2l0aFVzZXJJbnB1dCk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fSU5fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKFN0cmluZygodXNlciBhcyBhbnkpPy51c2VySWQgfHwgJycpKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2lnbk91dCA9IGFzeW5jIChfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBhd2FpdCBjbGVhclBlcnNpc3RlZFNlc3Npb24oZmx1eCk7XG4gICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7c2Vzc2lvbjoge30sIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fT1VUX1NVQ0NFU1N9KTtcbiAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgY29uZmlybVNpZ25VcCA9IGFzeW5jIChcbiAgICBfY29kZTogc3RyaW5nLFxuICAgIF90eXBlOiAnZW1haWwnIHwgJ3Bob25lJyxcbiAgICBfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIHRydWU7XG5cbiAgY29uc3QgcmVxdWVzdFBhc3N3b3JkUmVzZXQgPSBhc3luYyAoXG4gICAgcmVxdWVzdDogc3RyaW5nIHwgUGFzc3dvcmRSZXNldFJlcXVlc3QsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgbGV0IGZvcmdvdFBhc3N3b3JkU3VjY2VlZGVkID0gZmFsc2U7XG4gICAgY29uc3Qge2lkZW50aWZpZXIsIHR5cGV9ID0gZ2V0UGFzc3dvcmRSZXNldElkZW50aWZpZXIocmVxdWVzdCk7XG4gICAgbGV0IGF0dHJpYnV0ZSA9ICd1c2VybmFtZSc7XG5cbiAgICBpZih0eXBlID09PSAncGhvbmUnKSB7XG4gICAgICBhdHRyaWJ1dGUgPSAncGhvbmUnO1xuICAgIH0gZWxzZSBpZih0eXBlID09PSAnZW1haWwnKSB7XG4gICAgICBhdHRyaWJ1dGUgPSAnZW1haWwnO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIFthdHRyaWJ1dGVdOiBpZGVudGlmaWVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE/OiBVc2VyQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAhIWRhdGE/LnVzZXJzPy5mb3Jnb3RQYXNzd29yZDtcbiAgICAgIGZvcmdvdFBhc3N3b3JkU3VjY2VlZGVkID0gc3VjY2VzcztcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogc3VjY2VzcyA/IFVTRVJfQ09OU1RBTlRTLkZPUkdPVF9QQVNTV09SRF9TVUNDRVNTIDogVVNFUl9DT05TVEFOVFMuRk9SR09UX1BBU1NXT1JEX0VSUk9SXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXdhaXQgcHVibGljTXV0YXRpb248VXNlckFwaVJlc3VsdHNUeXBlPihcbiAgICAgIGZsdXgsXG4gICAgICAnZm9yZ290UGFzc3dvcmQnLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICBbXSxcbiAgICAgIHtvblN1Y2Nlc3MsIC4uLnJlcXVlc3RPcHRpb25zfVxuICAgICk7XG5cbiAgICBpZighZm9yZ290UGFzc3dvcmRTdWNjZWVkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9yZ290X3Bhc3N3b3JkX2ZhaWxlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IGZvcmdvdFBhc3N3b3JkID0gYXN5bmMgKHVzZXJuYW1lOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIHJlcXVlc3RQYXNzd29yZFJlc2V0KHVzZXJuYW1lLCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgY29uc3Qgc2VuZFZlcmlmaWNhdGlvbkVtYWlsID0gYXN5bmMgKFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgZW1haWxPcHRpb25zOiBWZXJpZmljYXRpb25FbWFpbE9wdGlvbnMgPSB7fSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIC4uLihlbWFpbE9wdGlvbnMuc3ViamVjdCA/IHt2ZXJpZmljYXRpb25FbWFpbFN1YmplY3Q6IGVtYWlsT3B0aW9ucy5zdWJqZWN0fSA6IHt9KSxcbiAgICAgICAgICAuLi4oZW1haWxPcHRpb25zLnRlbXBsYXRlID8ge3ZlcmlmaWNhdGlvbkVtYWlsVGVtcGxhdGU6IGVtYWlsT3B0aW9ucy50ZW1wbGF0ZX0gOiB7fSksXG4gICAgICAgICAgLi4uKGVtYWlsT3B0aW9ucy50ZXh0ID8ge3ZlcmlmaWNhdGlvbkVtYWlsVGV4dDogZW1haWxPcHRpb25zLnRleHR9IDoge30pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE/OiBVc2VyQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAhIWRhdGE/LnVzZXJzPy5zZW5kVmVyaWZpY2F0aW9uRW1haWw7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IHN1Y2Nlc3MgPyBVU0VSX0NPTlNUQU5UUy5DT05GSVJNX1NJR05fVVBfU1VDQ0VTUyA6IFVTRVJfQ09OU1RBTlRTLkNPTkZJUk1fU0lHTl9VUF9FUlJPUlxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgZmx1eCxcbiAgICAgICdzZW5kVmVyaWZpY2F0aW9uRW1haWwnLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICBbXSxcbiAgICAgIHtvblN1Y2Nlc3MsIC4uLnJlcXVlc3RPcHRpb25zfVxuICAgICkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LnNlbmRWZXJpZmljYXRpb25FbWFpbDtcbiAgICAgIGlmKCFzdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2VuZF92ZXJpZmljYXRpb25fZW1haWxfZmFpbGVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCByZXNldFBhc3N3b3JkID0gYXN5bmMgKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBjb2RlOiB7XG4gICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgdmFsdWU6IGNvZGVcbiAgICAgIH0sXG4gICAgICB1c2VyOiB7XG4gICAgICAgIHR5cGU6ICdVc2VySW5wdXQhJyxcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAuLi4odHlwZSA9PT0gJ2VtYWlsJyA/IHtlbWFpbDogdXNlcm5hbWV9IDoge3Bob25lOiB1c2VybmFtZX0pLFxuICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgIHVzZXJuYW1lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE/OiBVc2VyQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAhIWRhdGE/LnVzZXJzPy5yZXNldFBhc3N3b3JkO1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBzdWNjZXNzID8gVVNFUl9DT05TVEFOVFMuUkVTRVRfUEFTU1dPUkRfU1VDQ0VTUyA6IFVTRVJfQ09OU1RBTlRTLlJFU0VUX1BBU1NXT1JEX0VSUk9SXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHB1YmxpY011dGF0aW9uPFVzZXJBcGlSZXN1bHRzVHlwZT4oXG4gICAgICBmbHV4LFxuICAgICAgJ3Jlc2V0UGFzc3dvcmQnLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICBbXSxcbiAgICAgIHtvblN1Y2Nlc3MsIC4uLnJlcXVlc3RPcHRpb25zfVxuICAgICkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LnJlc2V0UGFzc3dvcmQ7XG4gICAgICBpZighc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jlc2V0X3Bhc3N3b3JkX2ZhaWxlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY29tcGxldGVQYXNzd29yZFJlc2V0ID0gYXN5bmMgKFxuICAgIGNvbmZpcm1hdGlvbjogUGFzc3dvcmRSZXNldENvbmZpcm1hdGlvbixcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCB1c2VybmFtZSA9IFN0cmluZyhjb25maXJtYXRpb24uZW1haWwgfHwgY29uZmlybWF0aW9uLnBob25lIHx8IGNvbmZpcm1hdGlvbi51c2VybmFtZSB8fCAnJykudHJpbSgpO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRQYXNzd29yZFJlc2V0VHlwZShjb25maXJtYXRpb24pO1xuICAgIHJldHVybiByZXNldFBhc3N3b3JkKHVzZXJuYW1lLCBjb25maXJtYXRpb24ucGFzc3dvcmQsIGNvbmZpcm1hdGlvbi5jb2RlLCB0eXBlLCByZXF1ZXN0T3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlUGFzc3dvcmQgPSBhc3luYyAoXG4gICAgX3Bhc3N3b3JkOiBzdHJpbmcsXG4gICAgX25ld1Bhc3N3b3JkOiBzdHJpbmcsXG4gICAgX3JlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT5cbiAgICB0cnVlXG4gIDtcblxuICByZXR1cm4ge1xuICAgIGFkZFVzZXIsXG4gICAgY29tcGxldGVCaWxsaW5nU2V0dXBTZXNzaW9uLFxuICAgIGNvbXBsZXRlUGFzc3dvcmRSZXNldCxcbiAgICBjb25maXJtQ29kZSxcbiAgICBjb25maXJtU2lnblVwLFxuICAgIGNyZWF0ZUJpbGxpbmdTZXR1cFNlc3Npb24sXG4gICAgY3VycmVudEF1dGhlbnRpY2F0ZWRVc2VyLFxuICAgIGRlbGV0ZUJpbGxpbmdDYXJkLFxuICAgIGZvcmdvdFBhc3N3b3JkLFxuICAgIGdldFVzZXJCeUF0dHJpYnV0ZSxcbiAgICBpc0xvZ2dlZEluLFxuICAgIGl0ZW1CeUlkLFxuICAgIGxpc3QsXG4gICAgbGlzdEJ5Q29ubmVjdGlvbixcbiAgICBsaXN0QnlMYXRlc3QsXG4gICAgbGlzdEJ5UmVhY3Rpb25zLFxuICAgIGxpc3RCeVRhZ3MsXG4gICAgcmVmcmVzaFNlc3Npb246IHJlZnJlc2hTZXNzaW9uQWN0aW9uLFxuICAgIHJlbW92ZSxcbiAgICByZXF1ZXN0UGFzc3dvcmRSZXNldCxcbiAgICByZXNldFBhc3N3b3JkLFxuICAgIHNlYXJjaCxcbiAgICBzZW5kVmVyaWZpY2F0aW9uRW1haWwsXG4gICAgc2Vzc2lvbixcbiAgICBzaWduSW4sXG4gICAgc2lnbk91dCxcbiAgICBzaWduVXAsXG4gICAgdXBkYXRlUGFzc3dvcmQsXG4gICAgdXBkYXRlUGxhbixcbiAgICB1cGRhdGVVc2VyLFxuICAgIHVwZGF0ZVVzZXJBZGFwdGVyOiB1c2VyQmFzZS51cGRhdGVBZGFwdGVyLFxuICAgIHVwZGF0ZVVzZXJBZGFwdGVyT3B0aW9uczogdXNlckJhc2UudXBkYXRlT3B0aW9uc1xuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJ2YWxpZGF0ZVVzZXJJbnB1dCIsIlVTRVJfQ09OU1RBTlRTIiwiYXBwTXV0YXRpb24iLCJhcHBRdWVyeSIsInB1YmxpY011dGF0aW9uIiwicHVibGljUXVlcnkiLCJyZWZyZXNoU2Vzc2lvbiIsImNyZWF0ZUJhc2VBY3Rpb25zIiwiZ2V0Q29uZmlnRnJvbUZsdXgiLCJjbGVhckNhY2hlZFJlcXVlc3QiLCJnZXRDYWNoZWRSZXF1ZXN0Iiwic2V0Q2FjaGVkUmVxdWVzdCIsImNsZWFyUGVyc2lzdGVkU2Vzc2lvbiIsImh5ZHJhdGVTZXNzaW9uRnJvbVN0b3JhZ2UiLCJpc0xvZ2dlZEluIiwiaXNMb2dnZWRJbldpdGhTdG9yYWdlIiwibm9ybWFsaXplU2Vzc2lvbiIsInN0b3JlU2Vzc2lvbiIsInN5bmNQZXJzb25hVGFnc1RvU2Vzc2lvbiIsIkRBVEFfVFlQRSIsIkRFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFMiLCJTRU5TSVRJVkVfVVNFUl9GSUVMRFMiLCJTZXQiLCJJTlZBTElEX0ZJRUxEX1JFR0VYIiwiaGFzU2Vzc2lvbklkZW50aXR5IiwidXNlciIsInNlc3Npb25Vc2VyIiwiQm9vbGVhbiIsIlJlZmxlY3QiLCJnZXQiLCJ1c2VySWQiLCJ1c2VybmFtZSIsImVtYWlsIiwic2FuaXRpemVVcGRhdGVVc2VySW5wdXQiLCJ1c2VySW5wdXQiLCJjdXJyZW50U2Vzc2lvbiIsIm5leHRVc2VyIiwiT2JqZWN0IiwiZW50cmllcyIsInJlZHVjZSIsImZpZWxkIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJwYXNzd29yZCIsIlN0cmluZyIsInRyaW0iLCJjdXJyZW50VmFsdWUiLCJzeW5jU3RvcmVkU2Vzc2lvbiIsImZsdXgiLCJzZXNzaW9uUGF0Y2giLCJnZXRTdGF0ZSIsImdldFNlc3Npb25QYXlsb2FkIiwicGF5bG9hZCIsInNlc3Npb24iLCJnZXRGaWVsZFJvb3QiLCJ0cmltbWVkIiwibWF0Y2giLCJzYW5pdGl6ZVVzZXJQcm9wcyIsInByb3BzIiwiZmFsbGJhY2tQcm9wcyIsInNlZW4iLCJzYW5pdGl6ZWQiLCJsaXN0Iiwicm9vdCIsImhhcyIsImFkZCIsInB1c2giLCJsZW5ndGgiLCJnZXRJbnZhbGlkRmllbGRzIiwiZXJyb3IiLCJlcnJvcnMiLCJzb3VyY2UiLCJpbnZhbGlkRmllbGRzIiwiZm9yRWFjaCIsIml0ZW0iLCJtZXNzYWdlIiwiZXhlYyIsImxhc3RJbmRleCIsImdldFBhc3N3b3JkUmVzZXRJZGVudGlmaWVyIiwicmVxdWVzdCIsImlkZW50aWZpZXIiLCJwaG9uZSIsInR5cGUiLCJpbmNsdWRlcyIsImdldFBhc3N3b3JkUmVzZXRUeXBlIiwiY29uZmlybWF0aW9uIiwid2l0aEludmFsaWRGaWVsZFJldHJ5IiwicmVxdWVzdFdpdGhQcm9wcyIsInNhZmVQcm9wcyIsInNpemUiLCJyZXRyeVByb3BzIiwiZmlsdGVyIiwiZGVmYXVsdFVzZXJWYWxpZGF0b3IiLCJpbnB1dCIsIm9wdGlvbnMiLCJ2YWxpZGF0ZWQiLCJzdHJpY3QiLCJFcnJvciIsImNyZWF0ZVVzZXJBY3Rpb25zIiwidXNlckJhc2UiLCJhZGFwdGVyIiwidXNlckFkYXB0ZXIiLCJhZGFwdGVyT3B0aW9ucyIsInVzZXJBZGFwdGVyT3B0aW9ucyIsImNsZWFyVXNlclJlcXVlc3RDYWNoZXMiLCJhZGRVc2VyIiwidXNlclByb3BzIiwicmVxdWVzdE9wdGlvbnMiLCJxdWVyeVZhcmlhYmxlcyIsIm9uU3VjY2VzcyIsImRhdGEiLCJ1c2VycyIsImRpc3BhdGNoIiwiQUREX0lURU1fU1VDQ0VTUyIsInJldHVyblByb3BzIiwic2lnblVwIiwiZXhwaXJlcyIsIlNJR05fVVBfU1VDQ0VTUyIsIlNJR05fVVBfRVJST1IiLCJ1cGRhdGVVc2VyIiwidXBkYXRlSW5wdXQiLCJiaXJ0aGRhdGUiLCJkb2IiLCJmaXJzdE5hbWUiLCJnZW5kZXIiLCJsYXN0TmFtZSIsIm1haWxpbmdMaXN0IiwiVVBEQVRFX0lURU1fU1VDQ0VTUyIsImNvbmZpcm1Db2RlIiwiY29kZSIsIl9yZXF1ZXN0T3B0aW9ucyIsImNvbmZpcm1lZCIsIkNPTkZJUk1fU0lHTl9VUF9TVUNDRVNTIiwicmVtb3ZlIiwiUkVNT1ZFX0lURU1fU1VDQ0VTUyIsInNlc3Npb25Qcm9wcyIsInNlc3Npb25EYXRhIiwiZ2V0VXNlckJ5U2Vzc2lvbiIsIkdFVF9TRVNTSU9OX0VSUk9SIiwibmV4dFNlc3Npb24iLCJHRVRfU0VTU0lPTl9TVUNDRVNTIiwicGVyc29uYUlkIiwiaXRlbUJ5SWQiLCJjYWNoZWRSZXN1bHQiLCJnZXRVc2VyQnlJZCIsIkdFVF9JVEVNX1NVQ0NFU1MiLCJyZXN1bHQiLCJzYWZlVXNlclByb3BzIiwiZ2V0VXNlckJ5QXR0cmlidXRlIiwiYXR0cmlidXRlIiwibm9ybWFsaXplZEF0dHJpYnV0ZSIsIm5vcm1hbGl6ZWRWYWx1ZSIsIm1hdGNoaW5nVXNlciIsImNyZWF0ZUJpbGxpbmdTZXR1cFNlc3Npb24iLCJyZXR1cm5VcmwiLCJub3JtYWxpemVkUmV0dXJuVXJsIiwiY2hlY2tvdXRVcmwiLCJCSUxMSU5HX1NFVFVQX1NFU1NJT05fU1VDQ0VTUyIsImNvbXBsZXRlQmlsbGluZ1NldHVwU2Vzc2lvbiIsInNlc3Npb25JZCIsIm5vcm1hbGl6ZWRTZXNzaW9uSWQiLCJ1cGRhdGVkVXNlciIsInNlc3Npb25Vc2VySWQiLCJkZWxldGVCaWxsaW5nQ2FyZCIsInVwZGF0ZVBsYW4iLCJwbGFuSWQiLCJuZXh0UGxhbklkIiwiZ2V0VXNlckxpc3QiLCJHRVRfTElTVF9TVUNDRVNTIiwibGlzdEJ5TGF0ZXN0IiwiZnJvbSIsInRvIiwiY2FjaGVLZXkiLCJsaXN0QnlDb25uZWN0aW9uIiwiX2Zyb20iLCJfdG8iLCJfdXNlclByb3BzIiwibGlzdEJ5UmVhY3Rpb25zIiwicmVhY3Rpb25OYW1lcyIsIl9wZXJzb25hUHJvcHMiLCJsaXN0QnlUYWdzIiwidGFnTmFtZXMiLCJwZXJzb25hUHJvcHMiLCJ0YWdzIiwic2VhcmNoIiwicXVlcnkiLCJjdXJyZW50QXV0aGVudGljYXRlZFVzZXIiLCJyZWZyZXNoU2Vzc2lvbkFjdGlvbiIsInRva2VuIiwic2lnbkluIiwiY29uZmlnIiwicmVxdWVzdGVkRXhwaXJlcyIsIk1hdGgiLCJtYXgiLCJOdW1iZXIiLCJhcHAiLCJtYXhNaW51dGVzIiwicXVlcnlWYXJpYWJsZXNXaXRoVXNlcklucHV0Iiwic3RvcmVkU2Vzc2lvbiIsImFjdGlvbiIsIlNJR05fSU5fU1VDQ0VTUyIsInBlcmZvcm1TaWduSW4iLCJzZXNzaW9uUmVzdWx0IiwiYmFzZVNlc3Npb24iLCJoeWRyYXRlZFNlc3Npb24iLCJmYWxsYmFja1Nlc3Npb24iLCJmaW5hbFNlc3Npb24iLCJTSUdOX0lOX0VSUk9SIiwic2lnbk91dCIsIlNJR05fT1VUX1NVQ0NFU1MiLCJjb25maXJtU2lnblVwIiwiX2NvZGUiLCJfdHlwZSIsInJlcXVlc3RQYXNzd29yZFJlc2V0IiwiZm9yZ290UGFzc3dvcmRTdWNjZWVkZWQiLCJzdWNjZXNzIiwiZm9yZ290UGFzc3dvcmQiLCJGT1JHT1RfUEFTU1dPUkRfU1VDQ0VTUyIsIkZPUkdPVF9QQVNTV09SRF9FUlJPUiIsInNlbmRWZXJpZmljYXRpb25FbWFpbCIsImVtYWlsT3B0aW9ucyIsInN1YmplY3QiLCJ2ZXJpZmljYXRpb25FbWFpbFN1YmplY3QiLCJ0ZW1wbGF0ZSIsInZlcmlmaWNhdGlvbkVtYWlsVGVtcGxhdGUiLCJ0ZXh0IiwidmVyaWZpY2F0aW9uRW1haWxUZXh0IiwiQ09ORklSTV9TSUdOX1VQX0VSUk9SIiwidGhlbiIsInJlc2V0UGFzc3dvcmQiLCJSRVNFVF9QQVNTV09SRF9TVUNDRVNTIiwiUkVTRVRfUEFTU1dPUkRfRVJST1IiLCJjb21wbGV0ZVBhc3N3b3JkUmVzZXQiLCJ1cGRhdGVQYXNzd29yZCIsIl9wYXNzd29yZCIsIl9uZXdQYXNzd29yZCIsInVwZGF0ZVVzZXJBZGFwdGVyIiwidXBkYXRlQWRhcHRlciIsInVwZGF0ZVVzZXJBZGFwdGVyT3B0aW9ucyIsInVwZGF0ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLGlCQUFpQixRQUFPLDRDQUE0QztBQUM1RSxTQUFRQyxjQUFjLFFBQU8sNEJBQTRCO0FBQ3pELFNBQVFDLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxjQUFjLEVBQUVDLFdBQVcsRUFBRUMsY0FBYyxRQUFPLHFCQUFxQjtBQUN0RyxTQUFRQyxpQkFBaUIsUUFBTyxtQ0FBbUM7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