@nlabs/reaktor 1.19.0 → 1.20.0-reactorbox.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +290 -0
  2. package/docs/GENERATION.md +4 -0
  3. package/lib/actions/apps.js +17 -2
  4. package/lib/actions/contentGeneration.d.ts +19 -1
  5. package/lib/actions/contentGeneration.js +59 -24
  6. package/lib/actions/contentGenerationSources.d.ts +29 -0
  7. package/lib/actions/contentGenerationSources.js +103 -0
  8. package/lib/actions/crm.d.ts +6 -2
  9. package/lib/actions/crm.js +91 -12
  10. package/lib/actions/crmCanonicalOutcomes.d.ts +88 -0
  11. package/lib/actions/crmCanonicalOutcomes.js +398 -0
  12. package/lib/actions/crmCanonicalPolicy.d.ts +92 -0
  13. package/lib/actions/crmCanonicalPolicy.js +104 -0
  14. package/lib/actions/crmCheckoutRecovery.d.ts +72 -0
  15. package/lib/actions/crmCheckoutRecovery.js +413 -0
  16. package/lib/actions/crmCheckoutRecoveryPolicy.d.ts +38 -0
  17. package/lib/actions/crmCheckoutRecoveryPolicy.js +61 -0
  18. package/lib/actions/crmDeliveryEvents.d.ts +24 -0
  19. package/lib/actions/crmDeliveryEvents.js +207 -0
  20. package/lib/actions/crmDeliveryEvidence.d.ts +17 -0
  21. package/lib/actions/crmDeliveryEvidence.js +58 -0
  22. package/lib/actions/crmExecution.d.ts +125 -0
  23. package/lib/actions/crmExecution.js +830 -0
  24. package/lib/actions/crmFinancialEvidence.d.ts +12 -0
  25. package/lib/actions/crmFinancialEvidence.js +60 -0
  26. package/lib/actions/crmInsights.d.ts +60 -0
  27. package/lib/actions/crmInsights.js +225 -0
  28. package/lib/actions/crmLeadFollowups.d.ts +66 -0
  29. package/lib/actions/crmLeadFollowups.js +209 -0
  30. package/lib/actions/crmOutcomes.d.ts +106 -0
  31. package/lib/actions/crmOutcomes.js +289 -0
  32. package/lib/actions/crmRecoveryRetention.d.ts +13 -0
  33. package/lib/actions/crmRecoveryRetention.js +163 -0
  34. package/lib/actions/crmReminderDispatch.d.ts +10 -0
  35. package/lib/actions/crmReminderDispatch.js +65 -0
  36. package/lib/actions/crmSourceOwnership.d.ts +7 -0
  37. package/lib/actions/crmSourceOwnership.js +27 -0
  38. package/lib/actions/crmSupportInsights.d.ts +18 -0
  39. package/lib/actions/crmSupportInsights.js +47 -0
  40. package/lib/actions/crmWinback.d.ts +71 -0
  41. package/lib/actions/crmWinback.js +347 -0
  42. package/lib/actions/crmWinbackConsent.d.ts +29 -0
  43. package/lib/actions/crmWinbackConsent.js +158 -0
  44. package/lib/actions/crmWinbackPolicy.d.ts +33 -0
  45. package/lib/actions/crmWinbackPolicy.js +115 -0
  46. package/lib/actions/crmWinbackShopSource.d.ts +15 -0
  47. package/lib/actions/crmWinbackShopSource.js +63 -0
  48. package/lib/actions/email.d.ts +4 -1
  49. package/lib/actions/email.js +25 -3
  50. package/lib/actions/index.d.ts +56 -0
  51. package/lib/actions/index.js +42 -1
  52. package/lib/actions/merchantAccountExperiment.d.ts +50 -0
  53. package/lib/actions/merchantAccountExperiment.js +424 -0
  54. package/lib/actions/merchantAccountExperimentConfig.d.ts +7 -0
  55. package/lib/actions/merchantAccountExperimentConfig.js +32 -0
  56. package/lib/actions/merchantAccountExperimentHost.d.ts +69 -0
  57. package/lib/actions/merchantAccountExperimentHost.js +92 -0
  58. package/lib/actions/merchantAccountExperimentPolicy.d.ts +66 -0
  59. package/lib/actions/merchantAccountExperimentPolicy.js +121 -0
  60. package/lib/actions/merchantAccountExperimentRelay.d.ts +10 -0
  61. package/lib/actions/merchantAccountExperimentRelay.js +75 -0
  62. package/lib/actions/merchantCalendar.d.ts +34 -0
  63. package/lib/actions/merchantCalendar.js +119 -0
  64. package/lib/actions/merchantCalendarBookings.d.ts +17 -0
  65. package/lib/actions/merchantCalendarBookings.js +113 -0
  66. package/lib/actions/merchantCalendarDelegation.d.ts +80 -0
  67. package/lib/actions/merchantCalendarDelegation.js +353 -0
  68. package/lib/actions/merchantCalendarDiscovery.d.ts +38 -0
  69. package/lib/actions/merchantCalendarDiscovery.js +124 -0
  70. package/lib/actions/merchantCalendarEventHost.d.ts +105 -0
  71. package/lib/actions/merchantCalendarEventHost.js +16 -0
  72. package/lib/actions/merchantCalendarEventPrivacy.d.ts +7 -0
  73. package/lib/actions/merchantCalendarEventPrivacy.js +70 -0
  74. package/lib/actions/merchantCalendarEventRepository.d.ts +121 -0
  75. package/lib/actions/merchantCalendarEventRepository.js +295 -0
  76. package/lib/actions/merchantCalendarEventTransport.d.ts +65 -0
  77. package/lib/actions/merchantCalendarEventTransport.js +132 -0
  78. package/lib/actions/merchantCalendarEvents.d.ts +172 -0
  79. package/lib/actions/merchantCalendarEvents.js +365 -0
  80. package/lib/actions/merchantCalendarInvitationConsent.d.ts +28 -0
  81. package/lib/actions/merchantCalendarInvitationConsent.js +118 -0
  82. package/lib/actions/merchantCalendarManagedSource.d.ts +22 -0
  83. package/lib/actions/merchantCalendarManagedSource.js +24 -0
  84. package/lib/actions/merchantCalendarOAuth.d.ts +92 -0
  85. package/lib/actions/merchantCalendarOAuth.js +502 -0
  86. package/lib/actions/merchantCalendarOAuthConfig.d.ts +4 -0
  87. package/lib/actions/merchantCalendarOAuthConfig.js +30 -0
  88. package/lib/actions/merchantCalendarOAuthRepository.d.ts +57 -0
  89. package/lib/actions/merchantCalendarOAuthRepository.js +108 -0
  90. package/lib/actions/merchantCalendarOAuthTransport.d.ts +4 -0
  91. package/lib/actions/merchantCalendarOAuthTransport.js +25 -0
  92. package/lib/actions/merchantCalendarScopes.d.ts +4 -0
  93. package/lib/actions/merchantCalendarScopes.js +31 -0
  94. package/lib/actions/merchantFinance.d.ts +65 -0
  95. package/lib/actions/merchantFinance.js +244 -0
  96. package/lib/actions/merchantFinanceProvider.d.ts +57 -0
  97. package/lib/actions/merchantFinanceProvider.js +180 -0
  98. package/lib/actions/merchantOperations.d.ts +94 -0
  99. package/lib/actions/merchantOperations.js +489 -0
  100. package/lib/actions/providerCredentials.d.ts +35 -0
  101. package/lib/actions/providerCredentials.js +166 -0
  102. package/lib/actions/s3.d.ts +10 -7
  103. package/lib/actions/s3.js +59 -14
  104. package/lib/actions/supportChannelSources.d.ts +66 -0
  105. package/lib/actions/supportChannelSources.js +183 -0
  106. package/lib/actions/supportCommerce.d.ts +62 -0
  107. package/lib/actions/supportCommerce.js +252 -0
  108. package/lib/actions/supportConnect.d.ts +39 -0
  109. package/lib/actions/supportConnect.js +224 -0
  110. package/lib/actions/supportContext.d.ts +31 -0
  111. package/lib/actions/supportContext.js +88 -0
  112. package/lib/actions/supportConversation.d.ts +102 -0
  113. package/lib/actions/supportConversation.js +100 -0
  114. package/lib/actions/supportEmailEvents.d.ts +20 -0
  115. package/lib/actions/supportEmailEvents.js +130 -0
  116. package/lib/actions/supportEmailHandoff.d.ts +114 -0
  117. package/lib/actions/supportEmailHandoff.js +356 -0
  118. package/lib/actions/supportOperations.d.ts +32 -0
  119. package/lib/actions/supportOperations.js +74 -0
  120. package/lib/actions/supportPolicy.d.ts +9 -0
  121. package/lib/actions/supportPolicy.js +44 -0
  122. package/lib/actions/supportPurposeConsent.d.ts +32 -0
  123. package/lib/actions/supportPurposeConsent.js +196 -0
  124. package/lib/actions/supportPurposePrivacy.d.ts +15 -0
  125. package/lib/actions/supportPurposePrivacy.js +181 -0
  126. package/lib/actions/supportSemanticReview.d.ts +64 -0
  127. package/lib/actions/supportSemanticReview.js +239 -0
  128. package/lib/actions/users.js +22 -3
  129. package/lib/constants/collections.d.ts +2 -1
  130. package/lib/constants/collections.js +2 -1
  131. package/lib/mutations/crm/crm.js +395 -7
  132. package/lib/queries/crm/crm.js +251 -5
  133. package/lib/types/auth.types.d.ts +2 -0
  134. package/lib/types/crm.types.d.ts +6 -0
  135. package/lib/types/users.types.d.ts +2 -0
  136. package/lib/utils/authUtils.js +17 -1
  137. package/lib/utils/graphqlUtils.d.ts +2 -0
  138. package/lib/utils/stripeUtils.ts.bak +1 -1
  139. package/package.json +8 -6
@@ -9,6 +9,7 @@ import { Config } from '../config.js';
9
9
  import { useDb } from '../utils/arangodbUtils.js';
10
10
  import { isAdminUser } from '../utils/sessionUtils.js';
11
11
  import { sesSend } from './email.js';
12
+ import { scopeCrmSourceOwner, validateCrmSourceLabels } from './crmSourceOwnership.js';
12
13
  const now = ()=>Date.now();
13
14
  const collection = (name)=>literal(name);
14
15
  const docKey = (value = '')=>parseId(String(value));
@@ -418,7 +419,9 @@ export const getEligibleMailingUsers = (context, options = {})=>{
418
419
  `;
419
420
  return useDb(context.databaseName).query(query).then((cursor)=>cursor.all());
420
421
  };
421
- export const ingestShopifyCustomerOrder = async (context, input)=>{
422
+ export const ingestShopifyCustomerOrder = async (context, input, scope)=>{
423
+ context = await scopeCrmSourceOwner(context, scope?.appId);
424
+ const appId = scope?.appId;
422
425
  const timestamp = now();
423
426
  const shopifyCustomerId = cleanExternalId(input.shopifyCustomerId, 160);
424
427
  const shopifyOrderId = cleanExternalId(input.shopifyOrderId, 160);
@@ -428,6 +431,9 @@ export const ingestShopifyCustomerOrder = async (context, input)=>{
428
431
  ...input.productIds || [],
429
432
  ...(input.products || []).map((product)=>product.productId)
430
433
  ].map((productId)=>cleanExternalId(productId, 320)).filter(Boolean)));
434
+ if (appId && productIds.length > 50) {
435
+ throw new Error('crm_source_product_limit');
436
+ }
431
437
  if (!shopifyCustomerId) {
432
438
  throw new Error('required_shopifyCustomerId');
433
439
  }
@@ -437,10 +443,30 @@ export const ingestShopifyCustomerOrder = async (context, input)=>{
437
443
  if (!email) {
438
444
  throw new Error('required_customerEmail');
439
445
  }
440
- const userKey = externalKey('shopify-user', shopifyCustomerId);
446
+ const userKey = externalKey('shopify-user', appId ? `${appId}:${shopifyCustomerId}` : shopifyCustomerId);
447
+ const orderKey = externalKey('shopify-order', appId ? `${appId}:${shopifyOrderId}` : shopifyOrderId);
448
+ if (appId) {
449
+ await validateCrmSourceLabels(context, appId, [
450
+ {
451
+ collection: COLLECTIONS.USERS,
452
+ id: userKey
453
+ },
454
+ {
455
+ collection: COLLECTIONS.CUSTOMER_ORDERS,
456
+ id: orderKey
457
+ },
458
+ ...productIds.map((productId)=>({
459
+ collection: COLLECTIONS.SHOPIFY_PRODUCTS,
460
+ id: externalKey('shopify-product', `${appId}:${productId}`)
461
+ }))
462
+ ]);
463
+ }
441
464
  const userInsert = {
442
465
  _key: userKey,
443
466
  added: timestamp,
467
+ ...appId ? {
468
+ appId
469
+ } : {},
444
470
  email,
445
471
  firstName: cleanString(customer.firstName, 160),
446
472
  lastName: cleanString(customer.lastName, 160),
@@ -463,12 +489,18 @@ export const ingestShopifyCustomerOrder = async (context, input)=>{
463
489
  shopifyCustomerId
464
490
  };
465
491
  const userQuery = aql`
466
- LET existing = FIRST(
492
+ LET matches = (
467
493
  FOR user IN ${collection(COLLECTIONS.USERS)}
468
- FILTER user.shopifyCustomerId == ${shopifyCustomerId} || user.email == ${email}
469
- LIMIT 1
494
+ FILTER ${appId ? aql`user.appId == ${appId} AND user.shopifyCustomerId == ${shopifyCustomerId}` : aql`user.shopifyCustomerId == ${shopifyCustomerId} || user.email == ${email}`}
495
+ LIMIT ${appId ? 2 : 1}
470
496
  RETURN user
471
497
  )
498
+ FILTER LENGTH(matches) < 2
499
+ LET existing = FIRST(matches)
500
+ ${appId ? aql`LET owned = DOCUMENT('users', ${userKey})
501
+ FILTER owned == null OR (owned.appId == ${appId} AND owned.shopifyCustomerId == ${shopifyCustomerId}
502
+ AND owned.deleted != true)
503
+ FILTER existing == null OR existing.deleted != true` : aql``}
472
504
  LET userKey = existing ? existing._key : ${userKey}
473
505
  UPSERT {_key: userKey}
474
506
  INSERT MERGE(${userInsert}, {_key: userKey, userId: userKey})
@@ -476,11 +508,16 @@ export const ingestShopifyCustomerOrder = async (context, input)=>{
476
508
  RETURN NEW
477
509
  `;
478
510
  const user = await useDb(context.databaseName).query(userQuery).then((cursor)=>cursor.next());
511
+ if (appId && (!user?._key || user.appId !== appId || user.shopifyCustomerId !== shopifyCustomerId || user.deleted === true)) {
512
+ throw new Error('crm_source_customer_binding_changed');
513
+ }
479
514
  const resolvedUserKey = docKey(String(user?._key || user?.userId || userKey));
480
- const orderKey = externalKey('shopify-order', shopifyOrderId);
481
515
  const order = {
482
516
  _key: orderKey,
483
517
  added: timestamp,
518
+ ...appId ? {
519
+ appId
520
+ } : {},
484
521
  currency: cleanString(input.currency, 3).toUpperCase(),
485
522
  customerOrderId: orderKey,
486
523
  modified: timestamp,
@@ -492,6 +529,10 @@ export const ingestShopifyCustomerOrder = async (context, input)=>{
492
529
  userId: resolvedUserKey
493
530
  };
494
531
  const orderQuery = aql`
532
+ ${appId ? aql`LET owned = DOCUMENT('customerOrders', ${orderKey})
533
+ FILTER owned == null OR (owned.appId == ${appId} AND owned.userId == ${resolvedUserKey}
534
+ AND owned.shopifyCustomerId == ${shopifyCustomerId} AND owned.shopifyOrderId == ${shopifyOrderId}
535
+ AND owned.deleted != true)` : aql``}
495
536
  UPSERT {_key: ${orderKey}}
496
537
  INSERT ${order}
497
538
  UPDATE ${{
@@ -505,7 +546,10 @@ export const ingestShopifyCustomerOrder = async (context, input)=>{
505
546
  RETURN NEW
506
547
  `;
507
548
  const savedOrder = await useDb(context.databaseName).query(orderQuery).then((cursor)=>cursor.next());
508
- await saveEdge(context, EDGES.HAS_CUSTOMER_ORDER, createHash(`hasCustomerOrder-${resolvedUserKey}-${orderKey}`), docId(COLLECTIONS.USERS, resolvedUserKey), docId(COLLECTIONS.CUSTOMER_ORDERS, orderKey), {
549
+ if (appId && (savedOrder?.appId !== appId || savedOrder.userId !== resolvedUserKey || savedOrder.shopifyCustomerId !== shopifyCustomerId || savedOrder.shopifyOrderId !== shopifyOrderId || savedOrder.deleted === true)) {
550
+ throw new Error('crm_source_order_binding_changed');
551
+ }
552
+ await saveEdge(context, EDGES.HAS_CUSTOMER_ORDER, createHash(`hasCustomerOrder-${resolvedUserKey}-${orderKey}`, appId ? null : undefined), docId(COLLECTIONS.USERS, resolvedUserKey), docId(COLLECTIONS.CUSTOMER_ORDERS, orderKey), {
509
553
  purchasedAt: order.purchasedAt,
510
554
  shopifyCustomerId,
511
555
  shopifyOrderId
@@ -514,16 +558,21 @@ export const ingestShopifyCustomerOrder = async (context, input)=>{
514
558
  const product = (input.products || []).find((item)=>item.productId === productId) || {
515
559
  productId
516
560
  };
517
- const productKey = externalKey('shopify-product', productId);
561
+ const productKey = externalKey('shopify-product', appId ? `${appId}:${productId}` : productId);
518
562
  const productDoc = {
519
563
  _key: productKey,
520
564
  added: timestamp,
565
+ ...appId ? {
566
+ appId
567
+ } : {},
521
568
  modified: timestamp,
522
569
  productId,
523
570
  title: cleanString(product.title, 320),
524
571
  variantId: cleanExternalId(product.variantId, 160)
525
572
  };
526
573
  const productQuery = aql`
574
+ ${appId ? aql`LET owned = DOCUMENT('shopifyProducts', ${productKey})
575
+ FILTER owned == null OR (owned.appId == ${appId} AND owned.productId == ${productId} AND owned.deleted != true)` : aql``}
527
576
  UPSERT {_key: ${productKey}}
528
577
  INSERT ${productDoc}
529
578
  UPDATE ${{
@@ -531,9 +580,13 @@ export const ingestShopifyCustomerOrder = async (context, input)=>{
531
580
  title: productDoc.title,
532
581
  variantId: productDoc.variantId
533
582
  }} IN ${collection(COLLECTIONS.SHOPIFY_PRODUCTS)}
583
+ RETURN NEW
534
584
  `;
535
- await useDb(context.databaseName).query(productQuery);
536
- await saveEdge(context, EDGES.HAS_PURCHASED_PRODUCT, createHash(`hasPurchasedProduct-${orderKey}-${productKey}`), docId(COLLECTIONS.CUSTOMER_ORDERS, orderKey), docId(COLLECTIONS.SHOPIFY_PRODUCTS, productKey), {
585
+ const savedProduct = await useDb(context.databaseName).query(productQuery).then((cursor)=>cursor.next());
586
+ if (appId && (!savedProduct || savedProduct.appId !== appId || savedProduct.productId !== productId || savedProduct.deleted === true)) {
587
+ throw new Error('crm_source_product_binding_changed');
588
+ }
589
+ await saveEdge(context, EDGES.HAS_PURCHASED_PRODUCT, createHash(`hasPurchasedProduct-${orderKey}-${productKey}`, appId ? null : undefined), docId(COLLECTIONS.CUSTOMER_ORDERS, orderKey), docId(COLLECTIONS.SHOPIFY_PRODUCTS, productKey), {
537
590
  productId,
538
591
  purchasedAt: order.purchasedAt
539
592
  });
@@ -594,14 +647,35 @@ const sendSupportTicketEmail = async (context, ticket, details, heading)=>{
594
647
  Source: `"${supportName}" <${supportEmail}>`
595
648
  }).catch(()=>undefined);
596
649
  };
597
- export const createSupportTicket = async (context, input)=>{
650
+ export const createSupportTicket = async (context, input, scope)=>{
651
+ context = await scopeCrmSourceOwner(context, scope?.appId);
652
+ const appId = scope?.appId;
598
653
  const timestamp = now();
599
654
  const userKey = docKey(String(input.userId || ''));
655
+ let userRevision;
600
656
  const ticketKey = docKey(String(input.supportTicketId || createHash(`support-ticket-${userKey}-${timestamp}`)));
657
+ if (appId) {
658
+ const user = await useDb(context.databaseName).collection(COLLECTIONS.USERS).document(userKey, {
659
+ graceful: true
660
+ });
661
+ if (!user || !user._rev || user.appId !== appId || user.deleted === true) {
662
+ throw new Error('support_source_customer_owner_required');
663
+ }
664
+ userRevision = user._rev;
665
+ await validateCrmSourceLabels(context, appId, [
666
+ {
667
+ collection: COLLECTIONS.SUPPORT_TICKETS,
668
+ id: ticketKey
669
+ }
670
+ ]);
671
+ }
601
672
  const ticketNumber = cleanString(input.ticketNumber, 80) || `RKT-${new Date(timestamp).toISOString().slice(0, 10).replace(/-/g, '')}-${ticketKey.slice(0, 8).toUpperCase()}`;
602
673
  const ticket = {
603
674
  _key: ticketKey,
604
675
  added: timestamp,
676
+ ...appId ? {
677
+ appId
678
+ } : {},
605
679
  assignedToUserId: docKey(String(input.assignedToUserId || '')),
606
680
  description: cleanString(input.description, 4000),
607
681
  modified: timestamp,
@@ -616,10 +690,15 @@ export const createSupportTicket = async (context, input)=>{
616
690
  userId: userKey
617
691
  };
618
692
  const query = aql`
693
+ ${appId ? aql`LET current = DOCUMENT('users', ${userKey})
694
+ FILTER current AND current.appId == ${appId} AND current._rev == ${userRevision} AND current.deleted != true` : aql``}
619
695
  INSERT ${ticket} IN ${collection(COLLECTIONS.SUPPORT_TICKETS)}
620
696
  RETURN NEW
621
697
  `;
622
698
  const savedTicket = await useDb(context.databaseName).query(query).then((cursor)=>cursor.next());
699
+ if (appId && (!savedTicket || savedTicket.appId !== appId || savedTicket.userId !== userKey)) {
700
+ throw new Error('support_source_customer_binding_changed');
701
+ }
623
702
  await saveEdge(context, EDGES.HAS_SUPPORT_TICKET, createHash(`hasSupportTicket-${userKey}-${ticketKey}`), docId(COLLECTIONS.USERS, userKey), docId(COLLECTIONS.SUPPORT_TICKETS, ticketKey), {
624
703
  priority: ticket.priority,
625
704
  status: ticket.status,
@@ -925,4 +1004,4 @@ export const getCustomerNotificationsByUser = (context, userId)=>{
925
1004
  return useDb(context.databaseName).query(query).then((cursor)=>cursor.all());
926
1005
  };
927
1006
 
928
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9wcml2YXRlL3RtcC92YXVsdC1yZWFrdG9yLWNvbXBsZXRpb24vcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jcm0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZCwgcGFyc2VQaG9uZSwgcGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7bGl0ZXJhbH0gZnJvbSAnYXJhbmdvanMvYXFsJztcblxuaW1wb3J0IHtDT0xMRUNUSU9OUywgRURHRVN9IGZyb20gJy4uL2NvbnN0YW50cy9jb2xsZWN0aW9ucy5qcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7dXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHtpc0FkbWluVXNlcn0gZnJvbSAnLi4vdXRpbHMvc2Vzc2lvblV0aWxzLmpzJztcbmltcG9ydCB7c2VzU2VuZH0gZnJvbSAnLi9lbWFpbC5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ3VzdG9tZXJOb3RpZmljYXRpb25UeXBlLFxuICBDdXN0b21lck9yZGVyVHlwZSxcbiAgQ3JtQ2FtcGFpZ25JbnB1dCxcbiAgQ3JtQ2FtcGFpZ25UeXBlLFxuICBDcm1Db250YWN0RmlsdGVyLFxuICBDcm1Gb3JtU3VibWlzc2lvbklucHV0LFxuICBDcm1Gb3JtU3VibWlzc2lvblR5cGUsXG4gIE1haWxpbmdMaXN0VHlwZSxcbiAgUHVibGljU3VwcG9ydFRpY2tldEZlZWQsXG4gIFB1YmxpY1N1cHBvcnRUaWNrZXRJbnB1dCxcbiAgU2hvcGlmeUN1c3RvbWVyT3JkZXJJbnB1dCxcbiAgU3VwcG9ydFRpY2tldEV2ZW50VHlwZSxcbiAgU3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlLFxuICBTdXBwb3J0VGlja2V0U3RhdHVzLFxuICBTdXBwb3J0VGlja2V0VHlwZURhdGFcbn0gZnJvbSAnLi4vdHlwZXMvY3JtLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtVc2VyVHlwZX0gZnJvbSAnLi4vdHlwZXMvdXNlcnMudHlwZXMuanMnO1xuXG5jb25zdCBub3cgPSAoKTogbnVtYmVyID0+IERhdGUubm93KCk7XG5jb25zdCBjb2xsZWN0aW9uID0gKG5hbWU6IHN0cmluZykgPT4gbGl0ZXJhbChuYW1lKTtcbmNvbnN0IGRvY0tleSA9ICh2YWx1ZSA9ICcnKTogc3RyaW5nID0+IHBhcnNlSWQoU3RyaW5nKHZhbHVlKSk7XG5jb25zdCBkb2NJZCA9IChjb2xsZWN0aW9uTmFtZTogc3RyaW5nLCBrZXkgPSAnJyk6IHN0cmluZyA9PiBgJHtjb2xsZWN0aW9uTmFtZX0vJHtkb2NLZXkoa2V5KX1gO1xuY29uc3QgZXh0ZXJuYWxLZXkgPSAocHJlZml4OiBzdHJpbmcsIGlkID0gJycpOiBzdHJpbmcgPT4gY3JlYXRlSGFzaChgJHtwcmVmaXh9LSR7U3RyaW5nKGlkKX1gLCBudWxsKTtcbmNvbnN0IGNsZWFuU3RyaW5nID0gKHZhbHVlOiB1bmtub3duLCBsZW5ndGggPSA2NDApOiBzdHJpbmcgPT4gcGFyc2VTdHJpbmcoU3RyaW5nKHZhbHVlIHx8ICcnKSwgbGVuZ3RoKTtcbmNvbnN0IGNsZWFuRXh0ZXJuYWxJZCA9ICh2YWx1ZTogdW5rbm93biwgbGVuZ3RoID0gMzIwKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpLnNsaWNlKDAsIGxlbmd0aCk7XG5jb25zdCBlbnN1cmVEb2N1bWVudENvbGxlY3Rpb24gPSBhc3luYyAoZGF0YWJhc2U6IFJldHVyblR5cGU8dHlwZW9mIHVzZURiPiwgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHRhcmdldCA9IGRhdGFiYXNlLmNvbGxlY3Rpb24obmFtZSk7XG4gIGlmKGF3YWl0IHRhcmdldC5leGlzdHMoKSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IGRhdGFiYXNlLmNyZWF0ZUNvbGxlY3Rpb24obmFtZSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBpZighYXdhaXQgdGFyZ2V0LmV4aXN0cygpKSB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbmNvbnN0IGVuc3VyZUVkZ2VDb2xsZWN0aW9uID0gYXN5bmMgKGRhdGFiYXNlOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VEYj4sIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB0YXJnZXQgPSBkYXRhYmFzZS5jb2xsZWN0aW9uKG5hbWUpO1xuICBpZihhd2FpdCB0YXJnZXQuZXhpc3RzKCkpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBkYXRhYmFzZS5jcmVhdGVFZGdlQ29sbGVjdGlvbihuYW1lKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGlmKCFhd2FpdCB0YXJnZXQuZXhpc3RzKCkpIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5jb25zdCByZXF1aXJlQ3JtQWRtaW4gPSAoY29udGV4dDogQXBpQ29udGV4dCk6IHZvaWQgPT4ge1xuICBpZighaXNBZG1pblVzZXIoY29udGV4dC5zZXNzaW9uIGFzIGFueSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkbWluaXN0cmF0b3JfYWNjZXNzX3JlcXVpcmVkJyk7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgcmVxdWlyZUNybUFkbWluaXN0cmF0b3IgPSByZXF1aXJlQ3JtQWRtaW47XG5cbmNvbnN0IGFsbG93ZWRDb250YWN0RmllbGRzID0gbmV3IFNldChbJ2VtYWlsJywgJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsICdwaG9uZScsICdtYXJrZXRpbmdDb25zZW50U291cmNlJywgJ2NybVNvdXJjZSddKTtcbmNvbnN0IHN1cHBvcnRQcmlvcml0aWVzID0gbmV3IFNldChbJ2xvdycsICdub3JtYWwnLCAnaGlnaCcsICd1cmdlbnQnXSk7XG5jb25zdCBzdXBwb3J0U3RhdHVzZXMgPSBuZXcgU2V0KFsnc3VibWl0dGVkJywgJ2luX3Byb2dyZXNzJywgJ2RvbmUnLCAnY29tcGxldGVkJ10pO1xuY29uc3Qgc3VwcG9ydFR5cGVzID0gbmV3IFNldChbJ2RlbGl2ZXJ5X2lzc3VlJywgJ3JlZnVuZF9yZXF1ZXN0JywgJ2J1Z19yZXBvcnQnLCAnYWNjb3VudF9pc3N1ZScsICdnZW5lcmFsX3N1cHBvcnQnXSk7XG5jb25zdCBlbWFpbFBhdHRlcm4gPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskL3U7XG5jb25zdCBlc2NhcGVIdG1sID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gdmFsdWUucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbmNvbnN0IHNhbml0aXplSHRtbCA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUgfHwgJycpXG4gIC5yZXBsYWNlKC88KHNjcmlwdHxpZnJhbWV8b2JqZWN0fGVtYmVkKVxcYltePl0qPltcXHNcXFNdKj88XFwvXFwxPi9naSwgJycpXG4gIC5yZXBsYWNlKC9cXHNvblxcdytcXHMqPVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W15cXHM+XSspL2dpLCAnJyk7XG5jb25zdCBzYW5pdGl6ZUNzcyA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUgfHwgJycpXG4gIC5yZXBsYWNlKC88XFwvP3N0eWxlXFxiW14+XSo+L2dpLCAnJylcbiAgLnJlcGxhY2UoL0BpbXBvcnRcXHMrW147XSs7Py9naSwgJycpXG4gIC5yZXBsYWNlKC91cmxcXHMqXFwoXFxzKihbJ1wiXT8pamF2YXNjcmlwdDpbXildK1xcKS9naSwgJycpO1xuY29uc3QgaHRtbFRvVGV4dCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHZhbHVlLnJlcGxhY2UoLzxbXj5dKz4vZywgJyAnKS5yZXBsYWNlKC9cXHMrL2csICcgJykudHJpbSgpO1xuY29uc3QgY2h1bmsgPSA8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSwgc2l6ZTogbnVtYmVyKTogVFtdW10gPT4ge1xuICBjb25zdCBncm91cHM6IFRbXVtdID0gW107XG4gIGZvcihsZXQgaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXggKz0gc2l6ZSkgZ3JvdXBzLnB1c2goaXRlbXMuc2xpY2UoaW5kZXgsIGluZGV4ICsgc2l6ZSkpO1xuICByZXR1cm4gZ3JvdXBzO1xufTtcblxuZXhwb3J0IGNvbnN0IHN1Ym1pdENybUZvcm0gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBDcm1Gb3JtU3VibWlzc2lvbklucHV0XG4pOiBQcm9taXNlPENybUZvcm1TdWJtaXNzaW9uVHlwZT4gPT4ge1xuICBpZih0eXBlb2YgaW5wdXQ/Lm1hcmtldGluZ09wdEluICE9PSAnYm9vbGVhbicpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfbWFya2V0aW5nT3B0SW4nKTtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhpbnB1dC5lbWFpbCwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCByYXdQaG9uZSA9IGNsZWFuU3RyaW5nKGlucHV0LnBob25lLCA4MCk7XG4gIGNvbnN0IHBob25lID0gcmF3UGhvbmUgPyAocGFyc2VQaG9uZShyYXdQaG9uZSkgfHwgcmF3UGhvbmUpIDogJyc7XG4gIGlmKCFlbWFpbCAmJiAhcGhvbmUpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfZW1haWxfb3JfcGhvbmUnKTtcblxuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgYXdhaXQgZW5zdXJlRG9jdW1lbnRDb2xsZWN0aW9uKGRhdGFiYXNlLCBDT0xMRUNUSU9OUy5DUk1fRk9STV9TVUJNSVNTSU9OUyk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBzb3VyY2UgPSBjbGVhblN0cmluZyhpbnB1dC5zb3VyY2UgfHwgaW5wdXQuZm9ybUlkIHx8ICdmb3JtJywgMTYwKTtcbiAgY29uc3QgdmFsdWVzID0gaW5wdXQudmFsdWVzIHx8IHt9O1xuICBjb25zdCBmaXJzdE5hbWUgPSBjbGVhblN0cmluZyhpbnB1dC5maXJzdE5hbWUgfHwgdmFsdWVzLmZpcnN0TmFtZSwgMTYwKTtcbiAgY29uc3QgbGFzdE5hbWUgPSBjbGVhblN0cmluZyhpbnB1dC5sYXN0TmFtZSB8fCB2YWx1ZXMubGFzdE5hbWUsIDE2MCk7XG4gIGNvbnN0IGdlbmVyYXRlZFVzZXJLZXkgPSBjcmVhdGVIYXNoKGVtYWlsIHx8IHBob25lLCBudWxsKTtcbiAgY29uc3QgY29uc2VudCA9IGlucHV0Lm1hcmtldGluZ09wdEluXG4gICAgPyB7bWFya2V0aW5nT3B0SW5BdDogdGltZXN0YW1wLCBtYXJrZXRpbmdPcHRPdXRBdDogbnVsbH1cbiAgICA6IHttYXJrZXRpbmdPcHRPdXRBdDogdGltZXN0YW1wfTtcbiAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICBfa2V5OiBnZW5lcmF0ZWRVc2VyS2V5LFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBlbWFpbCxcbiAgICBmaXJzdE5hbWUsXG4gICAgbGFzdE5hbWUsXG4gICAgbWFpbGluZ0xpc3Q6IGlucHV0Lm1hcmtldGluZ09wdEluLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6IHNvdXJjZSxcbiAgICBtYXJrZXRpbmdPcHRJbjogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBwaG9uZSxcbiAgICB0eXBlOiAnY3JtQ29udGFjdCcsXG4gICAgdXNlckFjY2VzczogMCxcbiAgICB1c2VySWQ6IGdlbmVyYXRlZFVzZXJLZXksXG4gICAgdmVyaWZpZWRFbWFpbDogZmFsc2UsXG4gICAgdmVyaWZpZWRQaG9uZTogZmFsc2UsXG4gICAgLi4uY29uc2VudFxuICB9O1xuICBjb25zdCB1c2VyVXBkYXRlID0ge1xuICAgIC4uLihlbWFpbCA/IHtlbWFpbH0gOiB7fSksXG4gICAgLi4uKGZpcnN0TmFtZSA/IHtmaXJzdE5hbWV9IDoge30pLFxuICAgIC4uLihsYXN0TmFtZSA/IHtsYXN0TmFtZX0gOiB7fSksXG4gICAgLi4uKHBob25lID8ge3Bob25lfSA6IHt9KSxcbiAgICBtYWlsaW5nTGlzdDogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbWFya2V0aW5nQ29uc2VudFNvdXJjZTogc291cmNlLFxuICAgIG1hcmtldGluZ09wdEluOiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIC4uLmNvbnNlbnRcbiAgfTtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBMRVQgZXhpc3RpbmcgPSBGSVJTVChcbiAgICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICAgIEZJTFRFUiAoJHtlbWFpbH0gIT0gXCJcIiAmJiBMT1dFUih1c2VyLmVtYWlsIHx8IFwiXCIpID09ICR7ZW1haWx9KVxuICAgICAgICAgIHx8ICgke3Bob25lfSAhPSBcIlwiICYmIHVzZXIucGhvbmUgPT0gJHtwaG9uZX0pXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgTEVUIHVzZXJLZXkgPSBleGlzdGluZyA/IGV4aXN0aW5nLl9rZXkgOiAke2dlbmVyYXRlZFVzZXJLZXl9XG4gICAgVVBTRVJUIHtfa2V5OiB1c2VyS2V5fVxuICAgIElOU0VSVCBNRVJHRSgke3VzZXJJbnNlcnR9LCB7X2tleTogdXNlcktleSwgdXNlcklkOiB1c2VyS2V5fSlcbiAgICBVUERBVEUgJHt1c2VyVXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBVc2VyVHlwZSB8IG51bGw7XG4gIGNvbnN0IHVzZXJJZCA9IGRvY0tleShTdHJpbmcodXNlcj8uX2tleSB8fCB1c2VyPy51c2VySWQgfHwgZ2VuZXJhdGVkVXNlcktleSkpO1xuXG4gIGNvbnN0IHN1Ym1pc3Npb25JZCA9IGNyZWF0ZUhhc2goYGNybS1zdWJtaXNzaW9uLSR7dGltZXN0YW1wfS0ke2VtYWlsfS0ke3Bob25lfWAsIG51bGwpO1xuICBjb25zdCBzdWJtaXNzaW9uID0ge1xuICAgIF9rZXk6IHN1Ym1pc3Npb25JZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGVtYWlsLFxuICAgIGZvcm1JZDogY2xlYW5TdHJpbmcoaW5wdXQuZm9ybUlkLCAxNjApLFxuICAgIG1hcmtldGluZ09wdEluOiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHBob25lLFxuICAgIHNvdXJjZSxcbiAgICBzdWJtaXNzaW9uSWQsXG4gICAgdXNlcklkLFxuICAgIHZhbHVlc1xuICB9O1xuICBjb25zdCBzYXZlZCA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBJTlNFUlQgJHtzdWJtaXNzaW9ufSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0ZPUk1fU1VCTUlTU0lPTlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcblxuICByZXR1cm4gc2F2ZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3JtRm9ybVN1Ym1pc3Npb25zID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPENybUZvcm1TdWJtaXNzaW9uVHlwZVtdPiA9PiB7XG4gIHJlcXVpcmVDcm1BZG1pbihjb250ZXh0KTtcbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgIGlmKCFhd2FpdCBkYXRhYmFzZS5jb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9GT1JNX1NVQk1JU1NJT05TKS5leGlzdHMoKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgICBGT1Igc3VibWlzc2lvbiBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0ZPUk1fU1VCTUlTU0lPTlMpfVxuICAgICAgICBTT1JUIHN1Ym1pc3Npb24uYWRkZWQgREVTQ1xuICAgICAgICBMSU1JVCA1MDBcbiAgICAgICAgUkVUVVJOIHN1Ym1pc3Npb25cbiAgICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG4gIH0pKCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3JtQ29udGFjdHMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZmlsdGVyOiBDcm1Db250YWN0RmlsdGVyID0ge30pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgcmVxdWlyZUNybUFkbWluKGNvbnRleHQpO1xuICBjb25zdCBzZWFyY2ggPSBjbGVhblN0cmluZyhmaWx0ZXIuc2VhcmNoLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGZpZWxkID0gYWxsb3dlZENvbnRhY3RGaWVsZHMuaGFzKGZpbHRlci5maWVsZCB8fCAnJykgPyBTdHJpbmcoZmlsdGVyLmZpZWxkKSA6ICcnO1xuICBjb25zdCB2YWx1ZSA9IGNsZWFuU3RyaW5nKGZpbHRlci52YWx1ZSwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBvcHRlZEluT25seSA9IGZpbHRlci5vcHRlZEluT25seSAhPT0gZmFsc2U7XG4gIGNvbnN0IG9wZXJhdG9yID0gWydjb250YWlucycsICdlcXVhbHMnLCAnZXhpc3RzJ10uaW5jbHVkZXMoZmlsdGVyLm9wZXJhdG9yIHx8ICcnKSA/IGZpbHRlci5vcGVyYXRvciA6ICdjb250YWlucyc7XG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICBGSUxURVIgJHshb3B0ZWRJbk9ubHl9IHx8IHVzZXIubWFya2V0aW5nT3B0SW4gPT0gdHJ1ZVxuICAgICAgRklMVEVSICR7IXNlYXJjaH0gfHwgQ09OVEFJTlMoTE9XRVIoQ09OQ0FUX1NFUEFSQVRPUihcIiBcIiwgdXNlci5maXJzdE5hbWUsIHVzZXIubGFzdE5hbWUsIHVzZXIuZW1haWwsIHVzZXIucGhvbmUpKSwgJHtzZWFyY2h9KVxuICAgICAgRklMVEVSICR7IWZpZWxkfSB8fCAoJHtvcGVyYXRvciA9PT0gJ2V4aXN0cyd9XG4gICAgICAgID8gSEFTKHVzZXIsICR7ZmllbGR9KVxuICAgICAgICA6ICgke29wZXJhdG9yID09PSAnZXF1YWxzJ30gPyBMT1dFUihUT19TVFJJTkcodXNlclske2ZpZWxkfV0pKSA9PSAke3ZhbHVlfSA6IENPTlRBSU5TKExPV0VSKFRPX1NUUklORyh1c2VyWyR7ZmllbGR9XSkpLCAke3ZhbHVlfSkpKVxuICAgICAgU09SVCB1c2VyLmFkZGVkIERFU0NcbiAgICAgIExJTUlUIDEwMDBcbiAgICAgIFJFVFVSTiBNRVJHRSh1c2VyLCB7Y3JtU291cmNlOiB1c2VyLm1hcmtldGluZ0NvbnNlbnRTb3VyY2V9KVxuICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VuZENybUNhbXBhaWduID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogQ3JtQ2FtcGFpZ25JbnB1dFxuKTogUHJvbWlzZTxDcm1DYW1wYWlnblR5cGU+ID0+IHtcbiAgcmVxdWlyZUNybUFkbWluKGNvbnRleHQpO1xuICBjb25zdCBzdWJqZWN0ID0gY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKTtcbiAgY29uc3QgYm9keUh0bWwgPSBzYW5pdGl6ZUh0bWwoaW5wdXQuaHRtbCk7XG4gIGNvbnN0IGNzcyA9IHNhbml0aXplQ3NzKGlucHV0LmNzcyk7XG4gIGlmKCFzdWJqZWN0IHx8ICFib2R5SHRtbCkgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9jYW1wYWlnbl9jb250ZW50Jyk7XG5cbiAgY29uc3QgY2FuZGlkYXRlcyA9IGF3YWl0IGdldENybUNvbnRhY3RzKGNvbnRleHQsIHsuLi5pbnB1dC5maWx0ZXIsIG9wdGVkSW5Pbmx5OiB0cnVlfSk7XG4gIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldCgoaW5wdXQudXNlcklkcyB8fCBbXSkubWFwKChpZCkgPT4gZG9jS2V5KGlkKSkpO1xuICBjb25zdCByZWNpcGllbnRzID0gY2FuZGlkYXRlcy5maWx0ZXIoKHVzZXIpID0+XG4gICAgQm9vbGVhbih1c2VyLmVtYWlsKSAmJiAoIXNlbGVjdGVkSWRzLnNpemUgfHwgc2VsZWN0ZWRJZHMuaGFzKGRvY0tleSh1c2VyLnVzZXJJZCB8fCB1c2VyLl9rZXkpKSkpO1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgY2FtcGFpZ25JZCA9IGNyZWF0ZUhhc2goYGNybS1jYW1wYWlnbi0ke3RpbWVzdGFtcH0tJHtzdWJqZWN0fWAsIG51bGwpO1xuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgY29uc3QgY2FtcGFpZ24gPSB7XG4gICAgX2tleTogY2FtcGFpZ25JZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGNhbXBhaWduSWQsXG4gICAgY3NzLFxuICAgIGZhaWxlZENvdW50OiAwLFxuICAgIGh0bWw6IGJvZHlIdG1sLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcmVjaXBpZW50Q291bnQ6IHJlY2lwaWVudHMubGVuZ3RoLFxuICAgIHNlbnRDb3VudDogMCxcbiAgICBzdGF0dXM6ICdzZW5kaW5nJyxcbiAgICBzdWJqZWN0XG4gIH07XG4gIGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBJTlNFUlQgJHtjYW1wYWlnbn0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9DQU1QQUlHTlMpfWApO1xuXG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGxldCBzZW50Q291bnQgPSAwO1xuICBmb3IoY29uc3QgcmVjaXBpZW50c0JhdGNoIG9mIGNodW5rKHJlY2lwaWVudHMsIDUwKSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXNTZW5kKHtcbiAgICAgICAgRGVzdGluYXRpb246IHtCY2NBZGRyZXNzZXM6IHJlY2lwaWVudHNCYXRjaC5tYXAoKHJlY2lwaWVudCkgPT4gU3RyaW5nKHJlY2lwaWVudC5lbWFpbCkpfSxcbiAgICAgICAgTWVzc2FnZToge1xuICAgICAgICAgIEJvZHk6IHtIdG1sOiB7RGF0YTogYDxzdHlsZT4ke2Nzc308L3N0eWxlPiR7Ym9keUh0bWx9YH0sIFRleHQ6IHtEYXRhOiBodG1sVG9UZXh0KGJvZHlIdG1sKX19LFxuICAgICAgICAgIFN1YmplY3Q6IHtEYXRhOiBzdWJqZWN0fVxuICAgICAgICB9LFxuICAgICAgICBTb3VyY2U6IGBcIiR7Y29udGV4dC5jb25maWc/LmRldGFpbHM/LnN1cHBvcnROYW1lIHx8ICdSZWFrdG9yJ31cIiA8JHtjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8uc3VwcG9ydEVtYWlsIHx8ICdzdXBwb3J0QHJlYWt0b3IuaW8nfT5gXG4gICAgICB9KTtcbiAgICAgIHNlbnRDb3VudCArPSByZWNpcGllbnRzQmF0Y2gubGVuZ3RoO1xuICAgIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgICBmYWlsZWRDb3VudCArPSByZWNpcGllbnRzQmF0Y2gubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBjb25zdCByZXN1bHQgPSB7Li4uY2FtcGFpZ24sIGZhaWxlZENvdW50LCBzZW50QXQ6IG5vdygpLCBzZW50Q291bnQsIHN0YXR1czogZmFpbGVkQ291bnQgPyAoc2VudENvdW50ID8gJ3BhcnRpYWwnIDogJ2ZhaWxlZCcpIDogJ3NlbnQnfTtcbiAgYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgIFVQREFURSAke2NhbXBhaWduSWR9IFdJVEggJHt7XG4gICAgICBmYWlsZWRDb3VudDogcmVzdWx0LmZhaWxlZENvdW50LFxuICAgICAgbW9kaWZpZWQ6IHJlc3VsdC5zZW50QXQsXG4gICAgICBzZW50QXQ6IHJlc3VsdC5zZW50QXQsXG4gICAgICBzZW50Q291bnQ6IHJlc3VsdC5zZW50Q291bnQsXG4gICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXNcbiAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0NBTVBBSUdOUyl9XG4gIGApO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3Qgc2F2ZUVkZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGVkZ2VDb2xsZWN0aW9uOiBzdHJpbmcsXG4gIGVkZ2VLZXk6IHN0cmluZyxcbiAgZnJvbTogc3RyaW5nLFxuICB0bzogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IGVkZ2UgPSB7XG4gICAgX2Zyb206IGZyb20sXG4gICAgX2tleTogZWRnZUtleSxcbiAgICBfdG86IHRvLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAuLi5kYXRhXG4gIH07XG4gIGNvbnN0IHF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBVUFNFUlQge19rZXk6ICR7ZWRnZUtleX19XG4gICAgSU5TRVJUICR7ZWRnZX1cbiAgICBVUERBVEUgJHtkYXRhfSBJTiAke2NvbGxlY3Rpb24oZWRnZUNvbGxlY3Rpb24pfVxuICBgO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPE1haWxpbmdMaXN0VHlwZT5cbik6IFByb21pc2U8TWFpbGluZ0xpc3RUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBtYWlsaW5nTGlzdElkID0gZG9jS2V5KFN0cmluZyhpbnB1dD8ubWFpbGluZ0xpc3RJZCB8fCBjcmVhdGVIYXNoKGBtYWlsaW5nLWxpc3QtJHtpbnB1dD8ubmFtZX0tJHt0aW1lc3RhbXB9YCkpKTtcbiAgY29uc3QgbWFpbGluZ0xpc3QgPSB7XG4gICAgX2tleTogbWFpbGluZ0xpc3RJZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGNyZWF0ZWRCeVVzZXJJZDogZG9jS2V5KFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSxcbiAgICBkZXNjcmlwdGlvbjogY2xlYW5TdHJpbmcoaW5wdXQ/LmRlc2NyaXB0aW9uLCAyMDAwKSxcbiAgICBtYWlsaW5nTGlzdElkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgbmFtZTogY2xlYW5TdHJpbmcoaW5wdXQ/Lm5hbWUsIDE2MCksXG4gICAgc3RhdHVzOiBpbnB1dD8uc3RhdHVzIHx8ICdhY3RpdmUnXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQU0VSVCB7X2tleTogJHttYWlsaW5nTGlzdElkfX1cbiAgICBJTlNFUlQgJHttYWlsaW5nTGlzdH1cbiAgICBVUERBVEUgJHt7XG4gICAgICBkZXNjcmlwdGlvbjogbWFpbGluZ0xpc3QuZGVzY3JpcHRpb24sXG4gICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgbmFtZTogbWFpbGluZ0xpc3QubmFtZSxcbiAgICAgIHN0YXR1czogbWFpbGluZ0xpc3Quc3RhdHVzXG4gICAgfX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1haWxpbmdMaXN0cyA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxNYWlsaW5nTGlzdFR5cGVbXT4gPT4ge1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1IgbGlzdCBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUyl9XG4gICAgICBGSUxURVIgbGlzdC5zdGF0dXMgIT0gXCJhcmNoaXZlZFwiXG4gICAgICBTT1JUIGxpc3QuYWRkZWQgREVTQ1xuICAgICAgUkVUVVJOIGxpc3RcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVXNlclRvTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmcsXG4gIHNvdXJjZSA9ICdtYW51YWwnXG4pOiBQcm9taXNlPE1haWxpbmdMaXN0VHlwZSB8IG51bGw+ID0+IHtcbiAgY29uc3QgdXNlcktleSA9IGRvY0tleSh1c2VySWQpO1xuICBjb25zdCBsaXN0S2V5ID0gZG9jS2V5KG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBlZGdlS2V5ID0gY3JlYXRlSGFzaChgaGFzTWFpbGluZ0xpc3QtJHt1c2VyS2V5fS0ke2xpc3RLZXl9YCk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfTUFJTElOR19MSVNULFxuICAgIGVkZ2VLZXksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMsIGxpc3RLZXkpLFxuICAgIHtcbiAgICAgIGFkZGVkQnlVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgICBzb3VyY2U6IGNsZWFuU3RyaW5nKHNvdXJjZSwgODApLFxuICAgICAgc3RhdHVzOiAnYWN0aXZlJ1xuICAgIH1cbiAgKTtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpXG4gICAgLnF1ZXJ5KGFxbGBSRVRVUk4gRE9DVU1FTlQoJHtkb2NJZChDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTLCBsaXN0S2V5KX0pYClcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVVc2VyRnJvbU1haWxpbmdMaXN0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgbWFpbGluZ0xpc3RJZDogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgdXNlcktleSA9IGRvY0tleSh1c2VySWQpO1xuICBjb25zdCBsaXN0S2V5ID0gZG9jS2V5KG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBlZGdlS2V5ID0gY3JlYXRlSGFzaChgaGFzTWFpbGluZ0xpc3QtJHt1c2VyS2V5fS0ke2xpc3RLZXl9YCk7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBtb2RpZmllZDogbm93KCksXG4gICAgcmVtb3ZlZEF0OiBub3coKSxcbiAgICBzdGF0dXM6ICdyZW1vdmVkJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBVUERBVEUgJHtlZGdlS2V5fSBXSVRIICR7dXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkudGhlbihCb29sZWFuKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYWlsaW5nTGlzdFVzZXJzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBsaXN0SWQgPSBkb2NJZChDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTLCBtYWlsaW5nTGlzdElkKTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIHVzZXIsIGVkZ2UgSU4gMS4uMSBJTkJPVU5EICR7bGlzdElkfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgICBGSUxURVIgZWRnZS5zdGF0dXMgPT0gXCJhY3RpdmVcIlxuICAgICAgU09SVCB1c2VyLmVtYWlsIEFTQ1xuICAgICAgUkVUVVJOIHVzZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeVB1cmNoYXNlZFByb2R1Y3QgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHByb2R1Y3RJZDogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgcHJvZHVjdEtleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LXByb2R1Y3QnLCBwcm9kdWN0SWQpO1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1Igb3JkZXIgSU4gMS4uMSBJTkJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUywgcHJvZHVjdEtleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QpfVxuICAgICAgRk9SIHVzZXIgSU4gMS4uMSBJTkJPVU5EIG9yZGVyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgU09SVCB1c2VyLmVtYWlsIEFTQ1xuICAgICAgICBSRVRVUk4gRElTVElOQ1QgdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGlnaWJsZU1haWxpbmdVc2VycyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgb3B0aW9uczoge3JlYWRvbmx5IG1haWxpbmdMaXN0SWQ/OiBzdHJpbmc7IHJlYWRvbmx5IHByb2R1Y3RJZD86IHN0cmluZzsgcmVhZG9ubHkgZXhjbHVkZU9wZW5TdXBwb3J0VGlja2V0cz86IGJvb2xlYW59ID0ge31cbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzID0gb3B0aW9ucy5leGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzICE9PSBmYWxzZTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgTEVUIGJhc2VVc2VycyA9IChcbiAgICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICAgIEZJTFRFUiB1c2VyLm1hcmtldGluZ09wdEluID09IHRydWVcbiAgICAgICAgRklMVEVSIHVzZXIuZW1haWwgIT0gbnVsbCAmJiB1c2VyLmVtYWlsICE9IFwiXCJcbiAgICAgICAgRklMVEVSIHVzZXIuZW1haWxEZWxpdmVyeVN0YXR1cyA9PSBudWxsIHx8IHVzZXIuZW1haWxEZWxpdmVyeVN0YXR1cyA9PSBcInZhbGlkXCJcbiAgICAgICAgJHtvcHRpb25zLm1haWxpbmdMaXN0SWQgPyBhcWxgXG4gICAgICAgICAgRklMVEVSIExFTkdUSChcbiAgICAgICAgICAgIEZPUiBsaXN0IElOIDEuLjEgT1VUQk9VTkQgdXNlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19NQUlMSU5HX0xJU1QpfVxuICAgICAgICAgICAgICBGSUxURVIgbGlzdC5fa2V5ID09ICR7ZG9jS2V5KG9wdGlvbnMubWFpbGluZ0xpc3RJZCl9XG4gICAgICAgICAgICAgIFJFVFVSTiBsaXN0XG4gICAgICAgICAgKSA+IDBcbiAgICAgICAgYCA6IGFxbGBgfVxuICAgICAgICAke29wdGlvbnMucHJvZHVjdElkID8gYXFsYFxuICAgICAgICAgIEZJTFRFUiBMRU5HVEgoXG4gICAgICAgICAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCB1c2VyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgICAgICAgRk9SIHByb2R1Y3QgSU4gMS4uMSBPVVRCT1VORCBvcmRlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19QVVJDSEFTRURfUFJPRFVDVCl9XG4gICAgICAgICAgICAgICAgRklMVEVSIHByb2R1Y3QucHJvZHVjdElkID09ICR7U3RyaW5nKG9wdGlvbnMucHJvZHVjdElkKX1cbiAgICAgICAgICAgICAgICBSRVRVUk4gcHJvZHVjdFxuICAgICAgICAgICkgPiAwXG4gICAgICAgIGAgOiBhcWxgYH1cbiAgICAgICAgJHtleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzID8gYXFsYFxuICAgICAgICAgIEZJTFRFUiBMRU5HVEgoXG4gICAgICAgICAgICBGT1IgdGlja2V0IElOIDEuLjEgT1VUQk9VTkQgdXNlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gICAgICAgICAgICAgIEZJTFRFUiB0aWNrZXQuc3RhdHVzIElOIFtcIm9wZW5cIiwgXCJpbl9wcm9ncmVzc1wiLCBcIndhaXRpbmdfb25fY3VzdG9tZXJcIiwgXCJ3YWl0aW5nX29uX2ludGVybmFsXCJdXG4gICAgICAgICAgICAgIEZJTFRFUiB0aWNrZXQucHJpb3JpdHkgSU4gW1wiaGlnaFwiLCBcInVyZ2VudFwiXVxuICAgICAgICAgICAgICBSRVRVUk4gdGlja2V0XG4gICAgICAgICAgKSA9PSAwXG4gICAgICAgIGAgOiBhcWxgYH1cbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgRk9SIHVzZXIgSU4gYmFzZVVzZXJzXG4gICAgICBTT1JUIHVzZXIuZW1haWwgQVNDXG4gICAgICBSRVRVUk4gRElTVElOQ1QgdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbmdlc3RTaG9waWZ5Q3VzdG9tZXJPcmRlciA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFNob3BpZnlDdXN0b21lck9yZGVySW5wdXRcbik6IFByb21pc2U8Q3VzdG9tZXJPcmRlclR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHNob3BpZnlDdXN0b21lcklkID0gY2xlYW5FeHRlcm5hbElkKGlucHV0LnNob3BpZnlDdXN0b21lcklkLCAxNjApO1xuICBjb25zdCBzaG9waWZ5T3JkZXJJZCA9IGNsZWFuRXh0ZXJuYWxJZChpbnB1dC5zaG9waWZ5T3JkZXJJZCwgMTYwKTtcbiAgY29uc3QgY3VzdG9tZXIgPSBpbnB1dC5jdXN0b21lciB8fCB7fTtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhjdXN0b21lci5lbWFpbCwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBwcm9kdWN0SWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi4oaW5wdXQucHJvZHVjdElkcyB8fCBbXSksIC4uLihpbnB1dC5wcm9kdWN0cyB8fCBbXSkubWFwKChwcm9kdWN0KSA9PiBwcm9kdWN0LnByb2R1Y3RJZCldXG4gICAgLm1hcCgocHJvZHVjdElkKSA9PiBjbGVhbkV4dGVybmFsSWQocHJvZHVjdElkLCAzMjApKVxuICAgIC5maWx0ZXIoQm9vbGVhbikpKTtcblxuICBpZighc2hvcGlmeUN1c3RvbWVySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX3Nob3BpZnlDdXN0b21lcklkJyk7XG4gIH1cbiAgaWYoIXNob3BpZnlPcmRlcklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9zaG9waWZ5T3JkZXJJZCcpO1xuICB9XG4gIGlmKCFlbWFpbCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfY3VzdG9tZXJFbWFpbCcpO1xuICB9XG5cbiAgY29uc3QgdXNlcktleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LXVzZXInLCBzaG9waWZ5Q3VzdG9tZXJJZCk7XG4gIGNvbnN0IHVzZXJJbnNlcnQgPSB7XG4gICAgX2tleTogdXNlcktleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGVtYWlsLFxuICAgIGZpcnN0TmFtZTogY2xlYW5TdHJpbmcoY3VzdG9tZXIuZmlyc3ROYW1lLCAxNjApLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5sYXN0TmFtZSwgMTYwKSxcbiAgICBtYXJrZXRpbmdDb25zZW50U291cmNlOiAnc2hvcGlmeScsXG4gICAgbWFya2V0aW5nT3B0SW46IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlLFxuICAgIG1hcmtldGluZ09wdEluQXQ6IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlID8gdGltZXN0YW1wIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc2hvcGlmeUN1c3RvbWVySWQsXG4gICAgdHlwZTogJ2NybUNvbnRhY3QnLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCB1c2VyVXBkYXRlID0ge1xuICAgIGVtYWlsLFxuICAgIGZpcnN0TmFtZTogY2xlYW5TdHJpbmcoY3VzdG9tZXIuZmlyc3ROYW1lLCAxNjApLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5sYXN0TmFtZSwgMTYwKSxcbiAgICBsYXN0UHVyY2hhc2VkQXQ6IGlucHV0LnB1cmNoYXNlZEF0IHx8IHRpbWVzdGFtcCxcbiAgICBtYXJrZXRpbmdDb25zZW50U291cmNlOiAnc2hvcGlmeScsXG4gICAgbWFya2V0aW5nT3B0SW46IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc2hvcGlmeUN1c3RvbWVySWRcbiAgfTtcbiAgY29uc3QgdXNlclF1ZXJ5ID0gYXFsYFxuICAgIExFVCBleGlzdGluZyA9IEZJUlNUKFxuICAgICAgRk9SIHVzZXIgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICAgICAgRklMVEVSIHVzZXIuc2hvcGlmeUN1c3RvbWVySWQgPT0gJHtzaG9waWZ5Q3VzdG9tZXJJZH0gfHwgdXNlci5lbWFpbCA9PSAke2VtYWlsfVxuICAgICAgICBMSU1JVCAxXG4gICAgICAgIFJFVFVSTiB1c2VyXG4gICAgKVxuICAgIExFVCB1c2VyS2V5ID0gZXhpc3RpbmcgPyBleGlzdGluZy5fa2V5IDogJHt1c2VyS2V5fVxuICAgIFVQU0VSVCB7X2tleTogdXNlcktleX1cbiAgICBJTlNFUlQgTUVSR0UoJHt1c2VySW5zZXJ0fSwge19rZXk6IHVzZXJLZXksIHVzZXJJZDogdXNlcktleX0pXG4gICAgVVBEQVRFICR7dXNlclVwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkodXNlclF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFVzZXJUeXBlO1xuICBjb25zdCByZXNvbHZlZFVzZXJLZXkgPSBkb2NLZXkoU3RyaW5nKHVzZXI/Ll9rZXkgfHwgdXNlcj8udXNlcklkIHx8IHVzZXJLZXkpKTtcbiAgY29uc3Qgb3JkZXJLZXkgPSBleHRlcm5hbEtleSgnc2hvcGlmeS1vcmRlcicsIHNob3BpZnlPcmRlcklkKTtcbiAgY29uc3Qgb3JkZXIgPSB7XG4gICAgX2tleTogb3JkZXJLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBjdXJyZW5jeTogY2xlYW5TdHJpbmcoaW5wdXQuY3VycmVuY3ksIDMpLnRvVXBwZXJDYXNlKCksXG4gICAgY3VzdG9tZXJPcmRlcklkOiBvcmRlcktleSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHByb2R1Y3RJZHMsXG4gICAgcHVyY2hhc2VkQXQ6IGlucHV0LnB1cmNoYXNlZEF0IHx8IHRpbWVzdGFtcCxcbiAgICBzaG9waWZ5Q3VzdG9tZXJJZCxcbiAgICBzaG9waWZ5T3JkZXJJZCxcbiAgICB0b3RhbFByaWNlOiBOdW1iZXIoaW5wdXQudG90YWxQcmljZSB8fCAwKSxcbiAgICB1c2VySWQ6IHJlc29sdmVkVXNlcktleVxuICB9O1xuICBjb25zdCBvcmRlclF1ZXJ5ID0gYXFsYFxuICAgIFVQU0VSVCB7X2tleTogJHtvcmRlcktleX19XG4gICAgSU5TRVJUICR7b3JkZXJ9XG4gICAgVVBEQVRFICR7e1xuICAgICAgY3VycmVuY3k6IG9yZGVyLmN1cnJlbmN5LFxuICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgIHByb2R1Y3RJZHMsXG4gICAgICBwdXJjaGFzZWRBdDogb3JkZXIucHVyY2hhc2VkQXQsXG4gICAgICB0b3RhbFByaWNlOiBvcmRlci50b3RhbFByaWNlLFxuICAgICAgdXNlcklkOiByZXNvbHZlZFVzZXJLZXlcbiAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1VTVE9NRVJfT1JERVJTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkT3JkZXIgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkob3JkZXJRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBDdXN0b21lck9yZGVyVHlwZTtcblxuICBhd2FpdCBzYXZlRWRnZShcbiAgICBjb250ZXh0LFxuICAgIEVER0VTLkhBU19DVVNUT01FUl9PUkRFUixcbiAgICBjcmVhdGVIYXNoKGBoYXNDdXN0b21lck9yZGVyLSR7cmVzb2x2ZWRVc2VyS2V5fS0ke29yZGVyS2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCByZXNvbHZlZFVzZXJLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLkNVU1RPTUVSX09SREVSUywgb3JkZXJLZXkpLFxuICAgIHtwdXJjaGFzZWRBdDogb3JkZXIucHVyY2hhc2VkQXQsIHNob3BpZnlDdXN0b21lcklkLCBzaG9waWZ5T3JkZXJJZH1cbiAgKTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9kdWN0SWRzLm1hcChhc3luYyAocHJvZHVjdElkKSA9PiB7XG4gICAgY29uc3QgcHJvZHVjdCA9IChpbnB1dC5wcm9kdWN0cyB8fCBbXSkuZmluZCgoaXRlbSkgPT4gaXRlbS5wcm9kdWN0SWQgPT09IHByb2R1Y3RJZCkgfHwge3Byb2R1Y3RJZH07XG4gICAgY29uc3QgcHJvZHVjdEtleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LXByb2R1Y3QnLCBwcm9kdWN0SWQpO1xuICAgIGNvbnN0IHByb2R1Y3REb2MgPSB7XG4gICAgICBfa2V5OiBwcm9kdWN0S2V5LFxuICAgICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICBwcm9kdWN0SWQsXG4gICAgICB0aXRsZTogY2xlYW5TdHJpbmcocHJvZHVjdC50aXRsZSwgMzIwKSxcbiAgICAgIHZhcmlhbnRJZDogY2xlYW5FeHRlcm5hbElkKHByb2R1Y3QudmFyaWFudElkLCAxNjApXG4gICAgfTtcbiAgICBjb25zdCBwcm9kdWN0UXVlcnkgPSBhcWxgXG4gICAgICBVUFNFUlQge19rZXk6ICR7cHJvZHVjdEtleX19XG4gICAgICBJTlNFUlQgJHtwcm9kdWN0RG9jfVxuICAgICAgVVBEQVRFICR7e1xuICAgICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgICB0aXRsZTogcHJvZHVjdERvYy50aXRsZSxcbiAgICAgICAgdmFyaWFudElkOiBwcm9kdWN0RG9jLnZhcmlhbnRJZFxuICAgICAgfX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNIT1BJRllfUFJPRFVDVFMpfVxuICAgIGA7XG4gICAgYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHByb2R1Y3RRdWVyeSk7XG4gICAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgICBjb250ZXh0LFxuICAgICAgRURHRVMuSEFTX1BVUkNIQVNFRF9QUk9EVUNULFxuICAgICAgY3JlYXRlSGFzaChgaGFzUHVyY2hhc2VkUHJvZHVjdC0ke29yZGVyS2V5fS0ke3Byb2R1Y3RLZXl9YCksXG4gICAgICBkb2NJZChDT0xMRUNUSU9OUy5DVVNUT01FUl9PUkRFUlMsIG9yZGVyS2V5KSxcbiAgICAgIGRvY0lkKENPTExFQ1RJT05TLlNIT1BJRllfUFJPRFVDVFMsIHByb2R1Y3RLZXkpLFxuICAgICAge3Byb2R1Y3RJZCwgcHVyY2hhc2VkQXQ6IG9yZGVyLnB1cmNoYXNlZEF0fVxuICAgICk7XG4gIH0pKTtcblxuICBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIFVQREFURSAke3Jlc29sdmVkVXNlcktleX1cbiAgICBXSVRIIHtcbiAgICAgIGxhc3RQdXJjaGFzZWRBdDogJHtvcmRlci5wdXJjaGFzZWRBdH0sXG4gICAgICB0b3RhbE9yZGVyQ291bnQ6IExFTkdUSChcbiAgICAgICAgRk9SIG9yZGVyIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgcmVzb2x2ZWRVc2VyS2V5KX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9PUkRFUil9XG4gICAgICAgICAgUkVUVVJOIG9yZGVyXG4gICAgICApLFxuICAgICAgdG90YWxTcGVuZDogU1VNKFxuICAgICAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCByZXNvbHZlZFVzZXJLZXkpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgICBSRVRVUk4gVE9fTlVNQkVSKG9yZGVyLnRvdGFsUHJpY2UpXG4gICAgICApXG4gICAgfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICBgKTtcblxuICByZXR1cm4gc2F2ZWRPcmRlcjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXN0b21lck9yZGVyc0J5VXNlciA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmdcbik6IFByb21pc2U8Q3VzdG9tZXJPcmRlclR5cGVbXT4gPT4ge1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VySWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgIFNPUlQgb3JkZXIucHVyY2hhc2VkQXQgREVTQ1xuICAgICAgUkVUVVJOIG9yZGVyXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuY29uc3Qgc2VuZFN1cHBvcnRUaWNrZXRFbWFpbCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGlja2V0OiBTdXBwb3J0VGlja2V0VHlwZURhdGEsXG4gIGRldGFpbHM6IHN0cmluZyxcbiAgaGVhZGluZzogc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgdXNlciA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgUkVUVVJOIERPQ1VNRU5UKCR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHRpY2tldC51c2VySWQpfSlcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBVc2VyVHlwZSB8IG51bGw7XG4gIGlmKCF1c2VyPy5lbWFpbCkgcmV0dXJuO1xuICBjb25zdCBzdXBwb3J0TmFtZSA9IGNvbnRleHQuY29uZmlnPy5kZXRhaWxzPy5zdXBwb3J0TmFtZSB8fCBDb25maWcuZ2V0KCdkZXRhaWxzLnN1cHBvcnROYW1lJykgfHwgJ1JlYWt0b3IgU3VwcG9ydCc7XG4gIGNvbnN0IHN1cHBvcnRFbWFpbCA9IGNvbnRleHQuY29uZmlnPy5kZXRhaWxzPy5zdXBwb3J0RW1haWwgfHwgQ29uZmlnLmdldCgnZGV0YWlscy5zdXBwb3J0RW1haWwnKSB8fCAnc3VwcG9ydEByZWFrdG9yLmlvJztcbiAgY29uc3QgdGlja2V0TnVtYmVyID0gU3RyaW5nKHRpY2tldC50aWNrZXROdW1iZXIgfHwgdGlja2V0LnN1cHBvcnRUaWNrZXRJZCB8fCB0aWNrZXQuX2tleSB8fCAnJyk7XG4gIGNvbnN0IHN0YXR1c1VybCA9IGBodHRwczovL2NybS5yZWFrdG9yLmlvL3N1cHBvcnQvc3RhdHVzP3RpY2tldD0ke2VuY29kZVVSSUNvbXBvbmVudCh0aWNrZXROdW1iZXIpfWA7XG4gIGNvbnN0IHRleHQgPSBgJHtoZWFkaW5nfVxcblxcblRpY2tldDogJHt0aWNrZXROdW1iZXJ9XFxuU3RhdHVzOiAke3RpY2tldC5zdGF0dXMgfHwgJ3N1Ym1pdHRlZCd9XFxuXFxuJHtkZXRhaWxzfVxcblxcblRyYWNrIHRoaXMgdGlja2V0OiAke3N0YXR1c1VybH1gO1xuICBhd2FpdCBzZXNTZW5kKHtcbiAgICBEZXN0aW5hdGlvbjoge1RvQWRkcmVzc2VzOiBbU3RyaW5nKHVzZXIuZW1haWwpXX0sXG4gICAgTWVzc2FnZToge1xuICAgICAgQm9keToge0h0bWw6IHtEYXRhOiBgPGgxPiR7ZXNjYXBlSHRtbChoZWFkaW5nKX08L2gxPjxwPjxzdHJvbmc+VGlja2V0Ojwvc3Ryb25nPiAke2VzY2FwZUh0bWwodGlja2V0TnVtYmVyKX08L3A+PHA+PHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChTdHJpbmcodGlja2V0LnN0YXR1cyB8fCAnc3VibWl0dGVkJykpfTwvcD48cHJlIHN0eWxlPVwid2hpdGUtc3BhY2U6cHJlLXdyYXA7Zm9udC1mYW1pbHk6aW5oZXJpdFwiPiR7ZXNjYXBlSHRtbChkZXRhaWxzKX08L3ByZT48cD48YSBocmVmPVwiJHtlc2NhcGVIdG1sKHN0YXR1c1VybCl9XCI+VHJhY2sgdGhpcyB0aWNrZXQgb25saW5lPC9hPjwvcD5gfSwgVGV4dDoge0RhdGE6IHRleHR9fSxcbiAgICAgIFN1YmplY3Q6IHtEYXRhOiBgWyR7dGlja2V0TnVtYmVyfV0gJHtoZWFkaW5nfWB9XG4gICAgfSxcbiAgICBTb3VyY2U6IGBcIiR7c3VwcG9ydE5hbWV9XCIgPCR7c3VwcG9ydEVtYWlsfT5gXG4gIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlU3VwcG9ydFRpY2tldCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8U3VwcG9ydFRpY2tldFR5cGVEYXRhPlxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnVzZXJJZCB8fCAnJykpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IHRpY2tldE51bWJlciA9IGNsZWFuU3RyaW5nKGlucHV0LnRpY2tldE51bWJlciwgODApIHx8IGBSS1QtJHtuZXcgRGF0ZSh0aW1lc3RhbXApLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApLnJlcGxhY2UoLy0vZywgJycpfS0ke3RpY2tldEtleS5zbGljZSgwLCA4KS50b1VwcGVyQ2FzZSgpfWA7XG4gIGNvbnN0IHRpY2tldCA9IHtcbiAgICBfa2V5OiB0aWNrZXRLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBhc3NpZ25lZFRvVXNlcklkOiBkb2NLZXkoU3RyaW5nKGlucHV0LmFzc2lnbmVkVG9Vc2VySWQgfHwgJycpKSxcbiAgICBkZXNjcmlwdGlvbjogY2xlYW5TdHJpbmcoaW5wdXQuZGVzY3JpcHRpb24sIDQwMDApLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcHJpb3JpdHk6IGlucHV0LnByaW9yaXR5IHx8ICdub3JtYWwnLFxuICAgIHByb2R1Y3RJZDogY2xlYW5FeHRlcm5hbElkKGlucHV0LnByb2R1Y3RJZCwgMzIwKSxcbiAgICBzaG9waWZ5T3JkZXJJZDogY2xlYW5TdHJpbmcoaW5wdXQuc2hvcGlmeU9yZGVySWQsIDE2MCksXG4gICAgc3RhdHVzOiAnc3VibWl0dGVkJyxcbiAgICBzdWJqZWN0OiBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApLFxuICAgIHN1cHBvcnRUaWNrZXRJZDogdGlja2V0S2V5LFxuICAgIHRpY2tldE51bWJlcixcbiAgICB0eXBlOiBpbnB1dC50eXBlIHx8ICdnZW5lcmFsX3N1cHBvcnQnLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHt0aWNrZXR9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRUaWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVQsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldC0ke3VzZXJLZXl9LSR7dGlja2V0S2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAge3ByaW9yaXR5OiB0aWNrZXQucHJpb3JpdHksIHN0YXR1czogdGlja2V0LnN0YXR1cywgdHlwZTogdGlja2V0LnR5cGV9XG4gICk7XG4gIGF3YWl0IGFkZFN1cHBvcnRUaWNrZXRFdmVudChjb250ZXh0LCB7XG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8IHVzZXJLZXkpKSxcbiAgICBldmVudFR5cGU6ICdzdWJtaXR0ZWQnLFxuICAgIG1ldGFkYXRhOiB7ZGV0YWlsczogdGlja2V0LmRlc2NyaXB0aW9ufSxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0b1ZhbHVlOiB0aWNrZXQuc3RhdHVzXG4gIH0pO1xuXG4gIHJldHVybiBzYXZlZFRpY2tldDtcbn07XG5cbmV4cG9ydCBjb25zdCBzdWJtaXRQdWJsaWNTdXBwb3J0VGlja2V0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogUHVibGljU3VwcG9ydFRpY2tldElucHV0XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRUeXBlRGF0YT4gPT4ge1xuICBjb25zdCBlbWFpbCA9IGNsZWFuU3RyaW5nKGlucHV0LmVtYWlsLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGRlc2NyaXB0aW9uID0gY2xlYW5TdHJpbmcoaW5wdXQuZGVzY3JpcHRpb24sIDQwMDApO1xuICBjb25zdCBzdWJqZWN0ID0gY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKTtcbiAgaWYoIWVtYWlsUGF0dGVybi50ZXN0KGVtYWlsKSkgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF92YWxpZF9lbWFpbCcpO1xuICBpZighc3ViamVjdCkgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9zdWJqZWN0Jyk7XG4gIGlmKCFkZXNjcmlwdGlvbikgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9kZXNjcmlwdGlvbicpO1xuXG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTLFxuICAgIENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX01FU1NBR0VTLFxuICAgIENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyxcbiAgICBDT0xMRUNUSU9OUy5VU0VSU1xuICBdLm1hcCgobmFtZSkgPT4gZW5zdXJlRG9jdW1lbnRDb2xsZWN0aW9uKGRhdGFiYXNlLCBuYW1lKSkpO1xuICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VULFxuICAgIEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVF9FVkVOVCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRVxuICBdLm1hcCgobmFtZSkgPT4gZW5zdXJlRWRnZUNvbGxlY3Rpb24oZGF0YWJhc2UsIG5hbWUpKSk7XG5cbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IGdlbmVyYXRlZFVzZXJLZXkgPSBjcmVhdGVIYXNoKGVtYWlsLCBudWxsKTtcbiAgY29uc3Qgb3B0ZWRJbiA9IGlucHV0Lm1hcmtldGluZ09wdEluID09PSB0cnVlO1xuICBjb25zdCB1c2VySW5zZXJ0ID0ge1xuICAgIF9rZXk6IGdlbmVyYXRlZFVzZXJLZXksXG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGVtYWlsLFxuICAgIGZpcnN0TmFtZTogY2xlYW5TdHJpbmcoaW5wdXQuZmlyc3ROYW1lLCAxNjApLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhpbnB1dC5sYXN0TmFtZSwgMTYwKSxcbiAgICBtYWlsaW5nTGlzdDogb3B0ZWRJbixcbiAgICBtYXJrZXRpbmdPcHRJbjogb3B0ZWRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHVzZXJJZDogZ2VuZXJhdGVkVXNlcktleVxuICB9O1xuICBjb25zdCB1c2VyVXBkYXRlID0ge1xuICAgIC4uLihvcHRlZEluID8ge21haWxpbmdMaXN0OiB0cnVlLCBtYXJrZXRpbmdPcHRJbjogdHJ1ZSwgbWFya2V0aW5nT3B0SW5BdDogdGltZXN0YW1wfSA6IHt9KSxcbiAgICBmaXJzdE5hbWU6IGNsZWFuU3RyaW5nKGlucHV0LmZpcnN0TmFtZSwgMTYwKSB8fCB1bmRlZmluZWQsXG4gICAgbGFzdE5hbWU6IGNsZWFuU3RyaW5nKGlucHV0Lmxhc3ROYW1lLCAxNjApIHx8IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wXG4gIH07XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgVVBTRVJUIHtlbWFpbDogJHtlbWFpbH19XG4gICAgICBJTlNFUlQgJHt1c2VySW5zZXJ0fVxuICAgICAgVVBEQVRFICR7dXNlclVwZGF0ZX1cbiAgICAgIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICBSRVRVUk4gTkVXXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGU7XG4gIGNvbnN0IHRpY2tldCA9IGF3YWl0IGNyZWF0ZVN1cHBvcnRUaWNrZXQoY29udGV4dCwge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIHByaW9yaXR5OiBzdXBwb3J0UHJpb3JpdGllcy5oYXMoU3RyaW5nKGlucHV0LnByaW9yaXR5KSkgPyBpbnB1dC5wcmlvcml0eSA6ICdub3JtYWwnLFxuICAgIHN1YmplY3QsXG4gICAgdHlwZTogc3VwcG9ydFR5cGVzLmhhcyhTdHJpbmcoaW5wdXQudHlwZSkpID8gaW5wdXQudHlwZSA6ICdnZW5lcmFsX3N1cHBvcnQnLFxuICAgIHVzZXJJZDogU3RyaW5nKHVzZXI/Ll9rZXkgfHwgdXNlcj8udXNlcklkIHx8IGdlbmVyYXRlZFVzZXJLZXkpXG4gIH0pO1xuICBhd2FpdCBzZW5kU3VwcG9ydFRpY2tldEVtYWlsKGNvbnRleHQsIHRpY2tldCwgZGVzY3JpcHRpb24sICdXZSByZWNlaXZlZCB5b3VyIHN1cHBvcnQgdGlja2V0Jyk7XG4gIHJldHVybiB0aWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UHVibGljU3VwcG9ydFRpY2tldCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGlja2V0TnVtYmVyOiBzdHJpbmcsXG4gIGVtYWlsQWRkcmVzczogc3RyaW5nXG4pOiBQcm9taXNlPFB1YmxpY1N1cHBvcnRUaWNrZXRGZWVkIHwgbnVsbD4gPT4ge1xuICBjb25zdCBlbWFpbCA9IGNsZWFuU3RyaW5nKGVtYWlsQWRkcmVzcywgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBudW1iZXIgPSBjbGVhblN0cmluZyh0aWNrZXROdW1iZXIsIDgwKS50b1VwcGVyQ2FzZSgpO1xuICBpZighZW1haWxQYXR0ZXJuLnRlc3QoZW1haWwpIHx8ICFudW1iZXIpIHJldHVybiBudWxsO1xuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgaWYoIWF3YWl0IGRhdGFiYXNlLmNvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKS5leGlzdHMoKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgRk9SIHRpY2tldCBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKX1cbiAgICAgIEZJTFRFUiBVUFBFUih0aWNrZXQudGlja2V0TnVtYmVyKSA9PSAke251bWJlcn1cbiAgICAgIExFVCB1c2VyID0gRE9DVU1FTlQoJHtDT0xMRUNUSU9OUy5VU0VSU30sIHRpY2tldC51c2VySWQpXG4gICAgICBGSUxURVIgTE9XRVIodXNlci5lbWFpbCkgPT0gJHtlbWFpbH1cbiAgICAgIExFVCBtZXNzYWdlcyA9IChcbiAgICAgICAgRk9SIG1lc3NhZ2UgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX01FU1NBR0VTKX1cbiAgICAgICAgICBGSUxURVIgbWVzc2FnZS5zdXBwb3J0VGlja2V0SWQgPT0gdGlja2V0Ll9rZXkgQU5EIG1lc3NhZ2UudmlzaWJpbGl0eSA9PSBcImN1c3RvbWVyXCJcbiAgICAgICAgICBTT1JUIG1lc3NhZ2UuYWRkZWQgQVNDXG4gICAgICAgICAgUkVUVVJOIG1lc3NhZ2VcbiAgICAgIClcbiAgICAgIExFVCBldmVudHMgPSAoXG4gICAgICAgIEZPUiBldmVudCBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTKX1cbiAgICAgICAgICBGSUxURVIgZXZlbnQuc3VwcG9ydFRpY2tldElkID09IHRpY2tldC5fa2V5XG4gICAgICAgICAgU09SVCBldmVudC5hZGRlZCBBU0NcbiAgICAgICAgICBSRVRVUk4gZXZlbnRcbiAgICAgIClcbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiB7dGlja2V0LCBtZXNzYWdlcywgZXZlbnRzfVxuICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFByb21pc2U8UHVibGljU3VwcG9ydFRpY2tldEZlZWQgfCBudWxsPjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgZmlsdGVyczoge3JlYWRvbmx5IHN0YXR1cz86IHN0cmluZzsgcmVhZG9ubHkgdXNlcklkPzogc3RyaW5nfSA9IHt9XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRUeXBlRGF0YVtdPiA9PiB7XG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpO1xuICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICBpZighYXdhaXQgZGF0YWJhc2UuY29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpLmV4aXN0cygpKSByZXR1cm4gW107XG4gICAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgICBGT1IgdGlja2V0IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMpfVxuICAgICAgICAke2ZpbHRlcnMuc3RhdHVzID8gYXFsYEZJTFRFUiB0aWNrZXQuc3RhdHVzID09ICR7ZmlsdGVycy5zdGF0dXN9YCA6IGFxbGBgfVxuICAgICAgICAke2ZpbHRlcnMudXNlcklkID8gYXFsYEZJTFRFUiB0aWNrZXQudXNlcklkID09ICR7ZG9jS2V5KGZpbHRlcnMudXNlcklkKX1gIDogYXFsYGB9XG4gICAgICAgIExFVCB1c2VyID0gRE9DVU1FTlQoJHtDT0xMRUNUSU9OUy5VU0VSU30sIHRpY2tldC51c2VySWQpXG4gICAgICAgIFNPUlQgdGlja2V0LmFkZGVkIERFU0NcbiAgICAgICAgUkVUVVJOIE1FUkdFKHRpY2tldCwge3VzZXJ9KVxuICAgIGA7XG4gICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG4gIH0pKCk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmcsXG4gIHN0YXR1czogU3VwcG9ydFRpY2tldFN0YXR1cyxcbiAgcmVzb2x1dGlvblN1bW1hcnkgPSAnJ1xuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgdGlja2V0S2V5ID0gZG9jS2V5KHN1cHBvcnRUaWNrZXRJZCk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKVxuICAgIC5xdWVyeShhcWxgUkVUVVJOIERPQ1VNRU5UKCR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCB0aWNrZXRLZXkpfSlgKVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFN1cHBvcnRUaWNrZXRUeXBlRGF0YSB8IG51bGw7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAuLi4oc3RhdHVzID09PSAnY29tcGxldGVkJyAmJiB7Y29tcGxldGVkQXQ6IHRpbWVzdGFtcCwgcmVzb2x1dGlvblN1bW1hcnk6IGNsZWFuU3RyaW5nKHJlc29sdXRpb25TdW1tYXJ5LCA0MDAwKX0pLFxuICAgIC4uLihzdGF0dXMgPT09ICdkb25lJyAmJiB7ZG9uZUF0OiB0aW1lc3RhbXAsIHJlc29sdXRpb25TdW1tYXJ5OiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCl9KSxcbiAgICAuLi4oc3RhdHVzID09PSAncmVzb2x2ZWQnICYmIHtyZXNvbHZlZEF0OiB0aW1lc3RhbXAsIHJlc29sdXRpb25TdW1tYXJ5OiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCl9KSxcbiAgICAuLi4oc3RhdHVzID09PSAnY2xvc2VkJyAmJiB7Y2xvc2VkQXQ6IHRpbWVzdGFtcH0pLFxuICAgIGxhc3RVcGRhdGVEZXRhaWxzOiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdGF0dXNcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgVVBEQVRFICR7dGlja2V0S2V5fSBXSVRIICR7dXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHRpY2tldCA9IGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBTdXBwb3J0VGlja2V0VHlwZURhdGE7XG5cbiAgYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbGBcbiAgICBGT1IgZWRnZSBJTiAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUKX1cbiAgICAgIEZJTFRFUiBlZGdlLl90byA9PSAke2RvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgdGlja2V0S2V5KX1cbiAgICAgIFVQREFURSBlZGdlIFdJVEggJHt7XG4gICAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICAgIHJlc29sdmVkQXQ6IHN0YXR1cyA9PT0gJ3Jlc29sdmVkJyA/IHRpbWVzdGFtcCA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzXG4gICAgICB9fSBJTiAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUKX1cbiAgYCk7XG4gIGF3YWl0IGFkZFN1cHBvcnRUaWNrZXRFdmVudChjb250ZXh0LCB7XG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgZXZlbnRUeXBlOiAnc3RhdHVzX2NoYW5nZWQnLFxuICAgIGZyb21WYWx1ZTogcHJldmlvdXM/LnN0YXR1cyxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0b1ZhbHVlOiBzdGF0dXNcbiAgfSk7XG5cbiAgaWYoc3RhdHVzID09PSAncmVzb2x2ZWQnKSB7XG4gICAgYXdhaXQgY3JlYXRlQ3VzdG9tZXJOb3RpZmljYXRpb24oY29udGV4dCwge1xuICAgICAgYm9keTogY2xlYW5TdHJpbmcocmVzb2x1dGlvblN1bW1hcnkgfHwgJ1lvdXIgc3VwcG9ydCB0aWNrZXQgaGFzIGJlZW4gcmVzb2x2ZWQuJywgNDAwMCksXG4gICAgICBzdGF0dXM6ICdxdWV1ZWQnLFxuICAgICAgc3ViamVjdDogYFJlc29sdmVkOiAke3RpY2tldC5zdWJqZWN0IHx8ICdTdXBwb3J0IHRpY2tldCd9YCxcbiAgICAgIHN1cHBvcnRUaWNrZXRJZDogdGlja2V0S2V5LFxuICAgICAgdHlwZTogJ3N1cHBvcnRfdGlja2V0X3Jlc29sdmVkJyxcbiAgICAgIHVzZXJJZDogdGlja2V0LnVzZXJJZFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRpY2tldDtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVTdXBwb3J0VGlja2V0UHJvZ3Jlc3MgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nLFxuICBzdGF0dXM6IFN1cHBvcnRUaWNrZXRTdGF0dXMsXG4gIGRldGFpbHM6IHN0cmluZ1xuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgcmVxdWlyZUNybUFkbWluKGNvbnRleHQpO1xuICBpZighc3VwcG9ydFN0YXR1c2VzLmhhcyhzdGF0dXMpKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWRfc3VwcG9ydF90aWNrZXRfc3RhdHVzJyk7XG4gIGNvbnN0IG1hcmtkb3duID0gY2xlYW5TdHJpbmcoZGV0YWlscywgNDAwMCk7XG4gIGlmKCFtYXJrZG93bikgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF91cGRhdGVfZGV0YWlscycpO1xuICBjb25zdCB0aWNrZXQgPSBhd2FpdCB1cGRhdGVTdXBwb3J0VGlja2V0U3RhdHVzKGNvbnRleHQsIHN1cHBvcnRUaWNrZXRJZCwgc3RhdHVzLCBtYXJrZG93bik7XG4gIGF3YWl0IGFkZFN1cHBvcnRUaWNrZXRNZXNzYWdlKGNvbnRleHQsIHtcbiAgICBhdXRob3JVc2VySWQ6IFN0cmluZyhjb250ZXh0LnNlc3Npb24/LnVzZXJJZCB8fCAnJyksXG4gICAgYm9keTogbWFya2Rvd24sXG4gICAgc3VwcG9ydFRpY2tldElkLFxuICAgIHZpc2liaWxpdHk6ICdjdXN0b21lcidcbiAgfSk7XG4gIGF3YWl0IGNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uKGNvbnRleHQsIHtcbiAgICBib2R5OiBtYXJrZG93bixcbiAgICBzdGF0dXM6ICdzZW50JyxcbiAgICBzdWJqZWN0OiBgVGlja2V0ICR7dGlja2V0LnRpY2tldE51bWJlciB8fCBzdXBwb3J0VGlja2V0SWR9OiAke3N0YXR1cy5yZXBsYWNlKC9fL2csICcgJyl9YCxcbiAgICBzdXBwb3J0VGlja2V0SWQsXG4gICAgdHlwZTogJ3N1cHBvcnRfdGlja2V0X3Byb2dyZXNzJyxcbiAgICB1c2VySWQ6IHRpY2tldC51c2VySWRcbiAgfSk7XG4gIGF3YWl0IHNlbmRTdXBwb3J0VGlja2V0RW1haWwoY29udGV4dCwgdGlja2V0LCBtYXJrZG93biwgYFN1cHBvcnQgdGlja2V0ICR7c3RhdHVzLnJlcGxhY2UoL18vZywgJyAnKX1gKTtcbiAgcmV0dXJuIHRpY2tldDtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRTdXBwb3J0VGlja2V0TWVzc2FnZSA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8U3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlPlxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0TWVzc2FnZVR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldElkIHx8ICcnKSk7XG4gIGNvbnN0IG1lc3NhZ2VLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRNZXNzYWdlSWQgfHwgY3JlYXRlSGFzaChgc3VwcG9ydC10aWNrZXQtbWVzc2FnZS0ke3RpY2tldEtleX0tJHt0aW1lc3RhbXB9YCkpKTtcbiAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICBfa2V5OiBtZXNzYWdlS2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgYXV0aG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGlucHV0LmF1dGhvclVzZXJJZCB8fCBjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSxcbiAgICBib2R5OiBjbGVhblN0cmluZyhpbnB1dC5ib2R5LCA0MDAwKSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHN1cHBvcnRUaWNrZXRJZDogdGlja2V0S2V5LFxuICAgIHN1cHBvcnRUaWNrZXRNZXNzYWdlSWQ6IG1lc3NhZ2VLZXksXG4gICAgdmlzaWJpbGl0eTogaW5wdXQudmlzaWJpbGl0eSB8fCAnY3VzdG9tZXInXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIElOU0VSVCAke21lc3NhZ2V9IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZE1lc3NhZ2UgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRSxcbiAgICBjcmVhdGVIYXNoKGBoYXNTdXBwb3J0VGlja2V0TWVzc2FnZS0ke3RpY2tldEtleX0tJHttZXNzYWdlS2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgdGlja2V0S2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUywgbWVzc2FnZUtleSksXG4gICAge2F1dGhvclVzZXJJZDogbWVzc2FnZS5hdXRob3JVc2VySWQsIHZpc2liaWxpdHk6IG1lc3NhZ2UudmlzaWJpbGl0eX1cbiAgKTtcblxuICByZXR1cm4gc2F2ZWRNZXNzYWdlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFN1cHBvcnRUaWNrZXRNZXNzYWdlcyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmdcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlW10+ID0+IHtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIG1lc3NhZ2UgSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgc3VwcG9ydFRpY2tldElkKX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFKX1cbiAgICAgIFNPUlQgbWVzc2FnZS5hZGRlZCBBU0NcbiAgICAgIFJFVFVSTiBtZXNzYWdlXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFN1cHBvcnRUaWNrZXRFdmVudCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8U3VwcG9ydFRpY2tldEV2ZW50VHlwZT5cbik6IFByb21pc2U8U3VwcG9ydFRpY2tldEV2ZW50VHlwZT4gPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgdGlja2V0S2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0SWQgfHwgJycpKTtcbiAgY29uc3QgZXZlbnRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRFdmVudElkIHx8IGNyZWF0ZUhhc2goYHN1cHBvcnQtdGlja2V0LWV2ZW50LSR7dGlja2V0S2V5fS0ke3RpbWVzdGFtcH0tJHtpbnB1dC5ldmVudFR5cGV9YCkpKTtcbiAgY29uc3QgZXZlbnQgPSB7XG4gICAgX2tleTogZXZlbnRLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBhY3RvclVzZXJJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5hY3RvclVzZXJJZCB8fCAnJykpLFxuICAgIGV2ZW50VHlwZTogY2xlYW5TdHJpbmcoaW5wdXQuZXZlbnRUeXBlLCAxNjApLFxuICAgIGZyb21WYWx1ZTogY2xlYW5TdHJpbmcoaW5wdXQuZnJvbVZhbHVlLCAzMjApLFxuICAgIG1ldGFkYXRhOiBpbnB1dC5tZXRhZGF0YSB8fCB7fSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHN1cHBvcnRUaWNrZXRFdmVudElkOiBldmVudEtleSxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0b1ZhbHVlOiBjbGVhblN0cmluZyhpbnB1dC50b1ZhbHVlLCAzMjApXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIElOU0VSVCAke2V2ZW50fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkRXZlbnQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfRVZFTlQsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldEV2ZW50LSR7dGlja2V0S2V5fS0ke2V2ZW50S2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgdGlja2V0S2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9FVkVOVFMsIGV2ZW50S2V5KSxcbiAgICB7YWN0b3JVc2VySWQ6IGV2ZW50LmFjdG9yVXNlcklkLCBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZX1cbiAgKTtcblxuICByZXR1cm4gc2F2ZWRFdmVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0RXZlbnRzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBzdXBwb3J0VGlja2V0SWQ6IHN0cmluZ1xuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0RXZlbnRUeXBlW10+ID0+IHtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIGV2ZW50IElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHN1cHBvcnRUaWNrZXRJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfRVZFTlQpfVxuICAgICAgU09SVCBldmVudC5hZGRlZCBBU0NcbiAgICAgIFJFVFVSTiBldmVudFxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVDdXN0b21lck5vdGlmaWNhdGlvbiA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFBhcnRpYWw8Q3VzdG9tZXJOb3RpZmljYXRpb25UeXBlPlxuKTogUHJvbWlzZTxDdXN0b21lck5vdGlmaWNhdGlvblR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnVzZXJJZCB8fCAnJykpO1xuICBjb25zdCBub3RpZmljYXRpb25LZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LmN1c3RvbWVyTm90aWZpY2F0aW9uSWQgfHwgY3JlYXRlSGFzaChgY3VzdG9tZXItbm90aWZpY2F0aW9uLSR7dXNlcktleX0tJHt0aW1lc3RhbXB9YCkpKTtcbiAgY29uc3Qgbm90aWZpY2F0aW9uID0ge1xuICAgIF9rZXk6IG5vdGlmaWNhdGlvbktleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGJvZHk6IGNsZWFuU3RyaW5nKGlucHV0LmJvZHksIDQwMDApLFxuICAgIGN1c3RvbWVyTm90aWZpY2F0aW9uSWQ6IG5vdGlmaWNhdGlvbktleSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHNlbnRBdDogaW5wdXQuc2VudEF0LFxuICAgIHN0YXR1czogaW5wdXQuc3RhdHVzIHx8ICdxdWV1ZWQnLFxuICAgIHN1YmplY3Q6IGNsZWFuU3RyaW5nKGlucHV0LnN1YmplY3QsIDMyMCksXG4gICAgc3VwcG9ydFRpY2tldElkOiBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCAnJykpLFxuICAgIHR5cGU6IGNsZWFuU3RyaW5nKGlucHV0LnR5cGUsIDE2MCksXG4gICAgdXNlcklkOiB1c2VyS2V5XG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIElOU0VSVCAke25vdGlmaWNhdGlvbn0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNVU1RPTUVSX05PVElGSUNBVElPTlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWROb3RpZmljYXRpb24gPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfQ1VTVE9NRVJfTk9USUZJQ0FUSU9OLFxuICAgIGNyZWF0ZUhhc2goYGhhc0N1c3RvbWVyTm90aWZpY2F0aW9uLSR7dXNlcktleX0tJHtub3RpZmljYXRpb25LZXl9YCksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLkNVU1RPTUVSX05PVElGSUNBVElPTlMsIG5vdGlmaWNhdGlvbktleSksXG4gICAge1xuICAgICAgc3RhdHVzOiBub3RpZmljYXRpb24uc3RhdHVzLFxuICAgICAgc3VwcG9ydFRpY2tldElkOiBub3RpZmljYXRpb24uc3VwcG9ydFRpY2tldElkLFxuICAgICAgdHlwZTogbm90aWZpY2F0aW9uLnR5cGVcbiAgICB9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkTm90aWZpY2F0aW9uO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1c3RvbWVyTm90aWZpY2F0aW9uc0J5VXNlciA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdXNlcklkOiBzdHJpbmdcbik6IFByb21pc2U8Q3VzdG9tZXJOb3RpZmljYXRpb25UeXBlW10+ID0+IHtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIG5vdGlmaWNhdGlvbiBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfTk9USUZJQ0FUSU9OKX1cbiAgICAgIFNPUlQgbm90aWZpY2F0aW9uLmFkZGVkIERFU0NcbiAgICAgIFJFVFVSTiBub3RpZmljYXRpb25cbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuIl0sIm5hbWVzIjpbImNyZWF0ZUhhc2giLCJwYXJzZUlkIiwicGFyc2VQaG9uZSIsInBhcnNlU3RyaW5nIiwiYXFsIiwibGl0ZXJhbCIsIkNPTExFQ1RJT05TIiwiRURHRVMiLCJDb25maWciLCJ1c2VEYiIsImlzQWRtaW5Vc2VyIiwic2VzU2VuZCIsIm5vdyIsIkRhdGUiLCJjb2xsZWN0aW9uIiwibmFtZSIsImRvY0tleSIsInZhbHVlIiwiU3RyaW5nIiwiZG9jSWQiLCJjb2xsZWN0aW9uTmFtZSIsImtleSIsImV4dGVybmFsS2V5IiwicHJlZml4IiwiaWQiLCJjbGVhblN0cmluZyIsImxlbmd0aCIsImNsZWFuRXh0ZXJuYWxJZCIsInRyaW0iLCJzbGljZSIsImVuc3VyZURvY3VtZW50Q29sbGVjdGlvbiIsImRhdGFiYXNlIiwidGFyZ2V0IiwiZXhpc3RzIiwiY3JlYXRlQ29sbGVjdGlvbiIsImVycm9yIiwiZW5zdXJlRWRnZUNvbGxlY3Rpb24iLCJjcmVhdGVFZGdlQ29sbGVjdGlvbiIsInJlcXVpcmVDcm1BZG1pbiIsImNvbnRleHQiLCJzZXNzaW9uIiwiRXJyb3IiLCJyZXF1aXJlQ3JtQWRtaW5pc3RyYXRvciIsImFsbG93ZWRDb250YWN0RmllbGRzIiwiU2V0Iiwic3VwcG9ydFByaW9yaXRpZXMiLCJzdXBwb3J0U3RhdHVzZXMiLCJzdXBwb3J0VHlwZXMiLCJlbWFpbFBhdHRlcm4iLCJlc2NhcGVIdG1sIiwicmVwbGFjZSIsInNhbml0aXplSHRtbCIsInNhbml0aXplQ3NzIiwiaHRtbFRvVGV4dCIsImNodW5rIiwiaXRlbXMiLCJzaXplIiwiZ3JvdXBzIiwiaW5kZXgiLCJwdXNoIiwic3VibWl0Q3JtRm9ybSIsImlucHV0IiwibWFya2V0aW5nT3B0SW4iLCJlbWFpbCIsInRvTG93ZXJDYXNlIiwicmF3UGhvbmUiLCJwaG9uZSIsImRhdGFiYXNlTmFtZSIsIkNSTV9GT1JNX1NVQk1JU1NJT05TIiwidGltZXN0YW1wIiwic291cmNlIiwiZm9ybUlkIiwidmFsdWVzIiwiZmlyc3ROYW1lIiwibGFzdE5hbWUiLCJnZW5lcmF0ZWRVc2VyS2V5IiwiY29uc2VudCIsIm1hcmtldGluZ09wdEluQXQiLCJtYXJrZXRpbmdPcHRPdXRBdCIsInVzZXJJbnNlcnQiLCJfa2V5IiwiYWN0aXZlIiwiYWRkZWQiLCJtYWlsaW5nTGlzdCIsIm1hcmtldGluZ0NvbnNlbnRTb3VyY2UiLCJtb2RpZmllZCIsInR5cGUiLCJ1c2VyQWNjZXNzIiwidXNlcklkIiwidmVyaWZpZWRFbWFpbCIsInZlcmlmaWVkUGhvbmUiLCJ1c2VyVXBkYXRlIiwidXNlciIsInF1ZXJ5IiwiVVNFUlMiLCJ0aGVuIiwiY3Vyc29yIiwibmV4dCIsInN1Ym1pc3Npb25JZCIsInN1Ym1pc3Npb24iLCJzYXZlZCIsImdldENybUZvcm1TdWJtaXNzaW9ucyIsImFsbCIsImdldENybUNvbnRhY3RzIiwiZmlsdGVyIiwic2VhcmNoIiwiZmllbGQiLCJoYXMiLCJvcHRlZEluT25seSIsIm9wZXJhdG9yIiwiaW5jbHVkZXMiLCJzZW5kQ3JtQ2FtcGFpZ24iLCJzdWJqZWN0IiwiYm9keUh0bWwiLCJodG1sIiwiY3NzIiwiY2FuZGlkYXRlcyIsInNlbGVjdGVkSWRzIiwidXNlcklkcyIsIm1hcCIsInJlY2lwaWVudHMiLCJCb29sZWFuIiwiY2FtcGFpZ25JZCIsImNhbXBhaWduIiwiZmFpbGVkQ291bnQiLCJyZWNpcGllbnRDb3VudCIsInNlbnRDb3VudCIsInN0YXR1cyIsIkNSTV9DQU1QQUlHTlMiLCJyZWNpcGllbnRzQmF0Y2giLCJEZXN0aW5hdGlvbiIsIkJjY0FkZHJlc3NlcyIsInJlY2lwaWVudCIsIk1lc3NhZ2UiLCJCb2R5IiwiSHRtbCIsIkRhdGEiLCJUZXh0IiwiU3ViamVjdCIsIlNvdXJjZSIsImNvbmZpZyIsImRldGFpbHMiLCJzdXBwb3J0TmFtZSIsInN1cHBvcnRFbWFpbCIsIl9lcnJvciIsInJlc3VsdCIsInNlbnRBdCIsInNhdmVFZGdlIiwiZWRnZUNvbGxlY3Rpb24iLCJlZGdlS2V5IiwiZnJvbSIsInRvIiwiZGF0YSIsImVkZ2UiLCJfZnJvbSIsIl90byIsImNyZWF0ZU1haWxpbmdMaXN0IiwibWFpbGluZ0xpc3RJZCIsImNyZWF0ZWRCeVVzZXJJZCIsImRlc2NyaXB0aW9uIiwiTUFJTElOR19MSVNUUyIsImdldE1haWxpbmdMaXN0cyIsImFkZFVzZXJUb01haWxpbmdMaXN0IiwidXNlcktleSIsImxpc3RLZXkiLCJIQVNfTUFJTElOR19MSVNUIiwiYWRkZWRCeVVzZXJJZCIsInJlbW92ZVVzZXJGcm9tTWFpbGluZ0xpc3QiLCJ1cGRhdGUiLCJyZW1vdmVkQXQiLCJnZXRNYWlsaW5nTGlzdFVzZXJzIiwibGlzdElkIiwiZ2V0VXNlcnNCeVB1cmNoYXNlZFByb2R1Y3QiLCJwcm9kdWN0SWQiLCJwcm9kdWN0S2V5IiwiU0hPUElGWV9QUk9EVUNUUyIsIkhBU19QVVJDSEFTRURfUFJPRFVDVCIsIkhBU19DVVNUT01FUl9PUkRFUiIsImdldEVsaWdpYmxlTWFpbGluZ1VzZXJzIiwib3B0aW9ucyIsImV4Y2x1ZGVPcGVuU3VwcG9ydFRpY2tldHMiLCJIQVNfU1VQUE9SVF9USUNLRVQiLCJpbmdlc3RTaG9waWZ5Q3VzdG9tZXJPcmRlciIsInNob3BpZnlDdXN0b21lcklkIiwic2hvcGlmeU9yZGVySWQiLCJjdXN0b21lciIsInByb2R1Y3RJZHMiLCJBcnJheSIsInByb2R1Y3RzIiwicHJvZHVjdCIsInVuZGVmaW5lZCIsImxhc3RQdXJjaGFzZWRBdCIsInB1cmNoYXNlZEF0IiwidXNlclF1ZXJ5IiwicmVzb2x2ZWRVc2VyS2V5Iiwib3JkZXJLZXkiLCJvcmRlciIsImN1cnJlbmN5IiwidG9VcHBlckNhc2UiLCJjdXN0b21lck9yZGVySWQiLCJ0b3RhbFByaWNlIiwiTnVtYmVyIiwib3JkZXJRdWVyeSIsIkNVU1RPTUVSX09SREVSUyIsInNhdmVkT3JkZXIiLCJQcm9taXNlIiwiZmluZCIsIml0ZW0iLCJwcm9kdWN0RG9jIiwidGl0bGUiLCJ2YXJpYW50SWQiLCJwcm9kdWN0UXVlcnkiLCJnZXRDdXN0b21lck9yZGVyc0J5VXNlciIsInNlbmRTdXBwb3J0VGlja2V0RW1haWwiLCJ0aWNrZXQiLCJoZWFkaW5nIiwiZ2V0IiwidGlja2V0TnVtYmVyIiwic3VwcG9ydFRpY2tldElkIiwic3RhdHVzVXJsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwidGV4dCIsIlRvQWRkcmVzc2VzIiwiY2F0Y2giLCJjcmVhdGVTdXBwb3J0VGlja2V0IiwidGlja2V0S2V5IiwidG9JU09TdHJpbmciLCJhc3NpZ25lZFRvVXNlcklkIiwicHJpb3JpdHkiLCJTVVBQT1JUX1RJQ0tFVFMiLCJzYXZlZFRpY2tldCIsImFkZFN1cHBvcnRUaWNrZXRFdmVudCIsImFjdG9yVXNlcklkIiwiZXZlbnRUeXBlIiwibWV0YWRhdGEiLCJ0b1ZhbHVlIiwic3VibWl0UHVibGljU3VwcG9ydFRpY2tldCIsInRlc3QiLCJTVVBQT1JUX1RJQ0tFVF9FVkVOVFMiLCJTVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUyIsIkhBU19TVVBQT1JUX1RJQ0tFVF9FVkVOVCIsIkhBU19TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFIiwib3B0ZWRJbiIsImdldFB1YmxpY1N1cHBvcnRUaWNrZXQiLCJlbWFpbEFkZHJlc3MiLCJudW1iZXIiLCJnZXRTdXBwb3J0VGlja2V0cyIsImZpbHRlcnMiLCJ1cGRhdGVTdXBwb3J0VGlja2V0U3RhdHVzIiwicmVzb2x1dGlvblN1bW1hcnkiLCJwcmV2aW91cyIsImNvbXBsZXRlZEF0IiwiZG9uZUF0IiwicmVzb2x2ZWRBdCIsImNsb3NlZEF0IiwibGFzdFVwZGF0ZURldGFpbHMiLCJmcm9tVmFsdWUiLCJjcmVhdGVDdXN0b21lck5vdGlmaWNhdGlvbiIsImJvZHkiLCJ1cGRhdGVTdXBwb3J0VGlja2V0UHJvZ3Jlc3MiLCJtYXJrZG93biIsImFkZFN1cHBvcnRUaWNrZXRNZXNzYWdlIiwiYXV0aG9yVXNlcklkIiwidmlzaWJpbGl0eSIsIm1lc3NhZ2VLZXkiLCJzdXBwb3J0VGlja2V0TWVzc2FnZUlkIiwibWVzc2FnZSIsInNhdmVkTWVzc2FnZSIsImdldFN1cHBvcnRUaWNrZXRNZXNzYWdlcyIsImV2ZW50S2V5Iiwic3VwcG9ydFRpY2tldEV2ZW50SWQiLCJldmVudCIsInNhdmVkRXZlbnQiLCJnZXRTdXBwb3J0VGlja2V0RXZlbnRzIiwibm90aWZpY2F0aW9uS2V5IiwiY3VzdG9tZXJOb3RpZmljYXRpb25JZCIsIm5vdGlmaWNhdGlvbiIsIkNVU1RPTUVSX05PVElGSUNBVElPTlMiLCJzYXZlZE5vdGlmaWNhdGlvbiIsIkhBU19DVVNUT01FUl9OT1RJRklDQVRJT04iLCJnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLFVBQVUsRUFBRUMsT0FBTyxFQUFFQyxVQUFVLEVBQUVDLFdBQVcsUUFBTywrQkFBK0I7QUFDMUYsU0FBUUMsR0FBRyxRQUFPLFdBQVc7QUFDN0IsU0FBUUMsT0FBTyxRQUFPLGVBQWU7QUFFckMsU0FBUUMsV0FBVyxFQUFFQyxLQUFLLFFBQU8sOEJBQThCO0FBQy9ELFNBQVFDLE1BQU0sUUFBTyxlQUFlO0FBQ3BDLFNBQVFDLEtBQUssUUFBTyw0QkFBNEI7QUFDaEQsU0FBUUMsV0FBVyxRQUFPLDJCQUEyQjtBQUNyRCxTQUFRQyxPQUFPLFFBQU8sYUFBYTtBQXVCbkMsTUFBTUMsTUFBTSxJQUFjQyxLQUFLRCxHQUFHO0FBQ2xDLE1BQU1FLGFBQWEsQ0FBQ0MsT0FBaUJWLFFBQVFVO0FBQzdDLE1BQU1DLFNBQVMsQ0FBQ0MsUUFBUSxFQUFFLEdBQWFoQixRQUFRaUIsT0FBT0Q7QUFDdEQsTUFBTUUsUUFBUSxDQUFDQyxnQkFBd0JDLE1BQU0sRUFBRSxHQUFhLEdBQUdELGVBQWUsQ0FBQyxFQUFFSixPQUFPSyxNQUFNO0FBQzlGLE1BQU1DLGNBQWMsQ0FBQ0MsUUFBZ0JDLEtBQUssRUFBRSxHQUFheEIsV0FBVyxHQUFHdUIsT0FBTyxDQUFDLEVBQUVMLE9BQU9NLEtBQUssRUFBRTtBQUMvRixNQUFNQyxjQUFjLENBQUNSLE9BQWdCUyxTQUFTLEdBQUcsR0FBYXZCLFlBQVllLE9BQU9ELFNBQVMsS0FBS1M7QUFDL0YsTUFBTUMsa0JBQWtCLENBQUNWLE9BQWdCUyxTQUFTLEdBQUcsR0FBYVIsT0FBT0QsU0FBUyxJQUFJVyxJQUFJLEdBQUdDLEtBQUssQ0FBQyxHQUFHSDtBQUN0RyxNQUFNSSwyQkFBMkIsT0FBT0MsVUFBb0NoQjtJQUMxRSxNQUFNaUIsU0FBU0QsU0FBU2pCLFVBQVUsQ0FBQ0M7SUFDbkMsSUFBRyxNQUFNaUIsT0FBT0MsTUFBTSxJQUFJO0lBQzFCLElBQUk7UUFDRixNQUFNRixTQUFTRyxnQkFBZ0IsQ0FBQ25CO0lBQ2xDLEVBQUUsT0FBTW9CLE9BQU87UUFDYixJQUFHLENBQUMsTUFBTUgsT0FBT0MsTUFBTSxJQUFJLE1BQU1FO0lBQ25DO0FBQ0Y7QUFDQSxNQUFNQyx1QkFBdUIsT0FBT0wsVUFBb0NoQjtJQUN0RSxNQUFNaUIsU0FBU0QsU0FBU2pCLFVBQVUsQ0FBQ0M7SUFDbkMsSUFBRyxNQUFNaUIsT0FBT0MsTUFBTSxJQUFJO0lBQzFCLElBQUk7UUFDRixNQUFNRixTQUFTTSxvQkFBb0IsQ0FBQ3RCO0lBQ3RDLEVBQUUsT0FBTW9CLE9BQU87UUFDYixJQUFHLENBQUMsTUFBTUgsT0FBT0MsTUFBTSxJQUFJLE1BQU1FO0lBQ25DO0FBQ0Y7QUFFQSxNQUFNRyxrQkFBa0IsQ0FBQ0M7SUFDdkIsSUFBRyxDQUFDN0IsWUFBWTZCLFFBQVFDLE9BQU8sR0FBVTtRQUN2QyxNQUFNLElBQUlDLE1BQU07SUFDbEI7QUFDRjtBQUNBLE9BQU8sTUFBTUMsMEJBQTBCSixnQkFBZ0I7QUFFdkQsTUFBTUssdUJBQXVCLElBQUlDLElBQUk7SUFBQztJQUFTO0lBQWE7SUFBWTtJQUFTO0lBQTBCO0NBQVk7QUFDdkgsTUFBTUMsb0JBQW9CLElBQUlELElBQUk7SUFBQztJQUFPO0lBQVU7SUFBUTtDQUFTO0FBQ3JFLE1BQU1FLGtCQUFrQixJQUFJRixJQUFJO0lBQUM7SUFBYTtJQUFlO0lBQVE7Q0FBWTtBQUNqRixNQUFNRyxlQUFlLElBQUlILElBQUk7SUFBQztJQUFrQjtJQUFrQjtJQUFjO0lBQWlCO0NBQWtCO0FBQ25ILE1BQU1JLGVBQWU7QUFDckIsTUFBTUMsYUFBYSxDQUFDaEMsUUFBMEJBLE1BQU1pQyxPQUFPLENBQUMsTUFBTSxTQUFTQSxPQUFPLENBQUMsTUFBTSxRQUFRQSxPQUFPLENBQUMsTUFBTSxRQUFRQSxPQUFPLENBQUMsTUFBTTtBQUNySSxNQUFNQyxlQUFlLENBQUNsQyxRQUEyQkMsT0FBT0QsU0FBUyxJQUM5RGlDLE9BQU8sQ0FBQyx5REFBeUQsSUFDakVBLE9BQU8sQ0FBQywrQ0FBK0M7QUFDMUQsTUFBTUUsY0FBYyxDQUFDbkMsUUFBMkJDLE9BQU9ELFNBQVMsSUFDN0RpQyxPQUFPLENBQUMsdUJBQXVCLElBQy9CQSxPQUFPLENBQUMsdUJBQXVCLElBQy9CQSxPQUFPLENBQUMsMENBQTBDO0FBQ3JELE1BQU1HLGFBQWEsQ0FBQ3BDLFFBQTBCQSxNQUFNaUMsT0FBTyxDQUFDLFlBQVksS0FBS0EsT0FBTyxDQUFDLFFBQVEsS0FBS3RCLElBQUk7QUFDdEcsTUFBTTBCLFFBQVEsQ0FBSUMsT0FBcUJDO0lBQ3JDLE1BQU1DLFNBQWdCLEVBQUU7SUFDeEIsSUFBSSxJQUFJQyxRQUFRLEdBQUdBLFFBQVFILE1BQU03QixNQUFNLEVBQUVnQyxTQUFTRixLQUFNQyxPQUFPRSxJQUFJLENBQUNKLE1BQU0xQixLQUFLLENBQUM2QixPQUFPQSxRQUFRRjtJQUMvRixPQUFPQztBQUNUO0FBRUEsT0FBTyxNQUFNRyxnQkFBZ0IsT0FDM0JyQixTQUNBc0I7SUFFQSxJQUFHLE9BQU9BLE9BQU9DLG1CQUFtQixXQUFXLE1BQU0sSUFBSXJCLE1BQU07SUFDL0QsTUFBTXNCLFFBQVF0QyxZQUFZb0MsTUFBTUUsS0FBSyxFQUFFLEtBQUtDLFdBQVc7SUFDdkQsTUFBTUMsV0FBV3hDLFlBQVlvQyxNQUFNSyxLQUFLLEVBQUU7SUFDMUMsTUFBTUEsUUFBUUQsV0FBWS9ELFdBQVcrRCxhQUFhQSxXQUFZO0lBQzlELElBQUcsQ0FBQ0YsU0FBUyxDQUFDRyxPQUFPLE1BQU0sSUFBSXpCLE1BQU07SUFFckMsTUFBTVYsV0FBV3RCLE1BQU04QixRQUFRNEIsWUFBWTtJQUMzQyxNQUFNckMseUJBQXlCQyxVQUFVekIsWUFBWThELG9CQUFvQjtJQUN6RSxNQUFNQyxZQUFZekQ7SUFDbEIsTUFBTTBELFNBQVM3QyxZQUFZb0MsTUFBTVMsTUFBTSxJQUFJVCxNQUFNVSxNQUFNLElBQUksUUFBUTtJQUNuRSxNQUFNQyxTQUFTWCxNQUFNVyxNQUFNLElBQUksQ0FBQztJQUNoQyxNQUFNQyxZQUFZaEQsWUFBWW9DLE1BQU1ZLFNBQVMsSUFBSUQsT0FBT0MsU0FBUyxFQUFFO0lBQ25FLE1BQU1DLFdBQVdqRCxZQUFZb0MsTUFBTWEsUUFBUSxJQUFJRixPQUFPRSxRQUFRLEVBQUU7SUFDaEUsTUFBTUMsbUJBQW1CM0UsV0FBVytELFNBQVNHLE9BQU87SUFDcEQsTUFBTVUsVUFBVWYsTUFBTUMsY0FBYyxHQUNoQztRQUFDZSxrQkFBa0JSO1FBQVdTLG1CQUFtQjtJQUFJLElBQ3JEO1FBQUNBLG1CQUFtQlQ7SUFBUztJQUNqQyxNQUFNVSxhQUFhO1FBQ2pCQyxNQUFNTDtRQUNOTSxRQUFRO1FBQ1JDLE9BQU9iO1FBQ1BOO1FBQ0FVO1FBQ0FDO1FBQ0FTLGFBQWF0QixNQUFNQyxjQUFjO1FBQ2pDc0Isd0JBQXdCZDtRQUN4QlIsZ0JBQWdCRCxNQUFNQyxjQUFjO1FBQ3BDdUIsVUFBVWhCO1FBQ1ZIO1FBQ0FvQixNQUFNO1FBQ05DLFlBQVk7UUFDWkMsUUFBUWI7UUFDUmMsZUFBZTtRQUNmQyxlQUFlO1FBQ2YsR0FBR2QsT0FBTztJQUNaO0lBQ0EsTUFBTWUsYUFBYTtRQUNqQixHQUFJNUIsUUFBUTtZQUFDQTtRQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3hCLEdBQUlVLFlBQVk7WUFBQ0E7UUFBUyxJQUFJLENBQUMsQ0FBQztRQUNoQyxHQUFJQyxXQUFXO1lBQUNBO1FBQVEsSUFBSSxDQUFDLENBQUM7UUFDOUIsR0FBSVIsUUFBUTtZQUFDQTtRQUFLLElBQUksQ0FBQyxDQUFDO1FBQ3hCaUIsYUFBYXRCLE1BQU1DLGNBQWM7UUFDakNzQix3QkFBd0JkO1FBQ3hCUixnQkFBZ0JELE1BQU1DLGNBQWM7UUFDcEN1QixVQUFVaEI7UUFDVixHQUFHTyxPQUFPO0lBQ1o7SUFDQSxNQUFNZ0IsT0FBTyxNQUFNN0QsU0FBUzhELEtBQUssQ0FBQ3pGLEdBQUcsQ0FBQzs7a0JBRXRCLEVBQUVVLFdBQVdSLFlBQVl3RixLQUFLLEVBQUU7Z0JBQ2xDLEVBQUUvQixNQUFNLHFDQUFxQyxFQUFFQSxNQUFNO2NBQ3ZELEVBQUVHLE1BQU0sd0JBQXdCLEVBQUVBLE1BQU07Ozs7NkNBSVQsRUFBRVMsaUJBQWlCOztpQkFFL0MsRUFBRUksV0FBVztXQUNuQixFQUFFWSxXQUFXLElBQUksRUFBRTdFLFdBQVdSLFlBQVl3RixLQUFLLEVBQUU7O0VBRTFELENBQUMsRUFBRUMsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9DLElBQUk7SUFDL0IsTUFBTVQsU0FBU3hFLE9BQU9FLE9BQU8wRSxNQUFNWixRQUFRWSxNQUFNSixVQUFVYjtJQUUzRCxNQUFNdUIsZUFBZWxHLFdBQVcsQ0FBQyxlQUFlLEVBQUVxRSxVQUFVLENBQUMsRUFBRU4sTUFBTSxDQUFDLEVBQUVHLE9BQU8sRUFBRTtJQUNqRixNQUFNaUMsYUFBYTtRQUNqQm5CLE1BQU1rQjtRQUNOaEIsT0FBT2I7UUFDUE47UUFDQVEsUUFBUTlDLFlBQVlvQyxNQUFNVSxNQUFNLEVBQUU7UUFDbENULGdCQUFnQkQsTUFBTUMsY0FBYztRQUNwQ3VCLFVBQVVoQjtRQUNWSDtRQUNBSTtRQUNBNEI7UUFDQVY7UUFDQWhCO0lBQ0Y7SUFDQSxNQUFNNEIsUUFBUSxNQUFNckUsU0FBUzhELEtBQUssQ0FBQ3pGLEdBQUcsQ0FBQztXQUM5QixFQUFFK0YsV0FBVyxJQUFJLEVBQUVyRixXQUFXUixZQUFZOEQsb0JBQW9CLEVBQUU7O0VBRXpFLENBQUMsRUFBRTJCLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPQyxJQUFJO0lBRS9CLE9BQU9HO0FBQ1QsRUFBRTtBQUVGLE9BQU8sTUFBTUMsd0JBQXdCLENBQUM5RDtJQUNwQ0QsZ0JBQWdCQztJQUNoQixNQUFNUixXQUFXdEIsTUFBTThCLFFBQVE0QixZQUFZO0lBQzNDLE9BQU8sQUFBQyxDQUFBO1FBQ04sSUFBRyxDQUFDLE1BQU1wQyxTQUFTakIsVUFBVSxDQUFDUixZQUFZOEQsb0JBQW9CLEVBQUVuQyxNQUFNLElBQUksT0FBTyxFQUFFO1FBQ25GLE9BQU9GLFNBQVM4RCxLQUFLLENBQUN6RixHQUFHLENBQUM7d0JBQ04sRUFBRVUsV0FBV1IsWUFBWThELG9CQUFvQixFQUFFOzs7O0lBSW5FLENBQUMsRUFBRTJCLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPTSxHQUFHO0lBQ2hDLENBQUE7QUFDRixFQUFFO0FBRUYsT0FBTyxNQUFNQyxpQkFBaUIsQ0FBQ2hFLFNBQXFCaUUsU0FBMkIsQ0FBQyxDQUFDO0lBQy9FbEUsZ0JBQWdCQztJQUNoQixNQUFNa0UsU0FBU2hGLFlBQVkrRSxPQUFPQyxNQUFNLEVBQUUsS0FBS3pDLFdBQVc7SUFDMUQsTUFBTTBDLFFBQVEvRCxxQkFBcUJnRSxHQUFHLENBQUNILE9BQU9FLEtBQUssSUFBSSxNQUFNeEYsT0FBT3NGLE9BQU9FLEtBQUssSUFBSTtJQUNwRixNQUFNekYsUUFBUVEsWUFBWStFLE9BQU92RixLQUFLLEVBQUUsS0FBSytDLFdBQVc7SUFDeEQsTUFBTTRDLGNBQWNKLE9BQU9JLFdBQVcsS0FBSztJQUMzQyxNQUFNQyxXQUFXO1FBQUM7UUFBWTtRQUFVO0tBQVMsQ0FBQ0MsUUFBUSxDQUFDTixPQUFPSyxRQUFRLElBQUksTUFBTUwsT0FBT0ssUUFBUSxHQUFHO0lBQ3RHLE9BQU9wRyxNQUFNOEIsUUFBUTRCLFlBQVksRUFBRTBCLEtBQUssQ0FBQ3pGLEdBQUcsQ0FBQztnQkFDL0IsRUFBRVUsV0FBV1IsWUFBWXdGLEtBQUssRUFBRTthQUNuQyxFQUFFLENBQUNjLFlBQVk7YUFDZixFQUFFLENBQUNILE9BQU8sa0dBQWtHLEVBQUVBLE9BQU87YUFDckgsRUFBRSxDQUFDQyxNQUFNLEtBQUssRUFBRUcsYUFBYSxTQUFTO29CQUMvQixFQUFFSCxNQUFNO1dBQ2pCLEVBQUVHLGFBQWEsU0FBUyx3QkFBd0IsRUFBRUgsTUFBTSxPQUFPLEVBQUV6RixNQUFNLGlDQUFpQyxFQUFFeUYsTUFBTSxLQUFLLEVBQUV6RixNQUFNOzs7O0VBSXRJLENBQUMsRUFBRThFLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPTSxHQUFHO0FBQ2hDLEVBQUU7QUFFRixPQUFPLE1BQU1TLGtCQUFrQixPQUM3QnhFLFNBQ0FzQjtJQUVBdkIsZ0JBQWdCQztJQUNoQixNQUFNeUUsVUFBVXZGLFlBQVlvQyxNQUFNbUQsT0FBTyxFQUFFO0lBQzNDLE1BQU1DLFdBQVc5RCxhQUFhVSxNQUFNcUQsSUFBSTtJQUN4QyxNQUFNQyxNQUFNL0QsWUFBWVMsTUFBTXNELEdBQUc7SUFDakMsSUFBRyxDQUFDSCxXQUFXLENBQUNDLFVBQVUsTUFBTSxJQUFJeEUsTUFBTTtJQUUxQyxNQUFNMkUsYUFBYSxNQUFNYixlQUFlaEUsU0FBUztRQUFDLEdBQUdzQixNQUFNMkMsTUFBTTtRQUFFSSxhQUFhO0lBQUk7SUFDcEYsTUFBTVMsY0FBYyxJQUFJekUsSUFBSSxBQUFDaUIsQ0FBQUEsTUFBTXlELE9BQU8sSUFBSSxFQUFFLEFBQUQsRUFBR0MsR0FBRyxDQUFDLENBQUMvRixLQUFPUixPQUFPUTtJQUNyRSxNQUFNZ0csYUFBYUosV0FBV1osTUFBTSxDQUFDLENBQUNaLE9BQ3BDNkIsUUFBUTdCLEtBQUs3QixLQUFLLEtBQU0sQ0FBQSxDQUFDc0QsWUFBWTdELElBQUksSUFBSTZELFlBQVlWLEdBQUcsQ0FBQzNGLE9BQU80RSxLQUFLSixNQUFNLElBQUlJLEtBQUtaLElBQUksRUFBQztJQUMvRixNQUFNWCxZQUFZekQ7SUFDbEIsTUFBTThHLGFBQWExSCxXQUFXLENBQUMsYUFBYSxFQUFFcUUsVUFBVSxDQUFDLEVBQUUyQyxTQUFTLEVBQUU7SUFDdEUsTUFBTWpGLFdBQVd0QixNQUFNOEIsUUFBUTRCLFlBQVk7SUFDM0MsTUFBTXdELFdBQVc7UUFDZjNDLE1BQU0wQztRQUNOeEMsT0FBT2I7UUFDUHFEO1FBQ0FQO1FBQ0FTLGFBQWE7UUFDYlYsTUFBTUQ7UUFDTjVCLFVBQVVoQjtRQUNWd0QsZ0JBQWdCTCxXQUFXOUYsTUFBTTtRQUNqQ29HLFdBQVc7UUFDWEMsUUFBUTtRQUNSZjtJQUNGO0lBQ0EsTUFBTWpGLFNBQVM4RCxLQUFLLENBQUN6RixHQUFHLENBQUMsT0FBTyxFQUFFdUgsU0FBUyxJQUFJLEVBQUU3RyxXQUFXUixZQUFZMEgsYUFBYSxFQUFFLENBQUM7SUFFeEYsSUFBSUosY0FBYztJQUNsQixJQUFJRSxZQUFZO0lBQ2hCLEtBQUksTUFBTUcsbUJBQW1CM0UsTUFBTWtFLFlBQVksSUFBSztRQUNsRCxJQUFJO1lBQ0YsTUFBTTdHLFFBQVE7Z0JBQ1p1SCxhQUFhO29CQUFDQyxjQUFjRixnQkFBZ0JWLEdBQUcsQ0FBQyxDQUFDYSxZQUFjbEgsT0FBT2tILFVBQVVyRSxLQUFLO2dCQUFFO2dCQUN2RnNFLFNBQVM7b0JBQ1BDLE1BQU07d0JBQUNDLE1BQU07NEJBQUNDLE1BQU0sQ0FBQyxPQUFPLEVBQUVyQixJQUFJLFFBQVEsRUFBRUYsVUFBVTt3QkFBQTt3QkFBR3dCLE1BQU07NEJBQUNELE1BQU1uRixXQUFXNEQ7d0JBQVM7b0JBQUM7b0JBQzNGeUIsU0FBUzt3QkFBQ0YsTUFBTXhCO29CQUFPO2dCQUN6QjtnQkFDQTJCLFFBQVEsQ0FBQyxDQUFDLEVBQUVwRyxRQUFRcUcsTUFBTSxFQUFFQyxTQUFTQyxlQUFlLFVBQVUsR0FBRyxFQUFFdkcsUUFBUXFHLE1BQU0sRUFBRUMsU0FBU0UsZ0JBQWdCLHFCQUFxQixDQUFDLENBQUM7WUFDckk7WUFDQWpCLGFBQWFHLGdCQUFnQnZHLE1BQU07UUFDckMsRUFBRSxPQUFNc0gsUUFBUTtZQUNkcEIsZUFBZUssZ0JBQWdCdkcsTUFBTTtRQUN2QztJQUNGO0lBQ0EsTUFBTXVILFNBQVM7UUFBQyxHQUFHdEIsUUFBUTtRQUFFQztRQUFhc0IsUUFBUXRJO1FBQU9rSDtRQUFXQyxRQUFRSCxjQUFlRSxZQUFZLFlBQVksV0FBWTtJQUFNO0lBQ3JJLE1BQU0vRixTQUFTOEQsS0FBSyxDQUFDekYsR0FBRyxDQUFDO1dBQ2hCLEVBQUVzSCxXQUFXLE1BQU0sRUFBRTtRQUMxQkUsYUFBYXFCLE9BQU9yQixXQUFXO1FBQy9CdkMsVUFBVTRELE9BQU9DLE1BQU07UUFDdkJBLFFBQVFELE9BQU9DLE1BQU07UUFDckJwQixXQUFXbUIsT0FBT25CLFNBQVM7UUFDM0JDLFFBQVFrQixPQUFPbEIsTUFBTTtJQUN2QixFQUFFLElBQUksRUFBRWpILFdBQVdSLFlBQVkwSCxhQUFhLEVBQUU7RUFDaEQsQ0FBQztJQUNELE9BQU9pQjtBQUNULEVBQUU7QUFFRixNQUFNRSxXQUFXLE9BQ2Y1RyxTQUNBNkcsZ0JBQ0FDLFNBQ0FDLE1BQ0FDLElBQ0FDLE9BQWdDLENBQUMsQ0FBQztJQUVsQyxNQUFNbkYsWUFBWXpEO0lBQ2xCLE1BQU02SSxPQUFPO1FBQ1hDLE9BQU9KO1FBQ1B0RSxNQUFNcUU7UUFDTk0sS0FBS0o7UUFDTHJFLE9BQU9iO1FBQ1BnQixVQUFVaEI7UUFDVixHQUFHbUYsSUFBSTtJQUNUO0lBQ0EsTUFBTTNELFFBQWtCekYsR0FBRyxDQUFDO2tCQUNaLEVBQUVpSixRQUFRO1dBQ2pCLEVBQUVJLEtBQUs7V0FDUCxFQUFFRCxLQUFLLElBQUksRUFBRTFJLFdBQVdzSSxnQkFBZ0I7RUFDakQsQ0FBQztJQUVELE1BQU0zSSxNQUFNOEIsUUFBUTRCLFlBQVksRUFBRTBCLEtBQUssQ0FBQ0E7QUFDMUM7QUFFQSxPQUFPLE1BQU0rRCxvQkFBb0IsT0FDL0JySCxTQUNBc0I7SUFFQSxNQUFNUSxZQUFZekQ7SUFDbEIsTUFBTWlKLGdCQUFnQjdJLE9BQU9FLE9BQU8yQyxPQUFPZ0csaUJBQWlCN0osV0FBVyxDQUFDLGFBQWEsRUFBRTZELE9BQU85QyxLQUFLLENBQUMsRUFBRXNELFdBQVc7SUFDakgsTUFBTWMsY0FBYztRQUNsQkgsTUFBTTZFO1FBQ04zRSxPQUFPYjtRQUNQeUYsaUJBQWlCOUksT0FBT0UsT0FBT3FCLFNBQVNDLFNBQVNnRCxVQUFVO1FBQzNEdUUsYUFBYXRJLFlBQVlvQyxPQUFPa0csYUFBYTtRQUM3Q0Y7UUFDQXhFLFVBQVVoQjtRQUNWdEQsTUFBTVUsWUFBWW9DLE9BQU85QyxNQUFNO1FBQy9CZ0gsUUFBUWxFLE9BQU9rRSxVQUFVO0lBQzNCO0lBQ0EsTUFBTWxDLFFBQVF6RixHQUFHLENBQUM7a0JBQ0YsRUFBRXlKLGNBQWM7V0FDdkIsRUFBRTFFLFlBQVk7V0FDZCxFQUFFO1FBQ1A0RSxhQUFhNUUsWUFBWTRFLFdBQVc7UUFDcEMxRSxVQUFVaEI7UUFDVnRELE1BQU1vRSxZQUFZcEUsSUFBSTtRQUN0QmdILFFBQVE1QyxZQUFZNEMsTUFBTTtJQUM1QixFQUFFLElBQUksRUFBRWpILFdBQVdSLFlBQVkwSixhQUFhLEVBQUU7O0VBRWhELENBQUM7SUFFRCxPQUFPdkosTUFBTThCLFFBQVE0QixZQUFZLEVBQUUwQixLQUFLLENBQUNBLE9BQU9FLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPQyxJQUFJO0FBQzlFLEVBQUU7QUFFRixPQUFPLE1BQU1nRSxrQkFBa0IsQ0FBQzFIO0lBQzlCLE1BQU1zRCxRQUFRekYsR0FBRyxDQUFDO2dCQUNKLEVBQUVVLFdBQVdSLFlBQVkwSixhQUFhLEVBQUU7Ozs7RUFJdEQsQ0FBQztJQUVELE9BQU92SixNQUFNOEIsUUFBUTRCLFlBQVksRUFBRTBCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9NLEdBQUc7QUFDN0UsRUFBRTtBQUVGLE9BQU8sTUFBTTRELHVCQUF1QixPQUNsQzNILFNBQ0FpRCxRQUNBcUUsZUFDQXZGLFNBQVMsUUFBUTtJQUVqQixNQUFNNkYsVUFBVW5KLE9BQU93RTtJQUN2QixNQUFNNEUsVUFBVXBKLE9BQU82STtJQUN2QixNQUFNUixVQUFVckosV0FBVyxDQUFDLGVBQWUsRUFBRW1LLFFBQVEsQ0FBQyxFQUFFQyxTQUFTO0lBRWpFLE1BQU1qQixTQUNKNUcsU0FDQWhDLE1BQU04SixnQkFBZ0IsRUFDdEJoQixTQUNBbEksTUFBTWIsWUFBWXdGLEtBQUssRUFBRXFFLFVBQ3pCaEosTUFBTWIsWUFBWTBKLGFBQWEsRUFBRUksVUFDakM7UUFDRUUsZUFBZXRKLE9BQU9FLE9BQU9xQixTQUFTQyxTQUFTZ0QsVUFBVTtRQUN6RGxCLFFBQVE3QyxZQUFZNkMsUUFBUTtRQUM1QnlELFFBQVE7SUFDVjtJQUdGLE9BQU90SCxNQUFNOEIsUUFBUTRCLFlBQVksRUFDOUIwQixLQUFLLENBQUN6RixHQUFHLENBQUMsZ0JBQWdCLEVBQUVlLE1BQU1iLFlBQVkwSixhQUFhLEVBQUVJLFNBQVMsQ0FBQyxDQUFDLEVBQ3hFckUsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9DLElBQUk7QUFDakMsRUFBRTtBQUVGLE9BQU8sTUFBTXNFLDRCQUE0QixPQUN2Q2hJLFNBQ0FpRCxRQUNBcUU7SUFFQSxNQUFNTSxVQUFVbkosT0FBT3dFO0lBQ3ZCLE1BQU00RSxVQUFVcEosT0FBTzZJO0lBQ3ZCLE1BQU1SLFVBQVVySixXQUFXLENBQUMsZUFBZSxFQUFFbUssUUFBUSxDQUFDLEVBQUVDLFNBQVM7SUFDakUsTUFBTUksU0FBUztRQUNibkYsVUFBVXpFO1FBQ1Y2SixXQUFXN0o7UUFDWG1ILFFBQVE7SUFDVjtJQUNBLE1BQU1sQyxRQUFRekYsR0FBRyxDQUFDO1dBQ1QsRUFBRWlKLFFBQVEsTUFBTSxFQUFFbUIsT0FBTyxJQUFJLEVBQUUxSixXQUFXUCxNQUFNOEosZ0JBQWdCLEVBQUU7O0VBRTNFLENBQUM7SUFFRCxPQUFPNUosTUFBTThCLFFBQVE0QixZQUFZLEVBQUUwQixLQUFLLENBQUNBLE9BQU9FLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPQyxJQUFJLElBQUlGLElBQUksQ0FBQzBCO0FBQ3ZGLEVBQUU7QUFFRixPQUFPLE1BQU1pRCxzQkFBc0IsQ0FDakNuSSxTQUNBc0g7SUFFQSxNQUFNYyxTQUFTeEosTUFBTWIsWUFBWTBKLGFBQWEsRUFBRUg7SUFDaEQsTUFBTWhFLFFBQVF6RixHQUFHLENBQUM7bUNBQ2UsRUFBRXVLLE9BQU8sQ0FBQyxFQUFFN0osV0FBV1AsTUFBTThKLGdCQUFnQixFQUFFOzs7O0VBSWhGLENBQUM7SUFFRCxPQUFPNUosTUFBTThCLFFBQVE0QixZQUFZLEVBQUUwQixLQUFLLENBQUNBLE9BQU9FLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPTSxHQUFHO0FBQzdFLEVBQUU7QUFFRixPQUFPLE1BQU1zRSw2QkFBNkIsQ0FDeENySSxTQUNBc0k7SUFFQSxNQUFNQyxhQUFheEosWUFBWSxtQkFBbUJ1SjtJQUNsRCxNQUFNaEYsUUFBUXpGLEdBQUcsQ0FBQzs4QkFDVSxFQUFFZSxNQUFNYixZQUFZeUssZ0JBQWdCLEVBQUVELFlBQVksQ0FBQyxFQUFFaEssV0FBV1AsTUFBTXlLLHFCQUFxQixFQUFFO3lDQUNsRixFQUFFbEssV0FBV1AsTUFBTTBLLGtCQUFrQixFQUFFOzs7RUFHOUUsQ0FBQztJQUVELE9BQU94SyxNQUFNOEIsUUFBUTRCLFlBQVksRUFBRTBCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9NLEdBQUc7QUFDN0UsRUFBRTtBQUVGLE9BQU8sTUFBTTRFLDBCQUEwQixDQUNyQzNJLFNBQ0E0SSxVQUF3SCxDQUFDLENBQUM7SUFFMUgsTUFBTUMsNEJBQTRCRCxRQUFRQyx5QkFBeUIsS0FBSztJQUN4RSxNQUFNdkYsUUFBUXpGLEdBQUcsQ0FBQzs7a0JBRUYsRUFBRVUsV0FBV1IsWUFBWXdGLEtBQUssRUFBRTs7OztRQUkxQyxFQUFFcUYsUUFBUXRCLGFBQWEsR0FBR3pKLEdBQUcsQ0FBQzs7K0NBRVMsRUFBRVUsV0FBV1AsTUFBTThKLGdCQUFnQixFQUFFO2tDQUNsRCxFQUFFckosT0FBT21LLFFBQVF0QixhQUFhLEVBQUU7OztRQUcxRCxDQUFDLEdBQUd6SixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ1YsRUFBRStLLFFBQVFOLFNBQVMsR0FBR3pLLEdBQUcsQ0FBQzs7Z0RBRWMsRUFBRVUsV0FBV1AsTUFBTTBLLGtCQUFrQixFQUFFO3FEQUNsQyxFQUFFbkssV0FBV1AsTUFBTXlLLHFCQUFxQixFQUFFOzRDQUNuRCxFQUFFOUosT0FBT2lLLFFBQVFOLFNBQVMsRUFBRTs7O1FBR2hFLENBQUMsR0FBR3pLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDVixFQUFFZ0wsNEJBQTRCaEwsR0FBRyxDQUFDOztpREFFTyxFQUFFVSxXQUFXUCxNQUFNOEssa0JBQWtCLEVBQUU7Ozs7O1FBS2hGLENBQUMsR0FBR2pMLEdBQUcsQ0FBQyxDQUFDLENBQUM7Ozs7OztFQU1oQixDQUFDO0lBRUQsT0FBT0ssTUFBTThCLFFBQVE0QixZQUFZLEVBQUUwQixLQUFLLENBQUNBLE9BQU9FLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPTSxHQUFHO0FBQzdFLEVBQUU7QUFFRixPQUFPLE1BQU1nRiw2QkFBNkIsT0FDeEMvSSxTQUNBc0I7SUFFQSxNQUFNUSxZQUFZekQ7SUFDbEIsTUFBTTJLLG9CQUFvQjVKLGdCQUFnQmtDLE1BQU0wSCxpQkFBaUIsRUFBRTtJQUNuRSxNQUFNQyxpQkFBaUI3SixnQkFBZ0JrQyxNQUFNMkgsY0FBYyxFQUFFO0lBQzdELE1BQU1DLFdBQVc1SCxNQUFNNEgsUUFBUSxJQUFJLENBQUM7SUFDcEMsTUFBTTFILFFBQVF0QyxZQUFZZ0ssU0FBUzFILEtBQUssRUFBRSxLQUFLQyxXQUFXO0lBQzFELE1BQU0wSCxhQUFhQyxNQUFNckMsSUFBSSxDQUFDLElBQUkxRyxJQUFJO1dBQUtpQixNQUFNNkgsVUFBVSxJQUFJLEVBQUU7V0FBTSxBQUFDN0gsQ0FBQUEsTUFBTStILFFBQVEsSUFBSSxFQUFFLEFBQUQsRUFBR3JFLEdBQUcsQ0FBQyxDQUFDc0UsVUFBWUEsUUFBUWhCLFNBQVM7S0FBRSxDQUMvSHRELEdBQUcsQ0FBQyxDQUFDc0QsWUFBY2xKLGdCQUFnQmtKLFdBQVcsTUFDOUNyRSxNQUFNLENBQUNpQjtJQUVWLElBQUcsQ0FBQzhELG1CQUFtQjtRQUNyQixNQUFNLElBQUk5SSxNQUFNO0lBQ2xCO0lBQ0EsSUFBRyxDQUFDK0ksZ0JBQWdCO1FBQ2xCLE1BQU0sSUFBSS9JLE1BQU07SUFDbEI7SUFDQSxJQUFHLENBQUNzQixPQUFPO1FBQ1QsTUFBTSxJQUFJdEIsTUFBTTtJQUNsQjtJQUVBLE1BQU0wSCxVQUFVN0ksWUFBWSxnQkFBZ0JpSztJQUM1QyxNQUFNeEcsYUFBYTtRQUNqQkMsTUFBTW1GO1FBQ05qRixPQUFPYjtRQUNQTjtRQUNBVSxXQUFXaEQsWUFBWWdLLFNBQVNoSCxTQUFTLEVBQUU7UUFDM0NDLFVBQVVqRCxZQUFZZ0ssU0FBUy9HLFFBQVEsRUFBRTtRQUN6Q1Usd0JBQXdCO1FBQ3hCdEIsZ0JBQWdCMkgsU0FBUzNILGNBQWMsS0FBSztRQUM1Q2Usa0JBQWtCNEcsU0FBUzNILGNBQWMsS0FBSyxPQUFPTyxZQUFZeUg7UUFDakV6RyxVQUFVaEI7UUFDVmtIO1FBQ0FqRyxNQUFNO1FBQ05FLFFBQVEyRTtJQUNWO0lBQ0EsTUFBTXhFLGFBQWE7UUFDakI1QjtRQUNBVSxXQUFXaEQsWUFBWWdLLFNBQVNoSCxTQUFTLEVBQUU7UUFDM0NDLFVBQVVqRCxZQUFZZ0ssU0FBUy9HLFFBQVEsRUFBRTtRQUN6Q3FILGlCQUFpQmxJLE1BQU1tSSxXQUFXLElBQUkzSDtRQUN0Q2Usd0JBQXdCO1FBQ3hCdEIsZ0JBQWdCMkgsU0FBUzNILGNBQWMsS0FBSztRQUM1Q3VCLFVBQVVoQjtRQUNWa0g7SUFDRjtJQUNBLE1BQU1VLFlBQVk3TCxHQUFHLENBQUM7O2tCQUVOLEVBQUVVLFdBQVdSLFlBQVl3RixLQUFLLEVBQUU7eUNBQ1QsRUFBRXlGLGtCQUFrQixrQkFBa0IsRUFBRXhILE1BQU07Ozs7NkNBSTFDLEVBQUVvRyxRQUFROztpQkFFdEMsRUFBRXBGLFdBQVc7V0FDbkIsRUFBRVksV0FBVyxJQUFJLEVBQUU3RSxXQUFXUixZQUFZd0YsS0FBSyxFQUFFOztFQUUxRCxDQUFDO0lBQ0QsTUFBTUYsT0FBTyxNQUFNbkYsTUFBTThCLFFBQVE0QixZQUFZLEVBQUUwQixLQUFLLENBQUNvRyxXQUFXbEcsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9DLElBQUk7SUFDNUYsTUFBTWlHLGtCQUFrQmxMLE9BQU9FLE9BQU8wRSxNQUFNWixRQUFRWSxNQUFNSixVQUFVMkU7SUFDcEUsTUFBTWdDLFdBQVc3SyxZQUFZLGlCQUFpQmtLO0lBQzlDLE1BQU1ZLFFBQVE7UUFDWnBILE1BQU1tSDtRQUNOakgsT0FBT2I7UUFDUGdJLFVBQVU1SyxZQUFZb0MsTUFBTXdJLFFBQVEsRUFBRSxHQUFHQyxXQUFXO1FBQ3BEQyxpQkFBaUJKO1FBQ2pCOUcsVUFBVWhCO1FBQ1ZxSDtRQUNBTSxhQUFhbkksTUFBTW1JLFdBQVcsSUFBSTNIO1FBQ2xDa0g7UUFDQUM7UUFDQWdCLFlBQVlDLE9BQU81SSxNQUFNMkksVUFBVSxJQUFJO1FBQ3ZDaEgsUUFBUTBHO0lBQ1Y7SUFDQSxNQUFNUSxhQUFhdE0sR0FBRyxDQUFDO2tCQUNQLEVBQUUrTCxTQUFTO1dBQ2xCLEVBQUVDLE1BQU07V0FDUixFQUFFO1FBQ1BDLFVBQVVELE1BQU1DLFFBQVE7UUFDeEJoSCxVQUFVaEI7UUFDVnFIO1FBQ0FNLGFBQWFJLE1BQU1KLFdBQVc7UUFDOUJRLFlBQVlKLE1BQU1JLFVBQVU7UUFDNUJoSCxRQUFRMEc7SUFDVixFQUFFLElBQUksRUFBRXBMLFdBQVdSLFlBQVlxTSxlQUFlLEVBQUU7O0VBRWxELENBQUM7SUFDRCxNQUFNQyxhQUFhLE1BQU1uTSxNQUFNOEIsUUFBUTRCLFlBQVksRUFBRTBCLEtBQUssQ0FBQzZHLFlBQVkzRyxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT0MsSUFBSTtJQUVuRyxNQUFNa0QsU0FDSjVHLFNBQ0FoQyxNQUFNMEssa0JBQWtCLEVBQ3hCakwsV0FBVyxDQUFDLGlCQUFpQixFQUFFa00sZ0JBQWdCLENBQUMsRUFBRUMsVUFBVSxHQUM1RGhMLE1BQU1iLFlBQVl3RixLQUFLLEVBQUVvRyxrQkFDekIvSyxNQUFNYixZQUFZcU0sZUFBZSxFQUFFUixXQUNuQztRQUFDSCxhQUFhSSxNQUFNSixXQUFXO1FBQUVUO1FBQW1CQztJQUFjO0lBR3BFLE1BQU1xQixRQUFRdkcsR0FBRyxDQUFDb0YsV0FBV25FLEdBQUcsQ0FBQyxPQUFPc0Q7UUFDdEMsTUFBTWdCLFVBQVUsQUFBQ2hJLENBQUFBLE1BQU0rSCxRQUFRLElBQUksRUFBRSxBQUFELEVBQUdrQixJQUFJLENBQUMsQ0FBQ0MsT0FBU0EsS0FBS2xDLFNBQVMsS0FBS0EsY0FBYztZQUFDQTtRQUFTO1FBQ2pHLE1BQU1DLGFBQWF4SixZQUFZLG1CQUFtQnVKO1FBQ2xELE1BQU1tQyxhQUFhO1lBQ2pCaEksTUFBTThGO1lBQ041RixPQUFPYjtZQUNQZ0IsVUFBVWhCO1lBQ1Z3RztZQUNBb0MsT0FBT3hMLFlBQVlvSyxRQUFRb0IsS0FBSyxFQUFFO1lBQ2xDQyxXQUFXdkwsZ0JBQWdCa0ssUUFBUXFCLFNBQVMsRUFBRTtRQUNoRDtRQUNBLE1BQU1DLGVBQWUvTSxHQUFHLENBQUM7b0JBQ1QsRUFBRTBLLFdBQVc7YUFDcEIsRUFBRWtDLFdBQVc7YUFDYixFQUFFO1lBQ1AzSCxVQUFVaEI7WUFDVjRJLE9BQU9ELFdBQVdDLEtBQUs7WUFDdkJDLFdBQVdGLFdBQVdFLFNBQVM7UUFDakMsRUFBRSxJQUFJLEVBQUVwTSxXQUFXUixZQUFZeUssZ0JBQWdCLEVBQUU7SUFDbkQsQ0FBQztRQUNELE1BQU10SyxNQUFNOEIsUUFBUTRCLFlBQVksRUFBRTBCLEtBQUssQ0FBQ3NIO1FBQ3hDLE1BQU1oRSxTQUNKNUcsU0FDQWhDLE1BQU15SyxxQkFBcUIsRUFDM0JoTCxXQUFXLENBQUMsb0JBQW9CLEVBQUVtTSxTQUFTLENBQUMsRUFBRXJCLFlBQVksR0FDMUQzSixNQUFNYixZQUFZcU0sZUFBZSxFQUFFUixXQUNuQ2hMLE1BQU1iLFlBQVl5SyxnQkFBZ0IsRUFBRUQsYUFDcEM7WUFBQ0Q7WUFBV21CLGFBQWFJLE1BQU1KLFdBQVc7UUFBQTtJQUU5QztJQUVBLE1BQU12TCxNQUFNOEIsUUFBUTRCLFlBQVksRUFBRTBCLEtBQUssQ0FBQ3pGLEdBQUcsQ0FBQztXQUNuQyxFQUFFOEwsZ0JBQWdCOzt1QkFFTixFQUFFRSxNQUFNSixXQUFXLENBQUM7O21DQUVSLEVBQUU3SyxNQUFNYixZQUFZd0YsS0FBSyxFQUFFb0csaUJBQWlCLENBQUMsRUFBRXBMLFdBQVdQLE1BQU0wSyxrQkFBa0IsRUFBRTs7OzttQ0FJcEYsRUFBRTlKLE1BQU1iLFlBQVl3RixLQUFLLEVBQUVvRyxpQkFBaUIsQ0FBQyxFQUFFcEwsV0FBV1AsTUFBTTBLLGtCQUFrQixFQUFFOzs7U0FHOUcsRUFBRW5LLFdBQVdSLFlBQVl3RixLQUFLLEVBQUU7RUFDdkMsQ0FBQztJQUVELE9BQU84RztBQUNULEVBQUU7QUFFRixPQUFPLE1BQU1RLDBCQUEwQixDQUNyQzdLLFNBQ0FpRDtJQUVBLE1BQU1LLFFBQVF6RixHQUFHLENBQUM7K0JBQ1csRUFBRWUsTUFBTWIsWUFBWXdGLEtBQUssRUFBRU4sUUFBUSxDQUFDLEVBQUUxRSxXQUFXUCxNQUFNMEssa0JBQWtCLEVBQUU7OztFQUd4RyxDQUFDO0lBRUQsT0FBT3hLLE1BQU04QixRQUFRNEIsWUFBWSxFQUFFMEIsS0FBSyxDQUFDQSxPQUFPRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT00sR0FBRztBQUM3RSxFQUFFO0FBRUYsTUFBTStHLHlCQUF5QixPQUM3QjlLLFNBQ0ErSyxRQUNBekUsU0FDQTBFO0lBRUEsTUFBTTNILE9BQU8sTUFBTW5GLE1BQU04QixRQUFRNEIsWUFBWSxFQUFFMEIsS0FBSyxDQUFDekYsR0FBRyxDQUFDO29CQUN2QyxFQUFFZSxNQUFNYixZQUFZd0YsS0FBSyxFQUFFd0gsT0FBTzlILE1BQU0sRUFBRTtFQUM1RCxDQUFDLEVBQUVPLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPQyxJQUFJO0lBQy9CLElBQUcsQ0FBQ0wsTUFBTTdCLE9BQU87SUFDakIsTUFBTStFLGNBQWN2RyxRQUFRcUcsTUFBTSxFQUFFQyxTQUFTQyxlQUFldEksT0FBT2dOLEdBQUcsQ0FBQywwQkFBMEI7SUFDakcsTUFBTXpFLGVBQWV4RyxRQUFRcUcsTUFBTSxFQUFFQyxTQUFTRSxnQkFBZ0J2SSxPQUFPZ04sR0FBRyxDQUFDLDJCQUEyQjtJQUNwRyxNQUFNQyxlQUFldk0sT0FBT29NLE9BQU9HLFlBQVksSUFBSUgsT0FBT0ksZUFBZSxJQUFJSixPQUFPdEksSUFBSSxJQUFJO0lBQzVGLE1BQU0ySSxZQUFZLENBQUMsNkNBQTZDLEVBQUVDLG1CQUFtQkgsZUFBZTtJQUNwRyxNQUFNSSxPQUFPLEdBQUdOLFFBQVEsWUFBWSxFQUFFRSxhQUFhLFVBQVUsRUFBRUgsT0FBT3ZGLE1BQU0sSUFBSSxZQUFZLElBQUksRUFBRWMsUUFBUSx1QkFBdUIsRUFBRThFLFdBQVc7SUFDOUksTUFBTWhOLFFBQVE7UUFDWnVILGFBQWE7WUFBQzRGLGFBQWE7Z0JBQUM1TSxPQUFPMEUsS0FBSzdCLEtBQUs7YUFBRTtRQUFBO1FBQy9Dc0UsU0FBUztZQUNQQyxNQUFNO2dCQUFDQyxNQUFNO29CQUFDQyxNQUFNLENBQUMsSUFBSSxFQUFFdkYsV0FBV3NLLFNBQVMsaUNBQWlDLEVBQUV0SyxXQUFXd0ssY0FBYyxnQ0FBZ0MsRUFBRXhLLFdBQVcvQixPQUFPb00sT0FBT3ZGLE1BQU0sSUFBSSxjQUFjLDBEQUEwRCxFQUFFOUUsV0FBVzRGLFNBQVMsa0JBQWtCLEVBQUU1RixXQUFXMEssV0FBVyxrQ0FBa0MsQ0FBQztnQkFBQTtnQkFBR2xGLE1BQU07b0JBQUNELE1BQU1xRjtnQkFBSTtZQUFDO1lBQ2hYbkYsU0FBUztnQkFBQ0YsTUFBTSxDQUFDLENBQUMsRUFBRWlGLGFBQWEsRUFBRSxFQUFFRixTQUFTO1lBQUE7UUFDaEQ7UUFDQTVFLFFBQVEsQ0FBQyxDQUFDLEVBQUVHLFlBQVksR0FBRyxFQUFFQyxhQUFhLENBQUMsQ0FBQztJQUM5QyxHQUFHZ0YsS0FBSyxDQUFDLElBQU1qQztBQUNqQjtBQUVBLE9BQU8sTUFBTWtDLHNCQUFzQixPQUNqQ3pMLFNBQ0FzQjtJQUVBLE1BQU1RLFlBQVl6RDtJQUNsQixNQUFNdUosVUFBVW5KLE9BQU9FLE9BQU8yQyxNQUFNMkIsTUFBTSxJQUFJO0lBQzlDLE1BQU15SSxZQUFZak4sT0FBT0UsT0FBTzJDLE1BQU02SixlQUFlLElBQUkxTixXQUFXLENBQUMsZUFBZSxFQUFFbUssUUFBUSxDQUFDLEVBQUU5RixXQUFXO0lBQzVHLE1BQU1vSixlQUFlaE0sWUFBWW9DLE1BQU00SixZQUFZLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJNU0sS0FBS3dELFdBQVc2SixXQUFXLEdBQUdyTSxLQUFLLENBQUMsR0FBRyxJQUFJcUIsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUrSyxVQUFVcE0sS0FBSyxDQUFDLEdBQUcsR0FBR3lLLFdBQVcsSUFBSTtJQUM1SyxNQUFNZ0IsU0FBUztRQUNidEksTUFBTWlKO1FBQ04vSSxPQUFPYjtRQUNQOEosa0JBQWtCbk4sT0FBT0UsT0FBTzJDLE1BQU1zSyxnQkFBZ0IsSUFBSTtRQUMxRHBFLGFBQWF0SSxZQUFZb0MsTUFBTWtHLFdBQVcsRUFBRTtRQUM1QzFFLFVBQVVoQjtRQUNWK0osVUFBVXZLLE1BQU11SyxRQUFRLElBQUk7UUFDNUJ2RCxXQUFXbEosZ0JBQWdCa0MsTUFBTWdILFNBQVMsRUFBRTtRQUM1Q1csZ0JBQWdCL0osWUFBWW9DLE1BQU0ySCxjQUFjLEVBQUU7UUFDbER6RCxRQUFRO1FBQ1JmLFNBQVN2RixZQUFZb0MsTUFBTW1ELE9BQU8sRUFBRTtRQUNwQzBHLGlCQUFpQk87UUFDakJSO1FBQ0FuSSxNQUFNekIsTUFBTXlCLElBQUksSUFBSTtRQUNwQkUsUUFBUTJFO0lBQ1Y7SUFDQSxNQUFNdEUsUUFBUXpGLEdBQUcsQ0FBQztXQUNULEVBQUVrTixPQUFPLElBQUksRUFBRXhNLFdBQVdSLFlBQVkrTixlQUFlLEVBQUU7O0VBRWhFLENBQUM7SUFDRCxNQUFNQyxjQUFjLE1BQU03TixNQUFNOEIsUUFBUTRCLFlBQVksRUFBRTBCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9DLElBQUk7SUFFL0YsTUFBTWtELFNBQ0o1RyxTQUNBaEMsTUFBTThLLGtCQUFrQixFQUN4QnJMLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRW1LLFFBQVEsQ0FBQyxFQUFFOEQsV0FBVyxHQUNyRDlNLE1BQU1iLFlBQVl3RixLQUFLLEVBQUVxRSxVQUN6QmhKLE1BQU1iLFlBQVkrTixlQUFlLEVBQUVKLFlBQ25DO1FBQUNHLFVBQVVkLE9BQU9jLFFBQVE7UUFBRXJHLFFBQVF1RixPQUFPdkYsTUFBTTtRQUFFekMsTUFBTWdJLE9BQU9oSSxJQUFJO0lBQUE7SUFFdEUsTUFBTWlKLHNCQUFzQmhNLFNBQVM7UUFDbkNpTSxhQUFheE4sT0FBT0UsT0FBT3FCLFNBQVNDLFNBQVNnRCxVQUFVMkU7UUFDdkRzRSxXQUFXO1FBQ1hDLFVBQVU7WUFBQzdGLFNBQVN5RSxPQUFPdkQsV0FBVztRQUFBO1FBQ3RDMkQsaUJBQWlCTztRQUNqQlUsU0FBU3JCLE9BQU92RixNQUFNO0lBQ3hCO0lBRUEsT0FBT3VHO0FBQ1QsRUFBRTtBQUVGLE9BQU8sTUFBTU0sNEJBQTRCLE9BQ3ZDck0sU0FDQXNCO0lBRUEsTUFBTUUsUUFBUXRDLFlBQVlvQyxNQUFNRSxLQUFLLEVBQUUsS0FBS0MsV0FBVztJQUN2RCxNQUFNK0YsY0FBY3RJLFlBQVlvQyxNQUFNa0csV0FBVyxFQUFFO0lBQ25ELE1BQU0vQyxVQUFVdkYsWUFBWW9DLE1BQU1tRCxPQUFPLEVBQUU7SUFDM0MsSUFBRyxDQUFDaEUsYUFBYTZMLElBQUksQ0FBQzlLLFFBQVEsTUFBTSxJQUFJdEIsTUFBTTtJQUM5QyxJQUFHLENBQUN1RSxTQUFTLE1BQU0sSUFBSXZFLE1BQU07SUFDN0IsSUFBRyxDQUFDc0gsYUFBYSxNQUFNLElBQUl0SCxNQUFNO0lBRWpDLE1BQU1WLFdBQVd0QixNQUFNOEIsUUFBUTRCLFlBQVk7SUFDM0MsTUFBTTBJLFFBQVF2RyxHQUFHLENBQUM7UUFDaEJoRyxZQUFZd08scUJBQXFCO1FBQ2pDeE8sWUFBWXlPLHVCQUF1QjtRQUNuQ3pPLFlBQVkrTixlQUFlO1FBQzNCL04sWUFBWXdGLEtBQUs7S0FDbEIsQ0FBQ3lCLEdBQUcsQ0FBQyxDQUFDeEcsT0FBU2UseUJBQXlCQyxVQUFVaEI7SUFDbkQsTUFBTThMLFFBQVF2RyxHQUFHLENBQUM7UUFDaEIvRixNQUFNOEssa0JBQWtCO1FBQ3hCOUssTUFBTXlPLHdCQUF3QjtRQUM5QnpPLE1BQU0wTywwQkFBMEI7S0FDakMsQ0FBQzFILEdBQUcsQ0FBQyxDQUFDeEcsT0FBU3FCLHFCQUFxQkwsVUFBVWhCO0lBRS9DLE1BQU1zRCxZQUFZekQ7SUFDbEIsTUFBTStELG1CQUFtQjNFLFdBQVcrRCxPQUFPO0lBQzNDLE1BQU1tTCxVQUFVckwsTUFBTUMsY0FBYyxLQUFLO0lBQ3pDLE1BQU1pQixhQUFhO1FBQ2pCQyxNQUFNTDtRQUNOTSxRQUFRO1FBQ1JDLE9BQU9iO1FBQ1BOO1FBQ0FVLFdBQVdoRCxZQUFZb0MsTUFBTVksU0FBUyxFQUFFO1FBQ3hDQyxVQUFVakQsWUFBWW9DLE1BQU1hLFFBQVEsRUFBRTtRQUN0Q1MsYUFBYStKO1FBQ2JwTCxnQkFBZ0JvTDtRQUNoQjdKLFVBQVVoQjtRQUNWbUIsUUFBUWI7SUFDVjtJQUNBLE1BQU1nQixhQUFhO1FBQ2pCLEdBQUl1SixVQUFVO1lBQUMvSixhQUFhO1lBQU1yQixnQkFBZ0I7WUFBTWUsa0JBQWtCUjtRQUFTLElBQUksQ0FBQyxDQUFDO1FBQ3pGSSxXQUFXaEQsWUFBWW9DLE1BQU1ZLFNBQVMsRUFBRSxRQUFRcUg7UUFDaERwSCxVQUFVakQsWUFBWW9DLE1BQU1hLFFBQVEsRUFBRSxRQUFRb0g7UUFDOUN6RyxVQUFVaEI7SUFDWjtJQUNBLE1BQU11QixPQUFPLE1BQU03RCxTQUFTOEQsS0FBSyxDQUFDekYsR0FBRyxDQUFDO21CQUNyQixFQUFFMkQsTUFBTTthQUNkLEVBQUVnQixXQUFXO2FBQ2IsRUFBRVksV0FBVztTQUNqQixFQUFFN0UsV0FBV1IsWUFBWXdGLEtBQUssRUFBRTs7RUFFdkMsQ0FBQyxFQUFFQyxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT0MsSUFBSTtJQUMvQixNQUFNcUgsU0FBUyxNQUFNVSxvQkFBb0J6TCxTQUFTO1FBQ2hEd0g7UUFDQXFFLFVBQVV2TCxrQkFBa0I4RCxHQUFHLENBQUN6RixPQUFPMkMsTUFBTXVLLFFBQVEsS0FBS3ZLLE1BQU11SyxRQUFRLEdBQUc7UUFDM0VwSDtRQUNBMUIsTUFBTXZDLGFBQWE0RCxHQUFHLENBQUN6RixPQUFPMkMsTUFBTXlCLElBQUksS0FBS3pCLE1BQU15QixJQUFJLEdBQUc7UUFDMURFLFFBQVF0RSxPQUFPMEUsTUFBTVosUUFBUVksTUFBTUosVUFBVWI7SUFDL0M7SUFDQSxNQUFNMEksdUJBQXVCOUssU0FBUytLLFFBQVF2RCxhQUFhO0lBQzNELE9BQU91RDtBQUNULEVBQUU7QUFFRixPQUFPLE1BQU02Qix5QkFBeUIsT0FDcEM1TSxTQUNBa0wsY0FDQTJCO0lBRUEsTUFBTXJMLFFBQVF0QyxZQUFZMk4sY0FBYyxLQUFLcEwsV0FBVztJQUN4RCxNQUFNcUwsU0FBUzVOLFlBQVlnTSxjQUFjLElBQUluQixXQUFXO0lBQ3hELElBQUcsQ0FBQ3RKLGFBQWE2TCxJQUFJLENBQUM5SyxVQUFVLENBQUNzTCxRQUFRLE9BQU87SUFDaEQsTUFBTXROLFdBQVd0QixNQUFNOEIsUUFBUTRCLFlBQVk7SUFDM0MsSUFBRyxDQUFDLE1BQU1wQyxTQUFTakIsVUFBVSxDQUFDUixZQUFZK04sZUFBZSxFQUFFcE0sTUFBTSxJQUFJLE9BQU87SUFDNUUsT0FBT0YsU0FBUzhELEtBQUssQ0FBQ3pGLEdBQUcsQ0FBQztrQkFDVixFQUFFVSxXQUFXUixZQUFZK04sZUFBZSxFQUFFOzJDQUNqQixFQUFFZ0IsT0FBTzswQkFDMUIsRUFBRS9PLFlBQVl3RixLQUFLLENBQUM7a0NBQ1osRUFBRS9CLE1BQU07O3VCQUVuQixFQUFFakQsV0FBV1IsWUFBWXlPLHVCQUF1QixFQUFFOzs7Ozs7cUJBTXBELEVBQUVqTyxXQUFXUixZQUFZd08scUJBQXFCLEVBQUU7Ozs7Ozs7RUFPbkUsQ0FBQyxFQUFFL0ksSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9DLElBQUk7QUFDakMsRUFBRTtBQUVGLE9BQU8sTUFBTXFKLG9CQUFvQixDQUMvQi9NLFNBQ0FnTixVQUFnRSxDQUFDLENBQUM7SUFFbEUsTUFBTXhOLFdBQVd0QixNQUFNOEIsUUFBUTRCLFlBQVk7SUFDM0MsT0FBTyxBQUFDLENBQUE7UUFDTixJQUFHLENBQUMsTUFBTXBDLFNBQVNqQixVQUFVLENBQUNSLFlBQVkrTixlQUFlLEVBQUVwTSxNQUFNLElBQUksT0FBTyxFQUFFO1FBQzlFLE1BQU00RCxRQUFRekYsR0FBRyxDQUFDO29CQUNGLEVBQUVVLFdBQVdSLFlBQVkrTixlQUFlLEVBQUU7UUFDdEQsRUFBRWtCLFFBQVF4SCxNQUFNLEdBQUczSCxHQUFHLENBQUMsd0JBQXdCLEVBQUVtUCxRQUFReEgsTUFBTSxDQUFDLENBQUMsR0FBRzNILEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUUsRUFBRW1QLFFBQVEvSixNQUFNLEdBQUdwRixHQUFHLENBQUMsd0JBQXdCLEVBQUVZLE9BQU91TyxRQUFRL0osTUFBTSxFQUFFLENBQUMsR0FBR3BGLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQzlELEVBQUVFLFlBQVl3RixLQUFLLENBQUM7OztJQUc1QyxDQUFDO1FBQ0QsT0FBTy9ELFNBQVM4RCxLQUFLLENBQUNBLE9BQU9FLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPTSxHQUFHO0lBQzFELENBQUE7QUFDRixFQUFFO0FBRUYsT0FBTyxNQUFNa0osNEJBQTRCLE9BQ3ZDak4sU0FDQW1MLGlCQUNBM0YsUUFDQTBILG9CQUFvQixFQUFFO0lBRXRCLE1BQU14QixZQUFZak4sT0FBTzBNO0lBQ3pCLE1BQU1ySixZQUFZekQ7SUFDbEIsTUFBTThPLFdBQVcsTUFBTWpQLE1BQU04QixRQUFRNEIsWUFBWSxFQUM5QzBCLEtBQUssQ0FBQ3pGLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRWUsTUFBTWIsWUFBWStOLGVBQWUsRUFBRUosV0FBVyxDQUFDLENBQUMsRUFDNUVsSSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT0MsSUFBSTtJQUMvQixNQUFNdUUsU0FBUztRQUNiLEdBQUl6QyxXQUFXLGVBQWU7WUFBQzRILGFBQWF0TDtZQUFXb0wsbUJBQW1CaE8sWUFBWWdPLG1CQUFtQjtRQUFLLENBQUM7UUFDL0csR0FBSTFILFdBQVcsVUFBVTtZQUFDNkgsUUFBUXZMO1lBQVdvTCxtQkFBbUJoTyxZQUFZZ08sbUJBQW1CO1FBQUssQ0FBQztRQUNyRyxHQUFJMUgsV0FBVyxjQUFjO1lBQUM4SCxZQUFZeEw7WUFBV29MLG1CQUFtQmhPLFlBQVlnTyxtQkFBbUI7UUFBSyxDQUFDO1FBQzdHLEdBQUkxSCxXQUFXLFlBQVk7WUFBQytILFVBQVV6TDtRQUFTLENBQUM7UUFDaEQwTCxtQkFBbUJ0TyxZQUFZZ08sbUJBQW1CO1FBQ2xEcEssVUFBVWhCO1FBQ1YwRDtJQUNGO0lBQ0EsTUFBTWxDLFFBQVF6RixHQUFHLENBQUM7V0FDVCxFQUFFNk4sVUFBVSxNQUFNLEVBQUV6RCxPQUFPLElBQUksRUFBRTFKLFdBQVdSLFlBQVkrTixlQUFlLEVBQUU7O0VBRWxGLENBQUM7SUFDRCxNQUFNZixTQUFTLE1BQU03TSxNQUFNOEIsUUFBUTRCLFlBQVksRUFBRTBCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9DLElBQUk7SUFFMUYsTUFBTXhGLE1BQU04QixRQUFRNEIsWUFBWSxFQUFFMEIsS0FBSyxDQUFDekYsR0FBRyxDQUFDO2dCQUM5QixFQUFFVSxXQUFXUCxNQUFNOEssa0JBQWtCLEVBQUU7eUJBQzlCLEVBQUVsSyxNQUFNYixZQUFZK04sZUFBZSxFQUFFSixXQUFXO3VCQUNsRCxFQUFFO1FBQ2pCNUksVUFBVWhCO1FBQ1Z3TCxZQUFZOUgsV0FBVyxhQUFhMUQsWUFBWXlIO1FBQ2hEL0Q7SUFDRixFQUFFLElBQUksRUFBRWpILFdBQVdQLE1BQU04SyxrQkFBa0IsRUFBRTtFQUNqRCxDQUFDO0lBQ0QsTUFBTWtELHNCQUFzQmhNLFNBQVM7UUFDbkNpTSxhQUFheE4sT0FBT0UsT0FBT3FCLFNBQVNDLFNBQVNnRCxVQUFVO1FBQ3ZEaUosV0FBVztRQUNYdUIsV0FBV04sVUFBVTNIO1FBQ3JCMkYsaUJBQWlCTztRQUNqQlUsU0FBUzVHO0lBQ1g7SUFFQSxJQUFHQSxXQUFXLFlBQVk7UUFDeEIsTUFBTWtJLDJCQUEyQjFOLFNBQVM7WUFDeEMyTixNQUFNek8sWUFBWWdPLHFCQUFxQiwwQ0FBMEM7WUFDakYxSCxRQUFRO1lBQ1JmLFNBQVMsQ0FBQyxVQUFVLEVBQUVzRyxPQUFPdEcsT0FBTyxJQUFJLGtCQUFrQjtZQUMxRDBHLGlCQUFpQk87WUFDakIzSSxNQUFNO1lBQ05FLFFBQVE4SCxPQUFPOUgsTUFBTTtRQUN2QjtJQUNGO0lBRUEsT0FBTzhIO0FBQ1QsRUFBRTtBQUVGLE9BQU8sTUFBTTZDLDhCQUE4QixPQUN6QzVOLFNBQ0FtTCxpQkFDQTNGLFFBQ0FjO0lBRUF2RyxnQkFBZ0JDO0lBQ2hCLElBQUcsQ0FBQ08sZ0JBQWdCNkQsR0FBRyxDQUFDb0IsU0FBUyxNQUFNLElBQUl0RixNQUFNO0lBQ2pELE1BQU0yTixXQUFXM08sWUFBWW9ILFNBQVM7SUFDdEMsSUFBRyxDQUFDdUgsVUFBVSxNQUFNLElBQUkzTixNQUFNO0lBQzlCLE1BQU02SyxTQUFTLE1BQU1rQywwQkFBMEJqTixTQUFTbUwsaUJBQWlCM0YsUUFBUXFJO0lBQ2pGLE1BQU1DLHdCQUF3QjlOLFNBQVM7UUFDckMrTixjQUFjcFAsT0FBT3FCLFFBQVFDLE9BQU8sRUFBRWdELFVBQVU7UUFDaEQwSyxNQUFNRTtRQUNOMUM7UUFDQTZDLFlBQVk7SUFDZDtJQUNBLE1BQU1OLDJCQUEyQjFOLFNBQVM7UUFDeEMyTixNQUFNRTtRQUNOckksUUFBUTtRQUNSZixTQUFTLENBQUMsT0FBTyxFQUFFc0csT0FBT0csWUFBWSxJQUFJQyxnQkFBZ0IsRUFBRSxFQUFFM0YsT0FBTzdFLE9BQU8sQ0FBQyxNQUFNLE1BQU07UUFDekZ3SztRQUNBcEksTUFBTTtRQUNORSxRQUFROEgsT0FBTzlILE1BQU07SUFDdkI7SUFDQSxNQUFNNkgsdUJBQXVCOUssU0FBUytLLFFBQVE4QyxVQUFVLENBQUMsZUFBZSxFQUFFckksT0FBTzdFLE9BQU8sQ0FBQyxNQUFNLE1BQU07SUFDckcsT0FBT29LO0FBQ1QsRUFBRTtBQUVGLE9BQU8sTUFBTStDLDBCQUEwQixPQUNyQzlOLFNBQ0FzQjtJQUVBLE1BQU1RLFlBQVl6RDtJQUNsQixNQUFNcU4sWUFBWWpOLE9BQU9FLE9BQU8yQyxNQUFNNkosZUFBZSxJQUFJO0lBQ3pELE1BQU04QyxhQUFheFAsT0FBT0UsT0FBTzJDLE1BQU00TSxzQkFBc0IsSUFBSXpRLFdBQVcsQ0FBQyx1QkFBdUIsRUFBRWlPLFVBQVUsQ0FBQyxFQUFFNUosV0FBVztJQUM5SCxNQUFNcU0sVUFBVTtRQUNkMUwsTUFBTXdMO1FBQ050TCxPQUFPYjtRQUNQaU0sY0FBY3RQLE9BQU9FLE9BQU8yQyxNQUFNeU0sWUFBWSxJQUFJL04sU0FBU0MsU0FBU2dELFVBQVU7UUFDOUUwSyxNQUFNek8sWUFBWW9DLE1BQU1xTSxJQUFJLEVBQUU7UUFDOUI3SyxVQUFVaEI7UUFDVnFKLGlCQUFpQk87UUFDakJ3Qyx3QkFBd0JEO1FBQ3hCRCxZQUFZMU0sTUFBTTBNLFVBQVUsSUFBSTtJQUNsQztJQUNBLE1BQU0xSyxRQUFRekYsR0FBRyxDQUFDO1dBQ1QsRUFBRXNRLFFBQVEsSUFBSSxFQUFFNVAsV0FBV1IsWUFBWXlPLHVCQUF1QixFQUFFOztFQUV6RSxDQUFDO0lBQ0QsTUFBTTRCLGVBQWUsTUFBTWxRLE1BQU04QixRQUFRNEIsWUFBWSxFQUFFMEIsS0FBSyxDQUFDQSxPQUFPRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT0MsSUFBSTtJQUVoRyxNQUFNa0QsU0FDSjVHLFNBQ0FoQyxNQUFNME8sMEJBQTBCLEVBQ2hDalAsV0FBVyxDQUFDLHdCQUF3QixFQUFFaU8sVUFBVSxDQUFDLEVBQUV1QyxZQUFZLEdBQy9EclAsTUFBTWIsWUFBWStOLGVBQWUsRUFBRUosWUFDbkM5TSxNQUFNYixZQUFZeU8sdUJBQXVCLEVBQUV5QixhQUMzQztRQUFDRixjQUFjSSxRQUFRSixZQUFZO1FBQUVDLFlBQVlHLFFBQVFILFVBQVU7SUFBQTtJQUdyRSxPQUFPSTtBQUNULEVBQUU7QUFFRixPQUFPLE1BQU1DLDJCQUEyQixDQUN0Q3JPLFNBQ0FtTDtJQUVBLE1BQU03SCxRQUFRekYsR0FBRyxDQUFDO2lDQUNhLEVBQUVlLE1BQU1iLFlBQVkrTixlQUFlLEVBQUVYLGlCQUFpQixDQUFDLEVBQUU1TSxXQUFXUCxNQUFNME8sMEJBQTBCLEVBQUU7OztFQUdySSxDQUFDO0lBRUQsT0FBT3hPLE1BQU04QixRQUFRNEIsWUFBWSxFQUFFMEIsS0FBSyxDQUFDQSxPQUFPRSxJQUFJLENBQUMsQ0FBQ0MsU0FBV0EsT0FBT00sR0FBRztBQUM3RSxFQUFFO0FBRUYsT0FBTyxNQUFNaUksd0JBQXdCLE9BQ25DaE0sU0FDQXNCO0lBRUEsTUFBTVEsWUFBWXpEO0lBQ2xCLE1BQU1xTixZQUFZak4sT0FBT0UsT0FBTzJDLE1BQU02SixlQUFlLElBQUk7SUFDekQsTUFBTW1ELFdBQVc3UCxPQUFPRSxPQUFPMkMsTUFBTWlOLG9CQUFvQixJQUFJOVEsV0FBVyxDQUFDLHFCQUFxQixFQUFFaU8sVUFBVSxDQUFDLEVBQUU1SixVQUFVLENBQUMsRUFBRVIsTUFBTTRLLFNBQVMsRUFBRTtJQUMzSSxNQUFNc0MsUUFBUTtRQUNaL0wsTUFBTTZMO1FBQ04zTCxPQUFPYjtRQUNQbUssYUFBYXhOLE9BQU9FLE9BQU8yQyxNQUFNMkssV0FBVyxJQUFJO1FBQ2hEQyxXQUFXaE4sWUFBWW9DLE1BQU00SyxTQUFTLEVBQUU7UUFDeEN1QixXQUFXdk8sWUFBWW9DLE1BQU1tTSxTQUFTLEVBQUU7UUFDeEN0QixVQUFVN0ssTUFBTTZLLFFBQVEsSUFBSSxDQUFDO1FBQzdCckosVUFBVWhCO1FBQ1Z5TSxzQkFBc0JEO1FBQ3RCbkQsaUJBQWlCTztRQUNqQlUsU0FBU2xOLFlBQVlvQyxNQUFNOEssT0FBTyxFQUFFO0lBQ3RDO0lBQ0EsTUFBTTlJLFFBQVF6RixHQUFHLENBQUM7V0FDVCxFQUFFMlEsTUFBTSxJQUFJLEVBQUVqUSxXQUFXUixZQUFZd08scUJBQXFCLEVBQUU7O0VBRXJFLENBQUM7SUFDRCxNQUFNa0MsYUFBYSxNQUFNdlEsTUFBTThCLFFBQVE0QixZQUFZLEVBQUUwQixLQUFLLENBQUNBLE9BQU9FLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPQyxJQUFJO0lBRTlGLE1BQU1rRCxTQUNKNUcsU0FDQWhDLE1BQU15Tyx3QkFBd0IsRUFDOUJoUCxXQUFXLENBQUMsc0JBQXNCLEVBQUVpTyxVQUFVLENBQUMsRUFBRTRDLFVBQVUsR0FDM0QxUCxNQUFNYixZQUFZK04sZUFBZSxFQUFFSixZQUNuQzlNLE1BQU1iLFlBQVl3TyxxQkFBcUIsRUFBRStCLFdBQ3pDO1FBQUNyQyxhQUFhdUMsTUFBTXZDLFdBQVc7UUFBRUMsV0FBV3NDLE1BQU10QyxTQUFTO0lBQUE7SUFHN0QsT0FBT3VDO0FBQ1QsRUFBRTtBQUVGLE9BQU8sTUFBTUMseUJBQXlCLENBQ3BDMU8sU0FDQW1MO0lBRUEsTUFBTTdILFFBQVF6RixHQUFHLENBQUM7K0JBQ1csRUFBRWUsTUFBTWIsWUFBWStOLGVBQWUsRUFBRVgsaUJBQWlCLENBQUMsRUFBRTVNLFdBQVdQLE1BQU15Tyx3QkFBd0IsRUFBRTs7O0VBR2pJLENBQUM7SUFFRCxPQUFPdk8sTUFBTThCLFFBQVE0QixZQUFZLEVBQUUwQixLQUFLLENBQUNBLE9BQU9FLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPTSxHQUFHO0FBQzdFLEVBQUU7QUFFRixPQUFPLE1BQU0ySiw2QkFBNkIsT0FDeEMxTixTQUNBc0I7SUFFQSxNQUFNUSxZQUFZekQ7SUFDbEIsTUFBTXVKLFVBQVVuSixPQUFPRSxPQUFPMkMsTUFBTTJCLE1BQU0sSUFBSTtJQUM5QyxNQUFNMEwsa0JBQWtCbFEsT0FBT0UsT0FBTzJDLE1BQU1zTixzQkFBc0IsSUFBSW5SLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRW1LLFFBQVEsQ0FBQyxFQUFFOUYsV0FBVztJQUNoSSxNQUFNK00sZUFBZTtRQUNuQnBNLE1BQU1rTTtRQUNOaE0sT0FBT2I7UUFDUDZMLE1BQU16TyxZQUFZb0MsTUFBTXFNLElBQUksRUFBRTtRQUM5QmlCLHdCQUF3QkQ7UUFDeEI3TCxVQUFVaEI7UUFDVjZFLFFBQVFyRixNQUFNcUYsTUFBTTtRQUNwQm5CLFFBQVFsRSxNQUFNa0UsTUFBTSxJQUFJO1FBQ3hCZixTQUFTdkYsWUFBWW9DLE1BQU1tRCxPQUFPLEVBQUU7UUFDcEMwRyxpQkFBaUIxTSxPQUFPRSxPQUFPMkMsTUFBTTZKLGVBQWUsSUFBSTtRQUN4RHBJLE1BQU03RCxZQUFZb0MsTUFBTXlCLElBQUksRUFBRTtRQUM5QkUsUUFBUTJFO0lBQ1Y7SUFDQSxNQUFNdEUsUUFBUXpGLEdBQUcsQ0FBQztXQUNULEVBQUVnUixhQUFhLElBQUksRUFBRXRRLFdBQVdSLFlBQVkrUSxzQkFBc0IsRUFBRTs7RUFFN0UsQ0FBQztJQUNELE1BQU1DLG9CQUFvQixNQUFNN1EsTUFBTThCLFFBQVE0QixZQUFZLEVBQUUwQixLQUFLLENBQUNBLE9BQU9FLElBQUksQ0FBQyxDQUFDQyxTQUFXQSxPQUFPQyxJQUFJO0lBRXJHLE1BQU1rRCxTQUNKNUcsU0FDQWhDLE1BQU1nUix5QkFBeUIsRUFDL0J2UixXQUFXLENBQUMsd0JBQXdCLEVBQUVtSyxRQUFRLENBQUMsRUFBRStHLGlCQUFpQixHQUNsRS9QLE1BQU1iLFlBQVl3RixLQUFLLEVBQUVxRSxVQUN6QmhKLE1BQU1iLFlBQVkrUSxzQkFBc0IsRUFBRUgsa0JBQzFDO1FBQ0VuSixRQUFRcUosYUFBYXJKLE1BQU07UUFDM0IyRixpQkFBaUIwRCxhQUFhMUQsZUFBZTtRQUM3Q3BJLE1BQU04TCxhQUFhOUwsSUFBSTtJQUN6QjtJQUdGLE9BQU9nTTtBQUNULEVBQUU7QUFFRixPQUFPLE1BQU1FLGlDQUFpQyxDQUM1Q2pQLFNBQ0FpRDtJQUVBLE1BQU1LLFFBQVF6RixHQUFHLENBQUM7c0NBQ2tCLEVBQUVlLE1BQU1iLFlBQVl3RixLQUFLLEVBQUVOLFFBQVEsQ0FBQyxFQUFFMUUsV0FBV1AsTUFBTWdSLHlCQUF5QixFQUFFOzs7RUFHdEgsQ0FBQztJQUVELE9BQU85USxNQUFNOEIsUUFBUTRCLFlBQVksRUFBRTBCLEtBQUssQ0FBQ0EsT0FBT0UsSUFBSSxDQUFDLENBQUNDLFNBQVdBLE9BQU9NLEdBQUc7QUFDN0UsRUFBRSJ9
1007
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L3JlYWt0b3IvcGFja2FnZXMvcmVha3Rvci9zcmMvYWN0aW9ucy9jcm0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIGlzIHN1YmplY3QgdG8gdGhlIGFjY29tcGFueWluZyBjb21tZXJjaWFsIExJQ0VOU0UuXG4gKi9cbmltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VJZCwgcGFyc2VQaG9uZSwgcGFyc2VTdHJpbmd9IGZyb20gJ0BubGFicy91dGlscy9wYXJzZXJzL3N0cmluZ3MnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7bGl0ZXJhbH0gZnJvbSAnYXJhbmdvanMvYXFsJztcblxuaW1wb3J0IHtDT0xMRUNUSU9OUywgRURHRVN9IGZyb20gJy4uL2NvbnN0YW50cy9jb2xsZWN0aW9ucy5qcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnLmpzJztcbmltcG9ydCB7dXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMuanMnO1xuaW1wb3J0IHtpc0FkbWluVXNlcn0gZnJvbSAnLi4vdXRpbHMvc2Vzc2lvblV0aWxzLmpzJztcbmltcG9ydCB7c2VzU2VuZH0gZnJvbSAnLi9lbWFpbC5qcyc7XG5pbXBvcnQge3Njb3BlQ3JtU291cmNlT3duZXIsIHZhbGlkYXRlQ3JtU291cmNlTGFiZWxzfSBmcm9tICcuL2NybVNvdXJjZU93bmVyc2hpcC5qcyc7XG5cbmltcG9ydCB0eXBlIHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0fSBmcm9tICcuLi90eXBlcy9hdXRoLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ3VzdG9tZXJOb3RpZmljYXRpb25UeXBlLFxuICBDdXN0b21lck9yZGVyVHlwZSxcbiAgQ3JtQ2FtcGFpZ25JbnB1dCxcbiAgQ3JtQ2FtcGFpZ25UeXBlLFxuICBDcm1Db250YWN0RmlsdGVyLFxuICBDcm1Gb3JtU3VibWlzc2lvbklucHV0LFxuICBDcm1Gb3JtU3VibWlzc2lvblR5cGUsXG4gIE1haWxpbmdMaXN0VHlwZSxcbiAgUHVibGljU3VwcG9ydFRpY2tldEZlZWQsXG4gIFB1YmxpY1N1cHBvcnRUaWNrZXRJbnB1dCxcbiAgU2hvcGlmeUN1c3RvbWVyT3JkZXJJbnB1dCxcbiAgU3VwcG9ydFRpY2tldEV2ZW50VHlwZSxcbiAgU3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlLFxuICBTdXBwb3J0VGlja2V0U3RhdHVzLFxuICBTdXBwb3J0VGlja2V0VHlwZURhdGFcbn0gZnJvbSAnLi4vdHlwZXMvY3JtLnR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtVc2VyVHlwZX0gZnJvbSAnLi4vdHlwZXMvdXNlcnMudHlwZXMuanMnO1xuXG5jb25zdCBub3cgPSAoKTogbnVtYmVyID0+IERhdGUubm93KCk7XG5jb25zdCBjb2xsZWN0aW9uID0gKG5hbWU6IHN0cmluZykgPT4gbGl0ZXJhbChuYW1lKTtcbmNvbnN0IGRvY0tleSA9ICh2YWx1ZSA9ICcnKTogc3RyaW5nID0+IHBhcnNlSWQoU3RyaW5nKHZhbHVlKSk7XG5jb25zdCBkb2NJZCA9IChjb2xsZWN0aW9uTmFtZTogc3RyaW5nLCBrZXkgPSAnJyk6IHN0cmluZyA9PiBgJHtjb2xsZWN0aW9uTmFtZX0vJHtkb2NLZXkoa2V5KX1gO1xuY29uc3QgZXh0ZXJuYWxLZXkgPSAocHJlZml4OiBzdHJpbmcsIGlkID0gJycpOiBzdHJpbmcgPT4gY3JlYXRlSGFzaChgJHtwcmVmaXh9LSR7U3RyaW5nKGlkKX1gLCBudWxsKTtcbmNvbnN0IGNsZWFuU3RyaW5nID0gKHZhbHVlOiB1bmtub3duLCBsZW5ndGggPSA2NDApOiBzdHJpbmcgPT4gcGFyc2VTdHJpbmcoU3RyaW5nKHZhbHVlIHx8ICcnKSwgbGVuZ3RoKTtcbmNvbnN0IGNsZWFuRXh0ZXJuYWxJZCA9ICh2YWx1ZTogdW5rbm93biwgbGVuZ3RoID0gMzIwKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpLnNsaWNlKDAsIGxlbmd0aCk7XG5jb25zdCBlbnN1cmVEb2N1bWVudENvbGxlY3Rpb24gPSBhc3luYyAoZGF0YWJhc2U6IFJldHVyblR5cGU8dHlwZW9mIHVzZURiPiwgbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHRhcmdldCA9IGRhdGFiYXNlLmNvbGxlY3Rpb24obmFtZSk7XG4gIGlmKGF3YWl0IHRhcmdldC5leGlzdHMoKSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IGRhdGFiYXNlLmNyZWF0ZUNvbGxlY3Rpb24obmFtZSk7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBpZighYXdhaXQgdGFyZ2V0LmV4aXN0cygpKSB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbmNvbnN0IGVuc3VyZUVkZ2VDb2xsZWN0aW9uID0gYXN5bmMgKGRhdGFiYXNlOiBSZXR1cm5UeXBlPHR5cGVvZiB1c2VEYj4sIG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCB0YXJnZXQgPSBkYXRhYmFzZS5jb2xsZWN0aW9uKG5hbWUpO1xuICBpZihhd2FpdCB0YXJnZXQuZXhpc3RzKCkpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBkYXRhYmFzZS5jcmVhdGVFZGdlQ29sbGVjdGlvbihuYW1lKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGlmKCFhd2FpdCB0YXJnZXQuZXhpc3RzKCkpIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5jb25zdCByZXF1aXJlQ3JtQWRtaW4gPSAoY29udGV4dDogQXBpQ29udGV4dCk6IHZvaWQgPT4ge1xuICBpZighaXNBZG1pblVzZXIoY29udGV4dC5zZXNzaW9uIGFzIGFueSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2FkbWluaXN0cmF0b3JfYWNjZXNzX3JlcXVpcmVkJyk7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgcmVxdWlyZUNybUFkbWluaXN0cmF0b3IgPSByZXF1aXJlQ3JtQWRtaW47XG5cbmNvbnN0IGFsbG93ZWRDb250YWN0RmllbGRzID0gbmV3IFNldChbJ2VtYWlsJywgJ2ZpcnN0TmFtZScsICdsYXN0TmFtZScsICdwaG9uZScsICdtYXJrZXRpbmdDb25zZW50U291cmNlJywgJ2NybVNvdXJjZSddKTtcbmNvbnN0IHN1cHBvcnRQcmlvcml0aWVzID0gbmV3IFNldChbJ2xvdycsICdub3JtYWwnLCAnaGlnaCcsICd1cmdlbnQnXSk7XG5jb25zdCBzdXBwb3J0U3RhdHVzZXMgPSBuZXcgU2V0KFsnc3VibWl0dGVkJywgJ2luX3Byb2dyZXNzJywgJ2RvbmUnLCAnY29tcGxldGVkJ10pO1xuY29uc3Qgc3VwcG9ydFR5cGVzID0gbmV3IFNldChbJ2RlbGl2ZXJ5X2lzc3VlJywgJ3JlZnVuZF9yZXF1ZXN0JywgJ2J1Z19yZXBvcnQnLCAnYWNjb3VudF9pc3N1ZScsICdnZW5lcmFsX3N1cHBvcnQnXSk7XG5jb25zdCBlbWFpbFBhdHRlcm4gPSAvXlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXSskL3U7XG5jb25zdCBlc2NhcGVIdG1sID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gdmFsdWUucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbmNvbnN0IHNhbml0aXplSHRtbCA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUgfHwgJycpXG4gIC5yZXBsYWNlKC88KHNjcmlwdHxpZnJhbWV8b2JqZWN0fGVtYmVkKVxcYltePl0qPltcXHNcXFNdKj88XFwvXFwxPi9naSwgJycpXG4gIC5yZXBsYWNlKC9cXHNvblxcdytcXHMqPVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W15cXHM+XSspL2dpLCAnJyk7XG5jb25zdCBzYW5pdGl6ZUNzcyA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUgfHwgJycpXG4gIC5yZXBsYWNlKC88XFwvP3N0eWxlXFxiW14+XSo+L2dpLCAnJylcbiAgLnJlcGxhY2UoL0BpbXBvcnRcXHMrW147XSs7Py9naSwgJycpXG4gIC5yZXBsYWNlKC91cmxcXHMqXFwoXFxzKihbJ1wiXT8pamF2YXNjcmlwdDpbXildK1xcKS9naSwgJycpO1xuY29uc3QgaHRtbFRvVGV4dCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHZhbHVlLnJlcGxhY2UoLzxbXj5dKz4vZywgJyAnKS5yZXBsYWNlKC9cXHMrL2csICcgJykudHJpbSgpO1xuY29uc3QgY2h1bmsgPSA8VD4oaXRlbXM6IHJlYWRvbmx5IFRbXSwgc2l6ZTogbnVtYmVyKTogVFtdW10gPT4ge1xuICBjb25zdCBncm91cHM6IFRbXVtdID0gW107XG4gIGZvcihsZXQgaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXggKz0gc2l6ZSkgZ3JvdXBzLnB1c2goaXRlbXMuc2xpY2UoaW5kZXgsIGluZGV4ICsgc2l6ZSkpO1xuICByZXR1cm4gZ3JvdXBzO1xufTtcblxuZXhwb3J0IGNvbnN0IHN1Ym1pdENybUZvcm0gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBDcm1Gb3JtU3VibWlzc2lvbklucHV0XG4pOiBQcm9taXNlPENybUZvcm1TdWJtaXNzaW9uVHlwZT4gPT4ge1xuICBpZih0eXBlb2YgaW5wdXQ/Lm1hcmtldGluZ09wdEluICE9PSAnYm9vbGVhbicpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfbWFya2V0aW5nT3B0SW4nKTtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhpbnB1dC5lbWFpbCwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCByYXdQaG9uZSA9IGNsZWFuU3RyaW5nKGlucHV0LnBob25lLCA4MCk7XG4gIGNvbnN0IHBob25lID0gcmF3UGhvbmUgPyAocGFyc2VQaG9uZShyYXdQaG9uZSkgfHwgcmF3UGhvbmUpIDogJyc7XG4gIGlmKCFlbWFpbCAmJiAhcGhvbmUpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfZW1haWxfb3JfcGhvbmUnKTtcblxuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgYXdhaXQgZW5zdXJlRG9jdW1lbnRDb2xsZWN0aW9uKGRhdGFiYXNlLCBDT0xMRUNUSU9OUy5DUk1fRk9STV9TVUJNSVNTSU9OUyk7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBzb3VyY2UgPSBjbGVhblN0cmluZyhpbnB1dC5zb3VyY2UgfHwgaW5wdXQuZm9ybUlkIHx8ICdmb3JtJywgMTYwKTtcbiAgY29uc3QgdmFsdWVzID0gaW5wdXQudmFsdWVzIHx8IHt9O1xuICBjb25zdCBmaXJzdE5hbWUgPSBjbGVhblN0cmluZyhpbnB1dC5maXJzdE5hbWUgfHwgdmFsdWVzLmZpcnN0TmFtZSwgMTYwKTtcbiAgY29uc3QgbGFzdE5hbWUgPSBjbGVhblN0cmluZyhpbnB1dC5sYXN0TmFtZSB8fCB2YWx1ZXMubGFzdE5hbWUsIDE2MCk7XG4gIGNvbnN0IGdlbmVyYXRlZFVzZXJLZXkgPSBjcmVhdGVIYXNoKGVtYWlsIHx8IHBob25lLCBudWxsKTtcbiAgY29uc3QgY29uc2VudCA9IGlucHV0Lm1hcmtldGluZ09wdEluXG4gICAgPyB7bWFya2V0aW5nT3B0SW5BdDogdGltZXN0YW1wLCBtYXJrZXRpbmdPcHRPdXRBdDogbnVsbH1cbiAgICA6IHttYXJrZXRpbmdPcHRPdXRBdDogdGltZXN0YW1wfTtcbiAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICBfa2V5OiBnZW5lcmF0ZWRVc2VyS2V5LFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBlbWFpbCxcbiAgICBmaXJzdE5hbWUsXG4gICAgbGFzdE5hbWUsXG4gICAgbWFpbGluZ0xpc3Q6IGlucHV0Lm1hcmtldGluZ09wdEluLFxuICAgIG1hcmtldGluZ0NvbnNlbnRTb3VyY2U6IHNvdXJjZSxcbiAgICBtYXJrZXRpbmdPcHRJbjogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBwaG9uZSxcbiAgICB0eXBlOiAnY3JtQ29udGFjdCcsXG4gICAgdXNlckFjY2VzczogMCxcbiAgICB1c2VySWQ6IGdlbmVyYXRlZFVzZXJLZXksXG4gICAgdmVyaWZpZWRFbWFpbDogZmFsc2UsXG4gICAgdmVyaWZpZWRQaG9uZTogZmFsc2UsXG4gICAgLi4uY29uc2VudFxuICB9O1xuICBjb25zdCB1c2VyVXBkYXRlID0ge1xuICAgIC4uLihlbWFpbCA/IHtlbWFpbH0gOiB7fSksXG4gICAgLi4uKGZpcnN0TmFtZSA/IHtmaXJzdE5hbWV9IDoge30pLFxuICAgIC4uLihsYXN0TmFtZSA/IHtsYXN0TmFtZX0gOiB7fSksXG4gICAgLi4uKHBob25lID8ge3Bob25lfSA6IHt9KSxcbiAgICBtYWlsaW5nTGlzdDogaW5wdXQubWFya2V0aW5nT3B0SW4sXG4gICAgbWFya2V0aW5nQ29uc2VudFNvdXJjZTogc291cmNlLFxuICAgIG1hcmtldGluZ09wdEluOiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIC4uLmNvbnNlbnRcbiAgfTtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBMRVQgZXhpc3RpbmcgPSBGSVJTVChcbiAgICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICAgIEZJTFRFUiAoJHtlbWFpbH0gIT0gXCJcIiAmJiBMT1dFUih1c2VyLmVtYWlsIHx8IFwiXCIpID09ICR7ZW1haWx9KVxuICAgICAgICAgIHx8ICgke3Bob25lfSAhPSBcIlwiICYmIHVzZXIucGhvbmUgPT0gJHtwaG9uZX0pXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgTEVUIHVzZXJLZXkgPSBleGlzdGluZyA/IGV4aXN0aW5nLl9rZXkgOiAke2dlbmVyYXRlZFVzZXJLZXl9XG4gICAgVVBTRVJUIHtfa2V5OiB1c2VyS2V5fVxuICAgIElOU0VSVCBNRVJHRSgke3VzZXJJbnNlcnR9LCB7X2tleTogdXNlcktleSwgdXNlcklkOiB1c2VyS2V5fSlcbiAgICBVUERBVEUgJHt1c2VyVXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBVc2VyVHlwZSB8IG51bGw7XG4gIGNvbnN0IHVzZXJJZCA9IGRvY0tleShTdHJpbmcodXNlcj8uX2tleSB8fCB1c2VyPy51c2VySWQgfHwgZ2VuZXJhdGVkVXNlcktleSkpO1xuXG4gIGNvbnN0IHN1Ym1pc3Npb25JZCA9IGNyZWF0ZUhhc2goYGNybS1zdWJtaXNzaW9uLSR7dGltZXN0YW1wfS0ke2VtYWlsfS0ke3Bob25lfWAsIG51bGwpO1xuICBjb25zdCBzdWJtaXNzaW9uID0ge1xuICAgIF9rZXk6IHN1Ym1pc3Npb25JZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGVtYWlsLFxuICAgIGZvcm1JZDogY2xlYW5TdHJpbmcoaW5wdXQuZm9ybUlkLCAxNjApLFxuICAgIG1hcmtldGluZ09wdEluOiBpbnB1dC5tYXJrZXRpbmdPcHRJbixcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHBob25lLFxuICAgIHNvdXJjZSxcbiAgICBzdWJtaXNzaW9uSWQsXG4gICAgdXNlcklkLFxuICAgIHZhbHVlc1xuICB9O1xuICBjb25zdCBzYXZlZCA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBcbiAgICBJTlNFUlQgJHtzdWJtaXNzaW9ufSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0ZPUk1fU1VCTUlTU0lPTlMpfVxuICAgIFJFVFVSTiBORVdcbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcblxuICByZXR1cm4gc2F2ZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3JtRm9ybVN1Ym1pc3Npb25zID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPENybUZvcm1TdWJtaXNzaW9uVHlwZVtdPiA9PiB7XG4gIHJlcXVpcmVDcm1BZG1pbihjb250ZXh0KTtcbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgIGlmKCFhd2FpdCBkYXRhYmFzZS5jb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9GT1JNX1NVQk1JU1NJT05TKS5leGlzdHMoKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxgXG4gICAgICBGT1Igc3VibWlzc2lvbiBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0ZPUk1fU1VCTUlTU0lPTlMpfVxuICAgICAgICBTT1JUIHN1Ym1pc3Npb24uYWRkZWQgREVTQ1xuICAgICAgICBMSU1JVCA1MDBcbiAgICAgICAgUkVUVVJOIHN1Ym1pc3Npb25cbiAgICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG4gIH0pKCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3JtQ29udGFjdHMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgZmlsdGVyOiBDcm1Db250YWN0RmlsdGVyID0ge30pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgcmVxdWlyZUNybUFkbWluKGNvbnRleHQpO1xuICBjb25zdCBzZWFyY2ggPSBjbGVhblN0cmluZyhmaWx0ZXIuc2VhcmNoLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGZpZWxkID0gYWxsb3dlZENvbnRhY3RGaWVsZHMuaGFzKGZpbHRlci5maWVsZCB8fCAnJykgPyBTdHJpbmcoZmlsdGVyLmZpZWxkKSA6ICcnO1xuICBjb25zdCB2YWx1ZSA9IGNsZWFuU3RyaW5nKGZpbHRlci52YWx1ZSwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBvcHRlZEluT25seSA9IGZpbHRlci5vcHRlZEluT25seSAhPT0gZmFsc2U7XG4gIGNvbnN0IG9wZXJhdG9yID0gWydjb250YWlucycsICdlcXVhbHMnLCAnZXhpc3RzJ10uaW5jbHVkZXMoZmlsdGVyLm9wZXJhdG9yIHx8ICcnKSA/IGZpbHRlci5vcGVyYXRvciA6ICdjb250YWlucyc7XG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICBGSUxURVIgJHshb3B0ZWRJbk9ubHl9IHx8IHVzZXIubWFya2V0aW5nT3B0SW4gPT0gdHJ1ZVxuICAgICAgRklMVEVSICR7IXNlYXJjaH0gfHwgQ09OVEFJTlMoTE9XRVIoQ09OQ0FUX1NFUEFSQVRPUihcIiBcIiwgdXNlci5maXJzdE5hbWUsIHVzZXIubGFzdE5hbWUsIHVzZXIuZW1haWwsIHVzZXIucGhvbmUpKSwgJHtzZWFyY2h9KVxuICAgICAgRklMVEVSICR7IWZpZWxkfSB8fCAoJHtvcGVyYXRvciA9PT0gJ2V4aXN0cyd9XG4gICAgICAgID8gSEFTKHVzZXIsICR7ZmllbGR9KVxuICAgICAgICA6ICgke29wZXJhdG9yID09PSAnZXF1YWxzJ30gPyBMT1dFUihUT19TVFJJTkcodXNlclske2ZpZWxkfV0pKSA9PSAke3ZhbHVlfSA6IENPTlRBSU5TKExPV0VSKFRPX1NUUklORyh1c2VyWyR7ZmllbGR9XSkpLCAke3ZhbHVlfSkpKVxuICAgICAgU09SVCB1c2VyLmFkZGVkIERFU0NcbiAgICAgIExJTUlUIDEwMDBcbiAgICAgIFJFVFVSTiBNRVJHRSh1c2VyLCB7Y3JtU291cmNlOiB1c2VyLm1hcmtldGluZ0NvbnNlbnRTb3VyY2V9KVxuICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VuZENybUNhbXBhaWduID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpbnB1dDogQ3JtQ2FtcGFpZ25JbnB1dFxuKTogUHJvbWlzZTxDcm1DYW1wYWlnblR5cGU+ID0+IHtcbiAgcmVxdWlyZUNybUFkbWluKGNvbnRleHQpO1xuICBjb25zdCBzdWJqZWN0ID0gY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKTtcbiAgY29uc3QgYm9keUh0bWwgPSBzYW5pdGl6ZUh0bWwoaW5wdXQuaHRtbCk7XG4gIGNvbnN0IGNzcyA9IHNhbml0aXplQ3NzKGlucHV0LmNzcyk7XG4gIGlmKCFzdWJqZWN0IHx8ICFib2R5SHRtbCkgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9jYW1wYWlnbl9jb250ZW50Jyk7XG5cbiAgY29uc3QgY2FuZGlkYXRlcyA9IGF3YWl0IGdldENybUNvbnRhY3RzKGNvbnRleHQsIHsuLi5pbnB1dC5maWx0ZXIsIG9wdGVkSW5Pbmx5OiB0cnVlfSk7XG4gIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldCgoaW5wdXQudXNlcklkcyB8fCBbXSkubWFwKChpZCkgPT4gZG9jS2V5KGlkKSkpO1xuICBjb25zdCByZWNpcGllbnRzID0gY2FuZGlkYXRlcy5maWx0ZXIoKHVzZXIpID0+XG4gICAgQm9vbGVhbih1c2VyLmVtYWlsKSAmJiAoIXNlbGVjdGVkSWRzLnNpemUgfHwgc2VsZWN0ZWRJZHMuaGFzKGRvY0tleSh1c2VyLnVzZXJJZCB8fCB1c2VyLl9rZXkpKSkpO1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgY2FtcGFpZ25JZCA9IGNyZWF0ZUhhc2goYGNybS1jYW1wYWlnbi0ke3RpbWVzdGFtcH0tJHtzdWJqZWN0fWAsIG51bGwpO1xuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgY29uc3QgY2FtcGFpZ24gPSB7XG4gICAgX2tleTogY2FtcGFpZ25JZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGNhbXBhaWduSWQsXG4gICAgY3NzLFxuICAgIGZhaWxlZENvdW50OiAwLFxuICAgIGh0bWw6IGJvZHlIdG1sLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcmVjaXBpZW50Q291bnQ6IHJlY2lwaWVudHMubGVuZ3RoLFxuICAgIHNlbnRDb3VudDogMCxcbiAgICBzdGF0dXM6ICdzZW5kaW5nJyxcbiAgICBzdWJqZWN0XG4gIH07XG4gIGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbGBJTlNFUlQgJHtjYW1wYWlnbn0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLkNSTV9DQU1QQUlHTlMpfWApO1xuXG4gIGxldCBmYWlsZWRDb3VudCA9IDA7XG4gIGxldCBzZW50Q291bnQgPSAwO1xuICBmb3IoY29uc3QgcmVjaXBpZW50c0JhdGNoIG9mIGNodW5rKHJlY2lwaWVudHMsIDUwKSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZXNTZW5kKHtcbiAgICAgICAgRGVzdGluYXRpb246IHtCY2NBZGRyZXNzZXM6IHJlY2lwaWVudHNCYXRjaC5tYXAoKHJlY2lwaWVudCkgPT4gU3RyaW5nKHJlY2lwaWVudC5lbWFpbCkpfSxcbiAgICAgICAgTWVzc2FnZToge1xuICAgICAgICAgIEJvZHk6IHtIdG1sOiB7RGF0YTogYDxzdHlsZT4ke2Nzc308L3N0eWxlPiR7Ym9keUh0bWx9YH0sIFRleHQ6IHtEYXRhOiBodG1sVG9UZXh0KGJvZHlIdG1sKX19LFxuICAgICAgICAgIFN1YmplY3Q6IHtEYXRhOiBzdWJqZWN0fVxuICAgICAgICB9LFxuICAgICAgICBTb3VyY2U6IGBcIiR7Y29udGV4dC5jb25maWc/LmRldGFpbHM/LnN1cHBvcnROYW1lIHx8ICdSZWFrdG9yJ31cIiA8JHtjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8uc3VwcG9ydEVtYWlsIHx8ICdzdXBwb3J0QHJlYWt0b3IuaW8nfT5gXG4gICAgICB9KTtcbiAgICAgIHNlbnRDb3VudCArPSByZWNpcGllbnRzQmF0Y2gubGVuZ3RoO1xuICAgIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgICBmYWlsZWRDb3VudCArPSByZWNpcGllbnRzQmF0Y2gubGVuZ3RoO1xuICAgIH1cbiAgfVxuICBjb25zdCByZXN1bHQgPSB7Li4uY2FtcGFpZ24sIGZhaWxlZENvdW50LCBzZW50QXQ6IG5vdygpLCBzZW50Q291bnQsIHN0YXR1czogZmFpbGVkQ291bnQgPyAoc2VudENvdW50ID8gJ3BhcnRpYWwnIDogJ2ZhaWxlZCcpIDogJ3NlbnQnfTtcbiAgYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgIFVQREFURSAke2NhbXBhaWduSWR9IFdJVEggJHt7XG4gICAgICBmYWlsZWRDb3VudDogcmVzdWx0LmZhaWxlZENvdW50LFxuICAgICAgbW9kaWZpZWQ6IHJlc3VsdC5zZW50QXQsXG4gICAgICBzZW50QXQ6IHJlc3VsdC5zZW50QXQsXG4gICAgICBzZW50Q291bnQ6IHJlc3VsdC5zZW50Q291bnQsXG4gICAgICBzdGF0dXM6IHJlc3VsdC5zdGF0dXNcbiAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1JNX0NBTVBBSUdOUyl9XG4gIGApO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3Qgc2F2ZUVkZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGVkZ2VDb2xsZWN0aW9uOiBzdHJpbmcsXG4gIGVkZ2VLZXk6IHN0cmluZyxcbiAgZnJvbTogc3RyaW5nLFxuICB0bzogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IGVkZ2UgPSB7XG4gICAgX2Zyb206IGZyb20sXG4gICAgX2tleTogZWRnZUtleSxcbiAgICBfdG86IHRvLFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAuLi5kYXRhXG4gIH07XG4gIGNvbnN0IHF1ZXJ5OiBBcWxRdWVyeSA9IGFxbGBcbiAgICBVUFNFUlQge19rZXk6ICR7ZWRnZUtleX19XG4gICAgSU5TRVJUICR7ZWRnZX1cbiAgICBVUERBVEUgJHtkYXRhfSBJTiAke2NvbGxlY3Rpb24oZWRnZUNvbGxlY3Rpb24pfVxuICBgO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPE1haWxpbmdMaXN0VHlwZT5cbik6IFByb21pc2U8TWFpbGluZ0xpc3RUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBtYWlsaW5nTGlzdElkID0gZG9jS2V5KFN0cmluZyhpbnB1dD8ubWFpbGluZ0xpc3RJZCB8fCBjcmVhdGVIYXNoKGBtYWlsaW5nLWxpc3QtJHtpbnB1dD8ubmFtZX0tJHt0aW1lc3RhbXB9YCkpKTtcbiAgY29uc3QgbWFpbGluZ0xpc3QgPSB7XG4gICAgX2tleTogbWFpbGluZ0xpc3RJZCxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGNyZWF0ZWRCeVVzZXJJZDogZG9jS2V5KFN0cmluZyhjb250ZXh0Py5zZXNzaW9uPy51c2VySWQgfHwgJycpKSxcbiAgICBkZXNjcmlwdGlvbjogY2xlYW5TdHJpbmcoaW5wdXQ/LmRlc2NyaXB0aW9uLCAyMDAwKSxcbiAgICBtYWlsaW5nTGlzdElkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgbmFtZTogY2xlYW5TdHJpbmcoaW5wdXQ/Lm5hbWUsIDE2MCksXG4gICAgc3RhdHVzOiBpbnB1dD8uc3RhdHVzIHx8ICdhY3RpdmUnXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQU0VSVCB7X2tleTogJHttYWlsaW5nTGlzdElkfX1cbiAgICBJTlNFUlQgJHttYWlsaW5nTGlzdH1cbiAgICBVUERBVEUgJHt7XG4gICAgICBkZXNjcmlwdGlvbjogbWFpbGluZ0xpc3QuZGVzY3JpcHRpb24sXG4gICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgbmFtZTogbWFpbGluZ0xpc3QubmFtZSxcbiAgICAgIHN0YXR1czogbWFpbGluZ0xpc3Quc3RhdHVzXG4gICAgfX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1haWxpbmdMaXN0cyA9IChjb250ZXh0OiBBcGlDb250ZXh0KTogUHJvbWlzZTxNYWlsaW5nTGlzdFR5cGVbXT4gPT4ge1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1IgbGlzdCBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuTUFJTElOR19MSVNUUyl9XG4gICAgICBGSUxURVIgbGlzdC5zdGF0dXMgIT0gXCJhcmNoaXZlZFwiXG4gICAgICBTT1JUIGxpc3QuYWRkZWQgREVTQ1xuICAgICAgUkVUVVJOIGxpc3RcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkVXNlclRvTWFpbGluZ0xpc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nLFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmcsXG4gIHNvdXJjZSA9ICdtYW51YWwnXG4pOiBQcm9taXNlPE1haWxpbmdMaXN0VHlwZSB8IG51bGw+ID0+IHtcbiAgY29uc3QgdXNlcktleSA9IGRvY0tleSh1c2VySWQpO1xuICBjb25zdCBsaXN0S2V5ID0gZG9jS2V5KG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBlZGdlS2V5ID0gY3JlYXRlSGFzaChgaGFzTWFpbGluZ0xpc3QtJHt1c2VyS2V5fS0ke2xpc3RLZXl9YCk7XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfTUFJTElOR19MSVNULFxuICAgIGVkZ2VLZXksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHVzZXJLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLk1BSUxJTkdfTElTVFMsIGxpc3RLZXkpLFxuICAgIHtcbiAgICAgIGFkZGVkQnlVc2VySWQ6IGRvY0tleShTdHJpbmcoY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgICBzb3VyY2U6IGNsZWFuU3RyaW5nKHNvdXJjZSwgODApLFxuICAgICAgc3RhdHVzOiAnYWN0aXZlJ1xuICAgIH1cbiAgKTtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpXG4gICAgLnF1ZXJ5KGFxbGBSRVRVUk4gRE9DVU1FTlQoJHtkb2NJZChDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTLCBsaXN0S2V5KX0pYClcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVVc2VyRnJvbU1haWxpbmdMaXN0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB1c2VySWQ6IHN0cmluZyxcbiAgbWFpbGluZ0xpc3RJZDogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgdXNlcktleSA9IGRvY0tleSh1c2VySWQpO1xuICBjb25zdCBsaXN0S2V5ID0gZG9jS2V5KG1haWxpbmdMaXN0SWQpO1xuICBjb25zdCBlZGdlS2V5ID0gY3JlYXRlSGFzaChgaGFzTWFpbGluZ0xpc3QtJHt1c2VyS2V5fS0ke2xpc3RLZXl9YCk7XG4gIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICBtb2RpZmllZDogbm93KCksXG4gICAgcmVtb3ZlZEF0OiBub3coKSxcbiAgICBzdGF0dXM6ICdyZW1vdmVkJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBVUERBVEUgJHtlZGdlS2V5fSBXSVRIICR7dXBkYXRlfSBJTiAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkudGhlbihCb29sZWFuKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYWlsaW5nTGlzdFVzZXJzID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBtYWlsaW5nTGlzdElkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBsaXN0SWQgPSBkb2NJZChDT0xMRUNUSU9OUy5NQUlMSU5HX0xJU1RTLCBtYWlsaW5nTGlzdElkKTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIHVzZXIsIGVkZ2UgSU4gMS4uMSBJTkJPVU5EICR7bGlzdElkfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX01BSUxJTkdfTElTVCl9XG4gICAgICBGSUxURVIgZWRnZS5zdGF0dXMgPT0gXCJhY3RpdmVcIlxuICAgICAgU09SVCB1c2VyLmVtYWlsIEFTQ1xuICAgICAgUkVUVVJOIHVzZXJcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VXNlcnNCeVB1cmNoYXNlZFByb2R1Y3QgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHByb2R1Y3RJZDogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgcHJvZHVjdEtleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LXByb2R1Y3QnLCBwcm9kdWN0SWQpO1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBGT1Igb3JkZXIgSU4gMS4uMSBJTkJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUywgcHJvZHVjdEtleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QpfVxuICAgICAgRk9SIHVzZXIgSU4gMS4uMSBJTkJPVU5EIG9yZGVyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgU09SVCB1c2VyLmVtYWlsIEFTQ1xuICAgICAgICBSRVRVUk4gRElTVElOQ1QgdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGlnaWJsZU1haWxpbmdVc2VycyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgb3B0aW9uczoge3JlYWRvbmx5IG1haWxpbmdMaXN0SWQ/OiBzdHJpbmc7IHJlYWRvbmx5IHByb2R1Y3RJZD86IHN0cmluZzsgcmVhZG9ubHkgZXhjbHVkZU9wZW5TdXBwb3J0VGlja2V0cz86IGJvb2xlYW59ID0ge31cbik6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzID0gb3B0aW9ucy5leGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzICE9PSBmYWxzZTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgTEVUIGJhc2VVc2VycyA9IChcbiAgICAgIEZPUiB1c2VyIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5VU0VSUyl9XG4gICAgICAgIEZJTFRFUiB1c2VyLm1hcmtldGluZ09wdEluID09IHRydWVcbiAgICAgICAgRklMVEVSIHVzZXIuZW1haWwgIT0gbnVsbCAmJiB1c2VyLmVtYWlsICE9IFwiXCJcbiAgICAgICAgRklMVEVSIHVzZXIuZW1haWxEZWxpdmVyeVN0YXR1cyA9PSBudWxsIHx8IHVzZXIuZW1haWxEZWxpdmVyeVN0YXR1cyA9PSBcInZhbGlkXCJcbiAgICAgICAgJHtvcHRpb25zLm1haWxpbmdMaXN0SWQgPyBhcWxgXG4gICAgICAgICAgRklMVEVSIExFTkdUSChcbiAgICAgICAgICAgIEZPUiBsaXN0IElOIDEuLjEgT1VUQk9VTkQgdXNlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19NQUlMSU5HX0xJU1QpfVxuICAgICAgICAgICAgICBGSUxURVIgbGlzdC5fa2V5ID09ICR7ZG9jS2V5KG9wdGlvbnMubWFpbGluZ0xpc3RJZCl9XG4gICAgICAgICAgICAgIFJFVFVSTiBsaXN0XG4gICAgICAgICAgKSA+IDBcbiAgICAgICAgYCA6IGFxbGBgfVxuICAgICAgICAke29wdGlvbnMucHJvZHVjdElkID8gYXFsYFxuICAgICAgICAgIEZJTFRFUiBMRU5HVEgoXG4gICAgICAgICAgICBGT1Igb3JkZXIgSU4gMS4uMSBPVVRCT1VORCB1c2VyLl9pZCAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX09SREVSKX1cbiAgICAgICAgICAgICAgRk9SIHByb2R1Y3QgSU4gMS4uMSBPVVRCT1VORCBvcmRlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19QVVJDSEFTRURfUFJPRFVDVCl9XG4gICAgICAgICAgICAgICAgRklMVEVSIHByb2R1Y3QucHJvZHVjdElkID09ICR7U3RyaW5nKG9wdGlvbnMucHJvZHVjdElkKX1cbiAgICAgICAgICAgICAgICBSRVRVUk4gcHJvZHVjdFxuICAgICAgICAgICkgPiAwXG4gICAgICAgIGAgOiBhcWxgYH1cbiAgICAgICAgJHtleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzID8gYXFsYFxuICAgICAgICAgIEZJTFRFUiBMRU5HVEgoXG4gICAgICAgICAgICBGT1IgdGlja2V0IElOIDEuLjEgT1VUQk9VTkQgdXNlci5faWQgJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gICAgICAgICAgICAgIEZJTFRFUiB0aWNrZXQuc3RhdHVzIElOIFtcIm9wZW5cIiwgXCJpbl9wcm9ncmVzc1wiLCBcIndhaXRpbmdfb25fY3VzdG9tZXJcIiwgXCJ3YWl0aW5nX29uX2ludGVybmFsXCJdXG4gICAgICAgICAgICAgIEZJTFRFUiB0aWNrZXQucHJpb3JpdHkgSU4gW1wiaGlnaFwiLCBcInVyZ2VudFwiXVxuICAgICAgICAgICAgICBSRVRVUk4gdGlja2V0XG4gICAgICAgICAgKSA9PSAwXG4gICAgICAgIGAgOiBhcWxgYH1cbiAgICAgICAgUkVUVVJOIHVzZXJcbiAgICApXG4gICAgRk9SIHVzZXIgSU4gYmFzZVVzZXJzXG4gICAgICBTT1JUIHVzZXIuZW1haWwgQVNDXG4gICAgICBSRVRVUk4gRElTVElOQ1QgdXNlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpbmdlc3RTaG9waWZ5Q3VzdG9tZXJPcmRlciA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFNob3BpZnlDdXN0b21lck9yZGVySW5wdXQsXG4gIHNjb3BlPzoge3JlYWRvbmx5IGFwcElkOiBzdHJpbmd9XG4pOiBQcm9taXNlPEN1c3RvbWVyT3JkZXJUeXBlPiA9PiB7XG4gIGNvbnRleHQgPSBhd2FpdCBzY29wZUNybVNvdXJjZU93bmVyKGNvbnRleHQsIHNjb3BlPy5hcHBJZCk7XG4gIGNvbnN0IGFwcElkID0gc2NvcGU/LmFwcElkO1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3Qgc2hvcGlmeUN1c3RvbWVySWQgPSBjbGVhbkV4dGVybmFsSWQoaW5wdXQuc2hvcGlmeUN1c3RvbWVySWQsIDE2MCk7XG4gIGNvbnN0IHNob3BpZnlPcmRlcklkID0gY2xlYW5FeHRlcm5hbElkKGlucHV0LnNob3BpZnlPcmRlcklkLCAxNjApO1xuICBjb25zdCBjdXN0b21lciA9IGlucHV0LmN1c3RvbWVyIHx8IHt9O1xuICBjb25zdCBlbWFpbCA9IGNsZWFuU3RyaW5nKGN1c3RvbWVyLmVtYWlsLCAzMjApLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHByb2R1Y3RJZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLihpbnB1dC5wcm9kdWN0SWRzIHx8IFtdKSwgLi4uKGlucHV0LnByb2R1Y3RzIHx8IFtdKS5tYXAoKHByb2R1Y3QpID0+IHByb2R1Y3QucHJvZHVjdElkKV1cbiAgICAubWFwKChwcm9kdWN0SWQpID0+IGNsZWFuRXh0ZXJuYWxJZChwcm9kdWN0SWQsIDMyMCkpXG4gICAgLmZpbHRlcihCb29sZWFuKSkpO1xuXG4gIGlmKGFwcElkICYmIHByb2R1Y3RJZHMubGVuZ3RoID4gNTApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NybV9zb3VyY2VfcHJvZHVjdF9saW1pdCcpO1xuICB9XG4gIGlmKCFzaG9waWZ5Q3VzdG9tZXJJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfc2hvcGlmeUN1c3RvbWVySWQnKTtcbiAgfVxuICBpZighc2hvcGlmeU9yZGVySWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlcXVpcmVkX3Nob3BpZnlPcmRlcklkJyk7XG4gIH1cbiAgaWYoIWVtYWlsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyZXF1aXJlZF9jdXN0b21lckVtYWlsJyk7XG4gIH1cblxuICBjb25zdCB1c2VyS2V5ID0gZXh0ZXJuYWxLZXkoJ3Nob3BpZnktdXNlcicsIGFwcElkID8gYCR7YXBwSWR9OiR7c2hvcGlmeUN1c3RvbWVySWR9YCA6IHNob3BpZnlDdXN0b21lcklkKTtcbiAgY29uc3Qgb3JkZXJLZXkgPSBleHRlcm5hbEtleSgnc2hvcGlmeS1vcmRlcicsIGFwcElkID8gYCR7YXBwSWR9OiR7c2hvcGlmeU9yZGVySWR9YCA6IHNob3BpZnlPcmRlcklkKTtcbiAgaWYoYXBwSWQpIHtcbiAgICBhd2FpdCB2YWxpZGF0ZUNybVNvdXJjZUxhYmVscyhjb250ZXh0LCBhcHBJZCwgW3tjb2xsZWN0aW9uOiBDT0xMRUNUSU9OUy5VU0VSUywgaWQ6IHVzZXJLZXl9LFxuICAgICAge2NvbGxlY3Rpb246IENPTExFQ1RJT05TLkNVU1RPTUVSX09SREVSUywgaWQ6IG9yZGVyS2V5fSwgLi4ucHJvZHVjdElkcy5tYXAoKHByb2R1Y3RJZCkgPT4gKHtcbiAgICAgICAgY29sbGVjdGlvbjogQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUywgaWQ6IGV4dGVybmFsS2V5KCdzaG9waWZ5LXByb2R1Y3QnLCBgJHthcHBJZH06JHtwcm9kdWN0SWR9YCl9KSldKTtcbiAgfVxuICBjb25zdCB1c2VySW5zZXJ0ID0ge1xuICAgIF9rZXk6IHVzZXJLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICAuLi4oYXBwSWQgPyB7YXBwSWR9IDoge30pLFxuICAgIGVtYWlsLFxuICAgIGZpcnN0TmFtZTogY2xlYW5TdHJpbmcoY3VzdG9tZXIuZmlyc3ROYW1lLCAxNjApLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5sYXN0TmFtZSwgMTYwKSxcbiAgICBtYXJrZXRpbmdDb25zZW50U291cmNlOiAnc2hvcGlmeScsXG4gICAgbWFya2V0aW5nT3B0SW46IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlLFxuICAgIG1hcmtldGluZ09wdEluQXQ6IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlID8gdGltZXN0YW1wIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc2hvcGlmeUN1c3RvbWVySWQsXG4gICAgdHlwZTogJ2NybUNvbnRhY3QnLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCB1c2VyVXBkYXRlID0ge1xuICAgIGVtYWlsLFxuICAgIGZpcnN0TmFtZTogY2xlYW5TdHJpbmcoY3VzdG9tZXIuZmlyc3ROYW1lLCAxNjApLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhjdXN0b21lci5sYXN0TmFtZSwgMTYwKSxcbiAgICBsYXN0UHVyY2hhc2VkQXQ6IGlucHV0LnB1cmNoYXNlZEF0IHx8IHRpbWVzdGFtcCxcbiAgICBtYXJrZXRpbmdDb25zZW50U291cmNlOiAnc2hvcGlmeScsXG4gICAgbWFya2V0aW5nT3B0SW46IGN1c3RvbWVyLm1hcmtldGluZ09wdEluID09PSB0cnVlLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc2hvcGlmeUN1c3RvbWVySWRcbiAgfTtcbiAgY29uc3QgdXNlclF1ZXJ5ID0gYXFsYFxuICAgIExFVCBtYXRjaGVzID0gKFxuICAgICAgRk9SIHVzZXIgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICAgICAgRklMVEVSICR7YXBwSWQgPyBhcWxgdXNlci5hcHBJZCA9PSAke2FwcElkfSBBTkQgdXNlci5zaG9waWZ5Q3VzdG9tZXJJZCA9PSAke3Nob3BpZnlDdXN0b21lcklkfWBcbiAgICA6IGFxbGB1c2VyLnNob3BpZnlDdXN0b21lcklkID09ICR7c2hvcGlmeUN1c3RvbWVySWR9IHx8IHVzZXIuZW1haWwgPT0gJHtlbWFpbH1gfSBcbiAgICAgICAgTElNSVQgJHthcHBJZCA/IDIgOiAxfVxuICAgICAgICBSRVRVUk4gdXNlclxuICAgIClcbiAgICBGSUxURVIgTEVOR1RIKG1hdGNoZXMpIDwgMlxuICAgIExFVCBleGlzdGluZyA9IEZJUlNUKG1hdGNoZXMpXG4gICAgJHthcHBJZCA/IGFxbGBMRVQgb3duZWQgPSBET0NVTUVOVCgndXNlcnMnLCAke3VzZXJLZXl9KVxuICAgICAgRklMVEVSIG93bmVkID09IG51bGwgT1IgKG93bmVkLmFwcElkID09ICR7YXBwSWR9IEFORCBvd25lZC5zaG9waWZ5Q3VzdG9tZXJJZCA9PSAke3Nob3BpZnlDdXN0b21lcklkfVxuICAgICAgICBBTkQgb3duZWQuZGVsZXRlZCAhPSB0cnVlKVxuICAgICAgRklMVEVSIGV4aXN0aW5nID09IG51bGwgT1IgZXhpc3RpbmcuZGVsZXRlZCAhPSB0cnVlYCA6IGFxbGBgfVxuICAgIExFVCB1c2VyS2V5ID0gZXhpc3RpbmcgPyBleGlzdGluZy5fa2V5IDogJHt1c2VyS2V5fVxuICAgIFVQU0VSVCB7X2tleTogdXNlcktleX1cbiAgICBJTlNFUlQgTUVSR0UoJHt1c2VySW5zZXJ0fSwge19rZXk6IHVzZXJLZXksIHVzZXJJZDogdXNlcktleX0pXG4gICAgVVBEQVRFICR7dXNlclVwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkodXNlclF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFVzZXJUeXBlO1xuICBpZihhcHBJZCAmJiAoIXVzZXI/Ll9rZXkgfHwgdXNlci5hcHBJZCAhPT0gYXBwSWQgfHwgdXNlci5zaG9waWZ5Q3VzdG9tZXJJZCAhPT0gc2hvcGlmeUN1c3RvbWVySWQgfHwgdXNlci5kZWxldGVkID09PSB0cnVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY3JtX3NvdXJjZV9jdXN0b21lcl9iaW5kaW5nX2NoYW5nZWQnKTtcbiAgfVxuICBjb25zdCByZXNvbHZlZFVzZXJLZXkgPSBkb2NLZXkoU3RyaW5nKHVzZXI/Ll9rZXkgfHwgdXNlcj8udXNlcklkIHx8IHVzZXJLZXkpKTtcbiAgY29uc3Qgb3JkZXIgPSB7XG4gICAgX2tleTogb3JkZXJLZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICAuLi4oYXBwSWQgPyB7YXBwSWR9IDoge30pLFxuICAgIGN1cnJlbmN5OiBjbGVhblN0cmluZyhpbnB1dC5jdXJyZW5jeSwgMykudG9VcHBlckNhc2UoKSxcbiAgICBjdXN0b21lck9yZGVySWQ6IG9yZGVyS2V5LFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgcHJvZHVjdElkcyxcbiAgICBwdXJjaGFzZWRBdDogaW5wdXQucHVyY2hhc2VkQXQgfHwgdGltZXN0YW1wLFxuICAgIHNob3BpZnlDdXN0b21lcklkLFxuICAgIHNob3BpZnlPcmRlcklkLFxuICAgIHRvdGFsUHJpY2U6IE51bWJlcihpbnB1dC50b3RhbFByaWNlIHx8IDApLFxuICAgIHVzZXJJZDogcmVzb2x2ZWRVc2VyS2V5XG4gIH07XG4gIGNvbnN0IG9yZGVyUXVlcnkgPSBhcWxgXG4gICAgJHthcHBJZCA/IGFxbGBMRVQgb3duZWQgPSBET0NVTUVOVCgnY3VzdG9tZXJPcmRlcnMnLCAke29yZGVyS2V5fSlcbiAgICAgIEZJTFRFUiBvd25lZCA9PSBudWxsIE9SIChvd25lZC5hcHBJZCA9PSAke2FwcElkfSBBTkQgb3duZWQudXNlcklkID09ICR7cmVzb2x2ZWRVc2VyS2V5fVxuICAgICAgICBBTkQgb3duZWQuc2hvcGlmeUN1c3RvbWVySWQgPT0gJHtzaG9waWZ5Q3VzdG9tZXJJZH0gQU5EIG93bmVkLnNob3BpZnlPcmRlcklkID09ICR7c2hvcGlmeU9yZGVySWR9XG4gICAgICAgIEFORCBvd25lZC5kZWxldGVkICE9IHRydWUpYCA6IGFxbGBgfVxuICAgIFVQU0VSVCB7X2tleTogJHtvcmRlcktleX19XG4gICAgSU5TRVJUICR7b3JkZXJ9XG4gICAgVVBEQVRFICR7e1xuICAgICAgY3VycmVuY3k6IG9yZGVyLmN1cnJlbmN5LFxuICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgIHByb2R1Y3RJZHMsXG4gICAgICBwdXJjaGFzZWRBdDogb3JkZXIucHVyY2hhc2VkQXQsXG4gICAgICB0b3RhbFByaWNlOiBvcmRlci50b3RhbFByaWNlLFxuICAgICAgdXNlcklkOiByZXNvbHZlZFVzZXJLZXlcbiAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuQ1VTVE9NRVJfT1JERVJTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkT3JkZXIgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkob3JkZXJRdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBDdXN0b21lck9yZGVyVHlwZTtcbiAgaWYoYXBwSWQgJiYgKHNhdmVkT3JkZXI/LmFwcElkICE9PSBhcHBJZCB8fCBzYXZlZE9yZGVyLnVzZXJJZCAhPT0gcmVzb2x2ZWRVc2VyS2V5XG4gICAgfHwgc2F2ZWRPcmRlci5zaG9waWZ5Q3VzdG9tZXJJZCAhPT0gc2hvcGlmeUN1c3RvbWVySWQgfHwgc2F2ZWRPcmRlci5zaG9waWZ5T3JkZXJJZCAhPT0gc2hvcGlmeU9yZGVySWRcbiAgICB8fCBzYXZlZE9yZGVyLmRlbGV0ZWQgPT09IHRydWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjcm1fc291cmNlX29yZGVyX2JpbmRpbmdfY2hhbmdlZCcpO1xuICB9XG5cbiAgYXdhaXQgc2F2ZUVkZ2UoXG4gICAgY29udGV4dCxcbiAgICBFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIsXG4gICAgY3JlYXRlSGFzaChgaGFzQ3VzdG9tZXJPcmRlci0ke3Jlc29sdmVkVXNlcktleX0tJHtvcmRlcktleX1gLCBhcHBJZCA/IG51bGwgOiB1bmRlZmluZWQpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCByZXNvbHZlZFVzZXJLZXkpLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLkNVU1RPTUVSX09SREVSUywgb3JkZXJLZXkpLFxuICAgIHtwdXJjaGFzZWRBdDogb3JkZXIucHVyY2hhc2VkQXQsIHNob3BpZnlDdXN0b21lcklkLCBzaG9waWZ5T3JkZXJJZH1cbiAgKTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChwcm9kdWN0SWRzLm1hcChhc3luYyAocHJvZHVjdElkKSA9PiB7XG4gICAgY29uc3QgcHJvZHVjdCA9IChpbnB1dC5wcm9kdWN0cyB8fCBbXSkuZmluZCgoaXRlbSkgPT4gaXRlbS5wcm9kdWN0SWQgPT09IHByb2R1Y3RJZCkgfHwge3Byb2R1Y3RJZH07XG4gICAgY29uc3QgcHJvZHVjdEtleSA9IGV4dGVybmFsS2V5KCdzaG9waWZ5LXByb2R1Y3QnLCBhcHBJZCA/IGAke2FwcElkfToke3Byb2R1Y3RJZH1gIDogcHJvZHVjdElkKTtcbiAgICBjb25zdCBwcm9kdWN0RG9jID0ge1xuICAgICAgX2tleTogcHJvZHVjdEtleSxcbiAgICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgICAuLi4oYXBwSWQgPyB7YXBwSWR9IDoge30pLFxuICAgICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICAgIHByb2R1Y3RJZCxcbiAgICAgIHRpdGxlOiBjbGVhblN0cmluZyhwcm9kdWN0LnRpdGxlLCAzMjApLFxuICAgICAgdmFyaWFudElkOiBjbGVhbkV4dGVybmFsSWQocHJvZHVjdC52YXJpYW50SWQsIDE2MClcbiAgICB9O1xuICAgIGNvbnN0IHByb2R1Y3RRdWVyeSA9IGFxbGBcbiAgICAgICR7YXBwSWQgPyBhcWxgTEVUIG93bmVkID0gRE9DVU1FTlQoJ3Nob3BpZnlQcm9kdWN0cycsICR7cHJvZHVjdEtleX0pXG4gICAgICAgIEZJTFRFUiBvd25lZCA9PSBudWxsIE9SIChvd25lZC5hcHBJZCA9PSAke2FwcElkfSBBTkQgb3duZWQucHJvZHVjdElkID09ICR7cHJvZHVjdElkfSBBTkQgb3duZWQuZGVsZXRlZCAhPSB0cnVlKWAgOiBhcWxgYH1cbiAgICAgIFVQU0VSVCB7X2tleTogJHtwcm9kdWN0S2V5fX1cbiAgICAgIElOU0VSVCAke3Byb2R1Y3REb2N9XG4gICAgICBVUERBVEUgJHt7XG4gICAgICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgICAgIHRpdGxlOiBwcm9kdWN0RG9jLnRpdGxlLFxuICAgICAgICB2YXJpYW50SWQ6IHByb2R1Y3REb2MudmFyaWFudElkXG4gICAgICB9fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU0hPUElGWV9QUk9EVUNUUyl9XG4gICAgICBSRVRVUk4gTkVXXG4gICAgYDtcbiAgICBjb25zdCBzYXZlZFByb2R1Y3QgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocHJvZHVjdFF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuICAgIGlmKGFwcElkICYmICghc2F2ZWRQcm9kdWN0IHx8IHNhdmVkUHJvZHVjdC5hcHBJZCAhPT0gYXBwSWQgfHwgc2F2ZWRQcm9kdWN0LnByb2R1Y3RJZCAhPT0gcHJvZHVjdElkXG4gICAgICB8fCBzYXZlZFByb2R1Y3QuZGVsZXRlZCA9PT0gdHJ1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3JtX3NvdXJjZV9wcm9kdWN0X2JpbmRpbmdfY2hhbmdlZCcpO1xuICAgIH1cbiAgICBhd2FpdCBzYXZlRWRnZShcbiAgICAgIGNvbnRleHQsXG4gICAgICBFREdFUy5IQVNfUFVSQ0hBU0VEX1BST0RVQ1QsXG4gICAgICBjcmVhdGVIYXNoKGBoYXNQdXJjaGFzZWRQcm9kdWN0LSR7b3JkZXJLZXl9LSR7cHJvZHVjdEtleX1gLCBhcHBJZCA/IG51bGwgOiB1bmRlZmluZWQpLFxuICAgICAgZG9jSWQoQ09MTEVDVElPTlMuQ1VTVE9NRVJfT1JERVJTLCBvcmRlcktleSksXG4gICAgICBkb2NJZChDT0xMRUNUSU9OUy5TSE9QSUZZX1BST0RVQ1RTLCBwcm9kdWN0S2V5KSxcbiAgICAgIHtwcm9kdWN0SWQsIHB1cmNoYXNlZEF0OiBvcmRlci5wdXJjaGFzZWRBdH1cbiAgICApO1xuICB9KSk7XG5cbiAgYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbGBcbiAgICBVUERBVEUgJHtyZXNvbHZlZFVzZXJLZXl9XG4gICAgV0lUSCB7XG4gICAgICBsYXN0UHVyY2hhc2VkQXQ6ICR7b3JkZXIucHVyY2hhc2VkQXR9LFxuICAgICAgdG90YWxPcmRlckNvdW50OiBMRU5HVEgoXG4gICAgICAgIEZPUiBvcmRlciBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuVVNFUlMsIHJlc29sdmVkVXNlcktleSl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfQ1VTVE9NRVJfT1JERVIpfVxuICAgICAgICAgIFJFVFVSTiBvcmRlclxuICAgICAgKSxcbiAgICAgIHRvdGFsU3BlbmQ6IFNVTShcbiAgICAgICAgRk9SIG9yZGVyIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgcmVzb2x2ZWRVc2VyS2V5KX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9PUkRFUil9XG4gICAgICAgICAgUkVUVVJOIFRPX05VTUJFUihvcmRlci50b3RhbFByaWNlKVxuICAgICAgKVxuICAgIH0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlVTRVJTKX1cbiAgYCk7XG5cbiAgcmV0dXJuIHNhdmVkT3JkZXI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VzdG9tZXJPcmRlcnNCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEN1c3RvbWVyT3JkZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgRk9SIG9yZGVyIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgdXNlcklkKX0gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19DVVNUT01FUl9PUkRFUil9XG4gICAgICBTT1JUIG9yZGVyLnB1cmNoYXNlZEF0IERFU0NcbiAgICAgIFJFVFVSTiBvcmRlclxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmNvbnN0IHNlbmRTdXBwb3J0VGlja2V0RW1haWwgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHRpY2tldDogU3VwcG9ydFRpY2tldFR5cGVEYXRhLFxuICBkZXRhaWxzOiBzdHJpbmcsXG4gIGhlYWRpbmc6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkoYXFsYFxuICAgIFJFVFVSTiBET0NVTUVOVCgke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB0aWNrZXQudXNlcklkKX0pXG4gIGApLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgVXNlclR5cGUgfCBudWxsO1xuICBpZighdXNlcj8uZW1haWwpIHJldHVybjtcbiAgY29uc3Qgc3VwcG9ydE5hbWUgPSBjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8uc3VwcG9ydE5hbWUgfHwgQ29uZmlnLmdldCgnZGV0YWlscy5zdXBwb3J0TmFtZScpIHx8ICdSZWFrdG9yIFN1cHBvcnQnO1xuICBjb25zdCBzdXBwb3J0RW1haWwgPSBjb250ZXh0LmNvbmZpZz8uZGV0YWlscz8uc3VwcG9ydEVtYWlsIHx8IENvbmZpZy5nZXQoJ2RldGFpbHMuc3VwcG9ydEVtYWlsJykgfHwgJ3N1cHBvcnRAcmVha3Rvci5pbyc7XG4gIGNvbnN0IHRpY2tldE51bWJlciA9IFN0cmluZyh0aWNrZXQudGlja2V0TnVtYmVyIHx8IHRpY2tldC5zdXBwb3J0VGlja2V0SWQgfHwgdGlja2V0Ll9rZXkgfHwgJycpO1xuICBjb25zdCBzdGF0dXNVcmwgPSBgaHR0cHM6Ly9jcm0ucmVha3Rvci5pby9zdXBwb3J0L3N0YXR1cz90aWNrZXQ9JHtlbmNvZGVVUklDb21wb25lbnQodGlja2V0TnVtYmVyKX1gO1xuICBjb25zdCB0ZXh0ID0gYCR7aGVhZGluZ31cXG5cXG5UaWNrZXQ6ICR7dGlja2V0TnVtYmVyfVxcblN0YXR1czogJHt0aWNrZXQuc3RhdHVzIHx8ICdzdWJtaXR0ZWQnfVxcblxcbiR7ZGV0YWlsc31cXG5cXG5UcmFjayB0aGlzIHRpY2tldDogJHtzdGF0dXNVcmx9YDtcbiAgYXdhaXQgc2VzU2VuZCh7XG4gICAgRGVzdGluYXRpb246IHtUb0FkZHJlc3NlczogW1N0cmluZyh1c2VyLmVtYWlsKV19LFxuICAgIE1lc3NhZ2U6IHtcbiAgICAgIEJvZHk6IHtIdG1sOiB7RGF0YTogYDxoMT4ke2VzY2FwZUh0bWwoaGVhZGluZyl9PC9oMT48cD48c3Ryb25nPlRpY2tldDo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKHRpY2tldE51bWJlcil9PC9wPjxwPjxzdHJvbmc+U3RhdHVzOjwvc3Ryb25nPiAke2VzY2FwZUh0bWwoU3RyaW5nKHRpY2tldC5zdGF0dXMgfHwgJ3N1Ym1pdHRlZCcpKX08L3A+PHByZSBzdHlsZT1cIndoaXRlLXNwYWNlOnByZS13cmFwO2ZvbnQtZmFtaWx5OmluaGVyaXRcIj4ke2VzY2FwZUh0bWwoZGV0YWlscyl9PC9wcmU+PHA+PGEgaHJlZj1cIiR7ZXNjYXBlSHRtbChzdGF0dXNVcmwpfVwiPlRyYWNrIHRoaXMgdGlja2V0IG9ubGluZTwvYT48L3A+YH0sIFRleHQ6IHtEYXRhOiB0ZXh0fX0sXG4gICAgICBTdWJqZWN0OiB7RGF0YTogYFske3RpY2tldE51bWJlcn1dICR7aGVhZGluZ31gfVxuICAgIH0sXG4gICAgU291cmNlOiBgXCIke3N1cHBvcnROYW1lfVwiIDwke3N1cHBvcnRFbWFpbH0+YFxuICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVN1cHBvcnRUaWNrZXQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRUeXBlRGF0YT4sXG4gIHNjb3BlPzoge3JlYWRvbmx5IGFwcElkOiBzdHJpbmd9XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRUeXBlRGF0YT4gPT4ge1xuICBjb250ZXh0ID0gYXdhaXQgc2NvcGVDcm1Tb3VyY2VPd25lcihjb250ZXh0LCBzY29wZT8uYXBwSWQpO1xuICBjb25zdCBhcHBJZCA9IHNjb3BlPy5hcHBJZDtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHVzZXJLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnVzZXJJZCB8fCAnJykpO1xuICBsZXQgdXNlclJldmlzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldElkIHx8IGNyZWF0ZUhhc2goYHN1cHBvcnQtdGlja2V0LSR7dXNlcktleX0tJHt0aW1lc3RhbXB9YCkpKTtcbiAgaWYoYXBwSWQpIHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLmNvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpLmRvY3VtZW50KHVzZXJLZXksIHtncmFjZWZ1bDogdHJ1ZX0pO1xuICAgIGlmKCF1c2VyIHx8ICF1c2VyLl9yZXYgfHwgdXNlci5hcHBJZCAhPT0gYXBwSWQgfHwgdXNlci5kZWxldGVkID09PSB0cnVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N1cHBvcnRfc291cmNlX2N1c3RvbWVyX293bmVyX3JlcXVpcmVkJyk7XG4gICAgfVxuICAgIHVzZXJSZXZpc2lvbiA9IHVzZXIuX3JldjtcbiAgICBhd2FpdCB2YWxpZGF0ZUNybVNvdXJjZUxhYmVscyhjb250ZXh0LCBhcHBJZCwgW3tjb2xsZWN0aW9uOiBDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIGlkOiB0aWNrZXRLZXl9XSk7XG4gIH1cbiAgY29uc3QgdGlja2V0TnVtYmVyID0gY2xlYW5TdHJpbmcoaW5wdXQudGlja2V0TnVtYmVyLCA4MCkgfHwgYFJLVC0ke25ldyBEYXRlKHRpbWVzdGFtcCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCkucmVwbGFjZSgvLS9nLCAnJyl9LSR7dGlja2V0S2V5LnNsaWNlKDAsIDgpLnRvVXBwZXJDYXNlKCl9YDtcbiAgY29uc3QgdGlja2V0ID0ge1xuICAgIF9rZXk6IHRpY2tldEtleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIC4uLihhcHBJZCA/IHthcHBJZH0gOiB7fSksXG4gICAgYXNzaWduZWRUb1VzZXJJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5hc3NpZ25lZFRvVXNlcklkIHx8ICcnKSksXG4gICAgZGVzY3JpcHRpb246IGNsZWFuU3RyaW5nKGlucHV0LmRlc2NyaXB0aW9uLCA0MDAwKSxcbiAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgIHByaW9yaXR5OiBpbnB1dC5wcmlvcml0eSB8fCAnbm9ybWFsJyxcbiAgICBwcm9kdWN0SWQ6IGNsZWFuRXh0ZXJuYWxJZChpbnB1dC5wcm9kdWN0SWQsIDMyMCksXG4gICAgc2hvcGlmeU9yZGVySWQ6IGNsZWFuU3RyaW5nKGlucHV0LnNob3BpZnlPcmRlcklkLCAxNjApLFxuICAgIHN0YXR1czogJ3N1Ym1pdHRlZCcsXG4gICAgc3ViamVjdDogY2xlYW5TdHJpbmcoaW5wdXQuc3ViamVjdCwgMzIwKSxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICB0aWNrZXROdW1iZXIsXG4gICAgdHlwZTogaW5wdXQudHlwZSB8fCAnZ2VuZXJhbF9zdXBwb3J0JyxcbiAgICB1c2VySWQ6IHVzZXJLZXlcbiAgfTtcbiAgY29uc3QgcXVlcnkgPSBhcWxgXG4gICAgJHthcHBJZCA/IGFxbGBMRVQgY3VycmVudCA9IERPQ1VNRU5UKCd1c2VycycsICR7dXNlcktleX0pXG4gICAgICBGSUxURVIgY3VycmVudCBBTkQgY3VycmVudC5hcHBJZCA9PSAke2FwcElkfSBBTkQgY3VycmVudC5fcmV2ID09ICR7dXNlclJldmlzaW9ufSBBTkQgY3VycmVudC5kZWxldGVkICE9IHRydWVgIDogYXFsYGB9XG4gICAgSU5TRVJUICR7dGlja2V0fSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkVGlja2V0ID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuICBpZihhcHBJZCAmJiAoIXNhdmVkVGlja2V0IHx8IHNhdmVkVGlja2V0LmFwcElkICE9PSBhcHBJZCB8fCBzYXZlZFRpY2tldC51c2VySWQgIT09IHVzZXJLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzdXBwb3J0X3NvdXJjZV9jdXN0b21lcl9iaW5kaW5nX2NoYW5nZWQnKTtcbiAgfVxuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VULFxuICAgIGNyZWF0ZUhhc2goYGhhc1N1cHBvcnRUaWNrZXQtJHt1c2VyS2V5fS0ke3RpY2tldEtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5VU0VSUywgdXNlcktleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCB0aWNrZXRLZXkpLFxuICAgIHtwcmlvcml0eTogdGlja2V0LnByaW9yaXR5LCBzdGF0dXM6IHRpY2tldC5zdGF0dXMsIHR5cGU6IHRpY2tldC50eXBlfVxuICApO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQoY29udGV4dCwge1xuICAgIGFjdG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCB1c2VyS2V5KSksXG4gICAgZXZlbnRUeXBlOiAnc3VibWl0dGVkJyxcbiAgICBtZXRhZGF0YToge2RldGFpbHM6IHRpY2tldC5kZXNjcmlwdGlvbn0sXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogdGlja2V0LnN0YXR1c1xuICB9KTtcblxuICByZXR1cm4gc2F2ZWRUaWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3Qgc3VibWl0UHVibGljU3VwcG9ydFRpY2tldCA9IGFzeW5jIChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaW5wdXQ6IFB1YmxpY1N1cHBvcnRUaWNrZXRJbnB1dFxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGE+ID0+IHtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhpbnB1dC5lbWFpbCwgMzIwKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IGNsZWFuU3RyaW5nKGlucHV0LmRlc2NyaXB0aW9uLCA0MDAwKTtcbiAgY29uc3Qgc3ViamVjdCA9IGNsZWFuU3RyaW5nKGlucHV0LnN1YmplY3QsIDMyMCk7XG4gIGlmKCFlbWFpbFBhdHRlcm4udGVzdChlbWFpbCkpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfdmFsaWRfZW1haWwnKTtcbiAgaWYoIXN1YmplY3QpIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfc3ViamVjdCcpO1xuICBpZighZGVzY3JpcHRpb24pIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfZGVzY3JpcHRpb24nKTtcblxuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyxcbiAgICBDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUyxcbiAgICBDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsXG4gICAgQ09MTEVDVElPTlMuVVNFUlNcbiAgXS5tYXAoKG5hbWUpID0+IGVuc3VyZURvY3VtZW50Q29sbGVjdGlvbihkYXRhYmFzZSwgbmFtZSkpKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCxcbiAgICBFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfRVZFTlQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0VcbiAgXS5tYXAoKG5hbWUpID0+IGVuc3VyZUVkZ2VDb2xsZWN0aW9uKGRhdGFiYXNlLCBuYW1lKSkpO1xuXG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCBnZW5lcmF0ZWRVc2VyS2V5ID0gY3JlYXRlSGFzaChlbWFpbCwgbnVsbCk7XG4gIGNvbnN0IG9wdGVkSW4gPSBpbnB1dC5tYXJrZXRpbmdPcHRJbiA9PT0gdHJ1ZTtcbiAgY29uc3QgdXNlckluc2VydCA9IHtcbiAgICBfa2V5OiBnZW5lcmF0ZWRVc2VyS2V5LFxuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBlbWFpbCxcbiAgICBmaXJzdE5hbWU6IGNsZWFuU3RyaW5nKGlucHV0LmZpcnN0TmFtZSwgMTYwKSxcbiAgICBsYXN0TmFtZTogY2xlYW5TdHJpbmcoaW5wdXQubGFzdE5hbWUsIDE2MCksXG4gICAgbWFpbGluZ0xpc3Q6IG9wdGVkSW4sXG4gICAgbWFya2V0aW5nT3B0SW46IG9wdGVkSW4sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICB1c2VySWQ6IGdlbmVyYXRlZFVzZXJLZXlcbiAgfTtcbiAgY29uc3QgdXNlclVwZGF0ZSA9IHtcbiAgICAuLi4ob3B0ZWRJbiA/IHttYWlsaW5nTGlzdDogdHJ1ZSwgbWFya2V0aW5nT3B0SW46IHRydWUsIG1hcmtldGluZ09wdEluQXQ6IHRpbWVzdGFtcH0gOiB7fSksXG4gICAgZmlyc3ROYW1lOiBjbGVhblN0cmluZyhpbnB1dC5maXJzdE5hbWUsIDE2MCkgfHwgdW5kZWZpbmVkLFxuICAgIGxhc3ROYW1lOiBjbGVhblN0cmluZyhpbnB1dC5sYXN0TmFtZSwgMTYwKSB8fCB1bmRlZmluZWQsXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcFxuICB9O1xuICBjb25zdCB1c2VyID0gYXdhaXQgZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgIFVQU0VSVCB7ZW1haWw6ICR7ZW1haWx9fVxuICAgICAgSU5TRVJUICR7dXNlckluc2VydH1cbiAgICAgIFVQREFURSAke3VzZXJVcGRhdGV9XG4gICAgICBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuVVNFUlMpfVxuICAgICAgUkVUVVJOIE5FV1xuICBgKS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpIGFzIFVzZXJUeXBlO1xuICBjb25zdCB0aWNrZXQgPSBhd2FpdCBjcmVhdGVTdXBwb3J0VGlja2V0KGNvbnRleHQsIHtcbiAgICBkZXNjcmlwdGlvbixcbiAgICBwcmlvcml0eTogc3VwcG9ydFByaW9yaXRpZXMuaGFzKFN0cmluZyhpbnB1dC5wcmlvcml0eSkpID8gaW5wdXQucHJpb3JpdHkgOiAnbm9ybWFsJyxcbiAgICBzdWJqZWN0LFxuICAgIHR5cGU6IHN1cHBvcnRUeXBlcy5oYXMoU3RyaW5nKGlucHV0LnR5cGUpKSA/IGlucHV0LnR5cGUgOiAnZ2VuZXJhbF9zdXBwb3J0JyxcbiAgICB1c2VySWQ6IFN0cmluZyh1c2VyPy5fa2V5IHx8IHVzZXI/LnVzZXJJZCB8fCBnZW5lcmF0ZWRVc2VyS2V5KVxuICB9KTtcbiAgYXdhaXQgc2VuZFN1cHBvcnRUaWNrZXRFbWFpbChjb250ZXh0LCB0aWNrZXQsIGRlc2NyaXB0aW9uLCAnV2UgcmVjZWl2ZWQgeW91ciBzdXBwb3J0IHRpY2tldCcpO1xuICByZXR1cm4gdGlja2V0O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFB1YmxpY1N1cHBvcnRUaWNrZXQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHRpY2tldE51bWJlcjogc3RyaW5nLFxuICBlbWFpbEFkZHJlc3M6IHN0cmluZ1xuKTogUHJvbWlzZTxQdWJsaWNTdXBwb3J0VGlja2V0RmVlZCB8IG51bGw+ID0+IHtcbiAgY29uc3QgZW1haWwgPSBjbGVhblN0cmluZyhlbWFpbEFkZHJlc3MsIDMyMCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbnVtYmVyID0gY2xlYW5TdHJpbmcodGlja2V0TnVtYmVyLCA4MCkudG9VcHBlckNhc2UoKTtcbiAgaWYoIWVtYWlsUGF0dGVybi50ZXN0KGVtYWlsKSB8fCAhbnVtYmVyKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgZGF0YWJhc2UgPSB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSk7XG4gIGlmKCFhd2FpdCBkYXRhYmFzZS5jb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUykuZXhpc3RzKCkpIHJldHVybiBudWxsO1xuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsYFxuICAgIEZPUiB0aWNrZXQgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgICBGSUxURVIgVVBQRVIodGlja2V0LnRpY2tldE51bWJlcikgPT0gJHtudW1iZXJ9XG4gICAgICBMRVQgdXNlciA9IERPQ1VNRU5UKCR7Q09MTEVDVElPTlMuVVNFUlN9LCB0aWNrZXQudXNlcklkKVxuICAgICAgRklMVEVSIExPV0VSKHVzZXIuZW1haWwpID09ICR7ZW1haWx9XG4gICAgICBMRVQgbWVzc2FnZXMgPSAoXG4gICAgICAgIEZPUiBtZXNzYWdlIElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVF9NRVNTQUdFUyl9XG4gICAgICAgICAgRklMVEVSIG1lc3NhZ2Uuc3VwcG9ydFRpY2tldElkID09IHRpY2tldC5fa2V5IEFORCBtZXNzYWdlLnZpc2liaWxpdHkgPT0gXCJjdXN0b21lclwiXG4gICAgICAgICAgU09SVCBtZXNzYWdlLmFkZGVkIEFTQ1xuICAgICAgICAgIFJFVFVSTiBtZXNzYWdlXG4gICAgICApXG4gICAgICBMRVQgZXZlbnRzID0gKFxuICAgICAgICBGT1IgZXZlbnQgSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyl9XG4gICAgICAgICAgRklMVEVSIGV2ZW50LnN1cHBvcnRUaWNrZXRJZCA9PSB0aWNrZXQuX2tleVxuICAgICAgICAgIFNPUlQgZXZlbnQuYWRkZWQgQVNDXG4gICAgICAgICAgUkVUVVJOIGV2ZW50XG4gICAgICApXG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4ge3RpY2tldCwgbWVzc2FnZXMsIGV2ZW50c31cbiAgYCkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBQcm9taXNlPFB1YmxpY1N1cHBvcnRUaWNrZXRGZWVkIHwgbnVsbD47XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3VwcG9ydFRpY2tldHMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGZpbHRlcnM6IHtyZWFkb25seSBzdGF0dXM/OiBzdHJpbmc7IHJlYWRvbmx5IHVzZXJJZD86IHN0cmluZ30gPSB7fVxuKTogUHJvbWlzZTxTdXBwb3J0VGlja2V0VHlwZURhdGFbXT4gPT4ge1xuICBjb25zdCBkYXRhYmFzZSA9IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKTtcbiAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgaWYoIWF3YWl0IGRhdGFiYXNlLmNvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKS5leGlzdHMoKSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgICAgRk9SIHRpY2tldCBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTKX1cbiAgICAgICAgJHtmaWx0ZXJzLnN0YXR1cyA/IGFxbGBGSUxURVIgdGlja2V0LnN0YXR1cyA9PSAke2ZpbHRlcnMuc3RhdHVzfWAgOiBhcWxgYH1cbiAgICAgICAgJHtmaWx0ZXJzLnVzZXJJZCA/IGFxbGBGSUxURVIgdGlja2V0LnVzZXJJZCA9PSAke2RvY0tleShmaWx0ZXJzLnVzZXJJZCl9YCA6IGFxbGBgfVxuICAgICAgICBMRVQgdXNlciA9IERPQ1VNRU5UKCR7Q09MTEVDVElPTlMuVVNFUlN9LCB0aWNrZXQudXNlcklkKVxuICAgICAgICBTT1JUIHRpY2tldC5hZGRlZCBERVNDXG4gICAgICAgIFJFVFVSTiBNRVJHRSh0aWNrZXQsIHt1c2VyfSlcbiAgICBgO1xuICAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xuICB9KSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVN1cHBvcnRUaWNrZXRTdGF0dXMgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nLFxuICBzdGF0dXM6IFN1cHBvcnRUaWNrZXRTdGF0dXMsXG4gIHJlc29sdXRpb25TdW1tYXJ5ID0gJydcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldFR5cGVEYXRhPiA9PiB7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShzdXBwb3J0VGlja2V0SWQpO1xuICBjb25zdCB0aW1lc3RhbXAgPSBub3coKTtcbiAgY29uc3QgcHJldmlvdXMgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSlcbiAgICAucXVlcnkoYXFsYFJFVFVSTiBET0NVTUVOVCgke2RvY0lkKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUywgdGlja2V0S2V5KX0pYClcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKSBhcyBTdXBwb3J0VGlja2V0VHlwZURhdGEgfCBudWxsO1xuICBjb25zdCB1cGRhdGUgPSB7XG4gICAgLi4uKHN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcgJiYge2NvbXBsZXRlZEF0OiB0aW1lc3RhbXAsIHJlc29sdXRpb25TdW1tYXJ5OiBjbGVhblN0cmluZyhyZXNvbHV0aW9uU3VtbWFyeSwgNDAwMCl9KSxcbiAgICAuLi4oc3RhdHVzID09PSAnZG9uZScgJiYge2RvbmVBdDogdGltZXN0YW1wLCByZXNvbHV0aW9uU3VtbWFyeTogY2xlYW5TdHJpbmcocmVzb2x1dGlvblN1bW1hcnksIDQwMDApfSksXG4gICAgLi4uKHN0YXR1cyA9PT0gJ3Jlc29sdmVkJyAmJiB7cmVzb2x2ZWRBdDogdGltZXN0YW1wLCByZXNvbHV0aW9uU3VtbWFyeTogY2xlYW5TdHJpbmcocmVzb2x1dGlvblN1bW1hcnksIDQwMDApfSksXG4gICAgLi4uKHN0YXR1cyA9PT0gJ2Nsb3NlZCcgJiYge2Nsb3NlZEF0OiB0aW1lc3RhbXB9KSxcbiAgICBsYXN0VXBkYXRlRGV0YWlsczogY2xlYW5TdHJpbmcocmVzb2x1dGlvblN1bW1hcnksIDQwMDApLFxuICAgIG1vZGlmaWVkOiB0aW1lc3RhbXAsXG4gICAgc3RhdHVzXG4gIH07XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIFVQREFURSAke3RpY2tldEtleX0gV0lUSCAke3VwZGF0ZX0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCB0aWNrZXQgPSBhd2FpdCB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSkgYXMgU3VwcG9ydFRpY2tldFR5cGVEYXRhO1xuXG4gIGF3YWl0IHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxgXG4gICAgRk9SIGVkZ2UgSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gICAgICBGSUxURVIgZWRnZS5fdG8gPT0gJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSl9XG4gICAgICBVUERBVEUgZWRnZSBXSVRIICR7e1xuICAgICAgICBtb2RpZmllZDogdGltZXN0YW1wLFxuICAgICAgICByZXNvbHZlZEF0OiBzdGF0dXMgPT09ICdyZXNvbHZlZCcgPyB0aW1lc3RhbXAgOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1c1xuICAgICAgfX0gSU4gJHtjb2xsZWN0aW9uKEVER0VTLkhBU19TVVBQT1JUX1RJQ0tFVCl9XG4gIGApO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQoY29udGV4dCwge1xuICAgIGFjdG9yVXNlcklkOiBkb2NLZXkoU3RyaW5nKGNvbnRleHQ/LnNlc3Npb24/LnVzZXJJZCB8fCAnJykpLFxuICAgIGV2ZW50VHlwZTogJ3N0YXR1c19jaGFuZ2VkJyxcbiAgICBmcm9tVmFsdWU6IHByZXZpb3VzPy5zdGF0dXMsXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogc3RhdHVzXG4gIH0pO1xuXG4gIGlmKHN0YXR1cyA9PT0gJ3Jlc29sdmVkJykge1xuICAgIGF3YWl0IGNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uKGNvbnRleHQsIHtcbiAgICAgIGJvZHk6IGNsZWFuU3RyaW5nKHJlc29sdXRpb25TdW1tYXJ5IHx8ICdZb3VyIHN1cHBvcnQgdGlja2V0IGhhcyBiZWVuIHJlc29sdmVkLicsIDQwMDApLFxuICAgICAgc3RhdHVzOiAncXVldWVkJyxcbiAgICAgIHN1YmplY3Q6IGBSZXNvbHZlZDogJHt0aWNrZXQuc3ViamVjdCB8fCAnU3VwcG9ydCB0aWNrZXQnfWAsXG4gICAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICAgIHR5cGU6ICdzdXBwb3J0X3RpY2tldF9yZXNvbHZlZCcsXG4gICAgICB1c2VySWQ6IHRpY2tldC51c2VySWRcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0aWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlU3VwcG9ydFRpY2tldFByb2dyZXNzID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBzdXBwb3J0VGlja2V0SWQ6IHN0cmluZyxcbiAgc3RhdHVzOiBTdXBwb3J0VGlja2V0U3RhdHVzLFxuICBkZXRhaWxzOiBzdHJpbmdcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldFR5cGVEYXRhPiA9PiB7XG4gIHJlcXVpcmVDcm1BZG1pbihjb250ZXh0KTtcbiAgaWYoIXN1cHBvcnRTdGF0dXNlcy5oYXMoc3RhdHVzKSkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkX3N1cHBvcnRfdGlja2V0X3N0YXR1cycpO1xuICBjb25zdCBtYXJrZG93biA9IGNsZWFuU3RyaW5nKGRldGFpbHMsIDQwMDApO1xuICBpZighbWFya2Rvd24pIHRocm93IG5ldyBFcnJvcigncmVxdWlyZWRfdXBkYXRlX2RldGFpbHMnKTtcbiAgY29uc3QgdGlja2V0ID0gYXdhaXQgdXBkYXRlU3VwcG9ydFRpY2tldFN0YXR1cyhjb250ZXh0LCBzdXBwb3J0VGlja2V0SWQsIHN0YXR1cywgbWFya2Rvd24pO1xuICBhd2FpdCBhZGRTdXBwb3J0VGlja2V0TWVzc2FnZShjb250ZXh0LCB7XG4gICAgYXV0aG9yVXNlcklkOiBTdHJpbmcoY29udGV4dC5zZXNzaW9uPy51c2VySWQgfHwgJycpLFxuICAgIGJvZHk6IG1hcmtkb3duLFxuICAgIHN1cHBvcnRUaWNrZXRJZCxcbiAgICB2aXNpYmlsaXR5OiAnY3VzdG9tZXInXG4gIH0pO1xuICBhd2FpdCBjcmVhdGVDdXN0b21lck5vdGlmaWNhdGlvbihjb250ZXh0LCB7XG4gICAgYm9keTogbWFya2Rvd24sXG4gICAgc3RhdHVzOiAnc2VudCcsXG4gICAgc3ViamVjdDogYFRpY2tldCAke3RpY2tldC50aWNrZXROdW1iZXIgfHwgc3VwcG9ydFRpY2tldElkfTogJHtzdGF0dXMucmVwbGFjZSgvXy9nLCAnICcpfWAsXG4gICAgc3VwcG9ydFRpY2tldElkLFxuICAgIHR5cGU6ICdzdXBwb3J0X3RpY2tldF9wcm9ncmVzcycsXG4gICAgdXNlcklkOiB0aWNrZXQudXNlcklkXG4gIH0pO1xuICBhd2FpdCBzZW5kU3VwcG9ydFRpY2tldEVtYWlsKGNvbnRleHQsIHRpY2tldCwgbWFya2Rvd24sIGBTdXBwb3J0IHRpY2tldCAke3N0YXR1cy5yZXBsYWNlKC9fL2csICcgJyl9YCk7XG4gIHJldHVybiB0aWNrZXQ7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkU3VwcG9ydFRpY2tldE1lc3NhZ2UgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZT5cbik6IFByb21pc2U8U3VwcG9ydFRpY2tldE1lc3NhZ2VUeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB0aWNrZXRLZXkgPSBkb2NLZXkoU3RyaW5nKGlucHV0LnN1cHBvcnRUaWNrZXRJZCB8fCAnJykpO1xuICBjb25zdCBtZXNzYWdlS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0TWVzc2FnZUlkIHx8IGNyZWF0ZUhhc2goYHN1cHBvcnQtdGlja2V0LW1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgX2tleTogbWVzc2FnZUtleSxcbiAgICBhZGRlZDogdGltZXN0YW1wLFxuICAgIGF1dGhvclVzZXJJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5hdXRob3JVc2VySWQgfHwgY29udGV4dD8uc2Vzc2lvbj8udXNlcklkIHx8ICcnKSksXG4gICAgYm9keTogY2xlYW5TdHJpbmcoaW5wdXQuYm9keSwgNDAwMCksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0SWQ6IHRpY2tldEtleSxcbiAgICBzdXBwb3J0VGlja2V0TWVzc2FnZUlkOiBtZXNzYWdlS2V5LFxuICAgIHZpc2liaWxpdHk6IGlucHV0LnZpc2liaWxpdHkgfHwgJ2N1c3RvbWVyJ1xuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHttZXNzYWdlfSBJTiAke2NvbGxlY3Rpb24oQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMpfVxuICAgIFJFVFVSTiBORVdcbiAgYDtcbiAgY29uc3Qgc2F2ZWRNZXNzYWdlID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UsXG4gICAgY3JlYXRlSGFzaChgaGFzU3VwcG9ydFRpY2tldE1lc3NhZ2UtJHt0aWNrZXRLZXl9LSR7bWVzc2FnZUtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfTUVTU0FHRVMsIG1lc3NhZ2VLZXkpLFxuICAgIHthdXRob3JVc2VySWQ6IG1lc3NhZ2UuYXV0aG9yVXNlcklkLCB2aXNpYmlsaXR5OiBtZXNzYWdlLnZpc2liaWxpdHl9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkTWVzc2FnZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRTdXBwb3J0VGlja2V0TWVzc2FnZXMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHN1cHBvcnRUaWNrZXRJZDogc3RyaW5nXG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRNZXNzYWdlVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBtZXNzYWdlIElOIDEuLjEgT1VUQk9VTkQgJHtkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHN1cHBvcnRUaWNrZXRJZCl9ICR7Y29sbGVjdGlvbihFREdFUy5IQVNfU1VQUE9SVF9USUNLRVRfTUVTU0FHRSl9XG4gICAgICBTT1JUIG1lc3NhZ2UuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gbWVzc2FnZVxuICBgO1xuXG4gIHJldHVybiB1c2VEYihjb250ZXh0LmRhdGFiYXNlTmFtZSkucXVlcnkocXVlcnkpLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRTdXBwb3J0VGlja2V0RXZlbnQgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+XG4pOiBQcm9taXNlPFN1cHBvcnRUaWNrZXRFdmVudFR5cGU+ID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbm93KCk7XG4gIGNvbnN0IHRpY2tldEtleSA9IGRvY0tleShTdHJpbmcoaW5wdXQuc3VwcG9ydFRpY2tldElkIHx8ICcnKSk7XG4gIGNvbnN0IGV2ZW50S2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0RXZlbnRJZCB8fCBjcmVhdGVIYXNoKGBzdXBwb3J0LXRpY2tldC1ldmVudC0ke3RpY2tldEtleX0tJHt0aW1lc3RhbXB9LSR7aW5wdXQuZXZlbnRUeXBlfWApKSk7XG4gIGNvbnN0IGV2ZW50ID0ge1xuICAgIF9rZXk6IGV2ZW50S2V5LFxuICAgIGFkZGVkOiB0aW1lc3RhbXAsXG4gICAgYWN0b3JVc2VySWQ6IGRvY0tleShTdHJpbmcoaW5wdXQuYWN0b3JVc2VySWQgfHwgJycpKSxcbiAgICBldmVudFR5cGU6IGNsZWFuU3RyaW5nKGlucHV0LmV2ZW50VHlwZSwgMTYwKSxcbiAgICBmcm9tVmFsdWU6IGNsZWFuU3RyaW5nKGlucHV0LmZyb21WYWx1ZSwgMzIwKSxcbiAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEgfHwge30sXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzdXBwb3J0VGlja2V0RXZlbnRJZDogZXZlbnRLZXksXG4gICAgc3VwcG9ydFRpY2tldElkOiB0aWNrZXRLZXksXG4gICAgdG9WYWx1ZTogY2xlYW5TdHJpbmcoaW5wdXQudG9WYWx1ZSwgMzIwKVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtldmVudH0gSU4gJHtjb2xsZWN0aW9uKENPTExFQ1RJT05TLlNVUFBPUlRfVElDS0VUX0VWRU5UUyl9XG4gICAgUkVUVVJOIE5FV1xuICBgO1xuICBjb25zdCBzYXZlZEV2ZW50ID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5ULFxuICAgIGNyZWF0ZUhhc2goYGhhc1N1cHBvcnRUaWNrZXRFdmVudC0ke3RpY2tldEtleX0tJHtldmVudEtleX1gKSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5TVVBQT1JUX1RJQ0tFVFMsIHRpY2tldEtleSksXG4gICAgZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRfRVZFTlRTLCBldmVudEtleSksXG4gICAge2FjdG9yVXNlcklkOiBldmVudC5hY3RvclVzZXJJZCwgZXZlbnRUeXBlOiBldmVudC5ldmVudFR5cGV9XG4gICk7XG5cbiAgcmV0dXJuIHNhdmVkRXZlbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3VwcG9ydFRpY2tldEV2ZW50cyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgc3VwcG9ydFRpY2tldElkOiBzdHJpbmdcbik6IFByb21pc2U8U3VwcG9ydFRpY2tldEV2ZW50VHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBldmVudCBJTiAxLi4xIE9VVEJPVU5EICR7ZG9jSWQoQ09MTEVDVElPTlMuU1VQUE9SVF9USUNLRVRTLCBzdXBwb3J0VGlja2V0SWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5UKX1cbiAgICAgIFNPUlQgZXZlbnQuYWRkZWQgQVNDXG4gICAgICBSRVRVUk4gZXZlbnRcbiAgYDtcblxuICByZXR1cm4gdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQ3VzdG9tZXJOb3RpZmljYXRpb24gPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGlucHV0OiBQYXJ0aWFsPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZT5cbik6IFByb21pc2U8Q3VzdG9tZXJOb3RpZmljYXRpb25UeXBlPiA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IG5vdygpO1xuICBjb25zdCB1c2VyS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC51c2VySWQgfHwgJycpKTtcbiAgY29uc3Qgbm90aWZpY2F0aW9uS2V5ID0gZG9jS2V5KFN0cmluZyhpbnB1dC5jdXN0b21lck5vdGlmaWNhdGlvbklkIHx8IGNyZWF0ZUhhc2goYGN1c3RvbWVyLW5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7dGltZXN0YW1wfWApKSk7XG4gIGNvbnN0IG5vdGlmaWNhdGlvbiA9IHtcbiAgICBfa2V5OiBub3RpZmljYXRpb25LZXksXG4gICAgYWRkZWQ6IHRpbWVzdGFtcCxcbiAgICBib2R5OiBjbGVhblN0cmluZyhpbnB1dC5ib2R5LCA0MDAwKSxcbiAgICBjdXN0b21lck5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25LZXksXG4gICAgbW9kaWZpZWQ6IHRpbWVzdGFtcCxcbiAgICBzZW50QXQ6IGlucHV0LnNlbnRBdCxcbiAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyB8fCAncXVldWVkJyxcbiAgICBzdWJqZWN0OiBjbGVhblN0cmluZyhpbnB1dC5zdWJqZWN0LCAzMjApLFxuICAgIHN1cHBvcnRUaWNrZXRJZDogZG9jS2V5KFN0cmluZyhpbnB1dC5zdXBwb3J0VGlja2V0SWQgfHwgJycpKSxcbiAgICB0eXBlOiBjbGVhblN0cmluZyhpbnB1dC50eXBlLCAxNjApLFxuICAgIHVzZXJJZDogdXNlcktleVxuICB9O1xuICBjb25zdCBxdWVyeSA9IGFxbGBcbiAgICBJTlNFUlQgJHtub3RpZmljYXRpb259IElOICR7Y29sbGVjdGlvbihDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TKX1cbiAgICBSRVRVUk4gTkVXXG4gIGA7XG4gIGNvbnN0IHNhdmVkTm90aWZpY2F0aW9uID0gYXdhaXQgdXNlRGIoY29udGV4dC5kYXRhYmFzZU5hbWUpLnF1ZXJ5KHF1ZXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xuXG4gIGF3YWl0IHNhdmVFZGdlKFxuICAgIGNvbnRleHQsXG4gICAgRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTixcbiAgICBjcmVhdGVIYXNoKGBoYXNDdXN0b21lck5vdGlmaWNhdGlvbi0ke3VzZXJLZXl9LSR7bm90aWZpY2F0aW9uS2V5fWApLFxuICAgIGRvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VyS2V5KSxcbiAgICBkb2NJZChDT0xMRUNUSU9OUy5DVVNUT01FUl9OT1RJRklDQVRJT05TLCBub3RpZmljYXRpb25LZXkpLFxuICAgIHtcbiAgICAgIHN0YXR1czogbm90aWZpY2F0aW9uLnN0YXR1cyxcbiAgICAgIHN1cHBvcnRUaWNrZXRJZDogbm90aWZpY2F0aW9uLnN1cHBvcnRUaWNrZXRJZCxcbiAgICAgIHR5cGU6IG5vdGlmaWNhdGlvbi50eXBlXG4gICAgfVxuICApO1xuXG4gIHJldHVybiBzYXZlZE5vdGlmaWNhdGlvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDdXN0b21lck5vdGlmaWNhdGlvbnNCeVVzZXIgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHVzZXJJZDogc3RyaW5nXG4pOiBQcm9taXNlPEN1c3RvbWVyTm90aWZpY2F0aW9uVHlwZVtdPiA9PiB7XG4gIGNvbnN0IHF1ZXJ5ID0gYXFsYFxuICAgIEZPUiBub3RpZmljYXRpb24gSU4gMS4uMSBPVVRCT1VORCAke2RvY0lkKENPTExFQ1RJT05TLlVTRVJTLCB1c2VySWQpfSAke2NvbGxlY3Rpb24oRURHRVMuSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTil9XG4gICAgICBTT1JUIG5vdGlmaWNhdGlvbi5hZGRlZCBERVNDXG4gICAgICBSRVRVUk4gbm90aWZpY2F0aW9uXG4gIGA7XG5cbiAgcmV0dXJuIHVzZURiKGNvbnRleHQuZGF0YWJhc2VOYW1lKS5xdWVyeShxdWVyeSkudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpO1xufTtcbiJdLCJuYW1lcyI6WyJjcmVhdGVIYXNoIiwicGFyc2VJZCIsInBhcnNlUGhvbmUiLCJwYXJzZVN0cmluZyIsImFxbCIsImxpdGVyYWwiLCJDT0xMRUNUSU9OUyIsIkVER0VTIiwiQ29uZmlnIiwidXNlRGIiLCJpc0FkbWluVXNlciIsInNlc1NlbmQiLCJzY29wZUNybVNvdXJjZU93bmVyIiwidmFsaWRhdGVDcm1Tb3VyY2VMYWJlbHMiLCJub3ciLCJEYXRlIiwiY29sbGVjdGlvbiIsIm5hbWUiLCJkb2NLZXkiLCJ2YWx1ZSIsIlN0cmluZyIsImRvY0lkIiwiY29sbGVjdGlvbk5hbWUiLCJrZXkiLCJleHRlcm5hbEtleSIsInByZWZpeCIsImlkIiwiY2xlYW5TdHJpbmciLCJsZW5ndGgiLCJjbGVhbkV4dGVybmFsSWQiLCJ0cmltIiwic2xpY2UiLCJlbnN1cmVEb2N1bWVudENvbGxlY3Rpb24iLCJkYXRhYmFzZSIsInRhcmdldCIsImV4aXN0cyIsImNyZWF0ZUNvbGxlY3Rpb24iLCJlcnJvciIsImVuc3VyZUVkZ2VDb2xsZWN0aW9uIiwiY3JlYXRlRWRnZUNvbGxlY3Rpb24iLCJyZXF1aXJlQ3JtQWRtaW4iLCJjb250ZXh0Iiwic2Vzc2lvbiIsIkVycm9yIiwicmVxdWlyZUNybUFkbWluaXN0cmF0b3IiLCJhbGxvd2VkQ29udGFjdEZpZWxkcyIsIlNldCIsInN1cHBvcnRQcmlvcml0aWVzIiwic3VwcG9ydFN0YXR1c2VzIiwic3VwcG9ydFR5cGVzIiwiZW1haWxQYXR0ZXJuIiwiZXNjYXBlSHRtbCIsInJlcGxhY2UiLCJzYW5pdGl6ZUh0bWwiLCJzYW5pdGl6ZUNzcyIsImh0bWxUb1RleHQiLCJjaHVuayIsIml0ZW1zIiwic2l6ZSIsImdyb3VwcyIsImluZGV4IiwicHVzaCIsInN1Ym1pdENybUZvcm0iLCJpbnB1dCIsIm1hcmtldGluZ09wdEluIiwiZW1haWwiLCJ0b0xvd2VyQ2FzZSIsInJhd1Bob25lIiwicGhvbmUiLCJkYXRhYmFzZU5hbWUiLCJDUk1fRk9STV9TVUJNSVNTSU9OUyIsInRpbWVzdGFtcCIsInNvdXJjZSIsImZvcm1JZCIsInZhbHVlcyIsImZpcnN0TmFtZSIsImxhc3ROYW1lIiwiZ2VuZXJhdGVkVXNlcktleSIsImNvbnNlbnQiLCJtYXJrZXRpbmdPcHRJbkF0IiwibWFya2V0aW5nT3B0T3V0QXQiLCJ1c2VySW5zZXJ0IiwiX2tleSIsImFjdGl2ZSIsImFkZGVkIiwibWFpbGluZ0xpc3QiLCJtYXJrZXRpbmdDb25zZW50U291cmNlIiwibW9kaWZpZWQiLCJ0eXBlIiwidXNlckFjY2VzcyIsInVzZXJJZCIsInZlcmlmaWVkRW1haWwiLCJ2ZXJpZmllZFBob25lIiwidXNlclVwZGF0ZSIsInVzZXIiLCJxdWVyeSIsIlVTRVJTIiwidGhlbiIsImN1cnNvciIsIm5leHQiLCJzdWJtaXNzaW9uSWQiLCJzdWJtaXNzaW9uIiwic2F2ZWQiLCJnZXRDcm1Gb3JtU3VibWlzc2lvbnMiLCJhbGwiLCJnZXRDcm1Db250YWN0cyIsImZpbHRlciIsInNlYXJjaCIsImZpZWxkIiwiaGFzIiwib3B0ZWRJbk9ubHkiLCJvcGVyYXRvciIsImluY2x1ZGVzIiwic2VuZENybUNhbXBhaWduIiwic3ViamVjdCIsImJvZHlIdG1sIiwiaHRtbCIsImNzcyIsImNhbmRpZGF0ZXMiLCJzZWxlY3RlZElkcyIsInVzZXJJZHMiLCJtYXAiLCJyZWNpcGllbnRzIiwiQm9vbGVhbiIsImNhbXBhaWduSWQiLCJjYW1wYWlnbiIsImZhaWxlZENvdW50IiwicmVjaXBpZW50Q291bnQiLCJzZW50Q291bnQiLCJzdGF0dXMiLCJDUk1fQ0FNUEFJR05TIiwicmVjaXBpZW50c0JhdGNoIiwiRGVzdGluYXRpb24iLCJCY2NBZGRyZXNzZXMiLCJyZWNpcGllbnQiLCJNZXNzYWdlIiwiQm9keSIsIkh0bWwiLCJEYXRhIiwiVGV4dCIsIlN1YmplY3QiLCJTb3VyY2UiLCJjb25maWciLCJkZXRhaWxzIiwic3VwcG9ydE5hbWUiLCJzdXBwb3J0RW1haWwiLCJfZXJyb3IiLCJyZXN1bHQiLCJzZW50QXQiLCJzYXZlRWRnZSIsImVkZ2VDb2xsZWN0aW9uIiwiZWRnZUtleSIsImZyb20iLCJ0byIsImRhdGEiLCJlZGdlIiwiX2Zyb20iLCJfdG8iLCJjcmVhdGVNYWlsaW5nTGlzdCIsIm1haWxpbmdMaXN0SWQiLCJjcmVhdGVkQnlVc2VySWQiLCJkZXNjcmlwdGlvbiIsIk1BSUxJTkdfTElTVFMiLCJnZXRNYWlsaW5nTGlzdHMiLCJhZGRVc2VyVG9NYWlsaW5nTGlzdCIsInVzZXJLZXkiLCJsaXN0S2V5IiwiSEFTX01BSUxJTkdfTElTVCIsImFkZGVkQnlVc2VySWQiLCJyZW1vdmVVc2VyRnJvbU1haWxpbmdMaXN0IiwidXBkYXRlIiwicmVtb3ZlZEF0IiwiZ2V0TWFpbGluZ0xpc3RVc2VycyIsImxpc3RJZCIsImdldFVzZXJzQnlQdXJjaGFzZWRQcm9kdWN0IiwicHJvZHVjdElkIiwicHJvZHVjdEtleSIsIlNIT1BJRllfUFJPRFVDVFMiLCJIQVNfUFVSQ0hBU0VEX1BST0RVQ1QiLCJIQVNfQ1VTVE9NRVJfT1JERVIiLCJnZXRFbGlnaWJsZU1haWxpbmdVc2VycyIsIm9wdGlvbnMiLCJleGNsdWRlT3BlblN1cHBvcnRUaWNrZXRzIiwiSEFTX1NVUFBPUlRfVElDS0VUIiwiaW5nZXN0U2hvcGlmeUN1c3RvbWVyT3JkZXIiLCJzY29wZSIsImFwcElkIiwic2hvcGlmeUN1c3RvbWVySWQiLCJzaG9waWZ5T3JkZXJJZCIsImN1c3RvbWVyIiwicHJvZHVjdElkcyIsIkFycmF5IiwicHJvZHVjdHMiLCJwcm9kdWN0Iiwib3JkZXJLZXkiLCJDVVNUT01FUl9PUkRFUlMiLCJ1bmRlZmluZWQiLCJsYXN0UHVyY2hhc2VkQXQiLCJwdXJjaGFzZWRBdCIsInVzZXJRdWVyeSIsImRlbGV0ZWQiLCJyZXNvbHZlZFVzZXJLZXkiLCJvcmRlciIsImN1cnJlbmN5IiwidG9VcHBlckNhc2UiLCJjdXN0b21lck9yZGVySWQiLCJ0b3RhbFByaWNlIiwiTnVtYmVyIiwib3JkZXJRdWVyeSIsInNhdmVkT3JkZXIiLCJQcm9taXNlIiwiZmluZCIsIml0ZW0iLCJwcm9kdWN0RG9jIiwidGl0bGUiLCJ2YXJpYW50SWQiLCJwcm9kdWN0UXVlcnkiLCJzYXZlZFByb2R1Y3QiLCJnZXRDdXN0b21lck9yZGVyc0J5VXNlciIsInNlbmRTdXBwb3J0VGlja2V0RW1haWwiLCJ0aWNrZXQiLCJoZWFkaW5nIiwiZ2V0IiwidGlja2V0TnVtYmVyIiwic3VwcG9ydFRpY2tldElkIiwic3RhdHVzVXJsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwidGV4dCIsIlRvQWRkcmVzc2VzIiwiY2F0Y2giLCJjcmVhdGVTdXBwb3J0VGlja2V0IiwidXNlclJldmlzaW9uIiwidGlja2V0S2V5IiwiZG9jdW1lbnQiLCJncmFjZWZ1bCIsIl9yZXYiLCJTVVBQT1JUX1RJQ0tFVFMiLCJ0b0lTT1N0cmluZyIsImFzc2lnbmVkVG9Vc2VySWQiLCJwcmlvcml0eSIsInNhdmVkVGlja2V0IiwiYWRkU3VwcG9ydFRpY2tldEV2ZW50IiwiYWN0b3JVc2VySWQiLCJldmVudFR5cGUiLCJtZXRhZGF0YSIsInRvVmFsdWUiLCJzdWJtaXRQdWJsaWNTdXBwb3J0VGlja2V0IiwidGVzdCIsIlNVUFBPUlRfVElDS0VUX0VWRU5UUyIsIlNVUFBPUlRfVElDS0VUX01FU1NBR0VTIiwiSEFTX1NVUFBPUlRfVElDS0VUX0VWRU5UIiwiSEFTX1NVUFBPUlRfVElDS0VUX01FU1NBR0UiLCJvcHRlZEluIiwiZ2V0UHVibGljU3VwcG9ydFRpY2tldCIsImVtYWlsQWRkcmVzcyIsIm51bWJlciIsImdldFN1cHBvcnRUaWNrZXRzIiwiZmlsdGVycyIsInVwZGF0ZVN1cHBvcnRUaWNrZXRTdGF0dXMiLCJyZXNvbHV0aW9uU3VtbWFyeSIsInByZXZpb3VzIiwiY29tcGxldGVkQXQiLCJkb25lQXQiLCJyZXNvbHZlZEF0IiwiY2xvc2VkQXQiLCJsYXN0VXBkYXRlRGV0YWlscyIsImZyb21WYWx1ZSIsImNyZWF0ZUN1c3RvbWVyTm90aWZpY2F0aW9uIiwiYm9keSIsInVwZGF0ZVN1cHBvcnRUaWNrZXRQcm9ncmVzcyIsIm1hcmtkb3duIiwiYWRkU3VwcG9ydFRpY2tldE1lc3NhZ2UiLCJhdXRob3JVc2VySWQiLCJ2aXNpYmlsaXR5IiwibWVzc2FnZUtleSIsInN1cHBvcnRUaWNrZXRNZXNzYWdlSWQiLCJtZXNzYWdlIiwic2F2ZWRNZXNzYWdlIiwiZ2V0U3VwcG9ydFRpY2tldE1lc3NhZ2VzIiwiZXZlbnRLZXkiLCJzdXBwb3J0VGlja2V0RXZlbnRJZCIsImV2ZW50Iiwic2F2ZWRFdmVudCIsImdldFN1cHBvcnRUaWNrZXRFdmVudHMiLCJub3RpZmljYXRpb25LZXkiLCJjdXN0b21lck5vdGlmaWNhdGlvbklkIiwibm90aWZpY2F0aW9uIiwiQ1VTVE9NRVJfTk9USUZJQ0FUSU9OUyIsInNhdmVkTm90aWZpY2F0aW9uIiwiSEFTX0NVU1RPTUVSX05PVElGSUNBVElPTiIsImdldEN1c3RvbWVyTm90aWZpY2F0aW9uc0J5VXNlciJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsVUFBVSxFQUFFQyxPQUFPLEVBQUVDLFVBQVUsRUFBRUMsV0FBVyxRQUFPLCtCQUErQjtBQUMxRixTQUFRQyxHQUFHLFFBQU8sV0FBVztBQUM3QixTQUFRQyxPQUFPLFFBQU8sZUFBZTtBQUVyQyxTQUFRQyxXQUFXLEVBQUVDLEtBQUssUUFBTyw4QkFBOEI7QUFDL0QsU0FBUUMsTUFBTSxRQUFPLGVBQWU7QUFDcEMsU0FBUUMsS0FBSyxRQUFPLDRCQUE0QjtBQUNoRCxTQUFRQyxXQUFXLFFBQU8sMkJBQTJCO0FBQ3JELFNBQVFDLE9BQU8sUUFBTyxhQUFhO0FBQ25DLFNBQVFDLG1CQUFtQixFQUFFQyx1QkFBdUIsUUFBTywwQkFBMEI7QUF1QnJGLE1BQU1DLE1BQU0sSUFBY0MsS0FBS0QsR0FBRztBQUNsQyxNQUFNRSxhQUFhLENBQUNDLE9BQWlCWixRQUFRWTtBQUM3QyxNQUFNQyxTQUFTLENBQUNDLFFBQVEsRUFBRSxHQUFhbEIsUUFBUW1CLE9BQU9EO0FBQ3RELE1BQU1FLFFBQVEsQ0FBQ0MsZ0JBQXdCQyxNQUFNLEVBQUUsR0FBYSxHQUFHRCxlQUFlLENBQUMsRUFBRUosT0FBT0ssTUFBTTtBQUM5RixNQUFNQyxjQUFjLENBQUNDLFFBQWdCQyxLQUFL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