@qbs-origin/origin-form 0.8.10 → 0.8.12

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 (27) hide show
  1. package/esm2022/lib/form-css.helper.mjs +122 -28
  2. package/esm2022/lib/formly/custom-section-separator.component.mjs +11 -3
  3. package/esm2022/lib/formly/form-section-separator.component.mjs +34 -11
  4. package/esm2022/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.mjs +23 -8
  5. package/esm2022/lib/formly/formly-radio/formly-radio-component.mjs +3 -3
  6. package/esm2022/lib/formly/formly-row-spacer.mjs +12 -0
  7. package/esm2022/lib/formly/formly-row-wrapper.mjs +32 -0
  8. package/esm2022/lib/formly/formly-scan-id/formly-scan-id.component.mjs +21 -26
  9. package/esm2022/lib/model-population.helper.mjs +22 -1
  10. package/esm2022/lib/models/flux.model.mjs +1 -1
  11. package/esm2022/lib/models/forms.model.mjs +77 -25
  12. package/esm2022/lib/origin-form.component.mjs +170 -55
  13. package/esm2022/lib/origin-form.module.mjs +11 -1
  14. package/esm2022/lib/services/applicationData.service.mjs +1 -1
  15. package/fesm2022/qbs-origin-origin-form.mjs +518 -151
  16. package/fesm2022/qbs-origin-origin-form.mjs.map +1 -1
  17. package/lib/form-css.helper.d.ts +7 -0
  18. package/lib/formly/form-section-separator.component.d.ts +2 -2
  19. package/lib/formly/formly-dictionary-dropdown-tree/formly-dictionary-dropdown-tree.component.d.ts +2 -1
  20. package/lib/formly/formly-row-spacer.d.ts +6 -0
  21. package/lib/formly/formly-row-wrapper.d.ts +6 -0
  22. package/lib/models/flux.model.d.ts +4 -0
  23. package/lib/models/forms.model.d.ts +22 -6
  24. package/lib/origin-form.component.d.ts +6 -1
  25. package/lib/origin-form.module.d.ts +64 -62
  26. package/lib/services/applicationData.service.d.ts +1 -1
  27. package/package.json +1 -1
@@ -463,9 +463,10 @@ export class CollectorFormComponent {
463
463
  }
464
464
  }
465
465
  }
466
- resolvedValue = displayValues.length > 0
467
- ? displayValues.join(', ')
468
- : (enriched.fillValue ?? String(value));
466
+ resolvedValue =
467
+ displayValues.length > 0
468
+ ? displayValues.join(', ')
469
+ : (enriched.fillValue ?? String(value));
469
470
  }
470
471
  else {
471
472
  // Single-select
@@ -582,6 +583,39 @@ export class CollectorFormComponent {
582
583
  }
583
584
  return actionsExecuted;
584
585
  }
586
+ /**
587
+ * Executes action/status steps that appear before the first visible step.
588
+ * Called on form initialization to handle leading action steps.
589
+ */
590
+ async executeLeadingActionSteps() {
591
+ if (!this.appDataUuid || !this.flux || this.flux.length === 0) {
592
+ return;
593
+ }
594
+ const leadingActionSteps = this.actionStepHandler.getActionStepsBeforeFirstVisibleStep(this.flux);
595
+ if (leadingActionSteps.length === 0) {
596
+ return;
597
+ }
598
+ console.log(`🎬 Executing ${leadingActionSteps.length} leading action steps before first visible step`);
599
+ this.isLoading = true;
600
+ try {
601
+ const result = await this.actionStepHandler.executeActionSteps(leadingActionSteps, this.appDataUuid, (step) => {
602
+ const loadingMessage = Utils.findTranslationInfo('loadingMessageTranslations', step.translations, this.currentLanguageIso);
603
+ this.loadingMessage = loadingMessage || null;
604
+ });
605
+ if (result.success) {
606
+ console.log('✅ Leading action steps executed successfully');
607
+ }
608
+ else {
609
+ console.error('❌ Leading action steps failed:', result.error);
610
+ }
611
+ }
612
+ catch (error) {
613
+ console.error('❌ Error executing leading action steps:', error);
614
+ }
615
+ finally {
616
+ this.loadingMessage = null;
617
+ }
618
+ }
585
619
  async executeActionStepsAfterCurrentStep(currentStepIndex) {
586
620
  if (this.actionStepHandler.isExecutingActions) {
587
621
  return false;
@@ -637,35 +671,6 @@ export class CollectorFormComponent {
637
671
  return false;
638
672
  }
639
673
  }
640
- async executeLeadingActionSteps() {
641
- if (!this.appDataUuid || !this.flux || this.flux.length === 0) {
642
- return;
643
- }
644
- const leadingActionSteps = this.actionStepHandler.getActionStepsBeforeFirstVisibleStep(this.flux);
645
- if (leadingActionSteps.length === 0) {
646
- return;
647
- }
648
- console.log(`🎬 Executing ${leadingActionSteps.length} leading action steps before first visible step`);
649
- this.isLoading = true;
650
- try {
651
- const result = await this.actionStepHandler.executeActionSteps(leadingActionSteps, this.appDataUuid, (step) => {
652
- const loadingMessage = Utils.findTranslationInfo('loadingMessageTranslations', step.translations, this.currentLanguageIso);
653
- this.loadingMessage = loadingMessage || null;
654
- });
655
- if (result.success) {
656
- console.log('✅ Leading action steps executed successfully');
657
- }
658
- else {
659
- console.error('❌ Leading action steps failed:', result.error);
660
- }
661
- }
662
- catch (error) {
663
- console.error('❌ Error executing leading action steps:', error);
664
- }
665
- finally {
666
- this.loadingMessage = null;
667
- }
668
- }
669
674
  onSelectedPageChanged(index) {
670
675
  if (this.formlyConfig[0].fieldGroup) {
671
676
  var selectedPage = this.formlyConfig[0].fieldGroup[index];
@@ -1294,15 +1299,47 @@ export class CollectorFormComponent {
1294
1299
  if (section.dependentDictionary) {
1295
1300
  this.attachToDependentDictionaryIfNecessary(section.dependentDictionary, separatorFormlyConfig);
1296
1301
  }
1302
+ const sectionAny = section;
1303
+ // When the section has a visible title or separator, sectionMarginTop is passed to
1304
+ // separatorFormlyConfig so it appears ABOVE the title/hr. When neither is shown,
1305
+ // the controls ARE the top of the section, so sectionMarginTop stays on custom-section.
1306
+ const hasTitleOrSeparator = section.showSectionTitle || section.showSectionSeparator;
1307
+ if (hasTitleOrSeparator && sectionAny.marginTop) {
1308
+ separatorFormlyConfig = {
1309
+ ...separatorFormlyConfig,
1310
+ props: {
1311
+ ...separatorFormlyConfig.props,
1312
+ sectionMarginTop: sectionAny.marginTop,
1313
+ }
1314
+ };
1315
+ }
1297
1316
  stepSections.push(separatorFormlyConfig);
1317
+ // firstRowMarginBottom is passed into buildControlsFieldGroupAsync so it ends up
1318
+ // in the spacer AFTER the first row (not before it), matching user expectation.
1319
+ const sectionControls = await this.buildControlsFieldGroupAsync(step, section.controls || [], section.presentationControls || [], sectionAny.firstRowMarginBottom || undefined);
1320
+ // Prepend a spacer only for firstRowMarginTop (space ABOVE row 0).
1321
+ // firstRowMarginBottom is handled inside buildControlsFieldGroupAsync.
1322
+ if (sectionAny.firstRowMarginTop) {
1323
+ sectionControls.unshift({
1324
+ type: 'row-spacer',
1325
+ className: 'percentage-width-12',
1326
+ props: {
1327
+ spacerMarginTop: sectionAny.firstRowMarginTop,
1328
+ }
1329
+ });
1330
+ }
1298
1331
  const sectionFormlyConfig = {
1299
1332
  type: 'custom-section',
1300
1333
  props: {
1301
1334
  label: section.title,
1302
1335
  description: section.translations?.find((t) => t.languageIso === this.currentLanguageIso)?.value ?? '',
1303
- design: this.design
1336
+ design: this.design,
1337
+ // When title/separator is shown, sectionMarginTop lives on separatorFormlyConfig above.
1338
+ // When neither is shown, the controls are the top of section so keep margin here.
1339
+ sectionMarginTop: hasTitleOrSeparator ? undefined : (sectionAny.marginTop || undefined),
1340
+ sectionMarginBottom: sectionAny.marginBottom || undefined,
1304
1341
  },
1305
- fieldGroup: await this.buildControlsFieldGroupAsync(step, section.controls || [], section.presentationControls || []),
1342
+ fieldGroup: sectionControls,
1306
1343
  fieldGroupClassName: 'display-flex'
1307
1344
  };
1308
1345
  if (section.dependentDictionary) {
@@ -1366,7 +1403,7 @@ export class CollectorFormComponent {
1366
1403
  }
1367
1404
  };
1368
1405
  }
1369
- async buildControlsFieldGroupAsync(step, controls, presentationControls) {
1406
+ async buildControlsFieldGroupAsync(step, controls, presentationControls, initialPendingMarginBottom) {
1370
1407
  const result = [];
1371
1408
  let rowItems = [];
1372
1409
  controls = controls.filter((c) => !c.isOnlyForConfig);
@@ -1378,12 +1415,15 @@ export class CollectorFormComponent {
1378
1415
  return false;
1379
1416
  return true;
1380
1417
  });
1381
- const processRow = async (items) => {
1418
+ const processRow = async (items, useFlexWidth = false) => {
1382
1419
  const fields = [];
1383
1420
  const total = 12;
1384
1421
  const built = [];
1385
1422
  const auto = [];
1386
1423
  let used = 0;
1424
+ const getWidthClass = (dim) => useFlexWidth
1425
+ ? this.getFlexWidthClassName(dim)
1426
+ : this.getPercentageClassName(dim);
1387
1427
  for (const i of items) {
1388
1428
  if ('collectionControlIdentifier' in i === true) {
1389
1429
  built.push(await this.buildPresentationFormFieldAsync(step, i));
@@ -1405,53 +1445,118 @@ export class CollectorFormComponent {
1405
1445
  else {
1406
1446
  const s = Math.round((c.dimension / 100) * total);
1407
1447
  used += s;
1408
- const percentageClass = this.getPercentageClassName(c.dimension);
1409
- f.className = `${f.className} ${percentageClass}`;
1448
+ f.className = `${f.className} ${getWidthClass(c.dimension)}`;
1410
1449
  }
1411
1450
  }
1412
1451
  else if (c.dimensionType === DimensionType.Pixels) {
1413
1452
  const s = Math.round((c.dimension / window.innerWidth) * total);
1414
1453
  used += s;
1415
- const percentageClass = this.getPercentageClassName((s / total) * 100);
1416
- f.className = `${f.className} ${percentageClass}`;
1454
+ f.className = `${f.className} ${getWidthClass((s / total) * 100)}`;
1417
1455
  }
1418
1456
  else if (c.autoDimension) {
1419
1457
  auto.push({ c, f });
1420
1458
  }
1421
1459
  else {
1422
1460
  used += 1;
1423
- const percentageClass = this.getPercentageClassName((1 / total) * 100);
1424
- f.className = `${f.className} ${percentageClass}`;
1461
+ f.className = `${f.className} ${getWidthClass((1 / total) * 100)}`;
1425
1462
  }
1426
1463
  }
1427
1464
  const rem = total - used;
1428
1465
  if (auto.length > 0) {
1429
1466
  const share = Math.max(Math.floor(rem / auto.length), 1);
1430
1467
  for (const a of auto) {
1431
- const percentageClass = this.getPercentageClassName((share / total) * 100);
1432
- a.f.className = `${a.f.className} ${percentageClass}`;
1468
+ a.f.className = `${a.f.className} ${getWidthClass((share / total) * 100)}`;
1433
1469
  }
1434
1470
  }
1435
1471
  fields.push(...built);
1436
1472
  return fields;
1437
1473
  };
1474
+ // pendingPrevRowMarginBottom: carries the marginBottom of the preceding row into the
1475
+ // next spacer's marginTop so that "row margin bottom" appears BELOW the row, not above it.
1476
+ let pendingPrevRowMarginBottom = initialPendingMarginBottom;
1477
+ let pendingJustifyContent = undefined;
1438
1478
  for (const c of [...controls, ...presentationControls]) {
1439
1479
  if (('type' in c && c.type === StepControlType.NewRow) ||
1440
1480
  c.type == PresentationControlType.NewRow) {
1441
1481
  if (rowItems.length > 0) {
1442
- result.push(...(await processRow(rowItems)));
1482
+ const jc = pendingJustifyContent;
1483
+ if (jc) {
1484
+ const rowFields = await processRow(rowItems, true);
1485
+ result.push({
1486
+ type: 'row-wrapper',
1487
+ className: 'percentage-width-12',
1488
+ props: { justifyContent: jc },
1489
+ fieldGroup: rowFields
1490
+ });
1491
+ }
1492
+ else {
1493
+ result.push(...(await processRow(rowItems)));
1494
+ }
1443
1495
  rowItems = [];
1444
1496
  }
1497
+ const newRowControl = c;
1498
+ pendingJustifyContent = newRowControl.rowJustifyContent || undefined;
1499
+ // spacerMarginTop = bottom margin of the PREVIOUS row (space below it)
1500
+ // spacerMarginBottom = top margin of the CURRENT row (space above it)
1501
+ const spacerTop = pendingPrevRowMarginBottom;
1502
+ const spacerBottom = newRowControl.rowMarginTop || undefined;
1503
+ pendingPrevRowMarginBottom = newRowControl.rowMarginBottom || undefined;
1504
+ if (spacerTop || spacerBottom) {
1505
+ result.push({
1506
+ type: 'row-spacer',
1507
+ className: 'percentage-width-12',
1508
+ props: {
1509
+ spacerMarginTop: spacerTop,
1510
+ spacerMarginBottom: spacerBottom,
1511
+ }
1512
+ });
1513
+ }
1445
1514
  }
1446
1515
  else {
1447
1516
  rowItems.push(c);
1448
1517
  }
1449
1518
  }
1450
1519
  if (rowItems.length > 0) {
1451
- result.push(...(await processRow(rowItems)));
1520
+ if (pendingJustifyContent) {
1521
+ const rowFields = await processRow(rowItems, true);
1522
+ result.push({
1523
+ type: 'row-wrapper',
1524
+ className: 'percentage-width-12',
1525
+ props: { justifyContent: pendingJustifyContent },
1526
+ fieldGroup: rowFields
1527
+ });
1528
+ }
1529
+ else {
1530
+ result.push(...(await processRow(rowItems)));
1531
+ }
1532
+ }
1533
+ // Trailing spacer for the last row's marginBottom
1534
+ if (pendingPrevRowMarginBottom) {
1535
+ result.push({
1536
+ type: 'row-spacer',
1537
+ className: 'percentage-width-12',
1538
+ props: { spacerMarginTop: pendingPrevRowMarginBottom }
1539
+ });
1452
1540
  }
1453
1541
  return result;
1454
1542
  }
1543
+ getFlexWidthClassName(percentageDimension) {
1544
+ const span = Math.round((percentageDimension / 100) * 12);
1545
+ const className = `flex-width-${span}`;
1546
+ if (!document.getElementById(className)) {
1547
+ const style = document.createElement('style');
1548
+ style.type = 'text/css';
1549
+ style.id = className;
1550
+ style.innerHTML = `
1551
+ .${className} {
1552
+ width: ${Math.round((span / 12) * 100)}%;
1553
+ flex-shrink: 1;
1554
+ }
1555
+ `;
1556
+ document.head.appendChild(style);
1557
+ }
1558
+ return className;
1559
+ }
1455
1560
  getPixelClassName(pixelDimension) {
1456
1561
  const className = `pixel-width-${pixelDimension}`;
1457
1562
  if (!document.getElementById(className)) {
@@ -1487,7 +1592,8 @@ export class CollectorFormComponent {
1487
1592
  '.component-checkbox',
1488
1593
  '.component-radio',
1489
1594
  '.component-date',
1490
- '.component-data'
1595
+ '.component-data',
1596
+ '.component-dictionary'
1491
1597
  ];
1492
1598
  let formlyConfig = this.getDefaultFormlyFieldConfig(control, initialType, pattern, componentStyleKey, componentsToExcludeFromStyle);
1493
1599
  //control.specificControlData.type === 3 is email
@@ -1511,8 +1617,8 @@ export class CollectorFormComponent {
1511
1617
  formlyConfig.type = 'input';
1512
1618
  break;
1513
1619
  case ManualInputControlType.TextArea:
1514
- formlyConfig.type = 'input';
1515
- formlyConfig.props['autosize'] = false;
1620
+ formlyConfig.type = 'textarea';
1621
+ formlyConfig.props['autosize'] = true;
1516
1622
  componentStyleKey = '.component-text-field';
1517
1623
  break;
1518
1624
  case ManualInputControlType.DateTime:
@@ -1532,7 +1638,11 @@ export class CollectorFormComponent {
1532
1638
  formlyConfig.type = 'formly-paragraph';
1533
1639
  componentStyleKey = '.component-text-field';
1534
1640
  const translatedDescription = control.specificControlData?.descriptionTranslations?.find((d) => d.languageIso === this.currentLanguageIso)?.value || '';
1641
+ const translatedParagraphTitle = control.translations?.find((d) => d.languageIso === this.currentLanguageIso)?.value || '';
1535
1642
  formlyConfig.defaultValue = translatedDescription;
1643
+ formlyConfig.props['translatedDescription'] = translatedDescription;
1644
+ formlyConfig.props['translatedParagraphTitle'] =
1645
+ translatedParagraphTitle;
1536
1646
  break;
1537
1647
  case StepControlType.CheckBox: // Checkbox
1538
1648
  formlyConfig.type = 'formly-checkbox';
@@ -1541,10 +1651,15 @@ export class CollectorFormComponent {
1541
1651
  formlyConfig.props['checked'] = checked;
1542
1652
  break;
1543
1653
  case StepControlType.Dictionary: // Dictionary (dropdown)
1544
- componentStyleKey =
1545
- control.specificControlData.showAsRadioButtonsList === true
1546
- ? '.component-radio'
1547
- : '.component-data';
1654
+ if (control.specificControlData.showAsCheckboxes === true) {
1655
+ componentStyleKey = '.component-checkbox';
1656
+ }
1657
+ else if (control.specificControlData.showAsRadioButtonsList === true) {
1658
+ componentStyleKey = '.component-radio';
1659
+ }
1660
+ else {
1661
+ componentStyleKey = '.component-dictionary';
1662
+ }
1548
1663
  await this.constructDictionary(control, formlyConfig);
1549
1664
  break;
1550
1665
  case StepControlType.Buttons:
@@ -1660,6 +1775,7 @@ export class CollectorFormComponent {
1660
1775
  title: control.translations?.find((t) => t.languageIso === this.currentLanguageIso)?.value || '',
1661
1776
  design: this.design,
1662
1777
  required: control.isMandatory,
1778
+ validateThroughApi: control.specificControlData?.isApiValidation,
1663
1779
  attributes: {
1664
1780
  style: componentsToExcludeFromStyle.find((c) => c === componentStyleKey)
1665
1781
  ? ''
@@ -1878,7 +1994,6 @@ export class CollectorFormComponent {
1878
1994
  formlyConfig.defaultValue = fillValue ? '✓' : '✗';
1879
1995
  break;
1880
1996
  case 'object':
1881
- // Enriched inherited dictionary format: extract fillValue for display
1882
1997
  if (fillValue.fillValue !== undefined) {
1883
1998
  formlyConfig.defaultValue = fillValue.fillValue;
1884
1999
  }
@@ -2634,4 +2749,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
2634
2749
  }], completionEvent: [{
2635
2750
  type: Output
2636
2751
  }] } });
2637
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2luLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9vcmlnaW4tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL29yaWdpbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBSU4sWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxXQUFXLEVBR1osTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsT0FBTyxFQUNQLGNBQWMsRUFDZCxTQUFTLEVBQ1QsUUFBUSxFQUdSLFVBQVUsRUFDVixFQUFFLEVBQ0YsU0FBUyxFQUVULEdBQUcsRUFDSCxZQUFZLEVBQ1osSUFBSSxFQUNMLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBTy9DLE9BQU8sRUFLTCxRQUFRLEVBQ1IsYUFBYSxFQUNiLGVBQWUsRUFDZixzQkFBc0IsRUFHdkIsTUFBTSxzQkFBc0IsQ0FBQztBQUs5QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFZLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBVWpELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBUWxFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBS0wsdUJBQXVCLEVBR3hCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPMUMsTUFBTSxPQUFPLHNCQUFzQjtJQTBHakMsWUFDVSxPQUEwQixFQUMxQixLQUF3QixFQUN4QixRQUFtQixFQUMzQixLQUFtQixFQUNYLFlBQTBCLEVBQzFCLHNCQUE4QyxFQUM5QyxXQUE0QixFQUM1QixXQUFrQyxFQUNsQyxZQUEwQixFQUMxQixhQUE0QixFQUM1QixrQkFBc0MsRUFDdEMsK0JBQWdFLEVBQ2hFLGlCQUFvQyxFQUNwQyxvQkFBMEM7UUFiMUMsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFDMUIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUVuQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixnQkFBVyxHQUFYLFdBQVcsQ0FBdUI7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxvQ0FBK0IsR0FBL0IsK0JBQStCLENBQWlDO1FBQ2hFLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQXpHM0Msb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMseUJBQW9CLEdBQVksSUFBSSxDQUFDO1FBQ3JDLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUl6QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQVMxQyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQy9DLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDL0MsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNoRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFOUIsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXJELFNBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixpQkFBWSxHQUF3QixFQUFFLENBQUM7UUFDdkMsbUJBQWMsR0FBd0IsRUFBRSxDQUFDO1FBQ3pDLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFFZixZQUFPLEdBQXNCLEVBQUUsQ0FBQztRQUNoQyxjQUFTLEdBQVksSUFBSSxDQUFDO1FBRTFCLGtCQUFhLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdEQsMEJBQXFCLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdkQsb0JBQWUsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUM5Qyw2QkFBd0IsR0FBb0IsRUFBRSxDQUFDO1FBQy9DLGtDQUE2QixHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXpFLDhCQUE4QjtRQUN0Qix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IsNEJBQXVCLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUQseUJBQW9CLEdBQUcsS0FBSyxDQUFDLENBQUMsNENBQTRDO1FBUTFFLG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBQzVCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQ3RDLG1DQUFtQztRQUM1QixrQkFBYSxHQUFVO1lBQzVCO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUU7YUFDcEI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsUUFBUTtnQkFDbEIsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFO2FBQ3BCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRTthQUNwQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxVQUFVO2dCQUNwQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUU7YUFDcEI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFO2FBQ3BCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRTthQUNwQjtTQUNGLENBQUM7UUFJRixVQUFLLEdBQUcsSUFBSSxDQUFDO1FBa3ZHYixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFodUduQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFFeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ2hDLE1BQU0sWUFBWSxHQUNoQixJQUFJLENBQUMsK0JBQStCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3BFLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVyRCxNQUFNLHFCQUFxQixHQUN6QixJQUFJLENBQUMsK0JBQStCLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUNoRSxLQUFLLEVBQUUsTUFBdUIsRUFBRSxFQUFFO1lBQ2hDLElBQUksTUFBTSxDQUFDLG1CQUFtQixLQUFLLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3BELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNuQixPQUFPLENBQUMsR0FBRyxDQUNULDhEQUE4RCxFQUM5RCxNQUFNLENBQUMsSUFBSSxDQUNaLENBQUM7b0JBQ0YsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNqRCxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNoRCxDQUFDO29CQUVELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLENBQUMsS0FBSyxDQUNYLDhDQUE4QyxFQUM5QyxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztRQUNKLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUU5RCw0Q0FBNEM7UUFDNUMsTUFBTSxrQkFBa0IsR0FDdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQzlELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7WUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVyRCxNQUFNLGtCQUFrQixHQUN0QixJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBQ0Qsc0ZBQXNGO1FBQ3hGLENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUMvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDdkQsQ0FBQztZQUNGLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FDeEMsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FDbkIsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLENBQUM7UUFFRCxJQUNFLElBQUksQ0FBQyxlQUFlO1lBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztZQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFDakMsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FDbEMsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckUsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNsRSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDO1FBQ3RFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2Qiw0RUFBNEU7WUFDNUUsTUFBTSxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBc0I7UUFDdEMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFFLElBQ0UsSUFBSSxDQUFDLGVBQWU7Z0JBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztnQkFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQ2pDLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQy9ELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FDbEMsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFDRSxPQUFPLENBQUMsb0JBQW9CLENBQUM7WUFDN0IsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxXQUFXLEVBQzFDLENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUV0QixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUM3QixNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ2xFLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzt3QkFDdkMsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUM7d0JBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUN4RCxJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO3dCQUNGLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzs0QkFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDN0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQzs0QkFDbkQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQ0FDcEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQzs0QkFDNUQsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwRCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3ZCLDRFQUE0RTtnQkFDNUUsTUFBTSxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUN6QyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNqQixDQUFDO29CQUFTLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FDWixNQUFNLGNBQWMsQ0FDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQzVELENBQUM7WUFDSixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMzRSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEQsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUztRQUNiLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sVUFBVSxDQUFDLFFBQWdCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDO0lBQ2xFLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBYztRQUMzQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxzQkFBc0I7YUFDeEIsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2FBQ3pELFNBQVMsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFDRCxlQUFlLENBQUMsV0FBbUI7UUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDM0MsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssV0FBVyxDQUNuQyxDQUFDO1FBQ0YsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQjtRQUM1QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFFRCxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUM3QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdEIsdUVBQXVFO1FBQ3ZFLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFFekMscURBQXFEO1FBQ3JELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTlCLHVFQUF1RTtRQUN2RSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDO1FBQy9DLENBQUM7UUFFRCxzREFBc0Q7UUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLHFCQUFxQixDQUFDLG9CQUFvQixDQUNyRCxJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFcEMsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7YUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQzthQUNqQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQWEsRUFBRSxFQUFFLENBQ3RDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUN6QyxDQUFDO0lBQ04sQ0FBQztJQUVPLHFCQUFxQixDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBYTtRQUNwRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FDakQsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7UUFDRixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQ2pELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUMsS0FBSyxHQUFHLENBQ2pFLENBQUM7WUFDRixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ3ZCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDZixRQUFRLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ3pCLEtBQUssU0FBUzs0QkFDWixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzs0QkFDMUMsTUFBTTt3QkFFUjs0QkFDRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQztnQ0FDNUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQzdDLENBQUMsV0FBZ0MsRUFBRSxFQUFFLENBQ25DLFdBQVcsQ0FBQyxVQUFVLEtBQUssaUJBQWlCLENBQy9DLENBQUM7Z0NBQ0YsS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUNqRCxDQUFDO2lDQUFNLENBQUM7Z0NBQ04sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDcEIsQ0FBQzs0QkFDRCxNQUFNO29CQUNWLENBQUM7b0JBQ0QsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFELElBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7b0JBQ2IsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUNqRCxDQUFDO29CQUNELElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO29CQUNoRSxJQUFJLHdCQUF3QixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDaEUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FDM0IsQ0FBQztvQkFDRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQzVELElBQUksQ0FBQyxJQUFJLEVBQ1Qsd0JBQXdCLENBQ3pCLENBQUM7b0JBQ0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzFCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQzdDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbEMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFNBQVM7UUFDZixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFlBQVk7aUJBQ2QsU0FBUyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUM7aUJBQ3pDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8scUNBQXFDO1FBQzNDLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFcEQsMEVBQTBFO1FBQzFFLE1BQU0sb0JBQW9CLEdBQXdCLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSTtZQUNuRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJO2lCQUNmLE9BQU8sQ0FBQyxDQUFDLElBQXlDLEVBQUUsRUFBRSxDQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQTRCLEVBQUUsRUFBRSxDQUNyRCxPQUFPLENBQUMsUUFBUTtpQkFDYixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQztpQkFDM0QsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQzVCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztnQkFDNUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO2FBQ2pDLENBQUMsQ0FBQyxDQUNOLENBQ0Y7aUJBQ0EsTUFBTSxDQUNMLENBQ0UsVUFBZ0MsRUFDaEMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBTyxFQUMxQyxFQUFFO2dCQUNGLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7d0JBQ3ZELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxDQUFDO3dCQUM1RCxJQUFJLEtBQUssRUFBRSxDQUFDOzRCQUNWLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQzlDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLGlCQUFpQixDQUN6QyxDQUFDOzRCQUNGLElBQUksV0FBVyxFQUFFLENBQUM7Z0NBQ2hCLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO2dDQUMxQyxNQUFNOzRCQUNSLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7cUJBQU0sQ0FBQztvQkFDTixVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDO2dCQUNwQyxDQUFDO2dCQUNELE9BQU8sVUFBVSxDQUFDO1lBQ3BCLENBQUMsRUFDRCxFQUF5QixDQUMxQjtZQUNMLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFUCw4RUFBOEU7UUFDOUUsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUM7UUFFbkQsb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQztnQkFDSCxjQUFjO29CQUNaLE9BQU8sSUFBSSxDQUFDLGNBQWMsS0FBSyxRQUFRO3dCQUNyQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO3dCQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUM1QixDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JELENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLElBQVMsRUFBRSxTQUFtQixFQUFFLEVBQUU7WUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN6QixvQkFBb0IsQ0FBQyxrQkFBa0IsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNyRSxDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FDMUIsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FDdEQsQ0FBQztnQkFDRixPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDOUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDOUMsQ0FBQztnQkFDRixPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsb0JBQW9CLENBQUMsa0JBQWtCLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixJQUFJLGNBQWMsS0FBSyxJQUFJLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELGlCQUFpQixDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsdUNBQXVDO1FBQ3ZDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDO1FBQ3ZELElBQUksZUFBZSxJQUFJLE9BQU8sZUFBZSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzNELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQzNELElBQUksYUFBa0IsQ0FBQztnQkFDdkIsSUFDRSxPQUFPLEtBQUssS0FBSyxRQUFRO29CQUN6QixLQUFLLEtBQUssSUFBSTtvQkFDZCxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUNwQixLQUFhLENBQUMsY0FBYyxFQUM3QixDQUFDO29CQUNELHlEQUF5RDtvQkFDekQsTUFBTSxRQUFRLEdBQUcsS0FBWSxDQUFDO29CQUM5QixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO29CQUUzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDM0Qsd0VBQXdFO3dCQUN4RSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO3dCQUN0RCxNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUM7d0JBQ25DLEtBQUssTUFBTSxPQUFPLElBQUksWUFBWSxFQUFFLENBQUM7NEJBQ25DLE1BQU0sU0FBUyxHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDOzRCQUNoRixLQUFLLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQ0FDcEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLENBQUM7Z0NBQzdELElBQUksRUFBRSxFQUFFLENBQUM7b0NBQ1AsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FDNUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksaUJBQWlCLENBQzlDLENBQUM7b0NBQ0YsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQ0FDbEQsTUFBTTtnQ0FDUixDQUFDOzRCQUNILENBQUM7d0JBQ0gsQ0FBQzt3QkFDRCxhQUFhLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDOzRCQUN0QyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7NEJBQzFCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQzVDLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixnQkFBZ0I7d0JBQ2hCLGFBQWEsR0FBRyxRQUFRLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdEQsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDeEIsQ0FBQztnQkFDRCxvQkFBb0IsQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDO2dCQUN6RCxJQUFJLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUM1QyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztJQUNuRCxDQUFDO0lBQ08sb0JBQW9CO1FBQzFCLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUNqRCxJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztRQUNGLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUNPLEtBQUssQ0FBQyxzQkFBc0I7UUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNuQixXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWU7Z0JBQy9CLENBQUMsQ0FBQyxLQUFLO2dCQUNQLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWU7WUFDcEMsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZO1lBQ3hFLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZTtnQkFDaEMsQ0FBQyxDQUFDLEtBQUs7Z0JBQ1AsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWTtZQUNqQyxlQUFlLEVBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlO2dCQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksSUFBSSxLQUFLO2dCQUNwQyxDQUFDLENBQUMsSUFBSTtnQkFDTixDQUFDLENBQUMsS0FBSztTQUNaLENBQUM7UUFFRixJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDOUQsSUFBSSwyQkFBMkIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDeEQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLHFCQUFxQixDQUMvRCxDQUFDO1FBRUYsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN4RCxJQUFJLHdCQUF3QixHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FDcEQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FDM0IsQ0FBQztRQUNGLCtDQUErQztRQUMvQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFFLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUNwRSxJQUFJLENBQUMsSUFBSSxFQUNULHdCQUF3QixDQUN6QixDQUFDO1FBRUYsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNsQjtnQkFDRSxJQUFJLEVBQUUsU0FBUztnQkFDZixLQUFLLEVBQUU7b0JBQ0wsU0FBUyxFQUFFLElBQUksQ0FBQyxRQUFRO3dCQUN0QixDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUzt3QkFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXO29CQUNwQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ25CLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWU7b0JBQzVDLElBQUksRUFBRSxZQUFZLEVBQUUscUNBQXFDO29CQUN6RCxZQUFZLEVBQUUsb0JBQW9CO29CQUNsQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGVBQWU7b0JBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDdkIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO29CQUNuQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsZUFBZTtvQkFDMUQsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUNyQixZQUFZLEVBQUU7d0JBQ1osdUJBQXVCLEVBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLHVCQUF1Qjt3QkFDOUMseUJBQXlCLEVBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLHlCQUF5QjtxQkFDakQ7b0JBQ0QsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO29CQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRO29CQUNqQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDckIsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO29CQUNyQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO29CQUN6QyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7b0JBQ2IsMkJBQTJCLEVBQUUsMkJBQTJCO29CQUN4RCxjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUN0QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUMxQyxFQUFFLHFDQUFxQztvQkFDeEMsZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7b0JBQzFDLHNCQUFzQixFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDeEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQztvQkFDcEMscUJBQXFCLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUN2QyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDO2lCQUNwQztnQkFDRCxVQUFVLEVBQUUsbUJBQW1CO2FBQ2hDO1NBQ0YsQ0FBQztRQUVGLHNFQUFzRTtRQUN0RSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUM3RCxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ25ELElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsc0JBQXNCLENBQUMsY0FBbUI7UUFDdEQsSUFBSSxTQUFpQixDQUFDO1FBQ3RCLElBQUksT0FBZSxDQUFDO1FBQ3BCLElBQUksUUFBUSxHQUFlLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUVwQyxJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sR0FBRyxjQUFjLENBQUM7WUFDekIsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDOUIsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFTLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztZQUNoQyxPQUFPLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUM1QixRQUFRLEdBQUcsY0FBYyxDQUFDLFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFFRCxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFFNUIsSUFBSSxPQUFPLEdBQUcsU0FBUyxFQUFFLENBQUM7WUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FDVCwrREFBK0QsQ0FDaEUsQ0FBQztZQUNGLGVBQWU7Z0JBQ2IsTUFBTSxJQUFJLENBQUMsa0NBQWtDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsQ0FBQzthQUFNLElBQUksT0FBTyxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNqRSxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7UUFFMUIsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLFFBQVEsRUFBRSxDQUFDO1FBQ2IsQ0FBQztRQUVELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxLQUFLLENBQUMsa0NBQWtDLENBQzlDLGdCQUF3QjtRQUV4QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzlDLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDekMsSUFDRSxDQUFDLENBQUMsbUJBQW1CO2dCQUNyQixDQUFDLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLEVBQzNDLENBQUM7Z0JBQ0QsTUFBTSxVQUFVLEdBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsMkJBQTJCLENBQUMsQ0FBQztnQkFDaEUsdURBQXVEO2dCQUN2RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxNQUFNLGFBQWEsR0FBRyxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUNyQyxJQUNFLGFBQWE7b0JBQ2IsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFDL0QsQ0FBQztvQkFDRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2dCQUNELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQzlELGFBQWEsRUFDYixnQkFBZ0IsQ0FDakIsQ0FBQztRQUVGLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN0QixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCw4Q0FBOEM7WUFDOUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUV0QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FDNUQsV0FBVyxFQUNYLElBQUksQ0FBQyxXQUFXLEVBQ2hCLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ1AsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUM5Qyw0QkFBNEIsRUFDNUIsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO2dCQUNGLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxJQUFJLElBQUksQ0FBQztZQUMvQyxDQUFDLENBQ0YsQ0FBQztZQUVGLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7Z0JBQ3BELCtFQUErRTtnQkFDL0UsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLHlCQUF5QjtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLGtCQUFrQixHQUN0QixJQUFJLENBQUMsaUJBQWlCLENBQUMsb0NBQW9DLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpFLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxnQkFBZ0Isa0JBQWtCLENBQUMsTUFBTSxpREFBaUQsQ0FDM0YsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUM1RCxrQkFBa0IsRUFDbEIsSUFBSSxDQUFDLFdBQVcsRUFDaEIsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDUCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQzlDLDRCQUE0QixFQUM1QixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLElBQUksSUFBSSxDQUFDO1lBQy9DLENBQUMsQ0FDRixDQUFDO1lBRUYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUM5RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEUsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRSxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLEtBQWE7UUFDekMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUUzRCxxQkFBcUIsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFTyx1Q0FBdUMsQ0FBQyxFQUFRO1FBQ3RELEVBQUUsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBTyxFQUFFLEVBQUU7WUFDbEMsSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ25ELElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDakQsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUN4RCxFQUFFLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQztnQkFDeEIsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksbUJBQW1CLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO29CQUNsRSxJQUFJLG1CQUFtQixFQUFFLENBQUM7d0JBQ3hCLE1BQU0sS0FBSyxHQUNULElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO3dCQUMxRCxJQUFJLEtBQUssRUFBRSxDQUFDOzRCQUNWLDhDQUE4Qzs0QkFDOUMsTUFBTSxhQUFhLEdBQ2pCLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDOzRCQUNqRSxNQUFNLFdBQVcsR0FDZixLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQzs0QkFFM0QsSUFDRSxhQUFhO2dDQUNiLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO2dDQUM1QixhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDeEIsQ0FBQztnQ0FDRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dDQUN0RCxNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUM7Z0NBQ25DLEtBQUssTUFBTSxPQUFPLElBQUksYUFBYSxFQUFFLENBQUM7b0NBQ3BDLE1BQU0sY0FBYyxHQUNsQixPQUFPLE9BQU8sS0FBSyxRQUFRO3dDQUN6QixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7d0NBQ3ZCLENBQUMsQ0FBQyxPQUFPLENBQUM7b0NBQ2QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQzt3Q0FDdkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQzdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLGNBQWMsQ0FDL0IsQ0FBQzt3Q0FDRixJQUFJLEtBQUssRUFBRSxDQUFDOzRDQUNWLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQzlDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLGlCQUFpQixDQUN6QyxDQUFDOzRDQUNGLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7NENBQ3JELE1BQU07d0NBQ1IsQ0FBQztvQ0FDSCxDQUFDO2dDQUNILENBQUM7Z0NBQ0QsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29DQUM3QixFQUFFLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0NBQzdDLENBQUM7NEJBQ0gsQ0FBQztpQ0FBTSxJQUNMLFdBQVc7Z0NBQ1gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7Z0NBQzFCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUN0QixDQUFDO2dDQUNELDBDQUEwQztnQ0FDMUMsRUFBRSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUMzQyxDQUFDO2lDQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dDQUM3QixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dDQUN0RCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO29DQUN2RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FDN0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FDakMsQ0FBQztvQ0FDRixJQUFJLEtBQUssRUFBRSxDQUFDO3dDQUNWLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQzlDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLGlCQUFpQixDQUN6QyxDQUFDO3dDQUNGLElBQUksV0FBVyxFQUFFLENBQUM7NENBQ2hCLEVBQUUsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQzs0Q0FDcEMsTUFBTTt3Q0FDUixDQUFDO29DQUNILENBQUM7Z0NBQ0gsQ0FBQzs0QkFDSCxDQUFDO2lDQUFNLENBQUM7Z0NBQ04sRUFBRSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDOzRCQUNwQyxDQUFDO3dCQUNILENBQUM7NkJBQU0sQ0FBQzs0QkFDTixnREFBZ0Q7NEJBQ2hELElBQUksYUFBYSxHQUNmLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7NEJBQ25ELElBQUksYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dDQUNoQyxJQUNFLE9BQU8sYUFBYSxLQUFLLFFBQVE7b0NBQ2pDLGFBQWEsS0FBSyxJQUFJO29DQUN0QixhQUFhLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFDckMsQ0FBQztvQ0FDRCxhQUFhLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztnQ0FDMUMsQ0FBQztnQ0FDRCxFQUFFLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQzs0QkFDbEMsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dDQUM5RCxFQUFFLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQzs0QkFDeEIsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsdUNBQXVDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkQsQ0FBQztZQUNELElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNwQixFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2xDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyw2QkFBNkIsQ0FBQyxTQUFpQjtRQUNyRCxJQUFJLFdBQVcsR0FBUSxTQUFTLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDakIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTt3QkFDN0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUNqQixXQUFXLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQzVCLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FDdEMsQ0FBQzs0QkFDRixJQUFJLFdBQVcsRUFBRSxDQUFDO2dDQUNoQixPQUFPLFdBQVcsQ0FBQzs0QkFDckIsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRU8sdUJBQXVCLENBQUMsT0FBZTtRQUM3QyxJQUFJLFVBQVUsR0FBUSxTQUFTLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQzNDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDaEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTt3QkFDOUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDOzRCQUNoQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQ2xDLElBQUksS0FBSyxFQUFFLENBQUM7Z0NBQ1YsVUFBVSxHQUFHLEtBQUssQ0FBQzs0QkFDckIsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDO2dCQUM5QyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsS0FBSyxDQUNyQixxQkFBcUIsQ0FDSyxDQUFDO2dCQUM3QixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztvQkFDN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQztvQkFDbkUsdURBQXVEO29CQUN2RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQzt3QkFDOUIsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCxNQUFNLGFBQWEsR0FBRyxVQUFVLEVBQUUsRUFBRSxDQUFDO29CQUNyQyxJQUNFLGFBQWE7d0JBQ2IsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFDakQsQ0FBQzt3QkFDRCxPQUFPLElBQUksQ0FBQztvQkFDZCxDQUFDO29CQUNELE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQywwQkFBMEI7UUFDdEMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMxQyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7YUFBTSxDQUFDO1lBQ04sNkNBQTZDO1lBQzdDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUUsT0FBTyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ3RCLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDeEIsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEQsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUNULENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQywyQkFBMkIsQ0FDdkMsSUFBYztRQUVkLElBQUksZ0JBQWdCLEdBQXNCLEVBQUUsQ0FBQztRQUU3QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsRSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNOLGdCQUFnQixHQUFHO2dCQUNqQixLQUFLLEVBQUU7b0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUNoQixXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ3RCLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztvQkFDNUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtvQkFDN0MsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVO2lCQUN4QjtnQkFDRCxVQUFVLEVBQUUsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUM7YUFDekUsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN0QixnQkFBZ0IsQ0FBQyxLQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUMxRCxNQUFNLEVBQ04sSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO2dCQUNGLGdCQUFnQixDQUFDLEtBQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQ2hFLGFBQWEsRUFDYixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQ2xDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQywyQkFBMkIsQ0FDckQsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxTQUFpQixFQUFFLEtBQVU7UUFDbEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCxtQkFBbUIsQ0FDakIsTUFBdUMsRUFDdkMsR0FBVyxFQUNYLEtBQVU7UUFFVixJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTFCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUN0QixJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDdEIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ3ZELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDckUsSUFBSSxLQUFLO29CQUFFLE9BQU8sSUFBSSxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sS0FBSyxDQUFDLDRCQUE0QixDQUN4QyxJQUFjO1FBRWQsTUFBTSxZQUFZLEdBQXNCO1lBQ3RDLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2hCLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDNUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJO2FBQ3BCO1lBQ0QsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDO1FBRUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMxQyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxNQUFNLEdBQVEsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQW1CLEVBQUUsRUFBRTtvQkFDaEQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUNyQyxFQUFFLENBQUMsTUFBTSxFQUNULElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDSCxXQUFXLENBQUMsS0FBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztnQkFDdEMsV0FBVyxDQUFDLEtBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQ3BELE1BQU0sRUFDTixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7Z0JBQ0YsV0FBVyxDQUFDLEtBQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQzNELGFBQWEsRUFDYixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7Z0JBQ0YsWUFBWSxDQUFDLEtBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQ3RELE1BQU0sRUFDTixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7Z0JBQ0YsWUFBWSxDQUFDLEtBQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQzVELGFBQWEsRUFDYixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7WUFDSixDQUFDO1lBQ0QsV0FBVyxDQUFDLEtBQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3pELFlBQVksQ0FBQyxVQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBYyxFQUFFLFlBQStCO1FBQ3RFLElBQUksWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN2QyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDM0MsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQy9DLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNqRCxZQUFZLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ3ZFLENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsSUFBYztRQUMxQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLHVCQUF1QjtZQUM3QixLQUFLLEVBQUU7Z0JBQ0wsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUMzQixRQUFRLEVBQUUsSUFBSTtnQkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2YsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNyQixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUs7Z0JBQzFCLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBVSxFQUFFLEVBQUU7b0JBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUN4QixNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUNsQyxDQUFDO2dCQUNILENBQUM7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sNkJBQTZCLENBQ25DLFdBQXdCO1FBRXhCLE9BQU87WUFDTCxJQUFJLEVBQUUscUNBQXFDO1lBQzNDLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlO2dCQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzNCLFdBQVcsRUFBRSxXQUFXO2dCQUN4QixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUztnQkFDdEMsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7YUFDakM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLHlCQUF5QixDQUMvQixXQUF3QjtRQUV4QixPQUFPO1lBQ0wsSUFBSSxFQUFFLGlDQUFpQztZQUN2QyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDcEMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUMzQixXQUFXLEVBQUUsV0FBVztnQkFDeEIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVM7Z0JBQ3RDLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCO2FBQ2pDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTywyQkFBMkIsQ0FDakMsV0FBd0I7UUFFeEIsT0FBTztZQUNMLElBQUksRUFBRSxtQ0FBbUM7WUFDekMsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWU7Z0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTO2dCQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjthQUNqQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sNkJBQTZCLENBQUMsSUFBYztRQUNsRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLHFDQUFxQztZQUMzQyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDcEMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUMzQixRQUFRLEVBQUUsSUFBSTtnQkFDZCxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTO2dCQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtnQkFDaEMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFVLEVBQUUsRUFBRTtvQkFDMUIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ3hCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQ2xDLENBQUM7Z0JBQ0gsQ0FBQzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsa0JBQWtCO1FBQ3RCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEUsSUFBSSxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNELE1BQU0sZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QyxDQUFDO0lBQ0gsQ0FBQztJQUVPLDJCQUEyQixDQUFDLElBQWM7UUFDaEQsSUFBSSxNQUFNLEdBQVEsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3ZDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUMxQixNQUFNLENBQUMsR0FBRyxDQUFDO29CQUNULElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUNyQixDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUM3QixDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FDNUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU87WUFDTCxJQUFJLEVBQUUsNkJBQTZCO1lBQ25DLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlO2dCQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzNCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7YUFDakM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUNPLHVCQUF1QixDQUFDLElBQWM7UUFDNUMsSUFBSSxhQUFhLEdBQVEsRUFBRSxDQUFDO1FBRTVCLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUM3QyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQy9DLEtBQUssQ0FBQyxZQUFZLEVBQ2xCLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELDBDQUEwQztRQUMxQyxJQUFJLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3ZDLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNwRSxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDakQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQ3ZDLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQzFFLEVBQUUsS0FBSyxDQUFDO29CQUNULElBQUksVUFBVSxFQUFFLENBQUM7d0JBQ2YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFVBQVUsQ0FBQztvQkFDaEMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTztZQUNMLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsS0FBSyxFQUFFO2dCQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNuQixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUU7Z0JBQ25ELEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWU7Z0JBQ3BDLGFBQWEsRUFBRSxhQUFhO2dCQUM1QixNQUFNLEVBQUUsTUFBTTtnQkFDZCxLQUFLLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO2FBQzNEO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxJQUFjO1FBQ3pDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQ3BELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDRCQUE0QixDQUNwRCxDQUFDO1FBRUYsTUFBTSx3QkFBd0IsR0FDNUIsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FDbEMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUN0RCxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFFakIsT0FBTztZQUNMLElBQUksRUFBRSxpQ0FBaUM7WUFDdkMsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDcEIsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzNCLEdBQUcsRUFBRSxRQUFRLEVBQUUseUNBQXlDO2dCQUN4RCxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQy9CLFlBQVksRUFBRSxFQUFFO2dCQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQ3pCLHlCQUF5QixFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ2xELFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYTtnQkFDL0IsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxJQUFJLENBQUM7Z0JBQzNDLGNBQWMsRUFBRSx3QkFBd0I7Z0JBQ3hDLFlBQVksRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyx3QkFBd0IsQ0FBQztvQkFDL0MsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMscUJBQXFCLENBQzlELElBQUksQ0FBQyxXQUFXLENBQ2pCLENBQUM7Z0JBQ0osQ0FBQzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxJQUFjO1FBQ2hELE9BQU87WUFDTCxJQUFJLEVBQUUsOEJBQThCO1lBQ3BDLEtBQUssRUFBRTtnQkFDTCxRQUFRLEVBQUUsSUFBSTtnQkFDZCxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFVLEVBQUUsRUFBRTtvQkFDMUIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ3hCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQ2xDLENBQUM7Z0JBQ0gsQ0FBQzthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTywwQkFBMEIsQ0FBQyxJQUFjO1FBQy9DLE9BQU87WUFDTCxJQUFJLEVBQUUsb0JBQW9CO1lBQzFCLEtBQUssRUFBRTtnQkFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzNCLFFBQVEsRUFBRSxJQUFJO2dCQUNkLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCO2dCQUNoQyxLQUFLLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQzthQUN6RDtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sc0JBQXNCLENBQUMsSUFBYztRQUMzQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLG9CQUFvQjtZQUMxQixLQUFLLEVBQUU7Z0JBQ0wsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMzQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7YUFDakM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLDRCQUE0QixDQUFDLElBQWM7UUFDakQsMERBQTBEO1FBQzFELHFFQUFxRTtRQUNyRSxPQUFPO1lBQ0wsSUFBSSxFQUFFLHFCQUFxQjtZQUMzQixLQUFLLEVBQUU7Z0JBQ0wsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMzQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsUUFBUSxFQUFFLElBQUksRUFBRSw0Q0FBNEM7Z0JBQzVELEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCO2dCQUNoQyxNQUFNLEVBQUU7b0JBQ04sY0FBYyxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQ25DLElBQUksQ0FBQyxNQUFNLEVBQUUsMEJBQTBCLElBQUksRUFBRSxFQUM3QyxJQUFJLENBQUMsa0JBQWtCLENBQ3hCO29CQUNELGNBQWMsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUNuQyxJQUFJLENBQUMsTUFBTSxFQUFFLDBCQUEwQixJQUFJLEVBQUUsRUFDN0MsSUFBSSxDQUFDLGtCQUFrQixDQUN4QjtvQkFDRCxtQkFBbUIsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUN4QyxJQUFJLENBQUMsTUFBTSxFQUFFLCtCQUErQixJQUFJLEVBQUUsRUFDbEQsSUFBSSxDQUFDLGtCQUFrQixDQUN4QjtvQkFDRCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUN0QyxJQUFJLENBQUMsTUFBTSxFQUFFLDZCQUE2QixJQUFJLEVBQUUsRUFDaEQsSUFBSSxDQUFDLGtCQUFrQixDQUN4QjtvQkFDRCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZUFBZSxDQUNyQyxJQUFJLENBQUMsTUFBTSxFQUFFLDRCQUE0QixJQUFJLEVBQUUsRUFDL0MsSUFBSSxDQUFDLGtCQUFrQixDQUN4QjtpQkFDRjtnQkFDRCxLQUFLLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO2FBQzVEO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxJQUFjO1FBQzVDLE9BQU87WUFDTCxJQUFJLEVBQUUsZUFBZTtZQUNyQixLQUFLLEVBQUU7Z0JBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixRQUFRLEVBQUUsSUFBSTtnQkFDZCxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWU7YUFDckM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLDZCQUE2QixDQUNuQyxJQUFjO1FBRWQsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsS0FBSyxRQUFRLENBQUMsR0FBRztnQkFDZixDQUFDO29CQUNDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QyxDQUFDO2dCQUNELE1BQU07WUFDUixLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDcEIsS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3JCLGtFQUFrRTtnQkFDbEUsc0RBQXNEO2dCQUN0RCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDckIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztnQkFDL0IsT0FBTyxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDckIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFZLEVBQUUsSUFBYztRQUMxQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUFVLEVBQUUsSUFBYztRQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU8sa0JBQWtCLENBQUMsS0FBVSxFQUFFLElBQWM7UUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QiwyQ0FBMkM7WUFDM0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLDRCQUE0QjtZQUM1QixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRU8saUJBQWlCLENBQUMsS0FBVSxFQUFFLElBQWM7UUFDbEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDckMsQ0FBQyxDQUFxQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQ3ZELENBQUM7UUFDRixZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FDM0IsQ0FBQyxDQUtBLEVBQUUsRUFBRTtZQUNILENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUNoQixDQUFDLENBR0EsRUFBRSxFQUFFO2dCQUNILElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUNoQixNQUFNLEtBQUssR0FBRzt3QkFDWixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRTs0QkFDYixLQUFLLEVBQUUsQ0FBQyxDQUFDLFNBQVM7eUJBQ25CO3FCQUNGLENBQUM7b0JBRUYsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQzt3QkFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzlCLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUNsRSxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFjO1FBQ2xDLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3BFLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUN2RSxDQUFDO1FBRUYsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQ3JELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FDdkQsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLGVBQWUsQ0FBQyxLQUFLLEdBQUc7Z0JBQ3RCLEdBQUcsZUFBZSxDQUFDLEtBQUs7Z0JBQ3hCLGVBQWUsRUFBRSxLQUFLO2FBQ3ZCLENBQUM7WUFDRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFTyxjQUFjO1FBQ3BCLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxvQkFBb0IsQ0FDcEQsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsZUFBZSxDQUNyQixDQUFDO1FBRUYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUQsWUFBWSxDQUFDLEVBQUUsR0FBRyxjQUFjLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2RCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQ3ZCLFlBQVksRUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQzVELENBQUM7UUFDRixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxLQUFLLENBQUMsNEJBQTRCLENBQ2hDLElBQTBCLEVBQzFCLFFBQXVCO1FBRXZCLE1BQU0sWUFBWSxHQUF3QixFQUFFLENBQUM7UUFFN0MsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsUUFBUSxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDakUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hDLElBQUkscUJBQXFCLEdBQVEsRUFBRSxDQUFDO1lBQ3BDLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzdCLHFCQUFxQixHQUFHO29CQUN0QixJQUFJLEVBQUUsV0FBVztvQkFDakIsS0FBSyxFQUFFO3dCQUNMLEtBQUssRUFDSCxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FDeEIsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUN0RCxFQUFFLEtBQUssSUFBSSxFQUFFO3dCQUVoQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07cUJBQ3BCO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxPQUFPLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDakMscUJBQXFCLEdBQUc7b0JBQ3RCLEdBQUcscUJBQXFCO29CQUN4QixJQUFJLEVBQUUsV0FBVztvQkFDakIsS0FBSyxFQUFFO3dCQUNMLEdBQUcscUJBQXFCLENBQUMsS0FBSzt3QkFDOUIsYUFBYSxFQUFFLE9BQU8sQ0FBQyxvQkFBb0I7cUJBQzVDO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLHNDQUFzQyxDQUN6QyxPQUFPLENBQUMsbUJBQW1CLEVBQzNCLHFCQUFxQixDQUN0QixDQUFDO1lBQ0osQ0FBQztZQUNELFlBQVksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUV6QyxNQUFNLG1CQUFtQixHQUFzQjtnQkFDN0MsSUFBSSxFQUFFLGdCQUFnQjtnQkFDdEIsS0FBSyxFQUFFO29CQUNMLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztvQkFDcEIsV0FBVyxFQUNULE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUN4QixDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQ3RELEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtpQkFDcEI7Z0JBQ0QsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUNqRCxJQUFJLEVBQ0osT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQ3RCLE9BQU8sQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQ25DO2dCQUNELG1CQUFtQixFQUFFLGNBQWM7YUFDcEMsQ0FBQztZQUNGLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxzQ0FBc0MsQ0FDekMsT0FBTyxDQUFDLG1CQUFtQixFQUMzQixtQkFBbUIsQ0FDcEIsQ0FBQztZQUNKLENBQUM7WUFFRCxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNuQixJQUFJLGdCQUFnQixHQUFzQixFQUFFLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsZ0JBQWdCLEdBQUc7Z0JBQ2pCLEtBQUssRUFBRTtnQkFDTCxvQkFBb0I7Z0JBQ3BCLGdEQUFnRDtnQkFDaEQsa0RBQWtEO2lCQUNuRDtnQkFDRCxVQUFVLEVBQUUsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQ2pELFNBQVMsRUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FDdEI7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVELGdDQUFnQyxDQUM5QixVQUErQixFQUMvQixNQUF5QjtRQUV6QixJQUFJLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRCxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsd0JBQXdCLENBQUMsVUFBK0I7UUFDdEQsTUFBTSxlQUFlLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDL0MsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3ZCLENBQUMsQ0FBQyxTQUFTLEdBQUcsTUFBTSxHQUFHLGVBQWUsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxtQkFBMkI7UUFDaEQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUMsaUJBQWlCO1FBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxtQkFBbUIsR0FBRyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztRQUNwRSxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsSUFBSSxFQUFFLENBQUM7UUFFN0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLEtBQUssQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDO1lBQ3JCLEtBQUssQ0FBQyxTQUFTLEdBQUc7V0FDYixTQUFTOzhCQUNVLElBQUk7O09BRTNCLENBQUM7WUFDRixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELG1CQUFtQixDQUFDLElBQVk7UUFDOUIsT0FBTztZQUNMLElBQUksRUFBRSxZQUFZO1lBQ2xCLFNBQVMsRUFBRSxvQkFBb0IsSUFBSSxFQUFFO1lBQ3JDLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsRUFBRTtnQkFDVCxRQUFRLEVBQUUsSUFBSTtnQkFDZCxJQUFJLEVBQUUsSUFBSTthQUNYO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsNEJBQTRCLENBQ3hDLElBQTBCLEVBQzFCLFFBQXVCLEVBQ3ZCLG9CQUEyQztRQUUzQyxNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFDO1FBQ3ZDLElBQUksUUFBUSxHQUEwQyxFQUFFLENBQUM7UUFDekQsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXRELDBDQUEwQztRQUMxQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQy9CLGdEQUFnRDtZQUNoRCxJQUNFLENBQUMsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLFVBQVU7Z0JBQ3JDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLGNBQWM7Z0JBRXRDLE9BQU8sS0FBSyxDQUFDO1lBQ2YsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxLQUE0QyxFQUFFLEVBQUU7WUFDeEUsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztZQUN2QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDakIsTUFBTSxLQUFLLEdBQXdCLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksR0FHSixFQUFFLENBQUM7WUFDVCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7WUFDYixLQUFLLE1BQU0sQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN0QixJQUFJLDZCQUE2QixJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDaEQsS0FBSyxDQUFDLElBQUksQ0FDUixNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FDeEMsSUFBSSxFQUNKLENBQXdCLENBQ3pCLENBQ0YsQ0FBQztnQkFDSixDQUFDO3FCQUFNLElBQUksYUFBYSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDdkMsS0FBSyxDQUFDLElBQUksQ0FDUixNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FDckMsSUFBSSxFQUNKLENBQXdCLENBQ3pCLENBQ0YsQ0FBQztnQkFDSixDQUFDO3FCQUFNLENBQUM7b0JBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBZ0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLENBQUM7WUFDSCxDQUFDO1lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2pELElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO3dCQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3RCLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQzt3QkFDbEQsSUFBSSxJQUFJLENBQUMsQ0FBQzt3QkFDVixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNqRSxDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxlQUFlLEVBQUUsQ0FBQztvQkFDcEQsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksQ0FBQyxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3BELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztvQkFDaEUsSUFBSSxJQUFJLENBQUMsQ0FBQztvQkFDVixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQ2pELENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FDbEIsQ0FBQztvQkFDRixDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEQsQ0FBQztxQkFBTSxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN0QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxJQUFJLENBQUMsQ0FBQztvQkFDVixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQ2pELENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FDbEIsQ0FBQztvQkFDRixDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEQsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3JCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FDakQsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUN0QixDQUFDO29CQUNGLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3hELENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQUNGLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztZQUN2RCxJQUNFLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xELENBQUMsQ0FBQyxJQUFJLElBQUksdUJBQXVCLENBQUMsTUFBTSxFQUN4QyxDQUFDO2dCQUNELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM3QyxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNoQixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsY0FBc0I7UUFDdEMsTUFBTSxTQUFTLEdBQUcsZUFBZSxjQUFjLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUMsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7WUFDeEIsS0FBSyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUM7WUFDckIsS0FBSyxDQUFDLFNBQVMsR0FBRztXQUNiLFNBQVM7bUJBQ0QsY0FBYzs7T0FFMUIsQ0FBQztZQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUN2QixJQUEwQixFQUMxQixPQUFvQjtRQUVwQixJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxlQUFlO1FBQzFDLElBQUksaUJBQWlCLEdBQUcsdUJBQXVCLENBQUMsQ0FBQywrQkFBK0I7UUFDaEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVELE1BQU0sa0JBQWtCLEdBQ3RCLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQztxQkFDaEUsTUFBTSxDQUFDO1lBQ1osQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sNEJBQTRCLEdBQUc7WUFDbkMsdUJBQXVCO1lBQ3ZCLHFCQUFxQjtZQUNyQixrQkFBa0I7WUFDbEIsaUJBQWlCO1lBQ2pCLGlCQUFpQjtTQUNsQixDQUFDO1FBQ0YsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUNqRCxPQUFPLEVBQ1AsV0FBVyxFQUNYLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsNEJBQTRCLENBQzdCLENBQUM7UUFDRixrREFBa0Q7UUFDbEQsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxRQUFRLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQixLQUFLLGVBQWUsQ0FBQyxXQUFXLEVBQUUsT0FBTztnQkFDdkMsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLG1CQUFtQjtvQkFDdkMsRUFBRSxJQUE4QixDQUFDO2dCQUNuQyxRQUFRLE9BQU8sRUFBRSxDQUFDO29CQUNoQixLQUFLLHNCQUFzQixDQUFDLE9BQU87d0JBQ2pDLFlBQVksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDO3dCQUU3QixNQUFNO29CQUNSLEtBQUssc0JBQXNCLENBQUMsS0FBSyxDQUFDO29CQUNsQyxLQUFLLHNCQUFzQixDQUFDLElBQUksQ0FBQztvQkFDakMsS0FBSyxzQkFBc0IsQ0FBQyxLQUFLO3dCQUMvQixZQUFZLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQzt3QkFDNUIsTUFBTTtvQkFDUixLQUFLLHNCQUFzQixDQUFDLFFBQVE7d0JBQ2xDLFlBQVksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO3dCQUM1QixZQUFZLENBQUMsS0FBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQzt3QkFDeEMsaUJBQWlCLEdBQUcsdUJBQXVCLENBQUM7d0JBQzVDLE1BQU07b0JBQ1IsS0FBSyxzQkFBc0IsQ0FBQyxRQUFRO3dCQUNsQyxZQUFZLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQzt3QkFDakMsWUFBWSxDQUFDLEtBQUssR0FBRzs0QkFDbkIsUUFBUSxFQUFFLElBQUk7eUJBQ2YsQ0FBQzt3QkFDRixpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQzt3QkFDdEMsTUFBTTtvQkFDUjt3QkFDRSxZQUFZLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQzt3QkFDNUIsaUJBQWlCLEdBQUcsdUJBQXVCLENBQUM7d0JBQzVDLE1BQU07Z0JBQ1YsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsS0FBSyxlQUFlLENBQUMsU0FBUyxFQUFFLFlBQVk7Z0JBQzFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7Z0JBQ3ZDLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDO2dCQUU1QyxNQUFNLHFCQUFxQixHQUN6QixPQUFPLENBQUMsbUJBQW1CLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxDQUN4RCxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUM3QixDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FDNUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNqQixZQUFZLENBQUMsWUFBWSxHQUFHLHFCQUFxQixDQUFDO2dCQUVsRCxNQUFNO1lBQ1IsS0FBSyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVc7Z0JBQ3hDLFlBQVksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7Z0JBQ3RDLGlCQUFpQixHQUFHLHFCQUFxQixDQUFDO2dCQUMxQyxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxJQUFJLEtBQUssQ0FBQztnQkFDNUQsWUFBWSxDQUFDLEtBQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7Z0JBQ3pDLE1BQU07WUFDUixLQUFLLGVBQWUsQ0FBQyxVQUFVLEVBQUUsd0JBQXdCO2dCQUN2RCxpQkFBaUI7b0JBQ2YsT0FBTyxDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixLQUFLLElBQUk7d0JBQ3pELENBQUMsQ0FBQyxrQkFBa0I7d0JBQ3BCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUN0RCxNQUFNO1lBQ1IsS0FBSyxlQUFlLENBQUMsT0FBTztnQkFDMUIsWUFBWSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFDUixLQUFLLGVBQWUsQ0FBQyxRQUFRO2dCQUMzQixZQUFZLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUNSLEtBQUssZUFBZSxDQUFDLGlCQUFpQjtnQkFDcEMsWUFBWSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0QsTUFBTTtZQUNSLEtBQUssZUFBZSxDQUFDLGFBQWE7Z0JBQ2hDLFlBQVksR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZELE1BQU07WUFDUixLQUFLLGVBQWUsQ0FBQyxlQUFlO2dCQUNsQyxZQUFZLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6RCxNQUFNO1lBQ1IsS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFLFVBQVU7Z0JBQ3JDLFlBQVksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUN2QixNQUFNO1lBQ1I7Z0JBQ0UsWUFBWSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7Z0JBQzVCLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDO1FBQ2hELENBQUM7UUFDRCxZQUFZLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssaUJBQWlCLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLFlBQVksQ0FBQyxLQUFNLENBQUMsVUFBVyxDQUFDLE9BQU8sQ0FBQztvQkFDdEMsR0FBRzt3QkFDSCxJQUFJLENBQUMsbUNBQW1DLENBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FDL0IsQ0FBQztZQUNOLENBQUM7WUFFRCxxQkFBcUI7WUFDckIsTUFBTSxhQUFhLEdBQUcsR0FBRyxpQkFBaUIsUUFBUSxDQUFDO1lBQ25ELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUMvQixZQUFZLENBQUMsS0FBTSxDQUFDLFVBQVcsQ0FBQyxPQUFPLENBQUM7b0JBQ3RDLEdBQUc7d0JBQ0gsSUFBSSxDQUFDLG1DQUFtQyxDQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQy9CLENBQUM7WUFDTixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLHNDQUFzQyxDQUN6QyxPQUFPLENBQUMsbUJBQW1CLEVBQzNCLFlBQVksQ0FDYixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksZUFBZSxHQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUM5QyxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUMxRSxFQUFFLEtBQUssQ0FBQztRQUNULElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNyQixlQUFlLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNsQyxDQUFDO1FBQ0QsWUFBWSxDQUFDLEtBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxlQUFlLENBQUM7UUFFL0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUvQyxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsYUFBYSxDQUFDLFlBQStCLEVBQUUsT0FBb0I7UUFDakUsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQ25DLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixLQUFLLE9BQU8sRUFBRSxVQUFVLENBQzdELEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQztRQUMzQixJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLGVBQWUsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1lBQzlELG9CQUFvQjtnQkFDakIsZUFBK0IsQ0FBQyxJQUFJLENBQ25DLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FDakQsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ25CLENBQUM7UUFFRCxZQUFZLENBQUMsVUFBVSxHQUFHO1lBQ3hCLFVBQVUsRUFBRTtnQkFDVixVQUFVLEVBQUUsQ0FBQyxJQUFxQixFQUFFLEVBQUU7b0JBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ3pCLE1BQU0sWUFBWSxHQUFHLElBQUksTUFBTSxDQUM3QixtREFBbUQsQ0FDcEQsQ0FBQztvQkFDRixJQUFJLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO3dCQUN2QyxPQUFPLEtBQUssQ0FBQztvQkFDZixDQUFDO29CQUNELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsT0FBTyxFQUFFLG9CQUFvQjthQUM5QjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsWUFBK0IsRUFBRSxPQUFvQjtRQUNwRSxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxrQ0FBa0MsQ0FDbkUsT0FBTyxDQUFDLGtCQUFrQixFQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLHNCQUFzQixDQUN2QixDQUFDO1FBRUYsWUFBWSxDQUFDLFVBQVUsR0FBRztZQUN4QixrQkFBa0IsRUFBRTtnQkFDbEIsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFxQixFQUFFLEVBQUU7b0JBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2hCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNsQixDQUFDO29CQUVELE1BQU0sbUJBQW1CLEdBQ3ZCLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQztvQkFFbEQsTUFBTSxXQUFXLEdBQXVCO3dCQUN0QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7d0JBQzNCLFdBQVcsRUFBRSxtQkFBbUI7d0JBQ2hDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxVQUFVO3FCQUN0QyxDQUFDO29CQUNGLElBQUksUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUV6RCxJQUFJLFFBQVEsS0FBSyxLQUFLLEVBQUUsQ0FBQzt3QkFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBRTdDLE9BQU8sS0FBSyxDQUFDO29CQUNmLENBQUM7b0JBRUQsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxPQUFPLEVBQUUsb0JBQW9CO2FBQzlCO1NBQ0YsQ0FBQztRQUVGLElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzVCLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHO2dCQUNqQyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUTtnQkFDbkMsa0JBQWtCLEVBQUUsb0JBQW9CO2FBQ3pDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELDJCQUEyQixDQUN6QixPQUFvQixFQUNwQixJQUFZLEVBQ1osT0FBZSxFQUNmLGlCQUF5QixFQUN6Qiw0QkFBc0M7UUFFdEMsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQ2pELElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO1FBRUYsSUFBSSxZQUFZLEdBQXNCO1lBQ3BDLEdBQUcsRUFBRSxPQUFPLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxLQUFLO1lBQ3hDLElBQUksRUFBRSxJQUFJO1lBQ1YsS0FBSyxFQUFFO2dCQUNMLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQzNDLGlCQUFpQixFQUFFLGlCQUFpQjtnQkFDcEMsS0FBSyxFQUNILE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUN4QixDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUM3QixDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FDNUMsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFFaEIsS0FBSyxFQUNILE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUN4QixDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUM3QixDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FDNUMsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDaEIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixRQUFRLEVBQUUsT0FBTyxDQUFDLFdBQVc7Z0JBQzdCLFVBQVUsRUFBRTtvQkFDVixLQUFLLEVBQUUsNEJBQTRCLENBQUMsSUFBSSxDQUN0QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLGlCQUFpQixDQUMvQjt3QkFDQyxDQUFDLENBQUMsRUFBRTt3QkFDSixDQUFDLENBQUMsaUJBQWlCO2lCQUN0QjtnQkFDRCxRQUFRLEVBQUUsSUFBSTtnQkFDZCxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2IsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhO2FBQ3JDO1lBQ0QsV0FBVyxFQUFFLEVBQUU7WUFDZixLQUFLLEVBQUUsRUFBRTtZQUNULFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQztRQUNGLFlBQVksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRTdCLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLFdBQVcsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkUsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDLGtDQUFrQyxDQUM1RCxPQUFPLENBQUMsa0JBQWtCLEVBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsdUJBQXVCLENBQ3hCLENBQUM7WUFFRixZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDO1lBQ3ZFLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHO2dCQUNqQyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsUUFBUTtnQkFDcEMsUUFBUSxFQUFFLGVBQWU7YUFDMUIsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUNFLE9BQU8sQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLFVBQVU7WUFDM0MsT0FBTyxDQUFDLG1CQUFtQixFQUFFLFdBQVc7WUFDeEMsT0FBTyxDQUFDLGtCQUFrQjtZQUMxQixZQUFZLENBQUMsS0FBSyxFQUNsQixDQUFDO1lBQ0QsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDLGtDQUFrQyxDQUM1RCxPQUFPLENBQUMsa0JBQWtCLEVBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsYUFBYSxDQUNkLENBQUM7WUFFRixZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDO1lBQ3ZFLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHO2dCQUNqQyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsUUFBUTtnQkFDcEMsUUFBUSxFQUFFLGVBQWU7YUFDMUIsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztRQUNqQyxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUUsSUFDRSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsa0JBQWtCO2dCQUMvQyxZQUFZLENBQUMsS0FBSyxFQUNsQixDQUFDO2dCQUNELHVCQUF1QixHQUFHLEtBQUssQ0FBQyxrQ0FBa0MsQ0FDaEUsT0FBTyxDQUFDLGtCQUFrQixFQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLGtCQUFrQixDQUNuQixDQUFDO2dCQUVGLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDO29CQUN0RCxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDO29CQUM5RCxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRzt3QkFDakMsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVE7d0JBQ3BDLEdBQUcsRUFBRSx1QkFBdUI7cUJBQzdCLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztvQkFDdEQsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztvQkFDOUQsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUc7d0JBQ2pDLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRO3dCQUNwQyxHQUFHLEVBQUUsdUJBQXVCO3FCQUM3QixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBRUQsMkRBQTJEO1lBQzNELElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLENBQUM7Z0JBQ25ELHVCQUF1QixHQUFHLHVCQUF1QjtvQkFDL0MsS0FBSyxDQUFDLGtDQUFrQyxDQUN0QyxPQUFPLENBQUMsa0JBQWtCLEVBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsa0JBQWtCLENBQ25CLENBQUM7Z0JBRUosWUFBWSxDQUFDLFVBQVUsR0FBRztvQkFDeEIsR0FBRyxZQUFZLENBQUMsVUFBVTtvQkFDMUIsYUFBYSxFQUFFO3dCQUNiLFVBQVUsRUFBRSxDQUFDLENBQWtCLEVBQUUsRUFBRTs0QkFDakMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO2dDQUFFLE9BQU8sSUFBSSxDQUFDOzRCQUMxQixJQUFJLENBQUM7Z0NBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0NBQ2xDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQzdCLENBQUM7NEJBQUMsTUFBTSxDQUFDO2dDQUNQLE9BQU8sS0FBSyxDQUFDOzRCQUNmLENBQUM7d0JBQ0gsQ0FBQzt3QkFDRCxPQUFPLEVBQ0wsdUJBQXVCOzRCQUN2QiwyQ0FBMkM7cUJBQzlDO2lCQUNGLENBQUM7Z0JBRUYsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUc7b0JBQ2pDLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRO29CQUNwQyxPQUFPLEVBQUUsdUJBQXVCO2lCQUNqQyxDQUFDO1lBQ0osQ0FBQztZQUVELHlEQUF5RDtZQUN6RCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsQ0FBQztnQkFDL0MsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTO29CQUMxQixPQUFPLENBQUMsbUJBQW1CLEVBQUUsYUFBYSxDQUFDO2dCQUM3QyxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRztvQkFDakMsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVE7b0JBQ3BDLFNBQVMsRUFBRSx1QkFBdUI7aUJBQ25DLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFDRSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsZUFBZTtnQkFDNUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLGFBQWEsRUFDMUMsQ0FBQztnQkFDRCxZQUFZLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQztnQkFDakMsTUFBTSxtQkFBbUIsR0FBRztvQkFDMUIsU0FBUyxFQUFFO3dCQUNULFVBQVUsRUFBRSxDQUFDLENBQWtCLEVBQUUsS0FBd0IsRUFBRSxFQUFFOzRCQUMzRCx1QkFBdUI7Z0NBQ3JCLEtBQUssQ0FBQyxrQ0FBa0MsQ0FDdEMsT0FBTyxDQUFDLGtCQUFrQixFQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLGtCQUFrQixDQUNuQixDQUFDOzRCQUVKLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7NEJBQy9CLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBRWpDLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxDQUFDO2dDQUNqRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7b0NBQUUsT0FBTyxJQUFJLENBQUM7Z0NBQzVDLE9BQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7NEJBQy9CLENBQUM7NEJBQ0QsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLENBQUM7Z0NBQy9DLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRTtvQ0FBRSxPQUFPLElBQUksQ0FBQztnQ0FDNUMsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQzs0QkFDL0IsQ0FBQzs0QkFDRCxPQUFPLElBQUksQ0FBQzt3QkFDZCxDQUFDO3dCQUNELE9BQU8sRUFBRSxDQUFDLEtBQVUsRUFBRSxLQUF3QixFQUFFLEVBQUU7NEJBQ2hELE9BQU8sdUJBQXVCLENBQUM7d0JBQ2pDLENBQUM7cUJBQ0Y7aUJBQ0YsQ0FBQztnQkFDRixZQUFZLENBQUMsVUFBVSxHQUFHO29CQUN4QixHQUFHLFlBQVksQ0FBQyxVQUFVO29CQUMxQixHQUFHLG1CQUFtQjtpQkFDdkIsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsa0RBQWtEO1FBQ2xELElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FDbkMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEtBQUssT0FBTyxFQUFFLFVBQVUsQ0FDN0QsRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDO1lBQzNCLElBQUksb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1lBQzlCLElBQUksZUFBZSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQzlELG9CQUFvQjtvQkFDakIsZUFBK0IsQ0FBQyxJQUFJLENBQ25DLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FDakQsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25CLENBQUM7WUFFRCxZQUFZLENBQUMsVUFBVSxHQUFHO2dCQUN4QixVQUFVLEVBQUU7b0JBQ1YsVUFBVSxFQUFFLENBQUMsSUFBcUIsRUFBRSxFQUFFO3dCQUNwQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO3dCQUN6QixNQUFNLFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FDN0IsK0ZBQStGLENBQ2hHLENBQUM7d0JBQ0YsSUFBSSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7NEJBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOzRCQUM3QyxPQUFPLEtBQUssQ0FBQzt3QkFDZixDQUFDO3dCQUNELE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBQ0QsT0FBTyxFQUFFLG9CQUFvQjtpQkFDOUI7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLG9CQUFvQixHQUFHO2dCQUMzQixVQUFVLEVBQUU7b0JBQ1YsVUFBVSxFQUFFLENBQUMsQ0FBa0IsRUFBRSxLQUF3QixFQUFFLEVBQUU7d0JBQzNELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7d0JBQ3hCLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxDQUFDOzRCQUMzRCx1QkFBdUI7Z0NBQ3JCLEtBQUssQ0FBQyxrQ0FBa0MsQ0FDdEMsT0FBTyxDQUFDLGtCQUFrQixFQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLHVCQUF1QixDQUN4QixDQUFDOzRCQUNKLE9BQU8sS0FBSyxDQUFDO3dCQUNmLENBQUM7d0JBQ0QsSUFDRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQzs0QkFDNUIsT0FBTyxDQUFDLG1CQUFtQixFQUFFLFdBQVc7NEJBRXhDLE9BQU8sS0FBSyxDQUFDO3dCQUVmLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBQ0QsT0FBTyxFQUFFLENBQUMsS0FBVSxFQUFFLEtBQXdCLEVBQUUsRUFBRTt3QkFDaEQsSUFBSSx1QkFBdUIsS0FBSyxFQUFFOzRCQUNoQyxPQUFPLDJCQUEyQixDQUFDO3dCQUVyQyxPQUFPLHVCQUF1QixDQUFDO29CQUNqQyxDQUFDO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLFlBQVksQ0FBQyxVQUFVLEdBQUc7Z0JBQ3hCLEdBQUcsWUFBWSxDQUFDLFVBQVU7Z0JBQzFCLEdBQUcsb0JBQW9CO2FBQ3hCLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQywrQkFBK0IsQ0FDbkMsSUFBMEIsRUFDMUIsT0FBNEI7UUFFNUIsSUFBSSxZQUFZLEdBQXNCLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBRXBELFlBQVksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDdkMsWUFBWSxDQUFDLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQztRQUNoRCxZQUFZLENBQUMsS0FBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBRTNELElBQUksZUFBZSxHQUNqQixPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDeEUsRUFBRSxLQUFLO1lBQ1QsT0FBTyxDQUFDLEtBQUs7WUFDYixFQUFFLENBQUM7UUFFTCxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksdUJBQXVCLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEQsTUFBTSxnQkFBZ0IsR0FBRyxPQUF1QyxDQUFDO1lBRWpFLElBQUkscUJBQXFCLEdBQ3ZCLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FDL0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUNyRCxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDakIsSUFBSSx3QkFBd0IsR0FDMUIsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDNUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUNyRCxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFFakIsWUFBWSxDQUFDLFlBQVksR0FBRyxxQkFBcUIsQ0FBQztZQUNsRCxZQUFZLENBQUMsS0FBTSxDQUFDLHVCQUF1QixDQUFDLEdBQUcscUJBQXFCLENBQUM7WUFDckUsWUFBWSxDQUFDLEtBQU0sQ0FBQywwQkFBMEIsQ0FBQztnQkFDN0Msd0JBQXdCLENBQUM7WUFDM0IsWUFBWSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztZQUN2QyxZQUFZLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDO1FBQ2xELENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksdUJBQXVCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUQsWUFBWSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3RCxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLHVCQUF1QixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELFlBQVksR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekQsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxRCxJQUFJLFVBQVUsR0FDWixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ3pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FDakQsRUFBRSxJQUFJLElBQUksZ0JBQWdCLENBQUM7WUFFOUIsWUFBWSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7WUFDdkMsWUFBWSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztZQUN2QyxZQUFZLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDO1FBQ2xELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFDRSxPQUFPLENBQUMsSUFBSSxJQUFJLHVCQUF1QixDQUFDLGFBQWE7Z0JBQ3JELElBQUksQ0FBQyxvQkFBb0I7Z0JBQ3pCLE9BQU8sQ0FBQywyQkFBMkIsRUFDbkMsQ0FBQztnQkFDRCxNQUFNLFNBQVMsR0FDYixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7Z0JBRWpFLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsUUFBUSxPQUFPLFNBQVMsRUFBRSxDQUFDO3dCQUN6QixLQUFLLFNBQVM7NEJBQ1osWUFBWSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDOzRCQUM5RCxNQUFNO3dCQUNSLEtBQUssUUFBUTs0QkFDWCxzRUFBc0U7NEJBQ3RFLElBQUksU0FBUyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQ0FDdEMsWUFBWSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDOzRCQUNsRCxDQUFDO2lDQUFNLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO2dDQUMxQixZQUFZLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7NEJBQzdDLENBQUM7aUNBQU0sQ0FBQztnQ0FDTixZQUFZLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQ3hELENBQUM7NEJBQ0QsTUFBTTt3QkFDUjs0QkFDRSxZQUFZLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQzs0QkFDdEMsTUFBTTtvQkFDVixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELCtDQUErQztRQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZCLFlBQVksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7WUFDdkMsWUFBWSxDQUFDLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQztRQUNsRCxDQUFDO1FBRUQsWUFBWSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JDLFlBQVksQ0FBQyxLQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzVDLFlBQVksQ0FBQyxLQUFNLENBQUMsNkJBQTZCLENBQUM7WUFDaEQsT0FBTyxDQUFDLDJCQUEyQixDQUFDO1FBQ3RDLFlBQVksQ0FBQyxLQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsZUFBZSxDQUFDO1FBQy9DLFlBQVksQ0FBQyxLQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBRXpELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFakQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQyw0QkFBNEIsQ0FDaEMsSUFBMEIsRUFDMUIsT0FBNEI7UUFFNUIsSUFBSSxZQUFZLEdBQXNCLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBRXBELFlBQVksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDdkMsWUFBWSxDQUFDLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQztRQUNoRCxZQUFZLENBQUMsS0FBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBRTNELElBQUksZUFBZSxHQUNqQixPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDeEUsRUFBRSxLQUFLO1lBQ1QsT0FBTyxDQUFDLEtBQUs7WUFDYixFQUFFLENBQUM7UUFFTCxZQUFZLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDckMsWUFBWSxDQUFDLEtBQU0sQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDNUMsWUFBWSxDQUFDLEtBQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ3pELFlBQVksQ0FBQyxLQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDbkUsWUFBWSxDQUFDLEtBQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxlQUFlLENBQUM7UUFFL0MsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbkUsWUFBWSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFakQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVPLHNDQUFzQyxDQUM1QyxtQkFBNEMsRUFDNUMsWUFBK0I7UUFFL0IsaUNBQWlDO1FBQ2pDLElBQ0UsbUJBQW1CO1lBQ25CLG1CQUFtQixDQUFDLDJCQUEyQixFQUMvQyxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsMkJBQTJCLENBQUM7WUFDbEUsTUFBTSxpQkFBaUIsR0FBRyxtQkFBbUIsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7WUFFdEUsWUFBWSxDQUFDLFdBQVcsR0FBRztnQkFDekIsSUFBSSxFQUFFLENBQUMsS0FBd0IsRUFBRSxFQUFFO29CQUNqQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQzlDLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsSUFBSSxDQUFDLEtBQUssQ0FDWCxDQUFDO29CQUNGLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQ3JCLENBQUM7YUFDRixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxTQUFpQixFQUFFLE9BQTBCO1FBQ3hFLE9BQU8sQ0FBQyxLQUFNLENBQUMsd0JBQXdCLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBUSxFQUFFLEVBQUU7WUFDNUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDNUIsSUFBSSxxQkFBcUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUM1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkQsSUFBSSxxQkFBcUIsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFcEMsSUFBSSx1Q0FBdUMsR0FDekMsSUFBSSxDQUFDLDRDQUE0QyxDQUMvQyxxQkFBcUIsRUFDckIsR0FBRyxDQUNKLENBQUM7Z0JBQ0osTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQ3hDLGNBQWMsQ0FDVSxDQUFDO2dCQUMzQixNQUFNLElBQUksQ0FBQyx1Q0FBdUMsQ0FDaEQsdUNBQXVDLEVBQ3ZDLE9BQU8sRUFDUCxPQUFPLENBQUMsSUFBSSxFQUNaLGtCQUFrQixFQUFFLCtCQUErQixJQUFJLEVBQUUsQ0FDMUQsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCw0Q0FBNEMsQ0FDMUMsZUFBZ0MsRUFDaEMsYUFBa0I7UUFFbEIsTUFBTSxlQUFlLEdBQW9CLEVBQUUsQ0FBQztRQUU1QyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDckMsTUFBTSxjQUFjLEdBQ2xCLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDbEMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQ3hCLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLGFBQWEsQ0FBQyxFQUFFLENBQy9DLENBQ0YsSUFBSSxFQUFFLENBQUM7WUFFVixJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sYUFBYSxHQUFrQjtvQkFDbkMsR0FBRyxVQUFVO29CQUNiLE1BQU0sRUFBRSxjQUFjO2lCQUN2QixDQUFDO2dCQUVGLGVBQWUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELHdCQUF3QixDQUN0QixTQUFpQixFQUNqQixpQkFBMkIsRUFDM0IsUUFBYSxFQUFFO1FBRWYsc0RBQXNEO1FBQ3RELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQ3JDLEtBQUssRUFDTCxTQUFTLENBQ1MsQ0FBQztRQUVyQixNQUFNLE9BQU8sR0FBRyxXQUFXLEVBQUUsRUFBRTtZQUM3QixDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDaEIsQ0FBQyxDQUFFLFdBQWlDLENBQUM7UUFDdkMsd0RBQXdEO1FBQ3hELElBQUksV0FBVyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3ZELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFRLEVBQUUsSUFBWTtRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNoQixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSw0QkFBNEI7UUFDakMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhLENBQUMsU0FBaUI7UUFDcEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQkFBaUI7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVELEtBQUssQ0FBQyxtQkFBbUIsQ0FDdkIsT0FBb0IsRUFDcEIsT0FBMEI7UUFFMUIsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1FBRWpELDZDQUE2QztRQUM3QyxJQUFJLFlBQVksQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMzQyxPQUFPLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDO1FBQ3JDLENBQUM7YUFBTSxJQUFJLFlBQVksQ0FBQyxzQkFBc0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN4RCxPQUFPLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQztRQUNoQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxJQUFJLEdBQUcsaUNBQWlDLENBQUM7UUFDbkQsQ0FBQztRQUVELE9BQU8sQ0FBQyxLQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsWUFBWSxDQUFDO1FBRTlDLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUM7UUFFbkQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxRCxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLElBQUksVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUMzQixPQUFPLENBQUMsS0FBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLGNBQWMsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLGlDQUFpQyxDQUNwQyxVQUFVLEVBQ1YsT0FBTyxFQUNQLFlBQVksQ0FDYixDQUFDO29CQUNGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN6RCxDQUFDO3FCQUFNLENBQUM7b0JBQ04scURBQXFEO29CQUNyRCxPQUFPLENBQUMsS0FBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLGNBQWMsQ0FBQztvQkFDaEQsSUFBSSxDQUFDLGlDQUFpQyxDQUNwQyxVQUFVLEVBQ1YsT0FBTyxFQUNQLFlBQVksQ0FDYixDQUFDO29CQUNGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN6RCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDbEUsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLElBQUksQ0FDVixvQ0FBb0MsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUNoRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyx5QkFBeUIsQ0FDL0IsVUFBcUMsRUFDckMsS0FBVTtRQUVWLElBQ0UsQ0FBQyxVQUFVO1lBQ1gsQ0FBQyxVQUFVLENBQUMsTUFBTTtZQUNsQixLQUFLLEtBQUssSUFBSTtZQUNkLEtBQUssS0FBSyxTQUFTLEVBQ25CLENBQUM7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNuRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRCxDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsQ0FBQztZQUN6RCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxLQUFLLENBQUMseUJBQXlCLENBQ3JDLE1BQTJCLEVBQzNCLGFBQWtDLElBQUksQ0FBQyxZQUFZO1FBRW5ELElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUNwQixNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFFcEMsS0FBSyxNQUFNLEtBQUssSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBYSxDQUFDO1lBQ3JDLElBQ0UsUUFBUTtnQkFDUixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsY0FBYyxDQUFDO2dCQUM3QixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQzdCLENBQUM7Z0JBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3hDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQzlCLGNBQWMsQ0FDVSxDQUFDO2dCQUMzQixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBVyxDQUFDO2dCQUM3RCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFFOUQsSUFBSSxVQUFVLEdBQVEsSUFBSSxDQUFDO2dCQUUzQixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNyRSxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDN0IsQ0FBQztxQkFBTSxJQUNMLEtBQUssQ0FBQyxZQUFZLEtBQUssSUFBSTtvQkFDM0IsS0FBSyxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQ2hDLENBQUM7b0JBQ0QsVUFBVSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7Z0JBQ2xDLENBQUM7cUJBQU0sSUFDTCxJQUFJLENBQUMsS0FBSztvQkFDVixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUk7b0JBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUNsQyxDQUFDO29CQUNELFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxDQUFDO2dCQUVELElBQUksbUJBQW1CLEdBQTBDLElBQUksQ0FBQztnQkFDdEUsSUFBSSxVQUFVLEtBQUssSUFBSSxJQUFJLGNBQWMsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3RELG1CQUFtQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDbEQsY0FBYyxFQUNkLFVBQVUsQ0FDWCxDQUFDO2dCQUNKLENBQUM7Z0JBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQ3ZCLFNBQVM7Z0JBQ1gsQ0FBQztnQkFFRCxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFFOUMsSUFDRSxtQkFBbUI7b0JBQ25CLG1CQUFtQixDQUFDLEVBQUUsSUFBSSxJQUFJO29CQUM5QixjQUFjLEVBQUUsRUFBRSxJQUFJLElBQUksRUFDMUIsQ0FBQztvQkFDRCxNQUFNLDhCQUE4QixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQy9DLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQzVCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFFM0QsSUFBSSw4QkFBOEIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQzlDLE1BQU0sMkJBQTJCLEdBQy9CLElBQUksQ0FBQyw0Q0FBNEMsQ0FDL0MsOEJBQThCLEVBQzlCLG1CQUFtQixDQUNwQixDQUFDO3dCQUVKLElBQUksMkJBQTJCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUMzQyxNQUFNLElBQUksQ0FBQyx1Q0FBdUMsQ0FDaEQsMkJBQTJCLEVBQzNCLGlCQUFpQixFQUNqQixpQkFBaUIsQ0FBQyxJQUFJLEVBQ3RCLFlBQVksRUFBRSwrQkFBK0IsSUFBSSxFQUFFLENBQ3BELENBQUM7d0JBQ0osQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxNQUFNLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFDRSxNQUFNLEtBQUssSUFBSSxDQUFDLFlBQVk7WUFDNUIsTUFBTSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUMzQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxpQ0FBaUMsQ0FDL0IsVUFBeUIsRUFDekIsT0FBMEIsRUFDMUIscUJBQTRDO1FBRTVDLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLElBQUksaUJBQWlCLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUMvQyxJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztZQUVGLHFEQUFxRDtZQUNyRCxPQUFPLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQzdDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQ3JELE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQzVELE9BQU8sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUM7WUFFekMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pELEtBQUssRUFBRSxLQUFLO2dCQUNaLEtBQUssRUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQ3hCLEtBQUssQ0FBQyxpQkFBaUIsRUFDdkIsaUJBQWlCLENBQ2xCLElBQUksS0FBSyxDQUFDLElBQUk7Z0JBQ2pCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQzNDLCtCQUErQixFQUM3QixxQkFBcUIsQ0FBQywrQkFBK0I7YUFDeEQsQ0FBQyxDQUFDLENBQUM7WUFFSixPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDO2dCQUMxQyxxQkFBcUIsQ0FBQywyQkFBMkIsSUFBSSxFQUFFLENBQUM7WUFDMUQsT0FBTyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQztnQkFDckMscUJBQXFCLENBQUMsc0JBQXNCLElBQUksS0FBSyxDQUFDO1lBRXhELElBQUksa0JBQWtCLEdBQTJCLElBQUksQ0FBQztZQUN0RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBYSxDQUFDO1lBQ3pDLE1BQU0sd0JBQXdCLEdBQzVCLHFCQUFxQixDQUFDLHdCQUF3QixDQUFDO1lBQ2pELElBQ0UsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUM7Z0JBQy9DLHdCQUF3QixJQUFJLElBQUksRUFDaEMsQ0FBQztnQkFDRCxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQzlDLFVBQVUsRUFDVix3QkFBd0IsQ0FDekIsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPLENBQUMsWUFBWSxHQUFHLGtCQUFrQixDQUFDO1lBRTFDLDRDQUE0QztZQUM1QyxPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLEdBQUcsd0JBQXdCLENBQUM7WUFFckUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM5QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDeEMsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUN0QyxLQUFLLE1BQU0sT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDcEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ25DLENBQUMsSUFFQSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FDbkMsQ0FBQzt3QkFDRixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQzNELE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7NEJBQ2hELE1BQU07d0JBQ1IsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxLQUFLLENBQUMsdUNBQXVDLENBQzNDLHVCQUE4QixFQUM5QixxQkFBd0MsRUFDeEMsSUFBUyxFQUNULCtCQUFzRDtRQUV0RCxJQUFJLHVCQUF1QixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLDJCQUEyQixHQUMvQixxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVyRSxNQUFNLG9CQUFvQixHQUFHLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ25FLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ2hELENBQUM7WUFFRixvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFO2dCQUNuRCxNQUFNLHVCQUF1QixHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQztnQkFFekQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsSUFBSTtxQkFDckMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO3FCQUMxQixPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7cUJBQzlCLElBQUksQ0FDSCxDQUFDLElBQUksRUFBRSxFQUFFLENBQ1AsSUFBSSxFQUFFLG1CQUFtQixFQUFFLGNBQWM7b0JBQ3ZDLHVCQUF1QixJQUFJLElBQUksRUFBRSxlQUFlLEtBQUssSUFBSSxDQUM5RCxDQUFDO2dCQUVKLE1BQU0sV0FBVyxHQUNmLHNCQUFzQixFQUFFLFVBQVU7b0JBQ2xDLFNBQVMsdUJBQXVCLEVBQUUsQ0FBQztnQkFFckMsSUFBSSx3QkFBd0IsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7Z0JBRXhELE1BQU0sd0JBQXdCLEdBQUcsK0JBQStCO3FCQUM3RCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksdUJBQXVCLENBQUM7b0JBQ3pELEVBQUUsWUFBWSxFQUFFLElBQUksQ0FDbEIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUNoRCxFQUFFLEtBQUssQ0FBQztnQkFFWCxJQUNFLHdCQUF3QjtvQkFDeEIsd0JBQXdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUN0QyxDQUFDO29CQUNELHdCQUF3QixHQUFHLHdCQUF3QixDQUFDO2dCQUN0RCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sd0JBQXdCLEdBQUcsRUFBRSxDQUFDO2dCQUNoQyxDQUFDO2dCQUNELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUNqRCxJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztnQkFFRixNQUFNLFFBQVEsR0FBc0I7b0JBQ2xDLEdBQUcsRUFBRSxXQUFXO29CQUNoQixJQUFJLEVBQUUsSUFBSTtvQkFDVixLQUFLLEVBQUU7d0JBQ0wsS0FBSyxFQUFFLHdCQUF3Qjt3QkFDL0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO3dCQUNuQixZQUFZLEVBQUUsdUJBQXVCO3dCQUNyQyxjQUFjLEVBQUUsbUJBQW1CO3dCQUNuQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjt3QkFDbEMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGFBQWE7d0JBQ3pDLGdCQUFnQixFQUFFLElBQUk7d0JBQ3RCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7d0JBQzNDLGlCQUFpQixFQUFFLGlCQUFpQjt3QkFDcEMsUUFBUSxFQUFFLElBQUk7d0JBQ2QsVUFBVSxFQUFFOzRCQUNWLEtBQUssRUFBRSxJQUFJLENBQUMsbUNBQW1DLENBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUNoQzt5QkFDRjt3QkFDRCxPQUFPLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQzs0QkFDeEQsS0FBSyxFQUFFLEtBQUs7NEJBQ1osS0FBSyxFQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FDeEIsS0FBSyxDQUFDLGlCQUFpQixFQUN2QixpQkFBaUIsQ0FDbEIsSUFBSSxLQUFLLENBQUMsSUFBSTs0QkFDakIsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjt5QkFDNUMsQ0FBQyxDQUFDO3FCQUNKO2lCQUNGLENBQUM7Z0JBRUYsSUFBSSxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUM1QyxtQkFBbUIsRUFDbkIsbUJBQW1CLENBQUMsY0FBYyxDQUNuQyxDQUFDO29CQUNGLElBQUksVUFBVSxFQUFFLENBQUM7d0JBQ2YsUUFBUSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7b0JBQ3JDLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxNQUFNLGdCQUFnQixHQUFHLHFCQUFxQixDQUFDLE1BQU07b0JBQ25ELENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsVUFBVTtvQkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDVCxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQ3JCLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FDNUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUsscUJBQXFCLENBQUMsR0FBRyxDQUNuRCxDQUFDO29CQUNGLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ3ZCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDdEMsZ0JBQWdCLEVBQ2hCLFdBQVcsQ0FDWixDQUFDO3dCQUVGLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FDaEQsZ0JBQWdCLEVBQ2hCLFdBQVcsQ0FDWixDQUFDO3dCQUNGLFFBQVEsQ0FBQyxTQUFTOzRCQUNoQixlQUFlLEtBQUssQ0FBQztnQ0FDbkIsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLFNBQVM7Z0NBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBRW5ELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQzt3QkFFbkQsTUFBTSxjQUFjLEdBQ2xCLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQzt3QkFDNUQsUUFBUSxDQUFDLFNBQVMsSUFBSSxjQUFjLENBQUM7d0JBQ3JDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBQ2pELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUM1QixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQscUJBQXFCLENBQUMsTUFBMkIsRUFBRSxLQUFhO1FBQzlELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNsQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2pFLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxVQUFVO29CQUNSLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzFFLENBQUM7aUJBQU0sSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUM3RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ25FLFVBQVUsR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsb0NBQW9DLENBQ2xDLE1BQTJCLEVBQzNCLFVBQWtCLEVBQ2xCLFFBQWdCO1FBRWhCLElBQUksbUJBQW1CLEdBQUcsR0FBRyxDQUFDO1FBRTlCLEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pELG1CQUFtQixJQUFJLFVBQVUsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyx3QkFBMkM7UUFDL0QsTUFBTSwyQkFBMkIsR0FDL0Isd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7WUFDaEQsRUFBRSwyQkFBMkIsQ0FBQztRQUVsQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsRUFBRSxDQUFDO1lBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUMsTUFBTTtnQkFDdEQsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxVQUFVO2dCQUM1QyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ1QsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNyQixNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQzVDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLHdCQUF3QixDQUFDLEdBQUcsQ0FDdEQsQ0FBQztnQkFFRixJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN2QixLQUFLLE1BQU0sSUFBSSxJQUFJLDJCQUEyQixFQUFFLENBQUM7d0JBQy9DLE1BQU0sUUFBUSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUM7d0JBRWpDLEtBQUssSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7NEJBQy9ELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQzs0QkFDNUQsSUFBSSxlQUFlLElBQUksZUFBZSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dDQUNwRCxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7Z0NBQ3JDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQ2hDLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsdUJBQXVCLENBQzNCLG1CQUEyQixFQUMzQixxQkFBd0MsRUFDeEMsSUFBUyxFQUNULCtCQUFzRDtRQUV0RCxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNwRSxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hELE1BQU0sV0FBVyxHQUNmLCtCQUErQjtxQkFDNUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLG1CQUFtQixDQUFDO29CQUNyRCxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDO29CQUNwRSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLG9CQUFvQixHQUFHLFdBQVcsQ0FBQztnQkFDckMsQ0FBQztnQkFDRCxNQUFNLFFBQVEsR0FBc0I7b0JBQ2xDLEdBQUcsRUFBRSxHQUFHLHFCQUFxQixDQUFDLEdBQUcsVUFBVSxtQkFBbUIsRUFBRTtvQkFDaEUsSUFBSSxFQUFFLElBQUk7b0JBQ1YsS0FBSyxFQUFFO3dCQUNMLEtBQUssRUFBRSxvQkFBb0I7d0JBQzNCLGNBQWMsRUFBRSxlQUFlO3dCQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjt3QkFDbEMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGFBQWE7d0JBQ3pDLE9BQU8sRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzs0QkFDL0MsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFOzRCQUNmLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTt5QkFDbEIsQ0FBQyxDQUFDO3dCQUNILFFBQVEsRUFBRSxJQUFJO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLG1DQUFtQyxDQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FDaEM7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsS0FBSyxFQUFFO3dCQUNMLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFOzRCQUNoQixNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDOzRCQUN6QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDOzRCQUVqRCxLQUFLLENBQUMsV0FBVyxFQUFFLFlBQVk7aUNBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7aUNBQzdCLFNBQVMsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLEVBQUU7Z0NBQ2pDLE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUNqRCxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxhQUFhLENBQ2xDLENBQUM7Z0NBQ0YsSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLG1CQUFtQixFQUFFLENBQUM7b0NBQ3pELE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUNoQyxjQUFjLENBQUMsbUJBQW1CLEVBQ2xDLEtBQUssRUFDTCxJQUFJLEVBQ0osK0JBQStCLENBQ2hDLENBQUM7Z0NBQ0osQ0FBQztxQ0FBTSxDQUFDO29DQUNOLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQ0FDOUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0NBQzVCLENBQUM7NEJBQ0gsQ0FBQyxDQUFDLENBQUM7NEJBRUwsS0FBSyxDQUFDLEtBQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFO2dDQUM1QixZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7Z0NBQ3BCLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs0QkFDMUIsQ0FBQyxDQUFDO3dCQUNKLENBQUM7cUJBQ0Y7aUJBQ0YsQ0FBQztnQkFFRixNQUFNLGdCQUFnQixHQUFHLHFCQUFxQixDQUFDLE1BQU07b0JBQ25ELENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsVUFBVTtvQkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDVCxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQ3JCLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FDNUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUsscUJBQXFCLENBQUMsR0FBRyxDQUNuRCxDQUFDO29CQUNGLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ3ZCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FDdEMsZ0JBQWdCLEVBQ2hCLFdBQVcsQ0FDWixDQUFDO3dCQUVGLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FDaEQsZ0JBQWdCLEVBQ2hCLFdBQVcsQ0FDWixDQUFDO3dCQUNGLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUNsRSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBRW5ELE1BQU0sY0FBYyxHQUNsQixJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7d0JBQzVELFFBQVEsQ0FBQyxTQUFTLElBQUksY0FBYyxDQUFDO3dCQUNyQyxtREFBbUQ7d0JBQ25ELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUM1QixDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLElBQUksQ0FDVix1Q0FBdUMsbUJBQW1CLEVBQUUsQ0FDN0QsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBMkIsRUFBRSxXQUFtQjtRQUNqRSxNQUFNLGVBQWUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN0RCxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUM7UUFFNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckQsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO2dCQUMxRCxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsY0FBYyxDQUNaLE1BQTJCLEVBQzNCLEdBQVc7UUFFWCxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxjQUFjO29CQUFFLE9BQU8sY0FBYyxDQUFDO1lBQzVDLENBQUM7WUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3pELElBQUksS0FBSztvQkFBRSxPQUFPLEtBQUssQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGlCQUFpQixDQUFDLFdBQThCO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLE1BQU07WUFDekMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDO1FBRVQsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FDNUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVyxDQUFDLEdBQUcsQ0FDekMsQ0FBQztZQUVGLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sZUFBZSxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsU0FBUyxDQUFDO2dCQUVwRCx3Q0FBd0M7Z0JBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQy9ELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQztvQkFDNUQsSUFBSSxlQUFlLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO3dCQUNuRSxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQzVDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ2hDLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLDJCQUEyQjtRQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsQ0FBQztZQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7WUFDN0QsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLGNBQWMsQ0FDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQzdCLGVBQWUsQ0FBQyxNQUFNLENBQ3ZCLENBQ0YsQ0FBQztZQUVGLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sQ0FBQyxLQUFLLENBQ1gsd0NBQXdDLEVBQ3hDLFFBQVEsQ0FBQyxNQUFNLENBQ2hCLENBQUM7Z0JBQ0YsT0FBTztZQUNULENBQUM7WUFFRCxrRkFBa0Y7WUFDbEYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtnQkFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQscUJBQXFCLENBQUMsUUFBZ0I7UUFDcEMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFjLENBQUM7WUFDNUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMzQyxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QixDQUFDO0lBQ0gsQ0FBQztJQUVELFNBQVMsQ0FDUCxNQUEyQixFQUMzQixHQUFXO1FBRVgsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNyQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzFELElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLE9BQU8sV0FBVyxDQUFDO2dCQUNyQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxRQUFhO1FBQzdDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLFFBQVEsR0FBRyxxQkFBcUIsQ0FBQyx5QkFBeUIsQ0FDNUQsUUFBUSxFQUNSLElBQUksQ0FBQyxJQUFJLEVBQ1QsSUFBSSxDQUFDLGFBQWEsRUFDbEIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO1lBQ0YsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVPLHNCQUFzQixDQUM1QixVQUFxQyxFQUNyQyxjQUFzQjtRQUV0QixPQUFPLHFCQUFxQixDQUFDLHNCQUFzQixDQUNqRCxVQUFVLEVBQ1YsY0FBYyxFQUNkLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNwRCxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUNELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsYUFBb0I7UUFDbkMsSUFBSSxDQUFDLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2pELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNwQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUU7WUFDaEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSztZQUNyRSxRQUFRLEVBQUUsV0FBVyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFO1NBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLG1DQUFtQyxDQUFDLFFBQWE7UUFDdkQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQzthQUM1QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLGtCQUFrQixDQUFDO2FBQ3BELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsS0FBSyxLQUFLLEVBQUUsQ0FBQzthQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUF3QjtRQUM5QyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3hFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ1YsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLE9BQU8sY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7O09BR0c7SUFDSSw0QkFBNEI7UUFDakMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFHRDs7O09BR0c7SUFDSSwwQkFBMEIsQ0FBQyxRQUFhO1FBQzdDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQUUsT0FBTztRQUVuRSxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDdkIsS0FBSyxNQUFNLFVBQVUsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQy9CLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsVUFBVSxDQUM1RSxDQUFDO1lBQ0YsSUFBSSxDQUFDLFVBQVU7Z0JBQUUsU0FBUztZQUUxQixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDO1lBQ3pFLElBQUksV0FBVyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN4QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQztvQkFDdEQsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDcEIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ2hFLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUNsRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUMzQixDQUFDO1lBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUM1RCxJQUFJLENBQUMsSUFBSSxFQUFFLHdCQUF3QixDQUNwQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQzsrR0FoNEdVLHNCQUFzQjttR0FBdEIsc0JBQXNCLG1wQkFDbkIsV0FBVyxxRUM5RjNCLGd1Q0F3Q0E7OzRGRHFEYSxzQkFBc0I7a0JBTGxDLFNBQVM7K0JBQ0UsaUJBQWlCO3VmQUtBLFlBQVk7c0JBQXRDLFlBQVk7dUJBQUMsV0FBVztnQkFHaEIsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFjSSxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEZvcm1seUZpZWxkLFxuICBGb3JtbHlGaWVsZENvbmZpZyxcbiAgRm9ybWx5Rm9ybU9wdGlvbnNcbn0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQge1xuICBTdWJqZWN0LFxuICBmaXJzdFZhbHVlRnJvbSxcbiAgc3RhcnRXaXRoLFxuICBwYWlyd2lzZSxcbiAgZGVib3VuY2VUaW1lLFxuICBzd2l0Y2hNYXAsXG4gIGNhdGNoRXJyb3IsXG4gIG9mLFxuICB0YWtlVW50aWwsXG4gIE9ic2VydmFibGUsXG4gIG1hcCxcbiAgU3Vic2NyaXB0aW9uLFxuICBmcm9tXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTGFiZWxLZXlzIH0gZnJvbSAnLi9lbnVtcy9sYWJlbC5rZXlzJztcbmltcG9ydCB7IEFwaVZhbGlkYXRlUmVxdWVzdCB9IGZyb20gJy4vbW9kZWxzL2FwcGxpY2F0aW9uLm1vZGVsJztcbmltcG9ydCB7XG4gIERpY3Rpb25hcnlEdG8sXG4gIERpY3Rpb25hcnlWYWx1ZSxcbiAgRGljdGlvbmFyeVZhbHVlRHRvXG59IGZyb20gJy4vbW9kZWxzL2RpY3Rpb25hcnkubW9kZWwnO1xuaW1wb3J0IHtcbiAgRm9ybU1vZGVsLFxuICBEaXNwbGF5TW9kZWwsXG4gIEdlbmVyYWxEYXRhTW9kZWwsXG4gIFN0ZXBzU2V0dGluZ3MsXG4gIEZsdXhUeXBlLFxuICBEaW1lbnNpb25UeXBlLFxuICBTdGVwQ29udHJvbFR5cGUsXG4gIE1hbnVhbElucHV0Q29udHJvbFR5cGUsXG4gIFByZXNlbnRhdGlvblBhcmFncmFwaENvbnRyb2wsXG4gIERpY3Rpb25hcnlDb250cm9sRGF0YVxufSBmcm9tICcuL21vZGVscy9mb3Jtcy5tb2RlbCc7XG5pbXBvcnQgeyBMYWJlbEluZm8sIFRyYW5zbGF0aW9uSW5mbyB9IGZyb20gJy4vbW9kZWxzL2xhYmVsLWluZm8ubW9kZWwnO1xuaW1wb3J0IHsgTGFiZWwgfSBmcm9tICcuL21vZGVscy9sYWJlbC5tb2RlbCc7XG5pbXBvcnQgeyBMYW5ndWFnZSB9IGZyb20gJy4vbW9kZWxzL2xhbmd1YWdlLm1vZGVsJztcbmltcG9ydCB7IERpY3Rpb25hcnlMYWJlbEluZm8gfSBmcm9tICcuL290aGVycy9kaWN0aW9uYXJ5LWxhYmVsLWluZm8nO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRUeXBlIH0gZnJvbSAnLi9vdGhlcnMvZW52aXJvbm1lbnQtdHlwZSc7XG5pbXBvcnQgeyBDc3NSdWxlcywgVXRpbHMgfSBmcm9tICcuL290aGVycy91dGlscyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkRhdGFTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9hcHBsaWNhdGlvbkRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBMYWJlbFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2xhYmVscy5zZXJ2aWNlJztcbmltcG9ydCB7IFByb3h5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvcHJveHkuc2VydmljZSc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZGljdGlvbmFyeS5zZXJ2aWNlJztcbmltcG9ydCB7IExhbmd1YWdlU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvbGFuZ3VhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBPcmlnaW5Gb3JtQXV0aFNlcnZpY2UgfSBmcm9tICcuL29yaWdpbi1mb3JtLWF1dGguc2VydmljZSc7XG5pbXBvcnQgeyBGb3Jtc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Zvcm1zLnNlcnZpY2UnO1xuaW1wb3J0IHsgSW5wdXRDb25maWcgfSBmcm9tICcuL29yaWdpbi1mb3JtLWNvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9vdGhlcnMvY29uZmlnLXNlcnZpY2UnO1xuaW1wb3J0IHsgTW9kZWxQb3B1bGF0aW9uSGVscGVyIH0gZnJvbSAnLi9tb2RlbC1wb3B1bGF0aW9uLmhlbHBlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgT3BlcmF0aW9uUmVzdWx0LFxuICBPcmlnaW5Gb3JtU2lnbmFsckhhbmRsZXJTZXJ2aWNlXG59IGZyb20gJy4vc2VydmljZXMvb3JpZ2luLWZvcm0tc2lnbmFsci1oYW5kbGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aW9uU3RlcEhhbmRsZXIgfSBmcm9tICcuL2FjdGlvbi1zdGVwLWhhbmRsZXInO1xuaW1wb3J0IHsgU2Nyb2xsVG9FcnJvclNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3Njcm9sbC10by1lcnJvci5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1Dc3NIZWxwZXIgfSBmcm9tICcuL2Zvcm0tY3NzLmhlbHBlcic7XG5pbXBvcnQge1xuICBCYXNlQ29udHJvbCxcbiAgQ29udHJvbERhdGEsXG4gIERlcGVuZGVudERpY3Rpb25hcnlEYXRhLFxuICBQcmVzZW50YXRpb25Db250cm9sLFxuICBQcmVzZW50YXRpb25Db250cm9sVHlwZSxcbiAgU2VjdGlvbkRhdGEsXG4gIFN0ZXBEYXRhXG59IGZyb20gJy4vbW9kZWxzL2ZsdXgubW9kZWwnO1xuaW1wb3J0IHsgRkxBR19JQ09OUyB9IGZyb20gJy4vZmxhZy1pY29ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1vcmlnaW4tZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9vcmlnaW4tZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL29yaWdpbi1mb3JtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ29sbGVjdG9yRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZHJlbihGb3JtbHlGaWVsZCkgZm9ybWx5RmllbGRzOiBRdWVyeUxpc3Q8Rm9ybWx5RmllbGQ+O1xuXG4gIC8vdGhlc2UgYXJlIHNwZWNpZmljIHRvIHRoZSBsaWJcbiAgQElucHV0KCkgY29uZmlnQ29tcG9uZW50OiBJbnB1dENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgY29uZmlnVXVpZCE6IHN0cmluZztcbiAgQElucHV0KCkgY3VycmVudFN0ZXBJZDogc3RyaW5nO1xuICAvL2VuZCBzcGVjaWZpYyB0byBsaWJcblxuICBASW5wdXQoKSBhcHBNb2RlbDogRm9ybU1vZGVsO1xuICBASW5wdXQoKSBzaWduQmFzZVVybDogc3RyaW5nO1xuICBASW5wdXQoKSBjdXJyZW50TGFuZ3VhZ2VJc286IHN0cmluZztcbiAgQElucHV0KCkgZmlsbERhdGE6IGFueTtcbiAgQElucHV0KCkgaW5pdEZsb3dWYWx1ZXM6IHN0cmluZztcbiAgQElucHV0KCkgZW52OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHNob3dEaXNwbGF5TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzaG93TGFuZ3VhZ2VTZWxlY3RvcjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGlzRGVtb01vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgaXNEZWJ1ZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhcHBEYXRhVXVpZDogc3RyaW5nO1xuICBASW5wdXQoKSBibG9ja1ByZXZpb3VzU3RlcDogYm9vbGVhbjtcbiAgQElucHV0KCkgZGF0YVVybElkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG5vQnV0dG9uc0luVmlldzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGZsdXg6IFN0ZXBEYXRhW107XG4gIHByaXZhdGUgZGlzcGxheTogRGlzcGxheU1vZGVsO1xuICBwcml2YXRlIGRlc2lnbjogQ3NzUnVsZXM7XG4gIHByaXZhdGUgZ2VuZXJhbERhdGE6IEdlbmVyYWxEYXRhTW9kZWw7XG4gIHByaXZhdGUgbGFiZWxzOiBMYWJlbFtdO1xuICBwcml2YXRlIHN0ZXBEaWN0aW9uYXJ5RGVwZW5kZW50SWRzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSBhdmFpbGFibGVMYW5ndWFnZXM6IExhbmd1YWdlW107XG4gIHByaXZhdGUgc3RlcHNTZXR0aW5nczogU3RlcHNTZXR0aW5ncztcbiAgZm9ybWx5Q29uZmlnVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgdmlzaWJsZUZpZWxkc1VwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgZm9ybWx5VXBkYXRlQW5kR29OZXh0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIGZvcm1seUdvTmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAT3V0cHV0KCkgY29tcGxldGlvbkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gIGZvcm1seUFsbFN0ZXBzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gIGFjdGl2ZVN0ZXAgPSAwO1xuICBtb2RlbDogYW55O1xuICBvcHRpb25zOiBGb3JtbHlGb3JtT3B0aW9ucyA9IHt9O1xuICBpc0xvYWRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGRpY3Rpb25hcnlNYXA6IE1hcDxzdHJpbmcsIERpY3Rpb25hcnlEdG8+ID0gbmV3IE1hcCgpO1xuICBkaWN0aW9uYXJ5SWRUb1V1aWRNYXA6IE1hcDxudW1iZXIsIHN0cmluZz4gPSBuZXcgTWFwKCk7XG4gIGdlbmVyYWxEYXRhS2V5cyA9IExhYmVsS2V5cy5hcHBDb25maWdFZGl0LmdlbmVyYWxEYXRhO1xuICBwcml2YXRlIGZpZWxkVW5zdWJzY3JpYmVTdWJqZWN0czogU3ViamVjdDx2b2lkPltdID0gW107XG4gIHByaXZhdGUgY29sbGVjdG9ySGFuZGxlclN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAvLyBBY3Rpb24gc3RlcCBleGVjdXRpb24gc3RhdGVcbiAgcHJpdmF0ZSBpc0V4ZWN1dGluZ0FjdGlvbnMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3Rpb25TdGVwU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwdWJsaWMgaXNTYXZpbmdBZnRlckFjdGlvbnMgPSBmYWxzZTsgLy8gTWFrZSB0aGlzIHB1YmxpYyBzbyBzdGVwcGVyIGNhbiBhY2Nlc3MgaXRcblxuICAvLyBpZGVudGlmaWNhdGlvbiBreWMgY29tcG9uZW50XG4gIHB1YmxpYyBreWNBcGlVcmw6IHN0cmluZztcbiAgcHVibGljIGt5Y09yZGVySWQ6IHN0cmluZztcbiAgcHVibGljIGt5Y1Rva2VuOiBzdHJpbmc7XG4gIHB1YmxpYyBreWNFbnY6IHN0cmluZztcbiAgcHVibGljIGt5Y1JlZGlyZWN0SWQ6IHN0cmluZztcbiAgcHVibGljIGt5Y1Bob25lTnVtYmVyOiBzdHJpbmcgPSAnJztcbiAgcHVibGljIGt5Y0xhbmdJc286IHN0cmluZyA9ICcnO1xuICBwdWJsaWMga3ljU2hvd0NpdGl6ZW5zaGlwOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBreWNTY3JvbGxNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIGVuZCBpZGVudGlmaWNhdGlvbiBreWMgY29tcG9uZW50XG4gIHB1YmxpYyBsYW5ndWFnZUZsYWdzOiBhbnlbXSA9IFtcbiAgICB7XG4gICAgICBsYW5ndWFnZTogJ0VuZ2xpc2gnLFxuICAgICAgY29kZTogJ2VuJyxcbiAgICAgIHR5cGU6ICdVUycsXG4gICAgICBpY29uOiBGTEFHX0lDT05TLmVuXG4gICAgfSxcbiAgICB7XG4gICAgICBsYW5ndWFnZTogJ1JvbWFuYScsXG4gICAgICBjb2RlOiAncm8nLFxuICAgICAgaWNvbjogRkxBR19JQ09OUy5yb1xuICAgIH0sXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdEZXV0c2NoJyxcbiAgICAgIGNvZGU6ICdkZScsXG4gICAgICBpY29uOiBGTEFHX0lDT05TLmRlXG4gICAgfSxcbiAgICB7XG4gICAgICBsYW5ndWFnZTogJ0ZyYW7Dp2FpcycsXG4gICAgICBjb2RlOiAnZnInLFxuICAgICAgaWNvbjogRkxBR19JQ09OUy5mclxuICAgIH0sXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdJdGFsaWFubycsXG4gICAgICBjb2RlOiAnaXQnLFxuICAgICAgaWNvbjogRkxBR19JQ09OUy5pdFxuICAgIH0sXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdFc3Bhw7FvbCcsXG4gICAgICBjb2RlOiAnZXMnLFxuICAgICAgaWNvbjogRkxBR19JQ09OUy5lc1xuICAgIH1cbiAgXTtcbiAgZm9ybWx5Q29sbGVjdGluZ0ZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXTtcbiAgZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdO1xuICBjb250cm9sSWRzV2l0aFZhbHVlczogYW55O1xuICBfc2VsZiA9IHRoaXM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBEaWN0aW9uYXJ5U2VydmljZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJveHk6IFByb3h5U2VydmljZSxcbiAgICBwcml2YXRlIGxhYmVsU2VydmljZTogTGFiZWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwbGljYXRpb25EYXRhU2VydmljZTogQXBwbGljYXRpb25EYXRhU2VydmljZSxcbiAgICBwcml2YXRlIGxhbmdTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogT3JpZ2luRm9ybUF1dGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgZm9ybXNTZXJ2aWNlOiBGb3Jtc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb25TZXJ2aWNlOiBUcmFuc2xhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvcmlnaW5Gb3JtU2lnbmFsckhhbmRsZXJTZXJ2aWNlOiBPcmlnaW5Gb3JtU2lnbmFsckhhbmRsZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aW9uU3RlcEhhbmRsZXI6IEFjdGlvblN0ZXBIYW5kbGVyLFxuICAgIHByaXZhdGUgc2Nyb2xsVG9FcnJvclNlcnZpY2U6IFNjcm9sbFRvRXJyb3JTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMua3ljQXBpVXJsID0gcHJveHkuYXBpVVJMO1xuICAgIHRoaXMua3ljT3JkZXJJZCA9IHByb3h5Lm9yZGVySUQhO1xuICAgIHRoaXMua3ljVG9rZW4gPSBwcm94eS50b2tlbjtcbiAgICB0aGlzLmt5Y0VudiA9IHByb3h5LmVudjtcblxuICAgIHRoaXMua3ljTGFuZ0lzbyA9IHByb3h5LmxhbmdJc287XG4gICAgY29uc3QgaXNMb2FkaW5nU3ViID1cbiAgICAgIHRoaXMub3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZS5pc0xvYWRpbmckLnN1YnNjcmliZSgobG9hZGluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0xvYWRpbmcgIT09IGxvYWRpbmcpIHtcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGxvYWRpbmc7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHRoaXMuY29sbGVjdG9ySGFuZGxlclN1YnNjcmlwdGlvbnMuYWRkKGlzTG9hZGluZ1N1Yik7XG5cbiAgICBjb25zdCBvcGVyYXRpb25Db21wbGV0ZWRTdWIgPVxuICAgICAgdGhpcy5vcmlnaW5Gb3JtU2lnbmFsckhhbmRsZXJTZXJ2aWNlLm9wZXJhdGlvbkNvbXBsZXRlZCQuc3Vic2NyaWJlKFxuICAgICAgICBhc3luYyAocmVzdWx0OiBPcGVyYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0Lm9wZXJhdGlvbklkZW50aWZpZXIgPT09ICdLWUNfUFJPQ0VTU0lORycpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAnS1lDIFByb2Nlc3Npbmcgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCAodmlhIEhhbmRsZXIgU2VydmljZSk6JyxcbiAgICAgICAgICAgICAgICByZXN1bHQuZGF0YVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAocmVzdWx0LmRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGxEYXRhID0gSlNPTi5wYXJzZShyZXN1bHQuZGF0YS5maWxsRGF0YSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZU1vZGVsV2l0aEZpbGxEYXRhKHRoaXMuZmlsbERhdGEpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5mb3JtbHlVcGRhdGVBbmRHb05leHQuZW1pdCh7fSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICdLWUMgUHJvY2Vzc2luZyBmYWlsZWQgKHZpYSBIYW5kbGVyIFNlcnZpY2UpOicsXG4gICAgICAgICAgICAgICAgcmVzdWx0LmVycm9yXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApO1xuICAgIHRoaXMuY29sbGVjdG9ySGFuZGxlclN1YnNjcmlwdGlvbnMuYWRkKG9wZXJhdGlvbkNvbXBsZXRlZFN1Yik7XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYWN0aW9uIHN0ZXAgZXhlY3V0aW9uIGV2ZW50c1xuICAgIGNvbnN0IGFjdGlvbkV4ZWN1dGluZ1N1YiA9XG4gICAgICB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmFjdGlvbkV4ZWN1dGluZyQuc3Vic2NyaWJlKChleGVjdXRpbmcpID0+IHtcbiAgICAgICAgdGhpcy5pc0V4ZWN1dGluZ0FjdGlvbnMgPSBleGVjdXRpbmc7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZXhlY3V0aW5nO1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuYWN0aW9uU3RlcFN1YnNjcmlwdGlvbnMuYWRkKGFjdGlvbkV4ZWN1dGluZ1N1Yik7XG5cbiAgICBjb25zdCBhY3Rpb25Db21wbGV0ZWRTdWIgPVxuICAgICAgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5hY3Rpb25Db21wbGV0ZWQkLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfwn46sIEFjdGlvbiBzdGVwIGNvbXBsZXRlZDonLCByZXN1bHQpO1xuICAgICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcign4p2MIEFjdGlvbiBzdGVwIGZhaWxlZDonLCByZXN1bHQuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdGU6IFdlIGRvbid0IGF1dG8tcHJvZ3Jlc3MgaGVyZSBhcyBpdCdzIGhhbmRsZWQgaW4gZXhlY3V0ZUFjdGlvblN0ZXBzQmVmb3JlTW92aW5nXG4gICAgICB9KTtcbiAgICB0aGlzLmFjdGlvblN0ZXBTdWJzY3JpcHRpb25zLmFkZChhY3Rpb25Db21wbGV0ZWRTdWIpO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGF0YVVybElkKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgIHRoaXMuYXBwbGljYXRpb25EYXRhU2VydmljZS5nZXREYXRhVXJsKHRoaXMuZGF0YVVybElkKVxuICAgICAgKTtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5jb25maWdVdWlkID0gcmVzdWx0LmFwcElkO1xuICAgICAgICB0aGlzLmFwcERhdGFVdWlkID0gcmVzdWx0LmFwcERhdGFJZDtcbiAgICAgICAgdGhpcy5lbnYgPSByZXN1bHQuZW52O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmFwcERhdGFVdWlkICYmIHRoaXMuY3VycmVudFN0ZXBJZCkge1xuICAgICAgdGhpcy5hcHBsaWNhdGlvbkRhdGFTZXJ2aWNlLnNldEN1cnJlbnRTdGVwKFxuICAgICAgICB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICB0aGlzLmN1cnJlbnRTdGVwSWRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmFwcERhdGFVdWlkKSB7XG4gICAgICB0aGlzLmFwcERhdGFVdWlkID0gVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5jb25maWdDb21wb25lbnQgJiZcbiAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlRva2VuICYmXG4gICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudC5SZWZyZXNoVG9rZW5cbiAgICApIHtcbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS51cGRhdGVDb25maWdGcm9tSW5wdXQodGhpcy5jb25maWdDb21wb25lbnQpO1xuICAgICAgYXdhaXQgdGhpcy5hdXRoU2VydmljZS5zZXRUb2tlbnMoXG4gICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlRva2VuLFxuICAgICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudC5SZWZyZXNoVG9rZW5cbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMgfHwgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmxhbmdTZXJ2aWNlLmdldExhbmd1YWdlcygpKS50aGVuKChsaXN0KSA9PiB7XG4gICAgICAgIGlmIChsaXN0ICYmIGxpc3QuaXRlbXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyA9IGxpc3QuaXRlbXM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmxvYWRBcHBEYXRhKCk7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyAmJiB0aGlzLmFwcE1vZGVsKSB7XG4gICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyA9IHRoaXMuYXBwTW9kZWwuZ2VuZXJhbERhdGEuZGVmYXVsdExhbmd1YWdlO1xuICAgIH1cbiAgICBpZiAodGhpcy5hcHBNb2RlbCkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0QXN5bmMoKTtcbiAgICAgIC8vIEV4ZWN1dGUgYW55IGFjdGlvbi9zdGF0dXMgc3RlcHMgdGhhdCBhcHBlYXIgYmVmb3JlIHRoZSBmaXJzdCB2aXNpYmxlIHN0ZXBcbiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUxlYWRpbmdBY3Rpb25TdGVwcygpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hhbmdlc1snY29uZmlnQ29tcG9uZW50J10gJiYgIWNoYW5nZXNbJ2NvbmZpZ0NvbXBvbmVudCddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50ICYmXG4gICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlRva2VuICYmXG4gICAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50LlJlZnJlc2hUb2tlblxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY29uZmlnU2VydmljZS51cGRhdGVDb25maWdGcm9tSW5wdXQodGhpcy5jb25maWdDb21wb25lbnQpO1xuICAgICAgICBhd2FpdCB0aGlzLmF1dGhTZXJ2aWNlLnNldFRva2VucyhcbiAgICAgICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudC5Ub2tlbixcbiAgICAgICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudC5SZWZyZXNoVG9rZW5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1snY3VycmVudExhbmd1YWdlSXNvJ10gJiZcbiAgICAgICFjaGFuZ2VzWydjdXJyZW50TGFuZ3VhZ2VJc28nXS5maXJzdENoYW5nZVxuICAgICkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzKSB7XG4gICAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5sYW5nU2VydmljZS5nZXRMYW5ndWFnZXMoKSkudGhlbigobGlzdCkgPT4ge1xuICAgICAgICAgICAgaWYgKGxpc3QgJiYgbGlzdC5pdGVtcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyA9IGxpc3QuaXRlbXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXBwRGF0YVV1aWQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYXBwRGF0YSA9IGF3YWl0IHRoaXMuYXBwbGljYXRpb25EYXRhU2VydmljZS5nZXRTdGVwcyhcbiAgICAgICAgICAgICAgdGhpcy5hcHBEYXRhVXVpZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChhcHBEYXRhICYmIGFwcERhdGEuZmlsbERhdGEpIHtcbiAgICAgICAgICAgICAgdGhpcy5maWxsRGF0YSA9IEpTT04ucGFyc2UoYXBwRGF0YS5maWxsRGF0YSk7XG4gICAgICAgICAgICAgIHRoaXMuYmxvY2tQcmV2aW91c1N0ZXAgPSBhcHBEYXRhLmJsb2NrUHJldmlvdXNTdGVwO1xuICAgICAgICAgICAgICBpZiAodGhpcy5maWxsRGF0YS5tZXRhZGF0YS5sYW5ndWFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvID0gdGhpcy5maWxsRGF0YS5tZXRhZGF0YS5sYW5ndWFnZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZXRyaWV2aW5nIGFwcCBkYXRhJywgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLmluaXRBc3luYygpO1xuICAgICAgICAvLyBFeGVjdXRlIGFueSBhY3Rpb24vc3RhdHVzIHN0ZXBzIHRoYXQgYXBwZWFyIGJlZm9yZSB0aGUgZmlyc3QgdmlzaWJsZSBzdGVwXG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUxlYWRpbmdBY3Rpb25TdGVwcygpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9hZEFwcERhdGEoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZTogeyBjb25maWd1cmF0aW9uOiBhbnk7IGZpbGxEYXRhPzogYW55IH0gPVxuICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShcbiAgICAgICAgICB0aGlzLmZvcm1zU2VydmljZS5sb2FkRm9ybUJ5VXVpZCh0aGlzLmNvbmZpZ1V1aWQsIHRoaXMuZW52KVxuICAgICAgICApO1xuICAgICAgdGhpcy5hcHBNb2RlbCA9IEpTT04ucGFyc2UocmVzcG9uc2UuY29uZmlndXJhdGlvbik7XG4gICAgICB0aGlzLmZpbGxEYXRhID0gcmVzcG9uc2UuZmlsbERhdGEgPyBKU09OLnBhcnNlKHJlc3BvbnNlLmZpbGxEYXRhKSA6IG51bGw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgZm9ybSBkYXRhJywgZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUFsbEZpZWxkcygpO1xuICAgIGF3YWl0IHRoaXMuYnVpbGRGb3JtbHlBc3luYygpO1xuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVJlZmVyZW5jZUZpZWxkcyh0aGlzLmZvcm1seUNvbmZpZyk7XG4gICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICB0aGlzLmZvcm1seUNvbmZpZ1VwZGF0ZWQuZW1pdCgpO1xuICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGFwcGxpY2F0aW9uTGFuZ3VhZ2VzKCk6IExhbmd1YWdlW10ge1xuICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcz8uZmlsdGVyKChhKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5hcHBNb2RlbD8uZ2VuZXJhbERhdGE/Lmxhbmd1YWdlcz8uaW5kZXhPZihhLmlzbykgPj0gMDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXR1cm5GTGFnKGxhbmd1YWdlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5sYW5ndWFnZUZsYWdzLmZpbmQoKGwpID0+IGwuY29kZSA9PSBsYW5ndWFnZSk/Lmljb247XG4gIH1cblxuICBjaGFuZ2VMYW5ndWFnZSgkZXZlbnQ6IHN0cmluZykge1xuICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvID0gJGV2ZW50O1xuICAgIHRoaXMuYXBwbGljYXRpb25EYXRhU2VydmljZVxuICAgICAgLmNoYW5nZUxhbmd1YWdlKHRoaXMuYXBwRGF0YVV1aWQsIHRoaXMuY3VycmVudExhbmd1YWdlSXNvKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaW5pdEFzeW5jKCk7XG4gIH1cbiAgZ2V0TGFuZ3VhZ2VOYW1lKGxhbmd1YWdlSXNvOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMuZmluZChcbiAgICAgIChsYW5nKSA9PiBsYW5nLmlzbyA9PT0gbGFuZ3VhZ2VJc29cbiAgICApO1xuICAgIHJldHVybiBsYW5ndWFnZSA/IGxhbmd1YWdlLm5hbWUgOiAnJztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRGb3JtbHlBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28pIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TGFiZWxzKCk7XG4gICAgfVxuXG4gICAgLy8gU1RFUCAxOiBJbml0aWFsaXplIGZsdXggYW5kIG90aGVyIHByb3BlcnRpZXMgZmlyc3RcbiAgICB0aGlzLmZsdXggPSB0aGlzLmFwcE1vZGVsLmZsdXg7XG4gICAgdGhpcy5kaXNwbGF5ID0gdGhpcy5hcHBNb2RlbC5kaXNwbGF5O1xuICAgIHRoaXMuZGVzaWduID0gdGhpcy5hcHBNb2RlbC5nZW5lcmF0ZWRDc3M7XG4gICAgdGhpcy5nZW5lcmFsRGF0YSA9IHRoaXMuYXBwTW9kZWwuZ2VuZXJhbERhdGE7XG4gICAgdGhpcy5hZGRSZW5kZXJlZENzcygpO1xuXG4gICAgLy8gU1RFUCAyOiBMb2FkIEFMTCBkaWN0aW9uYXJpZXMgdXBmcm9udCAobm93IHRoYXQgZmx1eCBpcyBpbml0aWFsaXplZClcbiAgICBhd2FpdCB0aGlzLmxvYWRBbGxSZXF1aXJlZERpY3Rpb25hcmllcygpO1xuXG4gICAgLy8gU1RFUCAzOiBDb250aW51ZSB3aXRoIGV4aXN0aW5nIGZvcm0gYnVpbGRpbmcgbG9naWNcbiAgICB0aGlzLmZvcm1seUNvbmZpZyA9IFtdO1xuICAgIHRoaXMuZm9ybWx5Q29sbGVjdGluZ0ZpZWxkcyA9IFtdO1xuICAgIHRoaXMuZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzID0gW107XG4gICAgdGhpcy5tb2RlbCA9IHt9O1xuICAgIHRoaXMuZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pO1xuXG4gICAgLy8gUG9wdWxhdGUgY29udHJvbCBJRHMgd2l0aCB2YWx1ZXMgaWYgZmlsbERhdGEgb3IgaW5pdEZsb3dWYWx1ZXMgZXhpc3RcbiAgICBpZiAodGhpcy5maWxsRGF0YSB8fCB0aGlzLmluaXRGbG93VmFsdWVzKSB7XG4gICAgICB0aGlzLnBvcHVsYXRlQ29udHJvbElkc1dpdGhWYWx1ZURpY3Rpb25hcnkoKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIG1vZGVsIHdpdGggZGVmYXVsdCB2YWx1ZXMgaWYgbm8gZmlsbERhdGFcbiAgICBpZiAoIXRoaXMuZmlsbERhdGEpIHtcbiAgICAgIHRoaXMubW9kZWwgPSBNb2RlbFBvcHVsYXRpb25IZWxwZXIuYXBwbHlEZWZhdWx0c1RvTW9kZWwoXG4gICAgICAgIHRoaXMuZmx1eCxcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5TWFwLFxuICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wb3B1bGF0ZU1vZGVsV2l0aEZpbGxEYXRhKHRoaXMuZmlsbERhdGEpO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMubW9kZWwpO1xuICAgIGF3YWl0IHRoaXMuYnVpbGRGb3JtbHlDb25maWdBc3luYygpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSByZWZlcmVuY2VzIGZvciBkZWZhdWx0IHZhbHVlc1xuICAgIGlmICghdGhpcy5maWxsRGF0YSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVmZXJlbmNlRmllbGRzKHRoaXMuZm9ybWx5Q29uZmlnKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShzdGFydFdpdGgobnVsbCksIHBhaXJ3aXNlKCkpXG4gICAgICAuc3Vic2NyaWJlKChbcHJldiwgbmV4dF06IFthbnksIGFueV0pID0+XG4gICAgICAgIHRoaXMuaGFuZGxlRm9ybVZhbHVlQ2hhbmdlKFtwcmV2LCBuZXh0XSlcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZvcm1WYWx1ZUNoYW5nZShbcHJldiwgbmV4dF06IFthbnksIGFueV0pIHtcbiAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IFV0aWxzLmZpbmRMYW5ndWFnZUlkQnlJc28oXG4gICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXh0KSB7XG4gICAgICBpZiAobmV4dFtrZXldPy52YWx1ZVRyYW5zbGF0aW9ucykge1xuICAgICAgICB2YXIgcyA9IEpTT04uc3RyaW5naWZ5KG5leHRba2V5XSk7XG4gICAgICAgIHZhciByZXBsYWNlZCA9IHMucmVwbGFjZSgvXCJ2YWx1ZVRyYW5zbGF0aW9uc1wiOi9nLCAnXCJ0cmFuc2xhdGlvbnNcIjonKTtcbiAgICAgICAgbmV4dFtrZXldID0gSlNPTi5wYXJzZShyZXBsYWNlZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMuZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzLmZpbHRlcihcbiAgICAgICAgKGkpID0+IGkucHJvcHMgJiYgaS5wcm9wc1snY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyJ10gPT09IGtleVxuICAgICAgKTtcbiAgICAgIGlmIChmaWVsZHMgJiYgZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgbGV0IHZhbHVlID0gJyc7XG4gICAgICAgICAgc3dpdGNoICh0eXBlb2YgbmV4dFtrZXldKSB7XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgdmFsdWUgPSBuZXh0W2tleV0gPyAnJmNoZWNrOycgOiAnJmNyb3NzOyc7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBpZiAobmV4dFtrZXldPy50cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IG5leHRba2V5XS50cmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICh0cmFuc2xhdGlvbjogeyBsYW5ndWFnZUlkOiBhbnkgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24ubGFuZ3VhZ2VJZCA9PT0gY3VycmVudExhbmd1YWdlSWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdHJhbnNsYXRpb24gPyB0cmFuc2xhdGlvbi52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBuZXh0W2tleV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0ZXBEaWN0aW9uYXJ5RGVwZW5kZW50SWRzLmZpbmQoKGEpID0+IGEgPT0ga2V5KSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbmV4dFtrZXldPy5pZCAmJlxuICAgICAgICAgIChwcmV2ID09IG51bGwgfHwgcHJldltrZXldPy5pZCAhPT0gbmV4dFtrZXldPy5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cCA9IHRoaXMuZ2V0Rm9ybWx5RmlsdGVyZWRTdGVwcygpO1xuICAgICAgICAgIHZhciBmaWx0ZXJlZFN0ZXBzSWRlbnRpZmllcnMgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwLm1hcChcbiAgICAgICAgICAgIChmKSA9PiBmLnByb3BzPy5bJ3N0ZXBJZCddXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB2aXNpYmxlU3RlcHMgPSB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmZpbHRlclZpc2libGVTdGVwcyhcbiAgICAgICAgICAgIHRoaXMuZmx1eCxcbiAgICAgICAgICAgIGZpbHRlcmVkU3RlcHNJZGVudGlmaWVyc1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICAgICAgICB0aGlzLnZpc2libGVGaWVsZHNVcGRhdGVkLmVtaXQodmlzaWJsZVN0ZXBzKTtcbiAgICAgICAgICB0aGlzLmZvcm1seUNvbmZpZ1VwZGF0ZWQuZW1pdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYWJlbHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLmxhYmVsU2VydmljZVxuICAgICAgICAuZ2V0TGFiZWxzKHRoaXMuY3VycmVudExhbmd1YWdlSXNvLCBmYWxzZSlcbiAgICAgICAgLnN1YnNjcmliZSgobCkgPT4ge1xuICAgICAgICAgIHRoaXMubGFiZWxzID0gbDtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3B1bGF0ZUNvbnRyb2xJZHNXaXRoVmFsdWVEaWN0aW9uYXJ5KCkge1xuICAgIHZhciBjdXJyZW50TGFuZ3VhZ2VJZCA9IHRoaXMuZ2V0Q3VycmVudExhbmd1YWdlSWQoKTtcblxuICAgIC8vIEJ1aWxkIGRpY3Rpb25hcnkgZnJvbSBmaWxsRGF0YS5mbHV4IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHN0YXJ0IGVtcHR5XG4gICAgY29uc3QgY29udHJvbElkc1dpdGhWYWx1ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB0aGlzLmZpbGxEYXRhPy5mbHV4XG4gICAgICA/IHRoaXMuZmlsbERhdGEuZmx1eFxuICAgICAgICAgIC5mbGF0TWFwKChzdGVwOiB7IHNlY3Rpb25zOiB7IGNvbnRyb2xzOiBhbnlbXSB9W10gfSkgPT5cbiAgICAgICAgICAgIHN0ZXAuc2VjdGlvbnMuZmxhdE1hcCgoc2VjdGlvbjogeyBjb250cm9sczogYW55W10gfSkgPT5cbiAgICAgICAgICAgICAgc2VjdGlvbi5jb250cm9sc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNvbnRyb2wpID0+IGNvbnRyb2wuY29udHJvbElkICYmIGNvbnRyb2wuZmlsbFZhbHVlKVxuICAgICAgICAgICAgICAgIC5tYXAoKGNvbnRyb2wpID0+ICh7XG4gICAgICAgICAgICAgICAgICBjb250cm9sSWQ6IGNvbnRyb2wuY29udHJvbElkLFxuICAgICAgICAgICAgICAgICAgZmlsbFZhbHVlOiBjb250cm9sLmZpbGxWYWx1ZSxcbiAgICAgICAgICAgICAgICAgIGZpbGxWYWx1ZUlkOiBjb250cm9sLmZpbGxWYWx1ZUlkXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAoXG4gICAgICAgICAgICAgIGRpY3Rpb25hcnk6IHsgW3g6IHN0cmluZ106IGFueSB9LFxuICAgICAgICAgICAgICB7IGNvbnRyb2xJZCwgZmlsbFZhbHVlLCBmaWxsVmFsdWVJZCB9OiBhbnlcbiAgICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZmlsbFZhbHVlSWQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRpY3RdIG9mIHRoaXMuZGljdGlvbmFyeU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGljdC52YWx1ZXM/LmZpbmQoKHYpID0+IHYuaWQgPT0gZmlsbFZhbHVlSWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdmFsdWUudmFsdWVUcmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAodCkgPT4gdC5sYW5ndWFnZUlkID09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlbY29udHJvbElkXSA9IHRyYW5zbGF0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlbY29udHJvbElkXSA9IGZpbGxWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZGljdGlvbmFyeTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgICAgKVxuICAgICAgOiB7fTtcblxuICAgIC8vIEdldCBpbml0Rmxvd1ZhbHVlcyBmcm9tIGZpbGxEYXRhIG9yIGZyb20gZGlyZWN0IGlucHV0ICh0aGlzLmluaXRGbG93VmFsdWVzKVxuICAgIGxldCBpbml0Rmxvd1ZhbHVlcyA9IHRoaXMuZmlsbERhdGE/LmluaXRGbG93VmFsdWVzO1xuXG4gICAgLy8gSWYgbm90IGluIGZpbGxEYXRhLCB0cnkgdG8gcGFyc2UgZnJvbSBkaXJlY3QgaW5pdEZsb3dWYWx1ZXMgaW5wdXRcbiAgICBpZiAoIWluaXRGbG93VmFsdWVzICYmIHRoaXMuaW5pdEZsb3dWYWx1ZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluaXRGbG93VmFsdWVzID1cbiAgICAgICAgICB0eXBlb2YgdGhpcy5pbml0Rmxvd1ZhbHVlcyA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gSlNPTi5wYXJzZSh0aGlzLmluaXRGbG93VmFsdWVzKVxuICAgICAgICAgICAgOiB0aGlzLmluaXRGbG93VmFsdWVzO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBwYXJzZSBpbml0Rmxvd1ZhbHVlczonLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZGRJbml0Rmxvd1ZhbHVlcyA9IChub2RlOiBhbnksIHBhdGhQYXJ0czogc3RyaW5nW10pID0+IHtcbiAgICAgIGlmIChub2RlID09PSBudWxsIHx8IG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAocGF0aFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb250cm9sSWRzV2l0aFZhbHVlc1tgaW5pdEZsb3dWYWx1ZXNfJHtwYXRoUGFydHMuam9pbignXycpfWBdID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgICAgICBub2RlLmZvckVhY2goKGNoaWxkLCBpZHgpID0+XG4gICAgICAgICAgYWRkSW5pdEZsb3dWYWx1ZXMoY2hpbGQsIFsuLi5wYXRoUGFydHMsIFN0cmluZyhpZHgpXSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG5vZGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKG5vZGUpLmZvckVhY2goKGspID0+XG4gICAgICAgICAgYWRkSW5pdEZsb3dWYWx1ZXMobm9kZVtrXSwgWy4uLnBhdGhQYXJ0cywga10pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhdGhQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnRyb2xJZHNXaXRoVmFsdWVzW2Bpbml0Rmxvd1ZhbHVlc18ke3BhdGhQYXJ0cy5qb2luKCdfJyl9YF0gPVxuICAgICAgICAgIFN0cmluZyhub2RlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGluaXRGbG93VmFsdWVzICE9PSBudWxsICYmIGluaXRGbG93VmFsdWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFkZEluaXRGbG93VmFsdWVzKGluaXRGbG93VmFsdWVzLCBbXSk7XG4gICAgfVxuICAgIC8vIEFkZCBpbmhlcml0ZWQgZmllbGRzIGZyb20gcGFyZW50IGFwcFxuICAgIGNvbnN0IGluaGVyaXRlZEZpZWxkcyA9IHRoaXMuZmlsbERhdGE/LmluaGVyaXRlZEZpZWxkcztcbiAgICBpZiAoaW5oZXJpdGVkRmllbGRzICYmIHR5cGVvZiBpbmhlcml0ZWRGaWVsZHMgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbmhlcml0ZWRGaWVsZHMpKSB7XG4gICAgICAgIGxldCByZXNvbHZlZFZhbHVlOiBhbnk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICAgICAodmFsdWUgYXMgYW55KS5kaWN0aW9uYXJ5VVVJRFxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBFbnJpY2hlZCBmb3JtYXQ6IGhhbmRsZSBtdWx0aS1zZWxlY3QgYW5kIHNpbmdsZS1zZWxlY3RcbiAgICAgICAgICBjb25zdCBlbnJpY2hlZCA9IHZhbHVlIGFzIGFueTtcbiAgICAgICAgICBjb25zdCBmaWxsVmFsdWVJZHMgPSBlbnJpY2hlZC5maWxsVmFsdWVJZHM7XG5cbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWxsVmFsdWVJZHMpICYmIGZpbGxWYWx1ZUlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBNdWx0aS1zZWxlY3Q6IGxvb2sgdXAgZWFjaCBJRCBpbiBkaWN0aW9uYXJ5TWFwIGZvciB0cmFuc2xhdGVkIGRpc3BsYXlcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZUlkID0gdGhpcy5nZXRDdXJyZW50TGFuZ3VhZ2VJZCgpO1xuICAgICAgICAgICAgY29uc3QgZGlzcGxheVZhbHVlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWVJZCBvZiBmaWxsVmFsdWVJZHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgbnVtZXJpY0lkID0gdHlwZW9mIHZhbHVlSWQgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodmFsdWVJZCwgMTApIDogdmFsdWVJZDtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbLCBkaWN0XSBvZiB0aGlzLmRpY3Rpb25hcnlNYXAuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHYgPSBkaWN0LnZhbHVlcz8uZmluZCgodjogYW55KSA9PiB2LmlkID09PSBudW1lcmljSWQpO1xuICAgICAgICAgICAgICAgIGlmIChkdikge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSBkdi52YWx1ZVRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHQ6IGFueSkgPT4gdC5sYW5ndWFnZUlkID09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlcy5wdXNoKHRyYW5zbGF0aW9uPy52YWx1ZSB8fCBkdi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZSA9IGRpc3BsYXlWYWx1ZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IGRpc3BsYXlWYWx1ZXMuam9pbignLCAnKVxuICAgICAgICAgICAgICA6IChlbnJpY2hlZC5maWxsVmFsdWUgPz8gU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFNpbmdsZS1zZWxlY3RcbiAgICAgICAgICAgIHJlc29sdmVkVmFsdWUgPSBlbnJpY2hlZC5maWxsVmFsdWUgPz8gU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZWRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2xJZHNXaXRoVmFsdWVzW2Bpbmhlcml0ZWRfJHtrZXl9YF0gPSByZXNvbHZlZFZhbHVlO1xuICAgICAgICBpZiAoY29udHJvbElkc1dpdGhWYWx1ZXNba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29udHJvbElkc1dpdGhWYWx1ZXNba2V5XSA9IHJlc29sdmVkVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbnRyb2xJZHNXaXRoVmFsdWVzID0gY29udHJvbElkc1dpdGhWYWx1ZXM7XG4gIH1cbiAgcHJpdmF0ZSBnZXRDdXJyZW50TGFuZ3VhZ2VJZCgpOiBudW1iZXIge1xuICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZUlkID0gVXRpbHMuZmluZExhbmd1YWdlSWRCeUlzbyhcbiAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICApO1xuICAgIHJldHVybiBjdXJyZW50TGFuZ3VhZ2VJZDtcbiAgfVxuICBwcml2YXRlIGFzeW5jIGJ1aWxkRm9ybWx5Q29uZmlnQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdGVwc1NldHRpbmdzID0ge1xuICAgICAgc2hvd0NvdW50ZXI6IHRoaXMuc2hvd0Rpc3BsYXlNb2RlXG4gICAgICAgID8gZmFsc2VcbiAgICAgICAgOiB0aGlzLmdlbmVyYWxEYXRhLnNob3dDb3VudGVyU3RlcCxcbiAgICAgIHNob3dMYWJlbHM6IHRoaXMuc2hvd0Rpc3BsYXlNb2RlID8gZmFsc2UgOiB0aGlzLmdlbmVyYWxEYXRhLnNob3dOYW1lU3RlcCxcbiAgICAgIHNob3dBbGxTdGVwczogdGhpcy5zaG93RGlzcGxheU1vZGVcbiAgICAgICAgPyBmYWxzZVxuICAgICAgICA6IHRoaXMuZ2VuZXJhbERhdGEuc2hvd0FsbFN0ZXBzLFxuICAgICAgc2hvd1Byb2dyZXNzQmFyOlxuICAgICAgICB0aGlzLmdlbmVyYWxEYXRhLnNob3dQcm9ncmVzc0JhciAmJlxuICAgICAgICB0aGlzLmdlbmVyYWxEYXRhLnNob3dBbGxTdGVwcyA9PSBmYWxzZVxuICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgIDogZmFsc2VcbiAgICB9O1xuXG4gICAgdGhpcy5mb3JtbHlBbGxTdGVwcyA9IGF3YWl0IHRoaXMuYnVpbGRGb3JtbHlGaWVsZEdyb3VwQXN5bmMoKTtcbiAgICB2YXIgaGFzRGljdGlvbmFyeURlcGVuZGVudFN0ZXBzID0gdGhpcy5mb3JtbHlBbGxTdGVwcy5zb21lKFxuICAgICAgKGYpID0+IGYucHJvcHM/LlsnZGVwZW5kZW50RGljdGlvbmFyeSddPy5pc0RpY3Rpb25hcnlEZXBlbmRlbnRcbiAgICApO1xuXG4gICAgdmFyIGZvcm1seUZpbHRlcmVkU3RlcHMgPSB0aGlzLmdldEZvcm1seUZpbHRlcmVkU3RlcHMoKTtcbiAgICB2YXIgZmlsdGVyZWRTdGVwc0lkZW50aWZpZXJzID0gZm9ybWx5RmlsdGVyZWRTdGVwcy5tYXAoXG4gICAgICAoZikgPT4gZi5wcm9wcz8uWydzdGVwSWQnXVxuICAgICk7XG4gICAgLy8gR2V0IHZpc2libGUgc3RlcHMgZm9yIGFjY3VyYXRlIHN0ZXAgY291bnRpbmdcbiAgICBjb25zdCB2aXNpYmxlU3RlcHMgPSB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmZpbHRlclZpc2libGVTdGVwcyh0aGlzLmZsdXgpO1xuICAgIGNvbnN0IGZpbHRlcmVkVmlzaWJsZVN0ZXBzID0gdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5maWx0ZXJWaXNpYmxlU3RlcHMoXG4gICAgICB0aGlzLmZsdXgsXG4gICAgICBmaWx0ZXJlZFN0ZXBzSWRlbnRpZmllcnNcbiAgICApO1xuXG4gICAgdGhpcy5mb3JtbHlDb25maWcgPSBbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdzdGVwcGVyJyxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuZmlsbERhdGFcbiAgICAgICAgICAgID8gdGhpcy5maWxsRGF0YT8ubWV0YWRhdGE/LmFwcERhdGFJZFxuICAgICAgICAgICAgOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgICAgYXBwbGljYXRpb25JZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgICAgZmx1eDogdmlzaWJsZVN0ZXBzLCAvLyBQYXNzIG9ubHkgdmlzaWJsZSBzdGVwcyB0byBzdGVwcGVyXG4gICAgICAgICAgZmlsdGVyZWRGbHV4OiBmaWx0ZXJlZFZpc2libGVTdGVwcyxcbiAgICAgICAgICBpc0Rpc3BsYXlNb2RlOiB0aGlzLnNob3dEaXNwbGF5TW9kZSxcbiAgICAgICAgICBmaWxsRGF0YTogdGhpcy5maWxsRGF0YSxcbiAgICAgICAgICBpbml0Rmxvd1ZhbHVlczogdGhpcy5pbml0Rmxvd1ZhbHVlcyxcbiAgICAgICAgICBkZWZhdWx0TGFuZ3VhZ2U6IHRoaXMuYXBwTW9kZWwuZ2VuZXJhbERhdGEuZGVmYXVsdExhbmd1YWdlLFxuICAgICAgICAgIGRpc3BsYXk6IHRoaXMuZGlzcGxheSxcbiAgICAgICAgICBkZXNpZ25Db25maWc6IHtcbiAgICAgICAgICAgIGJ1dHRvbnNWZXJ0aWNhbFBvc2l0aW9uOlxuICAgICAgICAgICAgICB0aGlzLmFwcE1vZGVsLmRlc2lnbi5idXR0b25zVmVydGljYWxQb3NpdGlvbixcbiAgICAgICAgICAgIGJ1dHRvbnNIb3Jpem9udGFsUG9zaXRpb246XG4gICAgICAgICAgICAgIHRoaXMuYXBwTW9kZWwuZGVzaWduLmJ1dHRvbnNIb3Jpem9udGFsUG9zaXRpb25cbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0ZXBzU2V0dGluZ3M6IHRoaXMuc3RlcHNTZXR0aW5ncyxcbiAgICAgICAgICBtZXRhRGF0YTogdGhpcy5maWxsRGF0YT8ubWV0YWRhdGEsXG4gICAgICAgICAgZGVtb01vZGU6IHRoaXMuaXNEZW1vTW9kZSxcbiAgICAgICAgICBpc0RlYnVnOiB0aGlzLmlzRGVidWcsXG4gICAgICAgICAgbm9CdXR0b25zSW5WaWV3OiB0aGlzLm5vQnV0dG9uc0luVmlldyxcbiAgICAgICAgICBibG9ja1ByZXZpb3VzU3RlcDogdGhpcy5ibG9ja1ByZXZpb3VzU3RlcCxcbiAgICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICAgIGhhc0RpY3Rpb25hcnlEZXBlbmRlbnRTdGVwczogaGFzRGljdGlvbmFyeURlcGVuZGVudFN0ZXBzLFxuICAgICAgICAgIGhhc0FjdGlvblN0ZXBzOiB0aGlzLmZsdXguc29tZSgoc3RlcCkgPT5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuaXNBY3Rpb25TdGVwKHN0ZXApXG4gICAgICAgICAgKSwgLy8gSW5kaWNhdGUgaWYgdGhlcmUgYXJlIGFjdGlvbiBzdGVwc1xuICAgICAgICAgIGNvbXBsZXRpb25FdmVudDogKCkgPT4gdGhpcy5vbkNvbXBsZXRpb24oKSxcbiAgICAgICAgICBvblNlbGVjdGVkUGFnZUNoYW5naW5nOiAoaW5kZXg6IG51bWJlcikgPT5cbiAgICAgICAgICAgIHRoaXMub25TZWxlY3RlZFBhZ2VDaGFuZ2luZyhpbmRleCksXG4gICAgICAgICAgb25TZWxlY3RlZFBhZ2VDaGFuZ2VkOiAoaW5kZXg6IG51bWJlcikgPT5cbiAgICAgICAgICAgIHRoaXMub25TZWxlY3RlZFBhZ2VDaGFuZ2VkKGluZGV4KVxuICAgICAgICB9LFxuICAgICAgICBmaWVsZEdyb3VwOiBmb3JtbHlGaWx0ZXJlZFN0ZXBzXG4gICAgICB9XG4gICAgXTtcblxuICAgIC8vIEZvciBkaXNwbGF5IG1vZGUsIHBvcHVsYXRlIHZhbHVlcyBpbW1lZGlhdGVseSBhZnRlciBjb25maWcgaXMgYnVpbHRcbiAgICBpZiAodGhpcy5zaG93RGlzcGxheU1vZGUgJiYgdGhpcy5mb3JtbHlDb25maWdbMF0/LmZpZWxkR3JvdXApIHtcbiAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwKSB7XG4gICAgICAgIHRoaXMuc2V0UHJlc2VudGF0aW9uQ29udHJvbFZhbHVlc1JlY3Vyc2l2ZWx5KHN0ZXApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgb25TZWxlY3RlZFBhZ2VDaGFuZ2luZyhzdGVwVHJhbnNpdGlvbjogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IGZyb21JbmRleDogbnVtYmVyO1xuICAgIGxldCB0b0luZGV4OiBudW1iZXI7XG4gICAgbGV0IGNhbGxiYWNrOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBpZiAodHlwZW9mIHN0ZXBUcmFuc2l0aW9uID09PSAnbnVtYmVyJykge1xuICAgICAgdG9JbmRleCA9IHN0ZXBUcmFuc2l0aW9uO1xuICAgICAgZnJvbUluZGV4ID0gdGhpcy5hY3RpdmVTdGVwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcm9tSW5kZXggPSBzdGVwVHJhbnNpdGlvbi5mcm9tO1xuICAgICAgdG9JbmRleCA9IHN0ZXBUcmFuc2l0aW9uLnRvO1xuICAgICAgY2FsbGJhY2sgPSBzdGVwVHJhbnNpdGlvbi5jYWxsYmFjayB8fCAoKCkgPT4ge30pO1xuICAgIH1cblxuICAgIGxldCBhY3Rpb25zRXhlY3V0ZWQgPSBmYWxzZTtcblxuICAgIGlmICh0b0luZGV4ID4gZnJvbUluZGV4KSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ+Keoe+4jyBNb3ZpbmcgZm9yd2FyZCAtIGV4ZWN1dGluZyBhY3Rpb24gc3RlcHMgYWZ0ZXIgY3VycmVudCBzdGVwJ1xuICAgICAgKTtcbiAgICAgIGFjdGlvbnNFeGVjdXRlZCA9XG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZUFjdGlvblN0ZXBzQWZ0ZXJDdXJyZW50U3RlcChmcm9tSW5kZXgpO1xuICAgIH0gZWxzZSBpZiAodG9JbmRleCA8IGZyb21JbmRleCkge1xuICAgICAgY29uc29sZS5sb2coJ+Kshe+4jyBNb3ZpbmcgYmFja3dhcmQgLSBubyBhY3Rpb24gZXhlY3V0aW9uIG5lZWRlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygn8J+UhCBTdGF5aW5nIG9uIHNhbWUgc3RlcCAtIG5vIGFjdGlvbiBleGVjdXRpb24gbmVlZGVkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmVTdGVwID0gdG9JbmRleDtcblxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uc0V4ZWN1dGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQWN0aW9uU3RlcHNBZnRlckN1cnJlbnRTdGVwKFxuICAgIGN1cnJlbnRTdGVwSW5kZXg6IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5hY3Rpb25TdGVwSGFuZGxlci5pc0V4ZWN1dGluZ0FjdGlvbnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgZmlsdGVyZWRTdGVwcyA9IHRoaXMuZmx1eC5maWx0ZXIoKHMpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcy5kZXBlbmRlbnREaWN0aW9uYXJ5ICYmXG4gICAgICAgIHMuZGVwZW5kZW50RGljdGlvbmFyeS5pc0RpY3Rpb25hcnlEZXBlbmRlbnRcbiAgICAgICkge1xuICAgICAgICBjb25zdCBtb2RlbFZhbHVlID1cbiAgICAgICAgICB0aGlzLm1vZGVsW3MuZGVwZW5kZW50RGljdGlvbmFyeS5kaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXJdO1xuICAgICAgICAvLyBTa2lwIGRlcGVuZGVuY3kgY2hlY2sgZm9yIG11bHRpcGxlIHNlbGVjdGlvbiAoYXJyYXkpXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGVsVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZSA9IG1vZGVsVmFsdWU/LmlkO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRWYWx1ZSAmJlxuICAgICAgICAgIHMuZGVwZW5kZW50RGljdGlvbmFyeS5kZXBlbmRlbnRWYWx1ZUlkcy5pbmNsdWRlcyhzZWxlY3RlZFZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGFjdGlvblN0ZXBzID0gdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5nZXRBY3Rpb25TdGVwc0F0SW5kZXgoXG4gICAgICBmaWx0ZXJlZFN0ZXBzLFxuICAgICAgY3VycmVudFN0ZXBJbmRleFxuICAgICk7XG5cbiAgICBpZiAoYWN0aW9uU3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuYXBwRGF0YVV1aWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHNhdmluZyBmbGFnIGJlZm9yZSBzdGFydGluZyBhY3Rpb25zXG4gICAgICB0aGlzLmlzU2F2aW5nQWZ0ZXJBY3Rpb25zID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5leGVjdXRlQWN0aW9uU3RlcHMoXG4gICAgICAgIGFjdGlvblN0ZXBzLFxuICAgICAgICB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICAoc3RlcCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvYWRpbmdNZXNzYWdlID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uSW5mbyhcbiAgICAgICAgICAgICdsb2FkaW5nTWVzc2FnZVRyYW5zbGF0aW9ucycsXG4gICAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNZXNzYWdlID0gbG9hZGluZ01lc3NhZ2UgfHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfinIUgQWN0aW9uIHN0ZXBzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgICAvLyBLZWVwIGxvYWRpbmcgc3RhdGUgdHJ1ZSAtIGl0IHdpbGwgYmUgY2xlYXJlZCBhZnRlciBzYXZlQXBwRGF0YVN0ZXAgY29tcGxldGVzXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcign4p2MIEFjdGlvbiBzdGVwcyBleGVjdXRpb24gZmFpbGVkOicsIHJlc3VsdC5lcnJvcik7XG4gICAgICAgIHRoaXMuaXNTYXZpbmdBZnRlckFjdGlvbnMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCfinYwgRXJyb3IgZXhlY3V0aW5nIGFjdGlvbiBzdGVwczonLCBlcnJvcik7XG4gICAgICB0aGlzLmlzU2F2aW5nQWZ0ZXJBY3Rpb25zID0gZmFsc2U7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUxlYWRpbmdBY3Rpb25TdGVwcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYXBwRGF0YVV1aWQgfHwgIXRoaXMuZmx1eCB8fCB0aGlzLmZsdXgubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGVhZGluZ0FjdGlvblN0ZXBzID1cbiAgICAgIHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZ2V0QWN0aW9uU3RlcHNCZWZvcmVGaXJzdFZpc2libGVTdGVwKHRoaXMuZmx1eCk7XG5cbiAgICBpZiAobGVhZGluZ0FjdGlvblN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYPCfjqwgRXhlY3V0aW5nICR7bGVhZGluZ0FjdGlvblN0ZXBzLmxlbmd0aH0gbGVhZGluZyBhY3Rpb24gc3RlcHMgYmVmb3JlIGZpcnN0IHZpc2libGUgc3RlcGBcbiAgICApO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmV4ZWN1dGVBY3Rpb25TdGVwcyhcbiAgICAgICAgbGVhZGluZ0FjdGlvblN0ZXBzLFxuICAgICAgICB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICAoc3RlcCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGxvYWRpbmdNZXNzYWdlID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uSW5mbyhcbiAgICAgICAgICAgICdsb2FkaW5nTWVzc2FnZVRyYW5zbGF0aW9ucycsXG4gICAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNZXNzYWdlID0gbG9hZGluZ01lc3NhZ2UgfHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCfinIUgTGVhZGluZyBhY3Rpb24gc3RlcHMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCfinYwgTGVhZGluZyBhY3Rpb24gc3RlcHMgZmFpbGVkOicsIHJlc3VsdC5lcnJvcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBFcnJvciBleGVjdXRpbmcgbGVhZGluZyBhY3Rpb24gc3RlcHM6JywgZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmdNZXNzYWdlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uU2VsZWN0ZWRQYWdlQ2hhbmdlZChpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXApIHtcbiAgICAgIHZhciBzZWxlY3RlZFBhZ2UgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwW2luZGV4XTtcbiAgICAgIHRoaXMuc2V0UHJlc2VudGF0aW9uQ29udHJvbFZhbHVlc1JlY3Vyc2l2ZWx5KHNlbGVjdGVkUGFnZSk7XG5cbiAgICAgIE1vZGVsUG9wdWxhdGlvbkhlbHBlci5hcHBseVByZWNvbXBsZXRpb25Ub01vZGVsKHRoaXMubW9kZWwsIHRoaXMuZmx1eCk7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh0aGlzLm1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFByZXNlbnRhdGlvbkNvbnRyb2xWYWx1ZXNSZWN1cnNpdmVseShmYz86IGFueSkge1xuICAgIGZjPy5maWVsZEdyb3VwPy5mb3JFYWNoKChmZzogYW55KSA9PiB7XG4gICAgICBpZiAoZmcucHJvcHMgJiYgZmcucHJvcHNbJ2lzRGlzcGxheU1vZGUnXSA9PT0gdHJ1ZSkge1xuICAgICAgICB2YXIgbWV0aG9kRmllbGRJZCA9IGZnLnByb3BzWydhcGlNZXRob2RGaWVsZElkJ107XG4gICAgICAgIGlmIChtZXRob2RGaWVsZElkKSB7XG4gICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5maW5kSW5BcGlDYWxsc1Jlc3BvbnNlcyhtZXRob2RGaWVsZElkKTtcbiAgICAgICAgICBmZy5kZWZhdWx0VmFsdWUgPSB2YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFzc29jaWF0ZWRDb250cm9sSWQgPSBmZy5wcm9wc1snY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyJ107XG4gICAgICAgICAgaWYgKGFzc29jaWF0ZWRDb250cm9sSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kID1cbiAgICAgICAgICAgICAgdGhpcy5maW5kQ29udHJvbEluRmlsbERhdGFDb250cm9scyhhc3NvY2lhdGVkQ29udHJvbElkKTtcbiAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAvLyBNdWx0aXBsZSBzZWxlY3Rpb24gLSBzaG93IHZhbHVlcyB3aXRoIGNvbW1hXG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlSWRzQXJyYXkgPVxuICAgICAgICAgICAgICAgIGZvdW5kLmZpbGxWYWx1ZUlkcyB8fCBmb3VuZC5maWxsdmFsdWVpZHMgfHwgZm91bmQuRmlsbFZhbHVlSWRzO1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZXNBcnJheSA9XG4gICAgICAgICAgICAgICAgZm91bmQuZmlsbFZhbHVlcyB8fCBmb3VuZC5maWxsdmFsdWVzIHx8IGZvdW5kLkZpbGxWYWx1ZXM7XG5cbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHZhbHVlSWRzQXJyYXkgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlSWRzQXJyYXkpICYmXG4gICAgICAgICAgICAgICAgdmFsdWVJZHNBcnJheS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZUlkID0gdGhpcy5nZXRDdXJyZW50TGFuZ3VhZ2VJZCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZUlkIG9mIHZhbHVlSWRzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG51bWVyaWNWYWx1ZUlkID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlSWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludCh2YWx1ZUlkLCAxMClcbiAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlSWQ7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRpY3RdIG9mIHRoaXMuZGljdGlvbmFyeU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkaWN0LnZhbHVlcz8uZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAodikgPT4gdi5pZCA9PT0gbnVtZXJpY1ZhbHVlSWRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB2YWx1ZS52YWx1ZVRyYW5zbGF0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHQpID0+IHQubGFuZ3VhZ2VJZCA9PSBjdXJyZW50TGFuZ3VhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlcy5wdXNoKHRyYW5zbGF0aW9uPy52YWx1ZSB8fCB2YWx1ZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlzcGxheVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBmZy5kZWZhdWx0VmFsdWUgPSBkaXNwbGF5VmFsdWVzLmpvaW4oJywgJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHZhbHVlc0FycmF5ICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZXNBcnJheSkgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZXNBcnJheS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB1c2UgZmlsbFZhbHVlcyBhcnJheSBkaXJlY3RseVxuICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IHZhbHVlc0FycmF5LmpvaW4oJywgJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmQuZmlsbFZhbHVlSWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IHRoaXMuZ2V0Q3VycmVudExhbmd1YWdlSWQoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRpY3RdIG9mIHRoaXMuZGljdGlvbmFyeU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGljdC52YWx1ZXM/LmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICh2KSA9PiB2LmlkID09IGZvdW5kLmZpbGxWYWx1ZUlkXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdmFsdWUudmFsdWVUcmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAodCkgPT4gdC5sYW5ndWFnZUlkID09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IHRyYW5zbGF0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IGZvdW5kLmZpbGxWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgY29udHJvbElkc1dpdGhWYWx1ZXMgZm9yIGluaXRGbG93VmFsdWVzXG4gICAgICAgICAgICAgIGxldCBpbml0Rmxvd1ZhbHVlID1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xJZHNXaXRoVmFsdWVzPy5bYXNzb2NpYXRlZENvbnRyb2xJZF07XG4gICAgICAgICAgICAgIGlmIChpbml0Rmxvd1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgaW5pdEZsb3dWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgIGluaXRGbG93VmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgIGluaXRGbG93VmFsdWUuZmlsbFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGluaXRGbG93VmFsdWUgPSBpbml0Rmxvd1ZhbHVlLmZpbGxWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmcuZGVmYXVsdFZhbHVlID0gaW5pdEZsb3dWYWx1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmZpbmRJbkFwaUNhbGxzUmVzcG9uc2VzKGFzc29jaWF0ZWRDb250cm9sSWQpO1xuICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IHZhbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRQcmVzZW50YXRpb25Db250cm9sVmFsdWVzUmVjdXJzaXZlbHkoZmcpO1xuICAgICAgfVxuICAgICAgaWYgKGZnLnByb3BzWydjZHInXSkge1xuICAgICAgICBmZy5wcm9wc1snY2RyJ10uZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQ29udHJvbEluRmlsbERhdGFDb250cm9scyhjb250cm9sSWQ6IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IGNvbnRyb2xEYXRhOiBhbnkgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuZmlsbERhdGEpIHtcbiAgICAgIHRoaXMuZmlsbERhdGEuZmx1eD8uZm9yRWFjaCgoZjogYW55KSA9PiB7XG4gICAgICAgIGlmICghY29udHJvbERhdGEpIHtcbiAgICAgICAgICBmLnNlY3Rpb25zPy5mb3JFYWNoKChzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICghY29udHJvbERhdGEpIHtcbiAgICAgICAgICAgICAgY29udHJvbERhdGEgPSBzLmNvbnRyb2xzPy5maW5kKFxuICAgICAgICAgICAgICAgIChjOiBhbnkpID0+IGMuY29udHJvbElkID09PSBjb250cm9sSWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNvbnRyb2xEYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xEYXRhO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbERhdGE7XG4gIH1cblxuICBwcml2YXRlIGZpbmRJbkFwaUNhbGxzUmVzcG9uc2VzKGZpZWxkSWQ6IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IGZvdW5kVmFsdWU6IGFueSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5maWxsRGF0YSkge1xuICAgICAgdGhpcy5maWxsRGF0YS5BUElDYWxscz8uZm9yRWFjaCgoYXBpOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFmb3VuZFZhbHVlKSB7XG4gICAgICAgICAgYXBpLk1ldGhvZHM/LmZvckVhY2goKG06IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFmb3VuZFZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gbS5GaWVsZHM/LltmaWVsZElkXTtcbiAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgZm91bmRWYWx1ZSA9IGZvdW5kO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZm91bmRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9ybWx5RmlsdGVyZWRTdGVwcygpIHtcbiAgICBsZXQgc3RlcHMgPSB0aGlzLmZvcm1seUFsbFN0ZXBzLmZpbHRlcigocykgPT4ge1xuICAgICAgaWYgKHMucHJvcHMgJiYgcy5wcm9wc1snZGVwZW5kZW50RGljdGlvbmFyeSddKSB7XG4gICAgICAgIGNvbnN0IGRlcERpY3QgPSBzLnByb3BzW1xuICAgICAgICAgICdkZXBlbmRlbnREaWN0aW9uYXJ5J1xuICAgICAgICBdIGFzIERlcGVuZGVudERpY3Rpb25hcnlEYXRhO1xuICAgICAgICBpZiAoZGVwRGljdCAmJiBkZXBEaWN0LmlzRGljdGlvbmFyeURlcGVuZGVudCkge1xuICAgICAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB0aGlzLm1vZGVsW2RlcERpY3QuZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyXTtcbiAgICAgICAgICAvLyBTa2lwIGRlcGVuZGVuY3kgY2hlY2sgZm9yIG11bHRpcGxlIHNlbGVjdGlvbiAoYXJyYXkpXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gbW9kZWxWYWx1ZT8uaWQ7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZSAmJlxuICAgICAgICAgICAgZGVwRGljdC5kZXBlbmRlbnRWYWx1ZUlkcy5pbmNsdWRlcyhzZWxlY3RlZFZhbHVlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RlcHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkRm9ybWx5RmllbGRHcm91cEFzeW5jKCk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWdbXT4ge1xuICAgIHRoaXMuc3RlcERpY3Rpb25hcnlEZXBlbmRlbnRJZHMgPSBbXTtcbiAgICBpZiAodGhpcy5zaG93RGlzcGxheU1vZGUpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBhd2FpdCB0aGlzLmJ1aWREaXNwbGF5U3RlcCgpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbc3RlcF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaWx0ZXIgb3V0IGFjdGlvbiBzdGVwcyBmcm9tIHZpc2libGUgc3RlcHNcbiAgICAgIGNvbnN0IHZpc2libGVTdGVwcyA9IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZmlsdGVyVmlzaWJsZVN0ZXBzKHRoaXMuZmx1eCk7XG4gICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHZpc2libGVTdGVwcy5tYXAoKHN0ZXApID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZEZvcm1seUZpZWxkQ29uZmlnQXN5bmMoc3RlcCk7XG4gICAgICAgIH0pID8/IFtdXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRGb3JtbHlGaWVsZENvbmZpZ0FzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhXG4gICk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWc+IHtcbiAgICBsZXQgc3RlcEZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7fTtcblxuICAgIGlmIChzdGVwLnR5cGUgIT09IEZsdXhUeXBlLkN1c3RvbSAmJiBzdGVwLnR5cGUgIT09IEZsdXhUeXBlLkZpbmFsKSB7XG4gICAgICBzdGVwRm9ybWx5Q29uZmlnID0gYXdhaXQgdGhpcy5idWlsZFN5c3RlbUZpZWxkRm9ybWx5Q29uZmlnKHN0ZXApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGVwRm9ybWx5Q29uZmlnID0ge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGxhYmVsOiBzdGVwLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHN0ZXAubmFtZSxcbiAgICAgICAgICBidXR0b25zOiB0aGlzLmNvbnN0cnVjdEJ1dHRvbnMoc3RlcC5idXR0b25zKSxcbiAgICAgICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiBzdGVwLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgICAgc3RlcElkOiBzdGVwLmlkZW50aWZpZXJcbiAgICAgICAgfSxcbiAgICAgICAgZmllbGRHcm91cDogYXdhaXQgdGhpcy5idWlsZFNlY3Rpb25zRmllbGRHcm91cEFzeW5jKHN0ZXAsIHN0ZXAuc2VjdGlvbnMpXG4gICAgICB9O1xuXG4gICAgICBpZiAoc3RlcC50cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgc3RlcEZvcm1seUNvbmZpZy5wcm9wcyFbJ2xhYmVsJ10gPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgICBzdGVwRm9ybWx5Q29uZmlnLnByb3BzIVsnZGVzY3JpcHRpb24nXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGVwRm9ybWx5Q29uZmlnICYmIHN0ZXBGb3JtbHlDb25maWcucHJvcHMpIHtcbiAgICAgIHRoaXMuc2V0U3RlcEJhc2VQcm9wcyhzdGVwLCBzdGVwRm9ybWx5Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKHN0ZXAuZGVwZW5kZW50RGljdGlvbmFyeT8uaXNEaWN0aW9uYXJ5RGVwZW5kZW50KSB7XG4gICAgICB0aGlzLnN0ZXBEaWN0aW9uYXJ5RGVwZW5kZW50SWRzLnB1c2goXG4gICAgICAgIHN0ZXAuZGVwZW5kZW50RGljdGlvbmFyeS5kaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBzdGVwRm9ybWx5Q29uZmlnO1xuICB9XG5cbiAgdHJpZ2dlckNvbXBvbmVudFVwZGF0ZShjb250cm9sSWQ6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2V0Rm9ybWx5RmllbGRWYWx1ZSh0aGlzLmZvcm1seUFsbFN0ZXBzLCBjb250cm9sSWQsIHZhbHVlKTtcbiAgfVxuXG4gIHNldEZvcm1seUZpZWxkVmFsdWUoXG4gICAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWVsZHMpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgaWYgKGZpZWxkLmZvcm1Db250cm9sKSB7XG4gICAgICAgICAgZmllbGQuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZC5maWVsZEdyb3VwICYmIEFycmF5LmlzQXJyYXkoZmllbGQuZmllbGRHcm91cCkpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLnNldEZvcm1seUZpZWxkVmFsdWUoZmllbGQuZmllbGRHcm91cCwga2V5LCB2YWx1ZSk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFN5c3RlbUZpZWxkRm9ybWx5Q29uZmlnKFxuICAgIHN0ZXA6IFN0ZXBEYXRhXG4gICk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWc+IHtcbiAgICBjb25zdCBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAgcHJvcHM6IHtcbiAgICAgICAgbGFiZWw6IHN0ZXAubmFtZSxcbiAgICAgICAgYnV0dG9uczogdGhpcy5jb25zdHJ1Y3RCdXR0b25zKHN0ZXAuYnV0dG9ucyksXG4gICAgICAgIGZsdXhUeXBlOiBzdGVwLnR5cGVcbiAgICAgIH0sXG4gICAgICBmaWVsZEdyb3VwOiBbXVxuICAgIH07XG5cbiAgICB0aGlzLnNldFN0ZXBCYXNlUHJvcHMoc3RlcCwgZm9ybWx5Q29uZmlnKTtcbiAgICB2YXIgZmllbGRDb25maWcgPSB0aGlzLmNyZWF0ZUZvcm1seVN5c3RlbUZpZWxkQ29uZmlnKHN0ZXApO1xuXG4gICAgaWYgKGZpZWxkQ29uZmlnKSB7XG4gICAgICBpZiAoc3RlcC50cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgbGV0IGxhYmVsczogYW55ID0ge307XG4gICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLmZvckVhY2goKHRyOiBUcmFuc2xhdGlvbkluZm8pID0+IHtcbiAgICAgICAgICBsYWJlbHNbdHIubmFtZV0gPSBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICB0ci52YWx1ZXMsXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICBmaWVsZENvbmZpZy5wcm9wcyFbJ2xhYmVscyddID0gbGFiZWxzO1xuICAgICAgICBmaWVsZENvbmZpZy5wcm9wcyFbJ25hbWUnXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ25hbWUnLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICAgIGZpZWxkQ29uZmlnLnByb3BzIVsnZGVzY3JpcHRpb24nXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhWydsYWJlbCddID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uSW5mbyhcbiAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnZGVzY3JpcHRpb24nXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZmllbGRDb25maWcucHJvcHMhWydzdGVwc1NldHRpbmdzJ10gPSB0aGlzLnN0ZXBzU2V0dGluZ3M7XG4gICAgICBmb3JtbHlDb25maWcuZmllbGRHcm91cCEucHVzaChmaWVsZENvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RlcEJhc2VQcm9wcyhzdGVwOiBTdGVwRGF0YSwgZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZykge1xuICAgIGlmIChmb3JtbHlDb25maWcucHJvcHMpIHtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snbmFtZSddID0gc3RlcC5uYW1lO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzWydmbHV4VHlwZSddID0gc3RlcC50eXBlO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzWydzdGVwSWQnXSA9IHN0ZXAuaWRlbnRpZmllcjtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snaXNWaXNpYmxlJ10gPSBzdGVwLmlzVmlzaWJsZTtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snZGVwZW5kZW50RGljdGlvbmFyeSddID0gc3RlcC5kZXBlbmRlbnREaWN0aW9uYXJ5O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlU2lnbkZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXNpZ24tY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGZsdXg6IHRoaXMuZmx1eCxcbiAgICAgICAgcGFyZW50Rm9ybTogdGhpcy5mb3JtLFxuICAgICAgICBnZXRNb2RlbDogKCkgPT4gdGhpcy5tb2RlbCxcbiAgICAgICAgZXZlbnQ6IGFzeW5jIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50ID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RlcHBlckdvTmV4dEFzeW5jKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlRG93bmxvYWREb2NzRmllbGRDb25maWcoXG4gICAgY29udHJvbERhdGE6IEJhc2VDb250cm9sXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1kb3dubG9hZC1kb2N1bWVudHMtY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBjb250cm9sRGF0YTogY29udHJvbERhdGEsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGRvY3VtZW50c0RhdGE6IHRoaXMuYXBwTW9kZWwuZG9jdW1lbnRzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVZpZXdEb2NzRmllbGRDb25maWcoXG4gICAgY29udHJvbERhdGE6IEJhc2VDb250cm9sXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS12aWV3LWRvY3VtZW50cy1jb21wb25lbnQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGNvbnRyb2xEYXRhOiBjb250cm9sRGF0YSxcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgZG9jdW1lbnRzRGF0YTogdGhpcy5hcHBNb2RlbC5kb2N1bWVudHMsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlVXBsb2FkRG9jc0ZpZWxkQ29uZmlnKFxuICAgIGNvbnRyb2xEYXRhOiBCYXNlQ29udHJvbFxuICApOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktdXBsb2FkLWRvY3VtZW50cy1jb21wb25lbnQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGNvbnRyb2xEYXRhOiBjb250cm9sRGF0YSxcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgZG9jdW1lbnRzRGF0YTogdGhpcy5hcHBNb2RlbC5kb2N1bWVudHMsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlR2VuZXJhdGVEb2NzRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktZ2VuZXJhdGUtZG9jdW1lbnRzLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGRvY3VtZW50c0RhdGE6IHRoaXMuYXBwTW9kZWwuZG9jdW1lbnRzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgZXZlbnQ6IGFzeW5jIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50ID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RlcHBlckdvTmV4dEFzeW5jKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHN0ZXBwZXJHb05leHRBc3luYygpIHtcbiAgICBjb25zdCBzdGVwcGVyQ29tcG9uZW50ID0gdGhpcy5mb3JtbHlDb25maWdbMF0ucHJvcHMhWydjb21wb25lbnQnXTtcbiAgICBpZiAoc3RlcHBlckNvbXBvbmVudCAmJiBzdGVwcGVyQ29tcG9uZW50Lm5hdmlnYXRlTmV4dEFzeW5jKSB7XG4gICAgICBhd2FpdCBzdGVwcGVyQ29tcG9uZW50Lm5hdmlnYXRlTmV4dEFzeW5jKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVFbnJvbGxDYXJkRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgbGV0IGxhYmVsczogYW55ID0ge307XG4gICAgT2JqZWN0LmtleXMoc3RlcC5jb25maWcpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleS5lbmRzV2l0aCgnTGFiZWwnKSkge1xuICAgICAgICBsYWJlbHNba2V5XSA9XG4gICAgICAgICAgc3RlcD8uY29uZmlnW2tleV0/LmZpbmQoXG4gICAgICAgICAgICAoaTogeyBsYW5ndWFnZUlzbzogc3RyaW5nIH0pID0+XG4gICAgICAgICAgICAgIGkubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWUgPz8gJyc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktZW5yb2wtY2FyZC1jb21wb25lbnQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGRhdGFVcmxJZDogdGhpcy5kYXRhVXJsSWQsXG4gICAgICAgIHN0ZXBEYXRhOiBzdGVwLFxuICAgICAgICBsYWJlbHM6IGxhYmVscyxcbiAgICAgICAgbGFuZ0lzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHByaXZhdGUgQ3JlYXRlSWRTY2FuRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgbGV0IGVycm9yTWVzc2FnZXM6IGFueSA9IHt9O1xuXG4gICAgaWYgKHN0ZXAuZXJyb3JzVHJhbnNsYXRpb25zKSB7XG4gICAgICBzdGVwLmVycm9yc1RyYW5zbGF0aW9ucy5mb3JFYWNoKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGVycm9yTWVzc2FnZXNbZXJyb3IuY29kZV0gPSBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgZXJyb3IudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IHRyYW5zbGF0YWJsZSBsYWJlbHMgZnJvbSBjb25maWdcbiAgICBsZXQgbGFiZWxzOiBhbnkgPSB7fTtcbiAgICBpZiAoc3RlcC5jb25maWcpIHtcbiAgICAgIE9iamVjdC5rZXlzKHN0ZXAuY29uZmlnKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleS5lbmRzV2l0aCgnVHJhbnNsYXRpb25zJykgJiYgQXJyYXkuaXNBcnJheShzdGVwLmNvbmZpZ1trZXldKSkge1xuICAgICAgICAgIGNvbnN0IGxhYmVsS2V5ID0ga2V5LnJlcGxhY2UoJ1RyYW5zbGF0aW9ucycsICcnKTtcbiAgICAgICAgICBjb25zdCB0cmFuc2xhdGVkID0gc3RlcC5jb25maWdba2V5XT8uZmluZChcbiAgICAgICAgICAgIChpOiB7IGxhbmd1YWdlSXNvOiBzdHJpbmcgfSkgPT4gaS5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZTtcbiAgICAgICAgICBpZiAodHJhbnNsYXRlZCkge1xuICAgICAgICAgICAgbGFiZWxzW2xhYmVsS2V5XSA9IHRyYW5zbGF0ZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1zY2FuLWlkJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGNvbmZpZzogc3RlcC5jb25maWcsXG4gICAgICAgIHN0ZXBUeXBlOiBzdGVwLnR5cGUsXG4gICAgICAgIHN0ZXBJZDogc3RlcC5pZGVudGlmaWVyLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQgfHwgVXRpbHMuZ2VuZXJhdGVVVUlEKCksXG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgZXJyb3JNZXNzYWdlczogZXJyb3JNZXNzYWdlcyxcbiAgICAgICAgbGFiZWxzOiBsYWJlbHMsXG4gICAgICAgIGV2ZW50OiAoZXZlbnQ6IGFueSkgPT4gdGhpcy5vbklkU2NhbkNvbXBsZXRlZChldmVudCwgc3RlcClcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVLeWNGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBsb2FkaW5nTXNnVHJhbnNsYXRpb25zID0gc3RlcC50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAodDogYW55KSA9PiB0Lm5hbWUgPT09ICdsb2FkaW5nTWVzc2FnZVRyYW5zbGF0aW9ucydcbiAgICApO1xuXG4gICAgY29uc3QgdHJhbnNsYXRlZExvYWRpbmdNZXNzYWdlID1cbiAgICAgIGxvYWRpbmdNc2dUcmFuc2xhdGlvbnM/LnZhbHVlcz8uZmluZChcbiAgICAgICAgKHY6IGFueSkgPT4gdi5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICk/LnZhbHVlIHx8ICcnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktaWRlbnRpZmljYXRpb24tY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIHRva2VuOiB0aGlzLmt5Y1Rva2VuLFxuICAgICAgICBhcGlfdXJsOiB0aGlzLmt5Y0FwaVVybCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBlbnY6ICdET0NLRVInLCAvLyBDb25zaWRlciBtYWtpbmcgdGhpcyBkeW5hbWljIGlmIG5lZWRlZFxuICAgICAgICByZWRpcmVjdF9pZDogdGhpcy5reWNSZWRpcmVjdElkLFxuICAgICAgICBwaG9uZV9udW1iZXI6ICcnLFxuICAgICAgICBsYW5nX2lzbzogdGhpcy5reWNMYW5nSXNvLFxuICAgICAgICBzaG93X2NpdGl6ZW5zaGlwX3NlbGVjdG9yOiB0aGlzLmt5Y1Nob3dDaXRpemVuc2hpcCxcbiAgICAgICAgc2Nyb2xsX21vZGU6IHRoaXMua3ljU2Nyb2xsTW9kZSxcbiAgICAgICAgbWF4UmV0cmllczogc3RlcC5jb25maWc/Lm1heEt5Y1JldHJpZXMgPz8gMyxcbiAgICAgICAgbG9hZGluZ01lc3NhZ2U6IHRyYW5zbGF0ZWRMb2FkaW5nTWVzc2FnZSxcbiAgICAgICAgZWN0Q29tcGxldGVkOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9IHRyYW5zbGF0ZWRMb2FkaW5nTWVzc2FnZTtcbiAgICAgICAgICBhd2FpdCB0aGlzLm9yaWdpbkZvcm1TaWduYWxySGFuZGxlclNlcnZpY2UuaW5pdGlhdGVLeWNQcm9jZXNzaW5nKFxuICAgICAgICAgICAgdGhpcy5hcHBEYXRhVXVpZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVQaG9uZUVtYWlsRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktdmFsaWRhdGUtY29udGFjdC1pbmZvJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIHN0ZXBEYXRhOiBzdGVwLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgIGV2ZW50OiBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0ZXBwZXJHb05leHRBc3luYygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVZpZXdPZmZlckZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXZpZXctb2ZmZXJzJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGFwcE1vZGVsOiB0aGlzLmFwcE1vZGVsLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgZXZlbnQ6IChldmVudDogYW55KSA9PiB0aGlzLm9uT2ZmZXJTZWxlY3RlZChldmVudCwgc3RlcClcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVQYXVzZUZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LWZpZWxkLXBhdXNlJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGlkZW50aWZpZXI6IHN0ZXAuaWRlbnRpZmllcixcbiAgICAgICAgY29uZmlnOiBzdGVwLmNvbmZpZyxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgYXBwTW9kZWw6IHRoaXMuYXBwTW9kZWwsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlT3BlbkJhbmtpbmdGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICAvLyBQYXNzIHRoZSBmdWxsIHN0ZXAgZGF0YSB3aGljaCBpbmNsdWRlcyBhbGwgdHJhbnNsYXRpb25zXG4gICAgLy8gVGhlIGNvbXBvbmVudCB3aWxsIGV4dHJhY3Qgd2hhdCBpdCBuZWVkcyBiYXNlZCBvbiBjdXJyZW50IGxhbmd1YWdlXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktb3Blbi1iYW5raW5nJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGlkZW50aWZpZXI6IHN0ZXAuaWRlbnRpZmllcixcbiAgICAgICAgY29uZmlnOiBzdGVwLmNvbmZpZyxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCwgLy8gVGhpcyBjb250YWlucyB0aGUgZnVsbCB0cmFuc2xhdGlvbnMgYXJyYXlcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgYXBwTW9kZWw6IHRoaXMuYXBwTW9kZWwsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICBpbml0aWFsTWVzc2FnZTogVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgc3RlcC5jb25maWc/LmluaXRpYWxNZXNzYWdlVHJhbnNsYXRpb25zIHx8IFtdLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApLFxuICAgICAgICAgIHdhaXRpbmdNZXNzYWdlOiBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICBzdGVwLmNvbmZpZz8ud2FpdGluZ01lc3NhZ2VUcmFuc2xhdGlvbnMgfHwgW10sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICksXG4gICAgICAgICAgY29uc2VudEVycm9yTWVzc2FnZTogVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgc3RlcC5jb25maWc/LmNvbnNlbnRFcnJvck1lc3NhZ2VUcmFuc2xhdGlvbnMgfHwgW10sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICksXG4gICAgICAgICAgY29tcGxldGlvbk1lc3NhZ2U6IFV0aWxzLmZpbmRUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIHN0ZXAuY29uZmlnPy5jb21wbGV0aW9uTWVzc2FnZVRyYW5zbGF0aW9ucyB8fCBbXSxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKSxcbiAgICAgICAgICByZXRyeUJ1dHRvbkxhYmVsOiBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICBzdGVwLmNvbmZpZz8ucmV0cnlCdXR0b25MYWJlbFRyYW5zbGF0aW9ucyB8fCBbXSxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKVxuICAgICAgICB9LFxuICAgICAgICBldmVudDogKGV2ZW50OiBhbnkpID0+IHRoaXMub25PcGVuQmFua2luZ0V2ZW50KGV2ZW50LCBzdGVwKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVN0YXR1c0ZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXN0YXR1cycsXG4gICAgICBwcm9wczoge1xuICAgICAgICBjb25maWc6IHN0ZXAuY29uZmlnLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWRcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtbHlTeXN0ZW1GaWVsZENvbmZpZyhcbiAgICBzdGVwOiBTdGVwRGF0YVxuICApOiBGb3JtbHlGaWVsZENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoIChzdGVwLnR5cGUpIHtcbiAgICAgIGNhc2UgRmx1eFR5cGUuS3ljOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlS3ljRmllbGRDb25maWcoc3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZsdXhUeXBlLkVtYWlsOlxuICAgICAgY2FzZSBGbHV4VHlwZS5QaG9uZToge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVQaG9uZUVtYWlsRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLkFjdGlvbjoge1xuICAgICAgICAvLyBBY3Rpb24gc3RlcHMgYXJlIG5vdyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgQWN0aW9uU3RlcEhhbmRsZXJcbiAgICAgICAgLy8gVGhleSBzaG91bGQgbm90IGFwcGVhciBhcyB2aXNpYmxlIGZvcm1seSBjb21wb25lbnRzXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLklkU2Nhbjoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVJZFNjYW5GaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuR2VuZXJhdGVEb2N1bWVudDoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVHZW5lcmF0ZURvY3NGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuU2lnbjoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVTaWduRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLlZpZXdPZmZlcjoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVWaWV3T2ZmZXJGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuU3RhdHVzOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZVN0YXR1c0ZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5FVVBMQVRFU0M6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlRW5yb2xsQ2FyZEZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5ORVRPUElBOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZUVucm9sbENhcmRGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuUGF1c2U6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlUGF1c2VGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuT3BlbkJhbmtpbmc6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlT3BlbkJhbmtpbmdGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIG9uT2ZmZXJTZWxlY3RlZChvZmZlcklkOiBhbnksIHN0ZXA6IFN0ZXBEYXRhKSB7XG4gICAgdGhpcy5mb3JtbHlVcGRhdGVBbmRHb05leHQuZW1pdCh7IHNlbGVjdGVkT2ZmZXJJZDogb2ZmZXJJZCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25TaWduRXZlbnQoZXZlbnQ6IGFueSwgc3RlcDogU3RlcERhdGEpIHtcbiAgICBjb25zb2xlLmxvZygnU2lnbiBldmVudCByZWNlaXZlZDonLCBldmVudCk7XG4gICAgdGhpcy51cGRhdGVTdGVwQnV0dG9uU3RhdGUoc3RlcCk7XG4gIH1cblxuICBwcml2YXRlIG9uT3BlbkJhbmtpbmdFdmVudChldmVudDogYW55LCBzdGVwOiBTdGVwRGF0YSkge1xuICAgIGNvbnNvbGUubG9nKCdPcGVuQmFua2luZyBldmVudCByZWNlaXZlZDonLCBldmVudCk7XG4gICAgaWYgKGV2ZW50ID09PSAnc3VjY2VzcycpIHtcbiAgICAgIC8vIE9wZW4gQmFua2luZyBmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAgICAgIHRoaXMudXBkYXRlU3RlcEJ1dHRvblN0YXRlKHN0ZXApO1xuICAgICAgLy8gQXV0by1wcm9jZWVkIHRvIG5leHQgc3RlcFxuICAgICAgdGhpcy5mb3JtbHlVcGRhdGVBbmRHb05leHQuZW1pdCh7fSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbklkU2NhbkNvbXBsZXRlZChldmVudDogYW55LCBzdGVwOiBTdGVwRGF0YSkge1xuICAgIGNvbnNvbGUubG9nKCdTaWduIGV2ZW50IHJlY2VpdmVkOicsIGV2ZW50KTtcbiAgICBjb25zdCBmaWxsRGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZmlsbERhdGEpO1xuICAgIGNvbnN0IHN0ZXBGaWxsRGF0YSA9IGZpbGxEYXRhLmZsdXguZmluZChcbiAgICAgIChzOiB7IHN0ZXBJZDogc3RyaW5nIH0pID0+IHMuc3RlcElkID09IHN0ZXAuaWRlbnRpZmllclxuICAgICk7XG4gICAgc3RlcEZpbGxEYXRhLnNlY3Rpb25zLmZvckVhY2goXG4gICAgICAoczoge1xuICAgICAgICBjb250cm9sczoge1xuICAgICAgICAgIGNvbnRyb2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGZpbGxWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB9W107XG4gICAgICB9KSA9PiB7XG4gICAgICAgIHMuY29udHJvbHMuZm9yRWFjaChcbiAgICAgICAgICAoYzoge1xuICAgICAgICAgICAgY29udHJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBmaWxsVmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoYy5jb250cm9sSWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgW2MuY29udHJvbElkXToge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IGMuZmlsbFZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uY29udGFpbnMoYy5jb250cm9sSWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGMuY29udHJvbElkLCBuZXcgRm9ybUNvbnRyb2woYy5maWxsVmFsdWUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy51cGRhdGVTdGVwQnV0dG9uU3RhdGUoc3RlcCk7XG4gIH1cblxuICB1cGRhdGVTdGVwQnV0dG9uU3RhdGUoc3RlcDogU3RlcERhdGEpIHtcbiAgICBsZXQgZm9ybWx5U3RlcEZpZWxkID0gdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cD8uZmluZCgoZmllbGQpID0+XG4gICAgICBmaWVsZC5maWVsZEdyb3VwPy5maW5kKChmKSA9PiBmLnByb3BzPy5bJ3N0ZXBJZCddID09PSBzdGVwLmlkZW50aWZpZXIpXG4gICAgKTtcblxuICAgIGlmICghZm9ybWx5U3RlcEZpZWxkKSB7XG4gICAgICBmb3JtbHlTdGVwRmllbGQgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwPy5maW5kKFxuICAgICAgICAoZmllbGQpID0+IGZpZWxkLnByb3BzPy5bJ3N0ZXBJZCddID09PSBzdGVwLmlkZW50aWZpZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1seVN0ZXBGaWVsZCkge1xuICAgICAgZm9ybWx5U3RlcEZpZWxkLnByb3BzID0ge1xuICAgICAgICAuLi5mb3JtbHlTdGVwRmllbGQucHJvcHMsXG4gICAgICAgIGJ1dHRvbnNEaXNhYmxlZDogZmFsc2VcbiAgICAgIH07XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgdGhpcy5mb3JtbHlDb25maWdVcGRhdGVkLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFJlbmRlcmVkQ3NzKCkge1xuICAgIGNvbnN0IHN0eWxlU3RyaW5nID0gRm9ybUNzc0hlbHBlci5jb252ZXJ0VG9TdHlsZVN0cmluZyhcbiAgICAgIHRoaXMuZGVzaWduLFxuICAgICAgdGhpcy5zaG93RGlzcGxheU1vZGVcbiAgICApO1xuXG4gICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWxlbWVudC5pZCA9ICdyZW5kZXJlZC1jc3MnO1xuICAgIGNvbnN0IHJlbmRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZW5kZXJlZC1jc3MnKTtcbiAgICBpZiAocmVuZEVsKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmJvZHksIHJlbmRFbCk7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoXG4gICAgICBzdHlsZUVsZW1lbnQsXG4gICAgICB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoVXRpbHMucmVtb3ZlTmV3TGluZXMoc3R5bGVTdHJpbmcpKVxuICAgICk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCBzdHlsZUVsZW1lbnQpO1xuICB9XG5cbiAgYXN5bmMgYnVpbGRTZWN0aW9uc0ZpZWxkR3JvdXBBc3luYyhcbiAgICBzdGVwOiBTdGVwRGF0YSB8IHVuZGVmaW5lZCxcbiAgICBzZWN0aW9uczogU2VjdGlvbkRhdGFbXVxuICApOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnW10+IHtcbiAgICBjb25zdCBzdGVwU2VjdGlvbnM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgc2VjdGlvbnMgJiYgaW5kZXggPCBzZWN0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHNlY3Rpb24gPSBzZWN0aW9uc1tpbmRleF07XG4gICAgICBsZXQgc2VwYXJhdG9yRm9ybWx5Q29uZmlnOiBhbnkgPSB7fTtcbiAgICAgIGlmIChzZWN0aW9uLnNob3dTZWN0aW9uVGl0bGUpIHtcbiAgICAgICAgc2VwYXJhdG9yRm9ybWx5Q29uZmlnID0ge1xuICAgICAgICAgIHR5cGU6ICdzZXBhcmF0b3InLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICB0aXRsZTpcbiAgICAgICAgICAgICAgc2VjdGlvbi50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAgICAgKHQ6IGFueSkgPT4gdC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICAgICAgKT8udmFsdWUgPz8gJycsXG5cbiAgICAgICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ25cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWN0aW9uLnNob3dTZWN0aW9uU2VwYXJhdG9yKSB7XG4gICAgICAgIHNlcGFyYXRvckZvcm1seUNvbmZpZyA9IHtcbiAgICAgICAgICAuLi5zZXBhcmF0b3JGb3JtbHlDb25maWcsXG4gICAgICAgICAgdHlwZTogJ3NlcGFyYXRvcicsXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIC4uLnNlcGFyYXRvckZvcm1seUNvbmZpZy5wcm9wcyxcbiAgICAgICAgICAgIHNob3dTZXBhcmF0b3I6IHNlY3Rpb24uc2hvd1NlY3Rpb25TZXBhcmF0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnkpIHtcbiAgICAgICAgdGhpcy5hdHRhY2hUb0RlcGVuZGVudERpY3Rpb25hcnlJZk5lY2Vzc2FyeShcbiAgICAgICAgICBzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgICAgc2VwYXJhdG9yRm9ybWx5Q29uZmlnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdGVwU2VjdGlvbnMucHVzaChzZXBhcmF0b3JGb3JtbHlDb25maWcpO1xuXG4gICAgICBjb25zdCBzZWN0aW9uRm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZyA9IHtcbiAgICAgICAgdHlwZTogJ2N1c3RvbS1zZWN0aW9uJyxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBsYWJlbDogc2VjdGlvbi50aXRsZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIHNlY3Rpb24udHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgICAodDogYW55KSA9PiB0Lmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICAgKT8udmFsdWUgPz8gJycsXG4gICAgICAgICAgZGVzaWduOiB0aGlzLmRlc2lnblxuICAgICAgICB9LFxuICAgICAgICBmaWVsZEdyb3VwOiBhd2FpdCB0aGlzLmJ1aWxkQ29udHJvbHNGaWVsZEdyb3VwQXN5bmMoXG4gICAgICAgICAgc3RlcCxcbiAgICAgICAgICBzZWN0aW9uLmNvbnRyb2xzIHx8IFtdLFxuICAgICAgICAgIHNlY3Rpb24ucHJlc2VudGF0aW9uQ29udHJvbHMgfHwgW11cbiAgICAgICAgKSxcbiAgICAgICAgZmllbGRHcm91cENsYXNzTmFtZTogJ2Rpc3BsYXktZmxleCdcbiAgICAgIH07XG4gICAgICBpZiAoc2VjdGlvbi5kZXBlbmRlbnREaWN0aW9uYXJ5KSB7XG4gICAgICAgIHRoaXMuYXR0YWNoVG9EZXBlbmRlbnREaWN0aW9uYXJ5SWZOZWNlc3NhcnkoXG4gICAgICAgICAgc2VjdGlvbi5kZXBlbmRlbnREaWN0aW9uYXJ5LFxuICAgICAgICAgIHNlY3Rpb25Gb3JtbHlDb25maWdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgc3RlcFNlY3Rpb25zLnB1c2goc2VjdGlvbkZvcm1seUNvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0ZXBTZWN0aW9ucztcbiAgfVxuXG4gIGFzeW5jIGJ1aWREaXNwbGF5U3RlcCgpOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnPiB7XG4gICAgbGV0IHN0ZXBGb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnID0ge307XG4gICAgaWYgKHRoaXMuZGlzcGxheT8uc2VjdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHN0ZXBGb3JtbHlDb25maWcgPSB7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgLy8gbGFiZWw6IHN0ZXAubmFtZSxcbiAgICAgICAgICAvLyBidXR0b25zOiB0aGlzLmNvbnN0cnVjdEJ1dHRvbnMoc3RlcC5idXR0b25zKSxcbiAgICAgICAgICAvLyAgZGVwZW5kZW50RGljdGlvbmFyeTogc3RlcC5kZXBlbmRlbnREaWN0aW9uYXJ5LFxuICAgICAgICB9LFxuICAgICAgICBmaWVsZEdyb3VwOiBhd2FpdCB0aGlzLmJ1aWxkU2VjdGlvbnNGaWVsZEdyb3VwQXN5bmMoXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRoaXMuZGlzcGxheS5zZWN0aW9uc1xuICAgICAgICApXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gc3RlcEZvcm1seUNvbmZpZztcbiAgfVxuXG4gIGFkZE5ld1Jvd1RvRm9ybUZpZWxkc0lmTmVjZXNzYXJ5KFxuICAgIGZpZWxkR3JvdXA6IEZvcm1seUZpZWxkQ29uZmlnW10sXG4gICAgbmV3Um93OiBGb3JtbHlGaWVsZENvbmZpZ1xuICApIHtcbiAgICBpZiAobmV3Um93LmZpZWxkR3JvdXAgJiYgbmV3Um93LmZpZWxkR3JvdXAubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jYWxjdWxhdGVGb3JtRmllbGRzV2lkdGgobmV3Um93LmZpZWxkR3JvdXApO1xuICAgICAgZmllbGRHcm91cC5wdXNoKG5ld1Jvdyk7XG4gICAgfVxuICB9XG5cbiAgY2FsY3VsYXRlRm9ybUZpZWxkc1dpZHRoKGZvcm1GaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10pIHtcbiAgICBjb25zdCBjb2xXaWR0aFBlckl0ZW0gPSAxMiAvIGZvcm1GaWVsZHMubGVuZ3RoO1xuICAgIGZvcm1GaWVsZHMuZm9yRWFjaCgoZikgPT4ge1xuICAgICAgZi5jbGFzc05hbWUgPSAnY29sLScgKyBjb2xXaWR0aFBlckl0ZW07XG4gICAgfSk7XG4gIH1cblxuICBnZXRQZXJjZW50YWdlQ2xhc3NOYW1lKHBlcmNlbnRhZ2VEaW1lbnNpb246IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3QgdG90YWxDb2x1bW5zID0gMTI7IC8vIDEyLWNvbHVtbiBncmlkXG4gICAgY29uc3Qgc3BhbiA9IE1hdGgucm91bmQoKHBlcmNlbnRhZ2VEaW1lbnNpb24gLyAxMDApICogdG90YWxDb2x1bW5zKTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBgcGVyY2VudGFnZS13aWR0aC0ke3NwYW59YDtcblxuICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2xhc3NOYW1lKSkge1xuICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICBzdHlsZS5pZCA9IGNsYXNzTmFtZTtcbiAgICAgIHN0eWxlLmlubmVySFRNTCA9IGBcbiAgICAgICAgLiR7Y2xhc3NOYW1lfSB7XG4gICAgICAgICAgZ3JpZC1jb2x1bW46IHNwYW4gJHtzcGFufTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lO1xuICB9XG5cbiAgY3JlYXRlRmlsbGVyQ29udHJvbChzcGFuOiBudW1iZXIpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdyb3ctZmlsbGVyJyxcbiAgICAgIGNsYXNzTmFtZTogYHBlcmNlbnRhZ2Utd2lkdGgtJHtzcGFufWAsXG4gICAgICBwcm9wczoge1xuICAgICAgICBsYWJlbDogJycsXG4gICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICBoaWRlOiB0cnVlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRDb250cm9sc0ZpZWxkR3JvdXBBc3luYyhcbiAgICBzdGVwOiBTdGVwRGF0YSB8IHVuZGVmaW5lZCxcbiAgICBjb250cm9sczogQ29udHJvbERhdGFbXSxcbiAgICBwcmVzZW50YXRpb25Db250cm9sczogUHJlc2VudGF0aW9uQ29udHJvbFtdXG4gICk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWdbXT4ge1xuICAgIGNvbnN0IHJlc3VsdDogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICAgIGxldCByb3dJdGVtczogKENvbnRyb2xEYXRhIHwgUHJlc2VudGF0aW9uQ29udHJvbClbXSA9IFtdO1xuICAgIGNvbnRyb2xzID0gY29udHJvbHMuZmlsdGVyKChjKSA9PiAhYy5pc09ubHlGb3JDb25maWcpO1xuXG4gICAgLy8gRmlsdGVyIG91dCBjb250cm9scyB0aGF0IGFyZSBpbmNvbXBsZXRlXG4gICAgY29udHJvbHMgPSBjb250cm9scy5maWx0ZXIoKGMpID0+IHtcbiAgICAgIC8vIFNraXAgY29udHJvbHMgdGhhdCBhcmUgbWlzc2luZyBlc3NlbnRpYWwgZGF0YVxuICAgICAgaWYgKFxuICAgICAgICBjLnR5cGUgPT09IFN0ZXBDb250cm9sVHlwZS5EaWN0aW9uYXJ5ICYmXG4gICAgICAgICFjLnNwZWNpZmljQ29udHJvbERhdGE/LmRpY3Rpb25hcnlVVUlEXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvY2Vzc1JvdyA9IGFzeW5jIChpdGVtczogKENvbnRyb2xEYXRhIHwgUHJlc2VudGF0aW9uQ29udHJvbClbXSkgPT4ge1xuICAgICAgY29uc3QgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gICAgICBjb25zdCB0b3RhbCA9IDEyO1xuICAgICAgY29uc3QgYnVpbHQ6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgICAgIGNvbnN0IGF1dG86IHtcbiAgICAgICAgYzogQ29udHJvbERhdGEgfCBQcmVzZW50YXRpb25Db250cm9sO1xuICAgICAgICBmOiBGb3JtbHlGaWVsZENvbmZpZztcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgbGV0IHVzZWQgPSAwO1xuICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmICgnY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyJyBpbiBpID09PSB0cnVlKSB7XG4gICAgICAgICAgYnVpbHQucHVzaChcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRQcmVzZW50YXRpb25Gb3JtRmllbGRBc3luYyhcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgaSBhcyBQcmVzZW50YXRpb25Db250cm9sXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICgnYXBpTWV0aG9kSWQnIGluIGkgPT09IHRydWUpIHtcbiAgICAgICAgICBidWlsdC5wdXNoKFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5idWlsZEFwaU1ldGhvZEZvcm1GaWVsZEFzeW5jKFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICBpIGFzIFByZXNlbnRhdGlvbkNvbnRyb2xcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1aWx0LnB1c2goYXdhaXQgdGhpcy5idWlsZEZvcm1GaWVsZEFzeW5jKHN0ZXAsIGkgYXMgQ29udHJvbERhdGEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjID0gaXRlbXNbaV07XG4gICAgICAgIGNvbnN0IGYgPSBidWlsdFtpXTtcbiAgICAgICAgaWYgKGMuZGltZW5zaW9uVHlwZSA9PT0gRGltZW5zaW9uVHlwZS5QZXJjZW50YWdlKSB7XG4gICAgICAgICAgaWYgKGMuYXV0b0RpbWVuc2lvbikge1xuICAgICAgICAgICAgYXV0by5wdXNoKHsgYywgZiB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcyA9IE1hdGgucm91bmQoKGMuZGltZW5zaW9uIC8gMTAwKSAqIHRvdGFsKTtcbiAgICAgICAgICAgIHVzZWQgKz0gcztcbiAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2VDbGFzcyA9IHRoaXMuZ2V0UGVyY2VudGFnZUNsYXNzTmFtZShjLmRpbWVuc2lvbik7XG4gICAgICAgICAgICBmLmNsYXNzTmFtZSA9IGAke2YuY2xhc3NOYW1lfSAke3BlcmNlbnRhZ2VDbGFzc31gO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChjLmRpbWVuc2lvblR5cGUgPT09IERpbWVuc2lvblR5cGUuUGl4ZWxzKSB7XG4gICAgICAgICAgY29uc3QgcyA9IE1hdGgucm91bmQoKGMuZGltZW5zaW9uIC8gd2luZG93LmlubmVyV2lkdGgpICogdG90YWwpO1xuICAgICAgICAgIHVzZWQgKz0gcztcbiAgICAgICAgICBjb25zdCBwZXJjZW50YWdlQ2xhc3MgPSB0aGlzLmdldFBlcmNlbnRhZ2VDbGFzc05hbWUoXG4gICAgICAgICAgICAocyAvIHRvdGFsKSAqIDEwMFxuICAgICAgICAgICk7XG4gICAgICAgICAgZi5jbGFzc05hbWUgPSBgJHtmLmNsYXNzTmFtZX0gJHtwZXJjZW50YWdlQ2xhc3N9YDtcbiAgICAgICAgfSBlbHNlIGlmIChjLmF1dG9EaW1lbnNpb24pIHtcbiAgICAgICAgICBhdXRvLnB1c2goeyBjLCBmIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVzZWQgKz0gMTtcbiAgICAgICAgICBjb25zdCBwZXJjZW50YWdlQ2xhc3MgPSB0aGlzLmdldFBlcmNlbnRhZ2VDbGFzc05hbWUoXG4gICAgICAgICAgICAoMSAvIHRvdGFsKSAqIDEwMFxuICAgICAgICAgICk7XG4gICAgICAgICAgZi5jbGFzc05hbWUgPSBgJHtmLmNsYXNzTmFtZX0gJHtwZXJjZW50YWdlQ2xhc3N9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcmVtID0gdG90YWwgLSB1c2VkO1xuICAgICAgaWYgKGF1dG8ubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBzaGFyZSA9IE1hdGgubWF4KE1hdGguZmxvb3IocmVtIC8gYXV0by5sZW5ndGgpLCAxKTtcbiAgICAgICAgZm9yIChjb25zdCBhIG9mIGF1dG8pIHtcbiAgICAgICAgICBjb25zdCBwZXJjZW50YWdlQ2xhc3MgPSB0aGlzLmdldFBlcmNlbnRhZ2VDbGFzc05hbWUoXG4gICAgICAgICAgICAoc2hhcmUgLyB0b3RhbCkgKiAxMDBcbiAgICAgICAgICApO1xuICAgICAgICAgIGEuZi5jbGFzc05hbWUgPSBgJHthLmYuY2xhc3NOYW1lfSAke3BlcmNlbnRhZ2VDbGFzc31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmaWVsZHMucHVzaCguLi5idWlsdCk7XG4gICAgICByZXR1cm4gZmllbGRzO1xuICAgIH07XG4gICAgZm9yIChjb25zdCBjIG9mIFsuLi5jb250cm9scywgLi4ucHJlc2VudGF0aW9uQ29udHJvbHNdKSB7XG4gICAgICBpZiAoXG4gICAgICAgICgndHlwZScgaW4gYyAmJiBjLnR5cGUgPT09IFN0ZXBDb250cm9sVHlwZS5OZXdSb3cpIHx8XG4gICAgICAgIGMudHlwZSA9PSBQcmVzZW50YXRpb25Db250cm9sVHlwZS5OZXdSb3dcbiAgICAgICkge1xuICAgICAgICBpZiAocm93SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLihhd2FpdCBwcm9jZXNzUm93KHJvd0l0ZW1zKSkpO1xuICAgICAgICAgIHJvd0l0ZW1zID0gW107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvd0l0ZW1zLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyb3dJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQucHVzaCguLi4oYXdhaXQgcHJvY2Vzc1Jvdyhyb3dJdGVtcykpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGdldFBpeGVsQ2xhc3NOYW1lKHBpeGVsRGltZW5zaW9uOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGBwaXhlbC13aWR0aC0ke3BpeGVsRGltZW5zaW9ufWA7XG4gICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjbGFzc05hbWUpKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgIHN0eWxlLmlkID0gY2xhc3NOYW1lO1xuICAgICAgc3R5bGUuaW5uZXJIVE1MID0gYFxuICAgICAgICAuJHtjbGFzc05hbWV9IHtcbiAgICAgICAgICB3aWR0aDogJHtwaXhlbERpbWVuc2lvbn1weDtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICAgIH1cbiAgICByZXR1cm4gY2xhc3NOYW1lO1xuICB9XG5cbiAgYXN5bmMgYnVpbGRGb3JtRmllbGRBc3luYyhcbiAgICBzdGVwOiBTdGVwRGF0YSB8IHVuZGVmaW5lZCxcbiAgICBjb250cm9sOiBDb250cm9sRGF0YVxuICApOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnPiB7XG4gICAgbGV0IGluaXRpYWxUeXBlID0gJ2lucHV0JzsgLy8gRGVmYXVsdCB0eXBlXG4gICAgbGV0IGNvbXBvbmVudFN0eWxlS2V5ID0gYC5jb21wb25lbnQtdGV4dC1maWVsZGA7IC8vIERlZmF1bHQgc3R5bGUgZm9yIHRleHQgaW5wdXRcbiAgICBjb25zdCBiYXNlU3R5bGUgPSB0aGlzLmRlc2lnbltgLmZvbnQtJHtpbml0aWFsVHlwZX1gXSB8fCB7fTtcbiAgICBjb25zdCBjb250cm9sU3R5bGVTdHJpbmcgPVxuICAgICAgdGhpcy5zdHlsZU9iamVjdFRvU3RyaW5nRXhjZXB0QmFja2dyb3VuZChiYXNlU3R5bGUpO1xuICAgIGxldCBwYXR0ZXJuID0gJyc7XG4gICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uYWxsb3dlZENoYXJhY3RlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhdHRlcm4gPSBuZXcgUmVnRXhwKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5hbGxvd2VkQ2hhcmFjdGVycylcbiAgICAgICAgICAuc291cmNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdpbmNvcnJlY3QgcmVnZXggcGF0dGVybicsIGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudHNUb0V4Y2x1ZGVGcm9tU3R5bGUgPSBbXG4gICAgICAnLmNvbXBvbmVudC10ZXh0LWZpZWxkJyxcbiAgICAgICcuY29tcG9uZW50LWNoZWNrYm94JyxcbiAgICAgICcuY29tcG9uZW50LXJhZGlvJyxcbiAgICAgICcuY29tcG9uZW50LWRhdGUnLFxuICAgICAgJy5jb21wb25lbnQtZGF0YSdcbiAgICBdO1xuICAgIGxldCBmb3JtbHlDb25maWcgPSB0aGlzLmdldERlZmF1bHRGb3JtbHlGaWVsZENvbmZpZyhcbiAgICAgIGNvbnRyb2wsXG4gICAgICBpbml0aWFsVHlwZSxcbiAgICAgIHBhdHRlcm4sXG4gICAgICBjb21wb25lbnRTdHlsZUtleSxcbiAgICAgIGNvbXBvbmVudHNUb0V4Y2x1ZGVGcm9tU3R5bGVcbiAgICApO1xuICAgIC8vY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLnR5cGUgPT09IDMgIGlzIGVtYWlsXG4gICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8udHlwZSA9PT0gMykge1xuICAgICAgdGhpcy5hZGRWYWxpZGF0b3JzKGZvcm1seUNvbmZpZywgY29udHJvbCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNBcGlWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLmFkZEFwaVZhbGlkYXRvcnMoZm9ybWx5Q29uZmlnLCBjb250cm9sKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbnRyb2wudHlwZSkge1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQ6IC8vIFRleHRcbiAgICAgICAgdmFyIHN1YlR5cGUgPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGFcbiAgICAgICAgICA/LnR5cGUgYXMgTWFudWFsSW5wdXRDb250cm9sVHlwZTtcbiAgICAgICAgc3dpdGNoIChzdWJUeXBlKSB7XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLk51bWVyaWM6XG4gICAgICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdudW1iZXInO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE1hbnVhbElucHV0Q29udHJvbFR5cGUuRW1haWw6XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHQ6XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlBob25lOlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnaW5wdXQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHRBcmVhOlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnaW5wdXQnO1xuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnYXV0b3NpemUnXSA9IGZhbHNlO1xuICAgICAgICAgICAgY29tcG9uZW50U3R5bGVLZXkgPSAnLmNvbXBvbmVudC10ZXh0LWZpZWxkJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgTWFudWFsSW5wdXRDb250cm9sVHlwZS5EYXRlVGltZTpcbiAgICAgICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2RhdGVwaWNrZXInO1xuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzID0ge1xuICAgICAgICAgICAgICByZWFkb25seTogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtZGF0ZSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnaW5wdXQnO1xuICAgICAgICAgICAgY29tcG9uZW50U3R5bGVLZXkgPSAnLmNvbXBvbmVudC10ZXh0LWZpZWxkJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuUGFyYWdyYXBoOiAvLyBQYXJhZ3JhcGhcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtdGV4dC1maWVsZCc7XG5cbiAgICAgICAgY29uc3QgdHJhbnNsYXRlZERlc2NyaXB0aW9uID1cbiAgICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmRlc2NyaXB0aW9uVHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgKGQ6IHsgbGFuZ3VhZ2VJc286IHN0cmluZyB9KSA9PlxuICAgICAgICAgICAgICBkLmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk/LnZhbHVlIHx8ICcnO1xuICAgICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gdHJhbnNsYXRlZERlc2NyaXB0aW9uO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuQ2hlY2tCb3g6IC8vIENoZWNrYm94XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1jaGVja2JveCc7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtY2hlY2tib3gnO1xuICAgICAgICB2YXIgY2hlY2tlZCA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uY2hlY2tlZCA/PyBmYWxzZTtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnY2hlY2tlZCddID0gY2hlY2tlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5EaWN0aW9uYXJ5OiAvLyBEaWN0aW9uYXJ5IChkcm9wZG93bilcbiAgICAgICAgY29tcG9uZW50U3R5bGVLZXkgPVxuICAgICAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5zaG93QXNSYWRpb0J1dHRvbnNMaXN0ID09PSB0cnVlXG4gICAgICAgICAgICA/ICcuY29tcG9uZW50LXJhZGlvJ1xuICAgICAgICAgICAgOiAnLmNvbXBvbmVudC1kYXRhJztcbiAgICAgICAgYXdhaXQgdGhpcy5jb25zdHJ1Y3REaWN0aW9uYXJ5KGNvbnRyb2wsIGZvcm1seUNvbmZpZyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuQnV0dG9uczpcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5GbHV4SW5mbzpcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5Eb3dubG9hZERvY3VtZW50czpcbiAgICAgICAgZm9ybWx5Q29uZmlnID0gdGhpcy5DcmVhdGVEb3dubG9hZERvY3NGaWVsZENvbmZpZyhjb250cm9sKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5WaWV3RG9jdW1lbnRzOlxuICAgICAgICBmb3JtbHlDb25maWcgPSB0aGlzLkNyZWF0ZVZpZXdEb2NzRmllbGRDb25maWcoY29udHJvbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuVXBsb2FkRG9jdW1lbnRzOlxuICAgICAgICBmb3JtbHlDb25maWcgPSB0aGlzLkNyZWF0ZVVwbG9hZERvY3NGaWVsZENvbmZpZyhjb250cm9sKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5OZXdSb3c6IC8vIE5ldyBSb3dcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdpbnB1dCc7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgfVxuICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSBjb21wb25lbnRTdHlsZUtleS5zdWJzdHJpbmcoMSk7XG5cbiAgICBpZiAoIWNvbXBvbmVudHNUb0V4Y2x1ZGVGcm9tU3R5bGUuZmluZCgoYykgPT4gYyA9PT0gY29tcG9uZW50U3R5bGVLZXkpKSB7XG4gICAgICBpZiAodGhpcy5kZXNpZ25bY29tcG9uZW50U3R5bGVLZXldKSB7XG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyEuYXR0cmlidXRlcyFbJ3N0eWxlJ10gKz1cbiAgICAgICAgICAnOycgK1xuICAgICAgICAgIHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoXG4gICAgICAgICAgICB0aGlzLmRlc2lnbltjb21wb25lbnRTdHlsZUtleV1cbiAgICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBsYWJlbCBzdHlsZXNcbiAgICAgIGNvbnN0IGxhYmVsU3R5bGVLZXkgPSBgJHtjb21wb25lbnRTdHlsZUtleX0tbGFiZWxgO1xuICAgICAgaWYgKHRoaXMuZGVzaWduW2xhYmVsU3R5bGVLZXldKSB7XG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyEuYXR0cmlidXRlcyFbJ3N0eWxlJ10gKz1cbiAgICAgICAgICAnOycgK1xuICAgICAgICAgIHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoXG4gICAgICAgICAgICB0aGlzLmRlc2lnbltjb21wb25lbnRTdHlsZUtleV1cbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29udHJvbC5kZXBlbmRlbnREaWN0aW9uYXJ5KSB7XG4gICAgICB0aGlzLmF0dGFjaFRvRGVwZW5kZW50RGljdGlvbmFyeUlmTmVjZXNzYXJ5KFxuICAgICAgICBjb250cm9sLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgIGZvcm1seUNvbmZpZ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgdHJhbnNsYXRlZFRpdGxlID0gY29udHJvbC50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAoZDogeyBsYW5ndWFnZUlzbzogc3RyaW5nIH0pID0+IGQubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgKT8udmFsdWU7XG4gICAgaWYgKCF0cmFuc2xhdGVkVGl0bGUpIHtcbiAgICAgIHRyYW5zbGF0ZWRUaXRsZSA9IGNvbnRyb2wudGl0bGU7XG4gICAgfVxuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2xhYmVsJ10gPSB0cmFuc2xhdGVkVGl0bGU7XG5cbiAgICB0aGlzLmZvcm1seUNvbGxlY3RpbmdGaWVsZHMucHVzaChmb3JtbHlDb25maWcpO1xuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIGFkZFZhbGlkYXRvcnMoZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZywgY29udHJvbDogQ29udHJvbERhdGEpIHtcbiAgICB2YXIgZW1haWxFcnJvckxhYmVsID0gdGhpcy5mbHV4Py5maW5kKFxuICAgICAgKGYpID0+IGY/LmNvbmZpZz8uY29tcG9uZW50Q29sbGVjdGVkID09PSBjb250cm9sPy5pZGVudGlmaWVyXG4gICAgKT8uY29uZmlnPy5lbWFpbEVycm9yTGFiZWw7XG4gICAgdmFyIGVtYWlsRXJyb3JMYWJlbFZhbHVlID0gJyc7XG4gICAgaWYgKGVtYWlsRXJyb3JMYWJlbCAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkoZW1haWxFcnJvckxhYmVsKSkge1xuICAgICAgZW1haWxFcnJvckxhYmVsVmFsdWUgPVxuICAgICAgICAoZW1haWxFcnJvckxhYmVsIGFzIExhYmVsSW5mb1tdKS5maW5kKFxuICAgICAgICAgIChsKSA9PiBsLmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApPy52YWx1ZSA/PyAnJztcbiAgICB9XG5cbiAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgIGVtYWlsVmFsaWQ6IHtcbiAgICAgICAgZXhwcmVzc2lvbjogKGNvbnQ6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29udC52YWx1ZTtcbiAgICAgICAgICBjb25zdCBlbWFpbFBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcXFwuW2EtekEtWl17Mix9JCdcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh2YWx1ZSAmJiAhZW1haWxQYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250LnNldEVycm9ycyh7IGludmFsaWRFbWFpbDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIG1lc3NhZ2U6IGVtYWlsRXJyb3JMYWJlbFZhbHVlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFkZEFwaVZhbGlkYXRvcnMoZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZywgY29udHJvbDogQ29udHJvbERhdGEpIHtcbiAgICBjb25zdCB0aHJvdWdoQXBpVmFsaWRhdGlvbiA9IFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgJ3Rocm91Z2hBcGlWYWxpZGF0aW9uJ1xuICAgICk7XG5cbiAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgIHZhbGlkYXRlVGhyb3VnaEFwaToge1xuICAgICAgICBleHByZXNzaW9uOiBhc3luYyAoY29udDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb250LnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYXBpVmFsaWRhdGlvbk1ldGhvZCA9XG4gICAgICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEuYXBpVmFsaWRhdGlvbk1ldGhvZDtcblxuICAgICAgICAgIGNvbnN0IGRhdGFSZXF1ZXN0OiBBcGlWYWxpZGF0ZVJlcXVlc3QgPSB7XG4gICAgICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgICAgICBhcGlNZXRob2RJZDogYXBpVmFsaWRhdGlvbk1ldGhvZCxcbiAgICAgICAgICAgIGNvbnRyb2xJZGVudGlmaWVyOiBjb250cm9sLmlkZW50aWZpZXJcbiAgICAgICAgICB9O1xuICAgICAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRob2RBcGkoZGF0YVJlcXVlc3QpO1xuXG4gICAgICAgICAgaWYgKHJlc3BvbnNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29udC5zZXRFcnJvcnMoeyB2YWxpZGF0ZVRocm91Z2hBcGk6IHRydWUgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgbWVzc2FnZTogdGhyb3VnaEFwaVZhbGlkYXRpb25cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGZvcm1seUNvbmZpZy52YWxpZGF0aW9uKSB7XG4gICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24ubWVzc2FnZXMsXG4gICAgICAgIHZhbGlkYXRlVGhyb3VnaEFwaTogdGhyb3VnaEFwaVZhbGlkYXRpb25cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZ2V0RGVmYXVsdEZvcm1seUZpZWxkQ29uZmlnKFxuICAgIGNvbnRyb2w6IENvbnRyb2xEYXRhLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBwYXR0ZXJuOiBzdHJpbmcsXG4gICAgY29tcG9uZW50U3R5bGVLZXk6IHN0cmluZyxcbiAgICBjb21wb25lbnRzVG9FeGNsdWRlRnJvbVN0eWxlOiBzdHJpbmdbXVxuICApOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgY29uc3QgY3VycmVudExhbmd1YWdlSWQgPSBVdGlscy5maW5kTGFuZ3VhZ2VJZEJ5SXNvKFxuICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICk7XG5cbiAgICBsZXQgZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZyA9IHtcbiAgICAgIGtleTogY29udHJvbC5pZGVudGlmaWVyIHx8IGNvbnRyb2wudGl0bGUsXG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgY3VycmVudExhbmd1YWdlSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgY3VycmVudExhbmd1YWdlSWQ6IGN1cnJlbnRMYW5ndWFnZUlkLFxuICAgICAgICBsYWJlbDpcbiAgICAgICAgICBjb250cm9sLnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgICh0OiB7IGxhbmd1YWdlSXNvOiBzdHJpbmcgfSkgPT5cbiAgICAgICAgICAgICAgdC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZSB8fCAnJyxcblxuICAgICAgICB0aXRsZTpcbiAgICAgICAgICBjb250cm9sLnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgICh0OiB7IGxhbmd1YWdlSXNvOiBzdHJpbmcgfSkgPT5cbiAgICAgICAgICAgICAgdC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZSB8fCAnJyxcbiAgICAgICAgZGVzaWduOiB0aGlzLmRlc2lnbixcbiAgICAgICAgcmVxdWlyZWQ6IGNvbnRyb2wuaXNNYW5kYXRvcnksXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBzdHlsZTogY29tcG9uZW50c1RvRXhjbHVkZUZyb21TdHlsZS5maW5kKFxuICAgICAgICAgICAgKGMpID0+IGMgPT09IGNvbXBvbmVudFN0eWxlS2V5XG4gICAgICAgICAgKVxuICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgOiBjb21wb25lbnRTdHlsZUtleVxuICAgICAgICB9LFxuICAgICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgICAgb3B0aW9uczogW3t9XSxcbiAgICAgICAgZmllbGRHcm91cDogW10sXG4gICAgICAgIGF1dG9EaW1lbnNpb246IGNvbnRyb2wuYXV0b0RpbWVuc2lvblxuICAgICAgfSxcbiAgICAgIGV4cHJlc3Npb25zOiB7fSxcbiAgICAgIGhvb2tzOiB7fSxcbiAgICAgIHZhbGlkYXRvcnM6IHt9XG4gICAgfTtcbiAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbiA9IHt9O1xuXG4gICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnkgJiYgZm9ybWx5Q29uZmlnLnByb3BzKSB7XG4gICAgICB2YXIgcmVxdWlyZWRNZXNzYWdlID0gVXRpbHMuZmluZEVycm9yVHJhbnNsYXRpb25WYWx1ZU9yRGVmYXVsdChcbiAgICAgICAgY29udHJvbC5lcnJvcnNUcmFuc2xhdGlvbnMsXG4gICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAnaXNNYW5kYXRvcnlWYWxpZGF0aW9uJ1xuICAgICAgKTtcblxuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLnJlcXVpcmVkID0gY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeTtcbiAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZE1lc3NhZ2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY29udHJvbC50eXBlID09PSBTdGVwQ29udHJvbFR5cGUuRGljdGlvbmFyeSAmJlxuICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeSAmJlxuICAgICAgY29udHJvbC5lcnJvcnNUcmFuc2xhdGlvbnMgJiZcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1xuICAgICkge1xuICAgICAgdmFyIHJlcXVpcmVkTWVzc2FnZSA9IFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgJ2lzTWFuZGF0b3J5J1xuICAgICAgKTtcblxuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLnJlcXVpcmVkID0gY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeTtcbiAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgIHJlcXVpcmVkOiByZXF1aXJlZE1lc3NhZ2VcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNTaW1wbGVWYWxpZGF0aW9uICYmIGZvcm1seUNvbmZpZy5wcm9wcykge1xuICAgICAgaWYgKFxuICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzU2ltcGxlVmFsaWRhdGlvbiAmJlxuICAgICAgICBmb3JtbHlDb25maWcucHJvcHNcbiAgICAgICkge1xuICAgICAgICBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9IFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgICAgY29udHJvbC5lcnJvcnNUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICAgJ3NpbXBsZVZhbGlkYXRpb24nXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8ubWluVmFsdWU/LnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICBmb3JtbHlDb25maWcucHJvcHMubWluID0gY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLm1pblZhbHVlO1xuICAgICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24/Lm1lc3NhZ2VzLFxuICAgICAgICAgICAgbWluOiBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5tYXhWYWx1ZT8udG9TdHJpbmcoKSkge1xuICAgICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcy5tYXggPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEubWF4VmFsdWU7XG4gICAgICAgICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24ubWVzc2FnZXMgPSB7XG4gICAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgICAgICBtYXg6IHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwYXR0ZXJuIHZhbGlkYXRpb24gaWYgYWxsb3dlZENoYXJhY3RlcnMgaXMgZGVmaW5lZFxuICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uYWxsb3dlZENoYXJhY3RlcnMpIHtcbiAgICAgICAgc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPSBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9XG4gICAgICAgICAgVXRpbHMuZmluZEVycm9yVHJhbnNsYXRpb25WYWx1ZU9yRGVmYXVsdChcbiAgICAgICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICAgICAnc2ltcGxlVmFsaWRhdGlvbidcbiAgICAgICAgICApO1xuXG4gICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0b3JzID0ge1xuICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0b3JzLFxuICAgICAgICAgIGN1c3RvbVBhdHRlcm46IHtcbiAgICAgICAgICAgIGV4cHJlc3Npb246IChjOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFjLnZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2V4LnRlc3QoYy52YWx1ZSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlIHx8XG4gICAgICAgICAgICAgICdWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcmVxdWlyZWQgcGF0dGVybidcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24ubWVzc2FnZXMgPSB7XG4gICAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24/Lm1lc3NhZ2VzLFxuICAgICAgICAgIHBhdHRlcm46IHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IG1heExlbmd0aCB2YWxpZGF0aW9uIGlmIG1heENoYXJhY3RlcnMgaXMgZGVmaW5lZFxuICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8ubWF4Q2hhcmFjdGVycykge1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMubWF4TGVuZ3RoID1cbiAgICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/Lm1heENoYXJhY3RlcnM7XG4gICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgICBtYXhMZW5ndGg6IHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uYWxsb3dPbmx5RnV0dXJlIHx8XG4gICAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uYWxsb3dPbmx5UGFzdFxuICAgICAgKSB7XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2RhdGVwaWNrZXInO1xuICAgICAgICBjb25zdCBjaGVja0RhdGVWYWxpZGF0aW9uID0ge1xuICAgICAgICAgIGNoZWNrRGF0ZToge1xuICAgICAgICAgICAgZXhwcmVzc2lvbjogKGM6IEFic3RyYWN0Q29udHJvbCwgZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlID1cbiAgICAgICAgICAgICAgICBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICAgICAgICAgICAgY29udHJvbC5lcnJvcnNUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgICAgICAgICAgICdzaW1wbGVWYWxpZGF0aW9uJ1xuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcblxuICAgICAgICAgICAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5hbGxvd09ubHlGdXR1cmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWMudmFsdWUgfHwgYy52YWx1ZSA9PT0gJycpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjLnZhbHVlID4gY3VycmVudERhdGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uYWxsb3dPbmx5UGFzdCkge1xuICAgICAgICAgICAgICAgIGlmICghYy52YWx1ZSB8fCBjLnZhbHVlID09PSAnJykgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGMudmFsdWUgPCBjdXJyZW50RGF0ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXNzYWdlOiAoZXJyb3I6IGFueSwgZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0b3JzID0ge1xuICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0b3JzLFxuICAgICAgICAgIC4uLmNoZWNrRGF0ZVZhbGlkYXRpb25cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL2NvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS50eXBlID09PSA0ICBpcyBwaG9uZVxuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LnR5cGUgPT09IDQpIHtcbiAgICAgIHZhciBwaG9uZUVycm9yTGFiZWwgPSB0aGlzLmZsdXg/LmZpbmQoXG4gICAgICAgIChmKSA9PiBmPy5jb25maWc/LmNvbXBvbmVudENvbGxlY3RlZCA9PT0gY29udHJvbD8uaWRlbnRpZmllclxuICAgICAgKT8uY29uZmlnPy5waG9uZUVycm9yTGFiZWw7XG4gICAgICB2YXIgcGhvbmVFcnJvckxhYmVsVmFsdWUgPSAnJztcbiAgICAgIGlmIChwaG9uZUVycm9yTGFiZWwgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHBob25lRXJyb3JMYWJlbCkpIHtcbiAgICAgICAgcGhvbmVFcnJvckxhYmVsVmFsdWUgPVxuICAgICAgICAgIChwaG9uZUVycm9yTGFiZWwgYXMgTGFiZWxJbmZvW10pLmZpbmQoXG4gICAgICAgICAgICAobCkgPT4gbC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZSA/PyAnJztcbiAgICAgIH1cblxuICAgICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRvcnMgPSB7XG4gICAgICAgIHBob25lVmFsaWQ6IHtcbiAgICAgICAgICBleHByZXNzaW9uOiAoY29udDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnQudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBwaG9uZVBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAnXihcXFxcKzR8KT8oMDdbMC04XXsxfVswLTldezF9fDAyWzAtOV17Mn18MDNbMC05XXsyfSl7MX0/KFxcXFxzfFxcXFwufC0pPyhbMC05XXszfShcXFxcc3xcXFxcLnwtfCkpezJ9JCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgIXBob25lUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICBjb250LnNldEVycm9ycyh7IGludmFsaWRQaG9uZU51bWJlcjogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZXNzYWdlOiBwaG9uZUVycm9yTGFiZWxWYWx1ZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LnR5cGUgPT09IDIpIHtcbiAgICAgIGNvbnN0IGNoZWNrRGF0ZTJWYWxpZGF0aW9uID0ge1xuICAgICAgICBjaGVja0RhdGUyOiB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogKGM6IEFic3RyYWN0Q29udHJvbCwgZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnKSA9PiB7XG4gICAgICAgICAgICB2YXIgZGF0ZVZhbHVlID0gYy52YWx1ZTtcbiAgICAgICAgICAgIGlmICghZGF0ZVZhbHVlICYmIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnkpIHtcbiAgICAgICAgICAgICAgc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgIFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgICAgICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICAgICAgICAgJ2lzTWFuZGF0b3J5VmFsaWRhdGlvbidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGlzTmFOKERhdGUucGFyc2UoZGF0ZVZhbHVlKSkgJiZcbiAgICAgICAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc01hbmRhdG9yeVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVzc2FnZTogKGVycm9yOiBhbnksIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgaWYgKHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlID09PSAnJylcbiAgICAgICAgICAgICAgcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWxpZCBkYXRlJztcblxuICAgICAgICAgICAgcmV0dXJuIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0b3JzID0ge1xuICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdG9ycyxcbiAgICAgICAgLi4uY2hlY2tEYXRlMlZhbGlkYXRpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkUHJlc2VudGF0aW9uRm9ybUZpZWxkQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGEgfCB1bmRlZmluZWQsXG4gICAgY29udHJvbDogUHJlc2VudGF0aW9uQ29udHJvbFxuICApOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnPiB7XG4gICAgbGV0IGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7IHByb3BzOiB7fSB9O1xuXG4gICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgZm9ybWx5Q29uZmlnLmNsYXNzTmFtZSA9ICdjb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnZGVzaWduJ10gPSB0aGlzLmFwcE1vZGVsLmdlbmVyYXRlZENzcztcblxuICAgIHZhciB0cmFuc2xhdGVkVGl0bGUgPVxuICAgICAgY29udHJvbC50cmFuc2xhdGlvbnMuZmluZCgoZCkgPT4gZC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbylcbiAgICAgICAgPy52YWx1ZSA/P1xuICAgICAgY29udHJvbC50aXRsZSA/P1xuICAgICAgJyc7XG5cbiAgICBpZiAoY29udHJvbC50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLlBhcmFncmFwaCkge1xuICAgICAgY29uc3QgcGFyYWdyYXBoQ29udHJvbCA9IGNvbnRyb2wgYXMgUHJlc2VudGF0aW9uUGFyYWdyYXBoQ29udHJvbDtcblxuICAgICAgdmFyIHRyYW5zbGF0ZWREZXNjcmlwdGlvbiA9XG4gICAgICAgIHBhcmFncmFwaENvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5kZXNjcmlwdGlvblRyYW5zbGF0aW9ucy5maW5kKFxuICAgICAgICAgIChkOiBhbnkpID0+IGQubGFuZ3VhZ2VJc28gPT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKT8udmFsdWUgPz8gJyc7XG4gICAgICB2YXIgdHJhbnNsYXRlZFBhcmFncmFwaFRpdGxlID1cbiAgICAgICAgcGFyYWdyYXBoQ29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLnRleHQuZmluZChcbiAgICAgICAgICAoZDogYW55KSA9PiBkLmxhbmd1YWdlSXNvID09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk/LnZhbHVlID8/ICcnO1xuXG4gICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gdHJhbnNsYXRlZERlc2NyaXB0aW9uO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsndHJhbnNsYXRlZERlc2NyaXB0aW9uJ10gPSB0cmFuc2xhdGVkRGVzY3JpcHRpb247XG4gICAgICBmb3JtbHlDb25maWcucHJvcHMhWyd0cmFuc2xhdGVkUGFyYWdyYXBoVGl0bGUnXSA9XG4gICAgICAgIHRyYW5zbGF0ZWRQYXJhZ3JhcGhUaXRsZTtcbiAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1wYXJhZ3JhcGgnO1xuICAgICAgZm9ybWx5Q29uZmlnLmNsYXNzTmFtZSA9ICdjb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgfSBlbHNlIGlmIChjb250cm9sLnR5cGUgPT0gUHJlc2VudGF0aW9uQ29udHJvbFR5cGUuRG93bmxvYWQpIHtcbiAgICAgIGZvcm1seUNvbmZpZyA9IHRoaXMuQ3JlYXRlRG93bmxvYWREb2NzRmllbGRDb25maWcoY29udHJvbCk7XG4gICAgfSBlbHNlIGlmIChjb250cm9sLnR5cGUgPT0gUHJlc2VudGF0aW9uQ29udHJvbFR5cGUuVmlldykge1xuICAgICAgZm9ybWx5Q29uZmlnID0gdGhpcy5DcmVhdGVWaWV3RG9jc0ZpZWxkQ29uZmlnKGNvbnRyb2wpO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLlN0YXR1cykge1xuICAgICAgbGV0IHN0YXR1c05hbWUgPVxuICAgICAgICB0aGlzLmFwcE1vZGVsLnN0YXR1c2VzLmZpbmQoXG4gICAgICAgICAgKHMpID0+IHMuaWQgPT09IHRoaXMuZmlsbERhdGE/Lm1ldGFkYXRhLnN0YXR1c0lkXG4gICAgICAgICk/Lm5hbWUgfHwgJ25vIHN0YXR1cyBuYW1lJztcblxuICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IHN0YXR1c05hbWU7XG4gICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdmb3JtbHktcGFyYWdyYXBoJztcbiAgICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSAnY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRyb2wudHlwZSA9PSBQcmVzZW50YXRpb25Db250cm9sVHlwZS5GbHV4Q29tcG9uZW50ICYmXG4gICAgICAgIHRoaXMuY29udHJvbElkc1dpdGhWYWx1ZXMgJiZcbiAgICAgICAgY29udHJvbC5jb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXJcbiAgICAgICkge1xuICAgICAgICBjb25zdCBmaWxsVmFsdWUgPVxuICAgICAgICAgIHRoaXMuY29udHJvbElkc1dpdGhWYWx1ZXNbY29udHJvbC5jb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXJdO1xuXG4gICAgICAgIGlmIChmaWxsVmFsdWUpIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBmaWxsVmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gZmlsbFZhbHVlID8gJyZjaGVjazsnIDogJyZjcm9zczsnO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgICAgICAgIC8vIEVucmljaGVkIGluaGVyaXRlZCBkaWN0aW9uYXJ5IGZvcm1hdDogZXh0cmFjdCBmaWxsVmFsdWUgZm9yIGRpc3BsYXlcbiAgICAgICAgICAgICAgaWYgKGZpbGxWYWx1ZS5maWxsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSBmaWxsVmFsdWUuZmlsbFZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGxWYWx1ZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IGZpbGxWYWx1ZS5uYW1lO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSBKU09OLnN0cmluZ2lmeShmaWxsVmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IGZpbGxWYWx1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIHR5cGUgaXMgc2V0IGZvciBwcmVzZW50YXRpb24gY29udHJvbHNcbiAgICBpZiAoIWZvcm1seUNvbmZpZy50eXBlKSB7XG4gICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdmb3JtbHktcGFyYWdyYXBoJztcbiAgICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSAnY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIH1cblxuICAgIGZvcm1seUNvbmZpZy5pZCA9IGNvbnRyb2wuaWRlbnRpZmllcjtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydpc0Rpc3BsYXlNb2RlJ10gPSB0cnVlO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2NvbGxlY3Rpb25Db250cm9sSWRlbnRpZmllciddID1cbiAgICAgIGNvbnRyb2wuY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2xhYmVsJ10gPSB0cmFuc2xhdGVkVGl0bGU7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnbGFuZ0lzbyddID0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc287XG5cbiAgICB0aGlzLmZvcm1seVByZXNlbnRhdGlvbkZpZWxkcy5wdXNoKGZvcm1seUNvbmZpZyk7XG5cbiAgICByZXR1cm4gZm9ybWx5Q29uZmlnO1xuICB9XG5cbiAgYXN5bmMgYnVpbGRBcGlNZXRob2RGb3JtRmllbGRBc3luYyhcbiAgICBzdGVwOiBTdGVwRGF0YSB8IHVuZGVmaW5lZCxcbiAgICBjb250cm9sOiBQcmVzZW50YXRpb25Db250cm9sXG4gICk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWc+IHtcbiAgICBsZXQgZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZyA9IHsgcHJvcHM6IHt9IH07XG5cbiAgICBmb3JtbHlDb25maWcudHlwZSA9ICdmb3JtbHktcGFyYWdyYXBoJztcbiAgICBmb3JtbHlDb25maWcuY2xhc3NOYW1lID0gJ2NvbXBvbmVudC10ZXh0LWZpZWxkJztcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydkZXNpZ24nXSA9IHRoaXMuYXBwTW9kZWwuZ2VuZXJhdGVkQ3NzO1xuXG4gICAgdmFyIHRyYW5zbGF0ZWRUaXRsZSA9XG4gICAgICBjb250cm9sLnRyYW5zbGF0aW9ucy5maW5kKChkKSA9PiBkLmxhbmd1YWdlSXNvID09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvKVxuICAgICAgICA/LnZhbHVlID8/XG4gICAgICBjb250cm9sLnRpdGxlID8/XG4gICAgICAnJztcblxuICAgIGZvcm1seUNvbmZpZy5pZCA9IGNvbnRyb2wuaWRlbnRpZmllcjtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydpc0Rpc3BsYXlNb2RlJ10gPSB0cnVlO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2FwaU1ldGhvZElkJ10gPSBjb250cm9sLmFwaU1ldGhvZElkO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2FwaU1ldGhvZEZpZWxkSWQnXSA9IGNvbnRyb2wuYXBpTWV0aG9kRmllbGRJZDtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydsYWJlbCddID0gdHJhbnNsYXRlZFRpdGxlO1xuXG4gICAgaWYgKGNvbnRyb2wuYXBpTWV0aG9kRmllbGRJZCkge1xuICAgICAgY29uc3QgdmFsID0gdGhpcy5maW5kSW5BcGlDYWxsc1Jlc3BvbnNlcyhjb250cm9sLmFwaU1ldGhvZEZpZWxkSWQpO1xuICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IHZhbDtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1seVByZXNlbnRhdGlvbkZpZWxkcy5wdXNoKGZvcm1seUNvbmZpZyk7XG5cbiAgICByZXR1cm4gZm9ybWx5Q29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hUb0RlcGVuZGVudERpY3Rpb25hcnlJZk5lY2Vzc2FyeShcbiAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiBEZXBlbmRlbnREaWN0aW9uYXJ5RGF0YSxcbiAgICBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnXG4gICkge1xuICAgIC8vIEhhbmRsZSBkaWN0aW9uYXJ5IGRlcGVuZGVuY2llc1xuICAgIGlmIChcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnkgJiZcbiAgICAgIGRlcGVuZGVudERpY3Rpb25hcnkuZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyXG4gICAgKSB7XG4gICAgICBjb25zdCBwYXJlbnRLZXkgPSBkZXBlbmRlbnREaWN0aW9uYXJ5LmRpY3Rpb25hcnlDb250cm9sSWRlbnRpZmllcjtcbiAgICAgIGNvbnN0IGRlcGVuZGVudFZhbHVlSWRzID0gZGVwZW5kZW50RGljdGlvbmFyeS5kZXBlbmRlbnRWYWx1ZUlkcyB8fCBbXTtcblxuICAgICAgZm9ybWx5Q29uZmlnLmV4cHJlc3Npb25zID0ge1xuICAgICAgICBoaWRlOiAoZmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkU2hvdyA9IHRoaXMuc2hvdWxkU2hvd0RlcGVuZGVudEZpZWxkKFxuICAgICAgICAgICAgcGFyZW50S2V5LFxuICAgICAgICAgICAgZGVwZW5kZW50VmFsdWVJZHMsXG4gICAgICAgICAgICB0aGlzLm1vZGVsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gIXNob3VsZFNob3c7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hUb1ZhbHVlQ2hhbmdlcyhjb250cm9sSWQ6IHN0cmluZywgb3B0aW9uczogRm9ybWx5RmllbGRDb25maWcpIHtcbiAgICBvcHRpb25zLnByb3BzIVsnb25TZWxlY3RlZFZhbHVlQ2hhbmdlZCddID0gYXN5bmMgKHZhbDogYW55KSA9PiB7XG4gICAgICB0aGlzLm1vZGVsW2NvbnRyb2xJZF0gPSB2YWw7XG4gICAgICB2YXIgcmVmZXJlbmNlRGljdGlvbmFyaWVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgdGhpcy5kaWN0aW9uYXJ5TWFwLnZhbHVlcygpXG4gICAgICApLmZpbHRlcigoZCkgPT4gZC5yZWZlcmVuY2VJZCA9PSB2YWwuZGljdGlvbmFyeUlkKTtcbiAgICAgIGlmIChyZWZlcmVuY2VEaWN0aW9uYXJpZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yZW1vdmVSZWZlcmVuY2VGaWVsZHMob3B0aW9ucyk7XG5cbiAgICAgICAgdmFyIHJlZmVyZW5jZURpY3Rpb25hcmllc1dpdGhGaWx0ZXJlZFZhbHVlcyA9XG4gICAgICAgICAgdGhpcy5jcmVhdGVSZWZlcmVuY2VEaWN0aW9uYXJpZXNGcm9tU2VsZWN0ZWRWYWx1ZShcbiAgICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcmllcyxcbiAgICAgICAgICAgIHZhbFxuICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBhcmVudFNwZWNpZmljRGF0YSA9IG9wdGlvbnMucHJvcHM/LltcbiAgICAgICAgICAnc3BlY2lmaWNEYXRhJ1xuICAgICAgICBdIGFzIERpY3Rpb25hcnlDb250cm9sRGF0YTtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRSZWZlcmVuY2VEaWN0aW9uYXJ5RmllbGRzSWZOZWNlc3NhcnkoXG4gICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyaWVzV2l0aEZpbHRlcmVkVmFsdWVzLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgb3B0aW9ucy50eXBlLFxuICAgICAgICAgIHBhcmVudFNwZWNpZmljRGF0YT8ucmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9ucyB8fCBbXVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVSZWZlcmVuY2VGaWVsZHMob3B0aW9ucyk7XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgIH07XG4gIH1cblxuICBjcmVhdGVSZWZlcmVuY2VEaWN0aW9uYXJpZXNGcm9tU2VsZWN0ZWRWYWx1ZShcbiAgICBhbGxEaWN0aW9uYXJpZXM6IERpY3Rpb25hcnlEdG9bXSxcbiAgICBzZWxlY3RlZFZhbHVlOiBhbnlcbiAgKTogRGljdGlvbmFyeUR0b1tdIHtcbiAgICBjb25zdCBuZXdEaWN0aW9uYXJpZXM6IERpY3Rpb25hcnlEdG9bXSA9IFtdO1xuXG4gICAgYWxsRGljdGlvbmFyaWVzLmZvckVhY2goKGRpY3Rpb25hcnkpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkVmFsdWVzID1cbiAgICAgICAgZGljdGlvbmFyeS52YWx1ZXM/LmZpbHRlcigodmFsdWUpID0+XG4gICAgICAgICAgdmFsdWUucmVmZXJlbmNlVmFsdWVzLnNvbWUoXG4gICAgICAgICAgICAocmVmVmFsdWUpID0+IHJlZlZhbHVlLmlkID09PSBzZWxlY3RlZFZhbHVlLmlkXG4gICAgICAgICAgKVxuICAgICAgICApIHx8IFtdO1xuXG4gICAgICBpZiAoZmlsdGVyZWRWYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBuZXdEaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvID0ge1xuICAgICAgICAgIC4uLmRpY3Rpb25hcnksXG4gICAgICAgICAgdmFsdWVzOiBmaWx0ZXJlZFZhbHVlc1xuICAgICAgICB9O1xuXG4gICAgICAgIG5ld0RpY3Rpb25hcmllcy5wdXNoKG5ld0RpY3Rpb25hcnkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ld0RpY3Rpb25hcmllcztcbiAgfVxuXG4gIHNob3VsZFNob3dEZXBlbmRlbnRGaWVsZChcbiAgICBwYXJlbnRLZXk6IHN0cmluZyxcbiAgICBkZXBlbmRlbnRWYWx1ZUlkczogbnVtYmVyW10sXG4gICAgbW9kZWw6IGFueSA9IHt9XG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IGRpY3Rpb25hcnkgY29udHJvbFxuICAgIGNvbnN0IHBhcmVudFZhbHVlID0gdGhpcy5nZXROZXN0ZWRWYWx1ZShcbiAgICAgIG1vZGVsLFxuICAgICAgcGFyZW50S2V5XG4gICAgKSBhcyBEaWN0aW9uYXJ5VmFsdWU7XG5cbiAgICBjb25zdCBpZFZhbHVlID0gcGFyZW50VmFsdWU/LmlkXG4gICAgICA/IHBhcmVudFZhbHVlLmlkXG4gICAgICA6IChwYXJlbnRWYWx1ZSBhcyB1bmtub3duIGFzIG51bWJlcik7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHBhcmVudCB2YWx1ZSBpcyBpbiB0aGUgZGVwZW5kZW50VmFsdWVJZHNcbiAgICBpZiAocGFyZW50VmFsdWUgJiYgZGVwZW5kZW50VmFsdWVJZHMuaW5jbHVkZXMoaWRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXROZXN0ZWRWYWx1ZShvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdCgnLicpO1xuICAgIGxldCB2YWx1ZSA9IG9iajtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzdWJtaXQoKTogdm9pZCB7XG4gICAgY29uc29sZS5sb2coJ0Zvcm0gRGF0YTonLCB0aGlzLmZvcm0udmFsdWUpO1xuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgY29uc29sZS5sb2coJ0Zvcm0gZGF0YSBoYXMgdmFsaWRhdGlvbiBlcnJvcnMuJyk7XG4gICAgICB0aGlzLnNjcm9sbFRvRXJyb3JTZXJ2aWNlLnNjcm9sbFRvRmlyc3RFcnJvcih0aGlzLmZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgbWV0aG9kIHRvIHRyaWdnZXIgc2Nyb2xsIHRvIGZpcnN0IGVycm9yIC0gY2FuIGJlIGNhbGxlZCBmcm9tIG90aGVyIGNvbXBvbmVudHNcbiAgICovXG4gIHB1YmxpYyBzY3JvbGxUb0ZpcnN0VmFsaWRhdGlvbkVycm9yKCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsVG9FcnJvclNlcnZpY2Uuc2Nyb2xsVG9GaXJzdEVycm9yKHRoaXMuZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICogUHVibGljIG1ldGhvZCB0byBzY3JvbGwgdG8gYSBzcGVjaWZpYyBmaWVsZCBieSBuYW1lXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsVG9GaWVsZChmaWVsZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsVG9FcnJvclNlcnZpY2Uuc2Nyb2xsVG9GaWVsZChmaWVsZE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlYnVnIG1ldGhvZCB0byBoZWxwIHRyb3VibGVzaG9vdCBzY3JvbGwgaXNzdWVzXG4gICAqL1xuICBwdWJsaWMgZGVidWdGb3JtRWxlbWVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxUb0Vycm9yU2VydmljZS5kZWJ1Z0xvZ0Zvcm1FbGVtZW50cygpO1xuICB9XG5cbiAgYXN5bmMgY29uc3RydWN0RGljdGlvbmFyeShcbiAgICBjb250cm9sOiBDb250cm9sRGF0YSxcbiAgICBvcHRpb25zOiBGb3JtbHlGaWVsZENvbmZpZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzcGVjaWZpY0RhdGEgPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE7XG5cbiAgICAvLyBEZXRlcm1pbmUgY29tcG9uZW50IHR5cGUgYmFzZWQgb24gc2V0dGluZ3NcbiAgICBpZiAoc3BlY2lmaWNEYXRhLnNob3dBc0NoZWNrYm94ZXMgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMudHlwZSA9ICdmb3JtbHktY2hlY2tib3hlcyc7XG4gICAgfSBlbHNlIGlmIChzcGVjaWZpY0RhdGEuc2hvd0FzUmFkaW9CdXR0b25zTGlzdCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy50eXBlID0gJ2Zvcm1seS1yYWRpbyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMudHlwZSA9ICdmb3JtbHktZGljdGlvbmFyeS1kcm9wZG93bi10cmVlJztcbiAgICB9XG5cbiAgICBvcHRpb25zLnByb3BzIVsnc3BlY2lmaWNEYXRhJ10gPSBzcGVjaWZpY0RhdGE7XG5cbiAgICBjb25zdCBkaWN0aW9uYXJ5VXVpZCA9IHNwZWNpZmljRGF0YS5kaWN0aW9uYXJ5VVVJRDtcblxuICAgIGlmIChkaWN0aW9uYXJ5VXVpZCkge1xuICAgICAgY29uc3QgZGljdGlvbmFyeSA9IHRoaXMuZGljdGlvbmFyeU1hcC5nZXQoZGljdGlvbmFyeVV1aWQpO1xuICAgICAgaWYgKGRpY3Rpb25hcnkpIHtcbiAgICAgICAgaWYgKGRpY3Rpb25hcnkucmVmZXJlbmNlSWQpIHtcbiAgICAgICAgICBvcHRpb25zLnByb3BzIVsnZGljdGlvbmFyeUlkJ10gPSBkaWN0aW9uYXJ5VXVpZDtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdERpY3Rpb25hcnlXaXRoUmVmZXJlbmNlcyhcbiAgICAgICAgICAgIGRpY3Rpb25hcnksXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgc3BlY2lmaWNEYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmF0dGFjaFRvVmFsdWVDaGFuZ2VzKGNvbnRyb2wuaWRlbnRpZmllciwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVHlwZSBpcyBhbHJlYWR5IHNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXRob2RcbiAgICAgICAgICBvcHRpb25zLnByb3BzIVsnZGljdGlvbmFyeUlkJ10gPSBkaWN0aW9uYXJ5VXVpZDtcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdERpY3Rpb25hcnlXaXRoUmVmZXJlbmNlcyhcbiAgICAgICAgICAgIGRpY3Rpb25hcnksXG4gICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgc3BlY2lmaWNEYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmF0dGFjaFRvVmFsdWVDaGFuZ2VzKGNvbnRyb2wuaWRlbnRpZmllciwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRGljdGlvbmFyeSBub3QgZm91bmQgZm9yIFVVSUQgJHtkaWN0aW9uYXJ5VXVpZH1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgVVVJRCBub3QgZm91bmQgZm9yIGRpY3Rpb25hcnkgSUQgJHtzcGVjaWZpY0RhdGEuZGljdGlvbmFyeUlkfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRGljdGlvbmFyeVZhbHVlT2JqZWN0KFxuICAgIGRpY3Rpb25hcnk6IERpY3Rpb25hcnlEdG8gfCB1bmRlZmluZWQsXG4gICAgdmFsdWU6IGFueVxuICApOiBEaWN0aW9uYXJ5VmFsdWVEdG8gfCB1bmRlZmluZWQge1xuICAgIGlmIChcbiAgICAgICFkaWN0aW9uYXJ5IHx8XG4gICAgICAhZGljdGlvbmFyeS52YWx1ZXMgfHxcbiAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZT8uaWQgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGRpY3Rpb25hcnkudmFsdWVzLmZpbmQoKHYpID0+IHYuaWQgPT09IHZhbHVlLmlkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdmFsdWVJZCA9IE51bWJlcih2YWx1ZSk7XG4gICAgICBpZiAoIWlzTmFOKHZhbHVlSWQpKSB7XG4gICAgICAgIHJldHVybiBkaWN0aW9uYXJ5LnZhbHVlcy5maW5kKCh2KSA9PiB2LmlkID09PSB2YWx1ZUlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVJlZmVyZW5jZUZpZWxkcyhcbiAgICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10sXG4gICAgcm9vdENvbmZpZzogRm9ybWx5RmllbGRDb25maWdbXSA9IHRoaXMuZm9ybWx5Q29uZmlnXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghZmllbGRzKSByZXR1cm47XG4gICAgY29uc3QgZmllbGRzVG9Qcm9jZXNzID0gWy4uLmZpZWxkc107XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkc1RvUHJvY2Vzcykge1xuICAgICAgY29uc3QgZmllbGRLZXkgPSBmaWVsZC5rZXkgYXMgc3RyaW5nO1xuICAgICAgaWYgKFxuICAgICAgICBmaWVsZEtleSAmJlxuICAgICAgICBmaWVsZC5wcm9wcz8uWydkaWN0aW9uYXJ5SWQnXSAmJlxuICAgICAgICBmaWVsZC5wcm9wcz8uWydzcGVjaWZpY0RhdGEnXVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkS2V5KTtcbiAgICAgICAgY29uc3Qgc3BlY2lmaWNEYXRhID0gZmllbGQucHJvcHNbXG4gICAgICAgICAgJ3NwZWNpZmljRGF0YSdcbiAgICAgICAgXSBhcyBEaWN0aW9uYXJ5Q29udHJvbERhdGE7XG4gICAgICAgIGNvbnN0IGRpY3Rpb25hcnlVdWlkID0gZmllbGQucHJvcHNbJ2RpY3Rpb25hcnlJZCddIGFzIHN0cmluZztcbiAgICAgICAgY29uc3QgbWFpbkRpY3Rpb25hcnkgPSB0aGlzLmRpY3Rpb25hcnlNYXAuZ2V0KGRpY3Rpb25hcnlVdWlkKTtcblxuICAgICAgICBsZXQgdmFsdWVUb1VzZTogYW55ID0gbnVsbDtcblxuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLnZhbHVlICE9PSBudWxsICYmIGNvbnRyb2wudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhbHVlVG9Vc2UgPSBjb250cm9sLnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGZpZWxkLmRlZmF1bHRWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgIGZpZWxkLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHZhbHVlVG9Vc2UgPSBmaWVsZC5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdGhpcy5tb2RlbCAmJlxuICAgICAgICAgIHRoaXMubW9kZWxbZmllbGRLZXldICE9PSBudWxsICYmXG4gICAgICAgICAgdGhpcy5tb2RlbFtmaWVsZEtleV0gIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB2YWx1ZVRvVXNlID0gdGhpcy5tb2RlbFtmaWVsZEtleV07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VsZWN0ZWRWYWx1ZU9iamVjdDogRGljdGlvbmFyeVZhbHVlRHRvIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmICh2YWx1ZVRvVXNlICE9PSBudWxsICYmIG1haW5EaWN0aW9uYXJ5Py5pZCAhPSBudWxsKSB7XG4gICAgICAgICAgc2VsZWN0ZWRWYWx1ZU9iamVjdCA9IHRoaXMuZmluZERpY3Rpb25hcnlWYWx1ZU9iamVjdChcbiAgICAgICAgICAgIG1haW5EaWN0aW9uYXJ5LFxuICAgICAgICAgICAgdmFsdWVUb1VzZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWVsZENvbmZpZ0luVHJlZSA9IHRoaXMuZmluZEZpZWxkQnlLZXkocm9vdENvbmZpZywgZmllbGRLZXkpO1xuICAgICAgICBpZiAoIWZpZWxkQ29uZmlnSW5UcmVlKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbW92ZVJlZmVyZW5jZUZpZWxkcyhmaWVsZENvbmZpZ0luVHJlZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkVmFsdWVPYmplY3QgJiZcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlT2JqZWN0LmlkICE9IG51bGwgJiZcbiAgICAgICAgICBtYWluRGljdGlvbmFyeT8uaWQgIT0gbnVsbFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwb3RlbnRpYWxSZWZlcmVuY2VEaWN0aW9uYXJpZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5TWFwLnZhbHVlcygpXG4gICAgICAgICAgKS5maWx0ZXIoKGRpY3QpID0+IGRpY3QucmVmZXJlbmNlSWQgPT09IG1haW5EaWN0aW9uYXJ5LmlkKTtcblxuICAgICAgICAgIGlmIChwb3RlbnRpYWxSZWZlcmVuY2VEaWN0aW9uYXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJlbmNlRGljdGlvbmFyaWVzVG9TaG93ID1cbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVSZWZlcmVuY2VEaWN0aW9uYXJpZXNGcm9tU2VsZWN0ZWRWYWx1ZShcbiAgICAgICAgICAgICAgICBwb3RlbnRpYWxSZWZlcmVuY2VEaWN0aW9uYXJpZXMsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZU9iamVjdFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAocmVmZXJlbmNlRGljdGlvbmFyaWVzVG9TaG93Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRSZWZlcmVuY2VEaWN0aW9uYXJ5RmllbGRzSWZOZWNlc3NhcnkoXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyaWVzVG9TaG93LFxuICAgICAgICAgICAgICAgIGZpZWxkQ29uZmlnSW5UcmVlLFxuICAgICAgICAgICAgICAgIGZpZWxkQ29uZmlnSW5UcmVlLnR5cGUsXG4gICAgICAgICAgICAgICAgc3BlY2lmaWNEYXRhPy5yZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zIHx8IFtdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZC5maWVsZEdyb3VwICYmIGZpZWxkLmZpZWxkR3JvdXAubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVSZWZlcmVuY2VGaWVsZHMoZmllbGQuZmllbGRHcm91cCwgcm9vdENvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGZpZWxkcyA9PT0gdGhpcy5mb3JtbHlDb25maWcgfHxcbiAgICAgIGZpZWxkcyA9PT0gdGhpcy5mb3JtbHlDb25maWdbMF0/LmZpZWxkR3JvdXBcbiAgICApIHtcbiAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgICB0aGlzLmZvcm1seUNvbmZpZ1VwZGF0ZWQuZW1pdCgpO1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0RGljdGlvbmFyeVdpdGhSZWZlcmVuY2VzKFxuICAgIGRpY3Rpb25hcnk6IERpY3Rpb25hcnlEdG8sXG4gICAgb3B0aW9uczogRm9ybWx5RmllbGRDb25maWcsXG4gICAgZGljdGlvbmFyeUNvbnRyb2xEYXRhOiBEaWN0aW9uYXJ5Q29udHJvbERhdGFcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMucHJvcHMpIHtcbiAgICAgIHZhciBjdXJyZW50TGFuZ3VhZ2VJZCA9IFV0aWxzLmZpbmRMYW5ndWFnZUlkQnlJc28oXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgKTtcblxuICAgICAgLy8gUGFzcyBwcmVsb2FkZWQgZGljdGlvbmFyeSBkYXRhIHRvIGZvcm1seSBjb21wb25lbnRcbiAgICAgIG9wdGlvbnMucHJvcHNbJ2RpY3Rpb25hcnlEYXRhJ10gPSBkaWN0aW9uYXJ5O1xuICAgICAgb3B0aW9ucy5wcm9wc1snbGFuZ3VhZ2VzJ10gPSB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcztcbiAgICAgIG9wdGlvbnMucHJvcHNbJ3ByZWxvYWRlZERpY3Rpb25hcmllcyddID0gdGhpcy5kaWN0aW9uYXJ5TWFwO1xuICAgICAgb3B0aW9ucy5wcm9wc1sndXNlUHJlbG9hZGVkRGF0YSddID0gdHJ1ZTtcblxuICAgICAgb3B0aW9ucy5wcm9wcy5vcHRpb25zID0gZGljdGlvbmFyeS52YWx1ZXM/Lm1hcCgodmFsdWUpID0+ICh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgbGFiZWw6XG4gICAgICAgICAgVXRpbHMuZmluZFZhbHVlVHJhbnNsYXRpb24oXG4gICAgICAgICAgICB2YWx1ZS52YWx1ZVRyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgIGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgKSB8fCB2YWx1ZS5uYW1lLFxuICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICByZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zOlxuICAgICAgICAgIGRpY3Rpb25hcnlDb250cm9sRGF0YS5yZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zXG4gICAgICB9KSk7XG5cbiAgICAgIG9wdGlvbnMucHJvcHNbJ3NlbGVjdGVkUmVsYXRlZERpY3Rpb25hcmllcyddID1cbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xEYXRhLnNlbGVjdGVkUmVsYXRlZERpY3Rpb25hcmllcyB8fCBbXTtcbiAgICAgIG9wdGlvbnMucHJvcHNbJ2FsbG93TXVsdGlwbGVTZWxlY3Rpb24nXSA9XG4gICAgICAgIGRpY3Rpb25hcnlDb250cm9sRGF0YS5hbGxvd011bHRpcGxlU2VsZWN0aW9uIHx8IGZhbHNlO1xuXG4gICAgICBsZXQgaW5pdGlhbFZhbHVlT2JqZWN0OiBEaWN0aW9uYXJ5VmFsdWUgfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0IGNvbnRyb2xLZXkgPSBvcHRpb25zLmtleSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWQgPVxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbERhdGEuZGljdGlvbmFyeURlZmF1bHRWYWx1ZUlkO1xuICAgICAgaWYgKFxuICAgICAgICAhKHRoaXMubW9kZWwgJiYgdGhpcy5tb2RlbFtjb250cm9sS2V5XSAhPSBudWxsKSAmJlxuICAgICAgICBkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWQgIT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIGluaXRpYWxWYWx1ZU9iamVjdCA9IHRoaXMuZmluZEFuZE1hcERlZmF1bHRWYWx1ZShcbiAgICAgICAgICBkaWN0aW9uYXJ5LFxuICAgICAgICAgIGRpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBvcHRpb25zLmRlZmF1bHRWYWx1ZSA9IGluaXRpYWxWYWx1ZU9iamVjdDtcblxuICAgICAgLy8gUGFzcyBkZWZhdWx0IHZhbHVlIElEIHRvIGZvcm1seSBjb21wb25lbnRcbiAgICAgIG9wdGlvbnMucHJvcHNbJ2RpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZCddID0gZGljdGlvbmFyeURlZmF1bHRWYWx1ZUlkO1xuXG4gICAgICBjb25zdCBjb250cm9sSWQgPSBvcHRpb25zLmtleTtcbiAgICAgIGlmICh0aGlzLmZpbGxEYXRhICYmIHRoaXMuZmlsbERhdGEuZmx1eCkge1xuICAgICAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgdGhpcy5maWxsRGF0YS5mbHV4KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uIG9mIHN0ZXAuc2VjdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBzZWN0aW9uLmNvbnRyb2xzLmZpbmQoXG4gICAgICAgICAgICAgIChjdHJsOiB7XG4gICAgICAgICAgICAgICAgY29udHJvbElkOiBzdHJpbmcgfCBudW1iZXIgfCAoc3RyaW5nIHwgbnVtYmVyKVtdIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9KSA9PiBjdHJsLmNvbnRyb2xJZCA9PT0gY29udHJvbElkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5maWxsVmFsdWUgJiYgY29udHJvbC5maWxsVmFsdWUubmFtZSkge1xuICAgICAgICAgICAgICBvcHRpb25zLnByb3BzWyd2YWx1ZSddID0gY29udHJvbC5maWxsVmFsdWUubmFtZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gIH1cblxuICBhc3luYyBhZGRSZWZlcmVuY2VEaWN0aW9uYXJ5RmllbGRzSWZOZWNlc3NhcnkoXG4gICAgcmVmZXJyZW5jZWREaWN0aW9uYXJpZXM6IGFueVtdLFxuICAgIHBhcmVudERpY3Rpb25hcnlGaWVsZDogRm9ybWx5RmllbGRDb25maWcsXG4gICAgdHlwZTogYW55LFxuICAgIHJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnM6IERpY3Rpb25hcnlMYWJlbEluZm9bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocmVmZXJyZW5jZWREaWN0aW9uYXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzID1cbiAgICAgICAgcGFyZW50RGljdGlvbmFyeUZpZWxkLnByb3BzPy5bJ3NlbGVjdGVkUmVsYXRlZERpY3Rpb25hcmllcyddIHx8IFtdO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZERpY3Rpb25hcmllcyA9IHJlZmVycmVuY2VkRGljdGlvbmFyaWVzLmZpbHRlcigoZGljdCkgPT5cbiAgICAgICAgc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzLmluY2x1ZGVzKGRpY3QudXVpZClcbiAgICAgICk7XG5cbiAgICAgIHNlbGVjdGVkRGljdGlvbmFyaWVzLmZvckVhY2goKHJlZmVyZW5jZURpY3Rpb25hcnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlRGljdGlvbmFyeVV1aWQgPSByZWZlcmVuY2VEaWN0aW9uYXJ5LnV1aWQ7XG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50T25seUZvckNvbmZpZyA9IHRoaXMuZmx1eFxuICAgICAgICAgIC5mbGF0TWFwKChzKSA9PiBzLnNlY3Rpb25zKVxuICAgICAgICAgIC5mbGF0TWFwKChzZWMpID0+IHNlYy5jb250cm9scylcbiAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgIChjdHJsKSA9PlxuICAgICAgICAgICAgICBjdHJsPy5zcGVjaWZpY0NvbnRyb2xEYXRhPy5kaWN0aW9uYXJ5VVVJRCA9PT1cbiAgICAgICAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJ5VXVpZCAmJiBjdHJsPy5pc09ubHlGb3JDb25maWcgPT09IHRydWVcbiAgICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG5ld0ZpZWxkS2V5ID1cbiAgICAgICAgICBjb21wb25lbnRPbmx5Rm9yQ29uZmlnPy5pZGVudGlmaWVyID8/XG4gICAgICAgICAgYGV4dHJhXyR7cmVmZXJlbmNlRGljdGlvbmFyeVV1aWR9YDtcblxuICAgICAgICBsZXQgcmVmZXJlbmNlRGljdGlvbmFyeUxhYmVsID0gcmVmZXJlbmNlRGljdGlvbmFyeS5uYW1lO1xuXG4gICAgICAgIGNvbnN0IHNwZWNpZmljVHJhbnNsYXRpb25WYWx1ZSA9IHJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnNcbiAgICAgICAgICAuZmluZCgoZCkgPT4gZC5kaWN0aW9uYXJ5VVVJRCA9PSByZWZlcmVuY2VEaWN0aW9uYXJ5VXVpZClcbiAgICAgICAgICA/LnRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgICh0KSA9PiB0Lmxhbmd1YWdlSXNvID09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWU7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNwZWNpZmljVHJhbnNsYXRpb25WYWx1ZSAmJlxuICAgICAgICAgIHNwZWNpZmljVHJhbnNsYXRpb25WYWx1ZS50cmltKCkgIT09ICcnXG4gICAgICAgICkge1xuICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcnlMYWJlbCA9IHNwZWNpZmljVHJhbnNsYXRpb25WYWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJ5TGFiZWwgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IFV0aWxzLmZpbmRMYW5ndWFnZUlkQnlJc28oXG4gICAgICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBuZXdGaWVsZDogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICAgICAga2V5OiBuZXdGaWVsZEtleSxcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbDogcmVmZXJlbmNlRGljdGlvbmFyeUxhYmVsLFxuICAgICAgICAgICAgZGVzaWduOiB0aGlzLmRlc2lnbixcbiAgICAgICAgICAgIGRpY3Rpb25hcnlJZDogcmVmZXJlbmNlRGljdGlvbmFyeVV1aWQsXG4gICAgICAgICAgICBkaWN0aW9uYXJ5RGF0YTogcmVmZXJlbmNlRGljdGlvbmFyeSxcbiAgICAgICAgICAgIGxhbmd1YWdlczogdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgICAgICAgICBwcmVsb2FkZWREaWN0aW9uYXJpZXM6IHRoaXMuZGljdGlvbmFyeU1hcCxcbiAgICAgICAgICAgIHVzZVByZWxvYWRlZERhdGE6IHRydWUsXG4gICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICAgY3VycmVudExhbmd1YWdlSWQ6IGN1cnJlbnRMYW5ndWFnZUlkLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgIHN0eWxlOiB0aGlzLnN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKFxuICAgICAgICAgICAgICAgIHRoaXMuZGVzaWduW2AuZm9udC1saXN0YF0gfHwge31cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wdGlvbnM6IHJlZmVyZW5jZURpY3Rpb25hcnkudmFsdWVzPy5tYXAoKHZhbHVlOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6XG4gICAgICAgICAgICAgICAgVXRpbHMuZmluZFZhbHVlVHJhbnNsYXRpb24oXG4gICAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZVRyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgKSB8fCB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHJlZmVyZW5jZURpY3Rpb25hcnkuZGVmYXVsdFZhbHVlSWQpIHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsID0gdGhpcy5maW5kQW5kTWFwRGVmYXVsdFZhbHVlKFxuICAgICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyeSxcbiAgICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcnkuZGVmYXVsdFZhbHVlSWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChkZWZhdWx0VmFsKSB7XG4gICAgICAgICAgICBuZXdGaWVsZC5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudEZpZWxkR3JvdXAgPSBwYXJlbnREaWN0aW9uYXJ5RmllbGQucGFyZW50XG4gICAgICAgICAgPyBwYXJlbnREaWN0aW9uYXJ5RmllbGQucGFyZW50LmZpZWxkR3JvdXBcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGlmIChwYXJlbnRGaWVsZEdyb3VwKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRGaWVsZEdyb3VwLmZpbmRJbmRleChcbiAgICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQua2V5ID09PSBwYXJlbnREaWN0aW9uYXJ5RmllbGQua2V5XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFyZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHRoaXMuZmluZExhc3RDaGlsZEluZGV4KFxuICAgICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLFxuICAgICAgICAgICAgICBwYXJlbnRJbmRleFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgcGVyY2VudGFnZVRvQWRkID0gdGhpcy5nZXRFeGlzdGluZ1BlcmNlbnRhZ2UoXG4gICAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAsXG4gICAgICAgICAgICAgIHBhcmVudEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbmV3RmllbGQuY2xhc3NOYW1lID1cbiAgICAgICAgICAgICAgcGVyY2VudGFnZVRvQWRkID09PSAwXG4gICAgICAgICAgICAgICAgPyBwYXJlbnREaWN0aW9uYXJ5RmllbGQuY2xhc3NOYW1lXG4gICAgICAgICAgICAgICAgOiB0aGlzLmdldFBlcmNlbnRhZ2VDbGFzc05hbWUocGVyY2VudGFnZVRvQWRkKTtcblxuICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cC5zcGxpY2UoZW5kSW5kZXggKyAxLCAwLCBuZXdGaWVsZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZVRvQWRkID1cbiAgICAgICAgICAgICAgdHlwZSA9PT0gJ3JhZGlvJyA/IGAgY29tcG9uZW50LXJhZGlvYCA6IGAgY29tcG9uZW50LWRhdGFgO1xuICAgICAgICAgICAgbmV3RmllbGQuY2xhc3NOYW1lICs9IGNsYXNzTmFtZVRvQWRkO1xuICAgICAgICAgICAgdGhpcy5hdHRhY2hUb1ZhbHVlQ2hhbmdlcyhuZXdGaWVsZEtleSwgbmV3RmllbGQpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEV4aXN0aW5nUGVyY2VudGFnZShmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10sIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBwZXJjZW50YWdlID0gMDtcbiAgICBjb25zdCBmaWVsZCA9IGZpZWxkc1tpbmRleF07XG4gICAgY29uc3QgY2xhc3NOYW1lID0gZmllbGQuY2xhc3NOYW1lO1xuICAgIGlmIChmaWVsZC50eXBlPy50b1N0cmluZygpICE9PSBTdGVwQ29udHJvbFR5cGUuTmV3Um93LnRvU3RyaW5nKCkpIHtcbiAgICAgIGlmIChjbGFzc05hbWUgJiYgY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ3BlcmNlbnRhZ2Utd2lkdGgtJykpIHtcbiAgICAgICAgcGVyY2VudGFnZSA9XG4gICAgICAgICAgKHBhcnNlSW50KGNsYXNzTmFtZS5yZXBsYWNlKCdwZXJjZW50YWdlLXdpZHRoLScsICcnKSwgMTApICogMTAwKSAvIDEyO1xuICAgICAgfSBlbHNlIGlmIChjbGFzc05hbWUgJiYgY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ3BpeGVsLXdpZHRoLScpKSB7XG4gICAgICAgIGNvbnN0IHBpeGVscyA9IHBhcnNlSW50KGNsYXNzTmFtZS5yZXBsYWNlKCdwaXhlbC13aWR0aC0nLCAnJyksIDEwKTtcbiAgICAgICAgcGVyY2VudGFnZSA9IChwaXhlbHMgLyAxMDAwKSAqIDEwMDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBlcmNlbnRhZ2U7XG4gIH1cblxuICBjYWxjdWxhdGVSZW1haW5pbmdQZXJjZW50YWdlRm9yUmFuZ2UoXG4gICAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBlbmRJbmRleDogbnVtYmVyXG4gICk6IG51bWJlciB7XG4gICAgbGV0IHJlbWFpbmluZ1BlcmNlbnRhZ2UgPSAxMDA7XG5cbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8PSBlbmRJbmRleDsgaSsrKSB7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdGhpcy5nZXRFeGlzdGluZ1BlcmNlbnRhZ2UoZmllbGRzLCBpKTtcbiAgICAgIHJlbWFpbmluZ1BlcmNlbnRhZ2UgLT0gcGVyY2VudGFnZTtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGgubWF4KHJlbWFpbmluZ1BlcmNlbnRhZ2UsIDApO1xuICB9XG5cbiAgcmVtb3ZlUmVmZXJlbmNlRmllbGRzKGN1cnJlbnRGb3JtbHlGaWVsZENvbmZpZzogRm9ybWx5RmllbGRDb25maWcpIHtcbiAgICBjb25zdCByZWZlcnJlZEluRGljdGlvbmFyaWVzVVVJZHMgPVxuICAgICAgY3VycmVudEZvcm1seUZpZWxkQ29uZmlnLnByb3BzPy5bJ2RpY3Rpb25hcnlEYXRhJ11cbiAgICAgICAgPy5yZWZlcnJlZEluRGljdGlvbmFyaWVzVVVJZHM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWZlcnJlZEluRGljdGlvbmFyaWVzVVVJZHMpKSB7XG4gICAgICBjb25zdCBwYXJlbnRGaWVsZEdyb3VwID0gY3VycmVudEZvcm1seUZpZWxkQ29uZmlnLnBhcmVudFxuICAgICAgICA/IGN1cnJlbnRGb3JtbHlGaWVsZENvbmZpZy5wYXJlbnQuZmllbGRHcm91cFxuICAgICAgICA6IG51bGw7XG4gICAgICBpZiAocGFyZW50RmllbGRHcm91cCkge1xuICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IHBhcmVudEZpZWxkR3JvdXAuZmluZEluZGV4KFxuICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQua2V5ID09PSBjdXJyZW50Rm9ybWx5RmllbGRDb25maWcua2V5XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHBhcmVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByZWZlcnJlZEluRGljdGlvbmFyaWVzVVVJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkVG9GaW5kID0gJ2V4dHJhXycgKyBpdGVtO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyZW50RmllbGRHcm91cC5sZW5ndGggLSAxOyBpID4gcGFyZW50SW5kZXg7IGktLSkge1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RmllbGRLZXkgPSBwYXJlbnRGaWVsZEdyb3VwW2ldLmtleT8udG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZEtleSAmJiBjdXJyZW50RmllbGRLZXkgPT09IGlkVG9GaW5kKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckZvcm1Db250cm9sVmFsdWUoaWRUb0ZpbmQpO1xuICAgICAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYWRkQ2hpbGREaWN0aW9uYXJ5RmllbGQoXG4gICAgY2hpbGREaWN0aW9uYXJ5VXVpZDogc3RyaW5nLFxuICAgIHBhcmVudERpY3Rpb25hcnlGaWVsZDogRm9ybWx5RmllbGRDb25maWcsXG4gICAgdHlwZTogYW55LFxuICAgIHJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnM6IERpY3Rpb25hcnlMYWJlbEluZm9bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hpbGREaWN0aW9uYXJ5VXVpZCkge1xuICAgICAgY29uc3QgY2hpbGREaWN0aW9uYXJ5ID0gdGhpcy5kaWN0aW9uYXJ5TWFwLmdldChjaGlsZERpY3Rpb25hcnlVdWlkKTtcbiAgICAgIGlmIChjaGlsZERpY3Rpb25hcnkpIHtcbiAgICAgICAgbGV0IGNoaWxkRGljdGlvbmFyeUxhYmVsID0gY2hpbGREaWN0aW9uYXJ5Lm5hbWU7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID1cbiAgICAgICAgICByZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zXG4gICAgICAgICAgICAuZmluZCgoZCkgPT4gZC5kaWN0aW9uYXJ5VVVJRCA9PSBjaGlsZERpY3Rpb25hcnlVdWlkKVxuICAgICAgICAgICAgPy50cmFuc2xhdGlvbnMuZmluZCgodCkgPT4gdC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbylcbiAgICAgICAgICAgID8udmFsdWUgfHwgJyc7XG4gICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgIGNoaWxkRGljdGlvbmFyeUxhYmVsID0gdHJhbnNsYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3RmllbGQ6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAgICAgIGtleTogYCR7cGFyZW50RGljdGlvbmFyeUZpZWxkLmtleX1fY2hpbGRfJHtjaGlsZERpY3Rpb25hcnlVdWlkfWAsXG4gICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgbGFiZWw6IGNoaWxkRGljdGlvbmFyeUxhYmVsLFxuICAgICAgICAgICAgZGljdGlvbmFyeURhdGE6IGNoaWxkRGljdGlvbmFyeSxcbiAgICAgICAgICAgIGxhbmd1YWdlczogdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgICAgICAgICBwcmVsb2FkZWREaWN0aW9uYXJpZXM6IHRoaXMuZGljdGlvbmFyeU1hcCxcbiAgICAgICAgICAgIG9wdGlvbnM6IGNoaWxkRGljdGlvbmFyeS52YWx1ZXM/Lm1hcCgodmFsdWUpID0+ICh7XG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZS5pZCxcbiAgICAgICAgICAgICAgbGFiZWw6IHZhbHVlLm5hbWVcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICBzdHlsZTogdGhpcy5zdHlsZU9iamVjdFRvU3RyaW5nRXhjZXB0QmFja2dyb3VuZChcbiAgICAgICAgICAgICAgICB0aGlzLmRlc2lnbltgLmZvbnQtbGlzdGBdIHx8IHt9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgICBvbkluaXQ6IChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgICAgICAgICAgICB0aGlzLmZpZWxkVW5zdWJzY3JpYmVTdWJqZWN0cy5wdXNoKHVuc3Vic2NyaWJlJCk7XG5cbiAgICAgICAgICAgICAgZmllbGQuZm9ybUNvbnRyb2w/LnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh1bnN1YnNjcmliZSQpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoYXN5bmMgKHNlbGVjdGVkVmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gY2hpbGREaWN0aW9uYXJ5LnZhbHVlcz8uZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHZhbCkgPT4gdmFsLmlkID09PSBzZWxlY3RlZFZhbHVlXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkT3B0aW9uICYmIHNlbGVjdGVkT3B0aW9uLmNoaWxkRGljdGlvbmFyeVVVSUQpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZGRDaGlsZERpY3Rpb25hcnlGaWVsZChcbiAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbi5jaGlsZERpY3Rpb25hcnlVVUlELFxuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZEZpZWxkcyhmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgZmllbGQuaG9va3MhLm9uRGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB1bnN1YnNjcmliZSQubmV4dCgpO1xuICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwYXJlbnRGaWVsZEdyb3VwID0gcGFyZW50RGljdGlvbmFyeUZpZWxkLnBhcmVudFxuICAgICAgICAgID8gcGFyZW50RGljdGlvbmFyeUZpZWxkLnBhcmVudC5maWVsZEdyb3VwXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICBpZiAocGFyZW50RmllbGRHcm91cCkge1xuICAgICAgICAgIGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50RmllbGRHcm91cC5maW5kSW5kZXgoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkLmtleSA9PT0gcGFyZW50RGljdGlvbmFyeUZpZWxkLmtleVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBhcmVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLmZpbmRMYXN0Q2hpbGRJbmRleChcbiAgICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cCxcbiAgICAgICAgICAgICAgcGFyZW50SW5kZXhcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2VUb0FkZCA9IHRoaXMuZ2V0RXhpc3RpbmdQZXJjZW50YWdlKFxuICAgICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLFxuICAgICAgICAgICAgICBwYXJlbnRJbmRleFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG5ld0ZpZWxkLmNsYXNzTmFtZSA9IHRoaXMuZ2V0UGVyY2VudGFnZUNsYXNzTmFtZShwZXJjZW50YWdlVG9BZGQpO1xuICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cC5zcGxpY2UoZW5kSW5kZXggKyAxLCAwLCBuZXdGaWVsZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZVRvQWRkID1cbiAgICAgICAgICAgICAgdHlwZSA9PT0gJ3JhZGlvJyA/IGAgY29tcG9uZW50LXJhZGlvYCA6IGAgY29tcG9uZW50LWRhdGFgO1xuICAgICAgICAgICAgbmV3RmllbGQuY2xhc3NOYW1lICs9IGNsYXNzTmFtZVRvQWRkO1xuICAgICAgICAgICAgLy90aGlzLmF0dGFjaFRvVmFsdWVDaGFuZ2VzKG5ld0ZpZWxkS2V5LCBuZXdGaWVsZCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBDaGlsZCBkaWN0aW9uYXJ5IG5vdCBmb3VuZCBmb3IgVVVJRCAke2NoaWxkRGljdGlvbmFyeVV1aWR9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uQ29tcGxldGlvbigpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnT3JpZ2luIGZvcm0gY29tcGxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgIHRoaXMuY29tcGxldGlvbkV2ZW50LmVtaXQoKTtcbiAgfVxuXG4gIGZpbmRMYXN0Q2hpbGRJbmRleChmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10sIHBhcmVudEluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHBhcmVudEtleVByZWZpeCA9IGAke2ZpZWxkc1twYXJlbnRJbmRleF0ua2V5fV9gO1xuICAgIGxldCBsYXN0SW5kZXggPSBwYXJlbnRJbmRleDtcblxuICAgIGZvciAobGV0IGkgPSBwYXJlbnRJbmRleCArIDE7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChmaWVsZHNbaV0ua2V5Py50b1N0cmluZygpLnN0YXJ0c1dpdGgocGFyZW50S2V5UHJlZml4KSkge1xuICAgICAgICBsYXN0SW5kZXggPSBpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhc3RJbmRleDtcbiAgfVxuXG4gIGZpbmRGaWVsZEJ5S2V5KFxuICAgIGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSxcbiAgICBrZXk6IHN0cmluZ1xuICApOiBGb3JtbHlGaWVsZENvbmZpZyB8IG51bGwge1xuICAgIGlmICghZmllbGRzKSByZXR1cm4gbnVsbDtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdzdGVwcGVyJyAmJiBmaWVsZC5maWVsZEdyb3VwKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kSW5TdGVwcGVyID0gdGhpcy5maW5kRmllbGRCeUtleShmaWVsZC5maWVsZEdyb3VwLCBrZXkpO1xuICAgICAgICBpZiAoZm91bmRJblN0ZXBwZXIpIHJldHVybiBmb3VuZEluU3RlcHBlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5maWVsZEdyb3VwKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kRmllbGRCeUtleShmaWVsZC5maWVsZEdyb3VwLCBrZXkpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZW1vdmVDaGlsZEZpZWxkcyhwYXJlbnRGaWVsZDogRm9ybWx5RmllbGRDb25maWcpIHtcbiAgICBjb25zdCBwYXJlbnRGaWVsZEdyb3VwID0gcGFyZW50RmllbGQucGFyZW50XG4gICAgICA/IHBhcmVudEZpZWxkLnBhcmVudC5maWVsZEdyb3VwXG4gICAgICA6IG51bGw7XG5cbiAgICBpZiAocGFyZW50RmllbGRHcm91cCkge1xuICAgICAgY29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRGaWVsZEdyb3VwLmZpbmRJbmRleChcbiAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5rZXkgPT09IHBhcmVudEZpZWxkLmtleVxuICAgICAgKTtcblxuICAgICAgaWYgKHBhcmVudEluZGV4ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBwYXJlbnRLZXlQcmVmaXggPSBgJHtwYXJlbnRGaWVsZC5rZXl9X2NoaWxkX2A7XG5cbiAgICAgICAgLy8gUmVtb3ZlIG9ubHkgdGhlIHJlbGV2YW50IGNoaWxkIGZpZWxkc1xuICAgICAgICBmb3IgKGxldCBpID0gcGFyZW50RmllbGRHcm91cC5sZW5ndGggLSAxOyBpID4gcGFyZW50SW5kZXg7IGktLSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRGaWVsZEtleSA9IHBhcmVudEZpZWxkR3JvdXBbaV0ua2V5Py50b1N0cmluZygpO1xuICAgICAgICAgIGlmIChjdXJyZW50RmllbGRLZXkgJiYgY3VycmVudEZpZWxkS2V5LnN0YXJ0c1dpdGgocGFyZW50S2V5UHJlZml4KSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckZvcm1Db250cm9sVmFsdWUoY3VycmVudEZpZWxkS2V5KTtcbiAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBORVc6IExvYWQgQUxMIGRpY3Rpb25hcmllcyBuZWVkZWQgZm9yIHRoaXMgYXBwIHVzaW5nIHRoZSBuZXcgYXBwLWJhc2VkIGVuZHBvaW50XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRBbGxSZXF1aXJlZERpY3Rpb25hcmllcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYXBwTW9kZWw/LmFwcGxpY2F0aW9uVXVpZCkge1xuICAgICAgY29uc29sZS53YXJuKCdObyBhcHAgVVVJRCBhdmFpbGFibGUgZm9yIGRpY3Rpb25hcnkgbG9hZGluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLnNlcnZpY2UubG9hZEFwcERpY3Rpb25hcmllcyhcbiAgICAgICAgICB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgICBFbnZpcm9ubWVudFR5cGUuQ29uZmlnXG4gICAgICAgIClcbiAgICAgICk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICfinYwgQmFja2VuZCBmYWlsZWQgdG8gbG9hZCBkaWN0aW9uYXJpZXM6JyxcbiAgICAgICAgICByZXNwb25zZS5lcnJvcnNcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTaW1wbGUgYXNzaWdubWVudCAtIEFMTCBkaWN0aW9uYXJpZXMgYW5kIGRlcGVuZGVuY2llcyBhbHJlYWR5IGxvYWRlZCBieSBiYWNrZW5kXG4gICAgICBPYmplY3QuZW50cmllcyhyZXNwb25zZS5kaWN0aW9uYXJpZXMpLmZvckVhY2goKFt1dWlkLCBkaWN0XSkgPT4ge1xuICAgICAgICB0aGlzLmRpY3Rpb25hcnlNYXAuc2V0KHV1aWQsIGRpY3QpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBGYWlsZWQgdG8gbG9hZCBhcHAgZGljdGlvbmFyaWVzOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBjbGVhckZvcm1Db250cm9sVmFsdWUoZmllbGRLZXk6IHN0cmluZykge1xuICAgIGNvbnN0IGtleXMgPSBmaWVsZEtleS5zcGxpdCgnLicpO1xuICAgIGxldCBjb250cm9sID0gdGhpcy5mb3JtO1xuICAgIGxldCBtb2RlbCA9IHRoaXMubW9kZWw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBjb250cm9sID0gY29udHJvbC5nZXQoa2V5c1tpXSkgYXMgRm9ybUdyb3VwO1xuICAgICAgbW9kZWwgPSBtb2RlbFtrZXlzW2ldXTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbEtleSA9IGtleXNba2V5cy5sZW5ndGggLSAxXTtcbiAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmdldChmaW5hbEtleSkpIHtcbiAgICAgIGNvbnRyb2wucmVtb3ZlQ29udHJvbChmaW5hbEtleSk7XG4gICAgfVxuXG4gICAgaWYgKG1vZGVsICYmIG1vZGVsW2ZpbmFsS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgbW9kZWxbZmluYWxLZXldO1xuICAgIH1cbiAgfVxuXG4gIGZpbmRGaWVsZChcbiAgICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10sXG4gICAga2V5OiBzdHJpbmdcbiAgKTogRm9ybWx5RmllbGRDb25maWcgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgaWYgKGZpZWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICAgIH1cbiAgICAgIGlmIChmaWVsZC5maWVsZEdyb3VwKSB7XG4gICAgICAgIGNvbnN0IG5lc3RlZEZpZWxkID0gdGhpcy5maW5kRmllbGQoZmllbGQuZmllbGRHcm91cCwga2V5KTtcbiAgICAgICAgaWYgKG5lc3RlZEZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuIG5lc3RlZEZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3B1bGF0ZU1vZGVsV2l0aEZpbGxEYXRhKGZpbGxEYXRhOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoZmlsbERhdGEpIHtcbiAgICAgIGxldCBhdXhNb2RlbCA9IE1vZGVsUG9wdWxhdGlvbkhlbHBlci5wb3B1bGF0ZU1vZGVsV2l0aEZpbGxEYXRhKFxuICAgICAgICBmaWxsRGF0YSxcbiAgICAgICAgdGhpcy5mbHV4LFxuICAgICAgICB0aGlzLmRpY3Rpb25hcnlNYXAsXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzXG4gICAgICApO1xuICAgICAgdGhpcy5tb2RlbCA9IHsgLi4uYXV4TW9kZWwgfTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZEFuZE1hcERlZmF1bHRWYWx1ZShcbiAgICBkaWN0aW9uYXJ5OiBEaWN0aW9uYXJ5RHRvIHwgdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRWYWx1ZUlkOiBudW1iZXJcbiAgKTogRGljdGlvbmFyeVZhbHVlIHwgbnVsbCB7XG4gICAgcmV0dXJuIE1vZGVsUG9wdWxhdGlvbkhlbHBlci5maW5kQW5kTWFwRGVmYXVsdFZhbHVlKFxuICAgICAgZGljdGlvbmFyeSxcbiAgICAgIGRlZmF1bHRWYWx1ZUlkLFxuICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXNcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlRm9ybWx5Q29uZmlnKCkge1xuICAgIHRoaXMuZm9ybWx5Q29uZmlnID0gWy4uLnRoaXMuZm9ybWx5Q29uZmlnXTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVGcm9tQWxsRmllbGRzKCkge1xuICAgIGZvciAoY29uc3Qgc3ViamVjdCBvZiB0aGlzLmZpZWxkVW5zdWJzY3JpYmVTdWJqZWN0cykge1xuICAgICAgc3ViamVjdC5uZXh0KCk7XG4gICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgfVxuICAgIHRoaXMuZmllbGRVbnN1YnNjcmliZVN1YmplY3RzID0gW107XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUFsbEZpZWxkcygpO1xuICAgIGlmICh0aGlzLmNvbGxlY3RvckhhbmRsZXJTdWJzY3JpcHRpb25zKSB7XG4gICAgICB0aGlzLmNvbGxlY3RvckhhbmRsZXJTdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjdGlvblN0ZXBTdWJzY3JpcHRpb25zKSB7XG4gICAgICB0aGlzLmFjdGlvblN0ZXBTdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjdGlvblN0ZXBIYW5kbGVyKSB7XG4gICAgICB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RCdXR0b25zKGJ1dHRvbnNDb25maWc6IGFueVtdKTogYW55W10ge1xuICAgIGlmICghYnV0dG9uc0NvbmZpZyB8fCBidXR0b25zQ29uZmlnLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gYnV0dG9uc0NvbmZpZy5tYXAoKGJ1dHRvbikgPT4gKHtcbiAgICAgIHR5cGU6IGJ1dHRvbi52YWx1ZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgbGFiZWw6IGJ1dHRvbi50cmFuc2xhdGlvbnM/Llt0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb10gfHwgYnV0dG9uLnZhbHVlLFxuICAgICAgc3R5bGVLZXk6IGAuYnV0dG9uLSR7YnV0dG9uLnZhbHVlLnRvTG93ZXJDYXNlKCl9YFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoc3R5bGVPYmo6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHN0eWxlT2JqKVxuICAgICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiBrZXkgIT09ICdiYWNrZ3JvdW5kLWNvbG9yJylcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fTogJHt2YWx1ZX1gKVxuICAgICAgLmpvaW4oJzsgJyk7XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZU1ldGhvZEFwaShkYXRhOiBBcGlWYWxpZGF0ZVJlcXVlc3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoZGF0YS5hcGlNZXRob2RJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBhcGlSZXNwb25zZSA9IGZyb20odGhpcy5hcHBsaWNhdGlvbkRhdGFTZXJ2aWNlLnZhbGlkYXRlQXBpKGRhdGEpKS5waXBlKFxuICAgICAgbWFwKChvYnMpID0+IHtcbiAgICAgICAgcmV0dXJuICEhb2JzO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKGFwaVJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgbWV0aG9kIHRvIGNsZWFyIHRoZSBzYXZpbmcgYWZ0ZXIgYWN0aW9ucyBzdGF0ZVxuICAgKiBDYWxsZWQgYnkgc3RlcHBlciBjb21wb25lbnQgYWZ0ZXIgc2F2ZUFwcERhdGFTdGVwIGNvbXBsZXRlc1xuICAgKi9cbiAgcHVibGljIGNsZWFyU2F2aW5nQWZ0ZXJBY3Rpb25zU3RhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNTYXZpbmdBZnRlckFjdGlvbnMpIHtcbiAgICAgIHRoaXMuaXNTYXZpbmdBZnRlckFjdGlvbnMgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cbiAgbG9hZGluZ01lc3NhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBSZWFkcyBWYWxpZGF0aW9uIHN0ZXAgcmVzdWx0cyBmcm9tIGZpbGxEYXRhLCBzZXRzIG1vZGVsIHZhbHVlcyxcbiAgICogYW5kIHJlY2FsY3VsYXRlcyB2aXNpYmxlIHN0ZXBzIHNvIGRlcGVuZGVudHMgYmVjb21lIHZpc2libGUuXG4gICAqL1xuICBwdWJsaWMgYXBwbHlWYWxpZGF0aW9uU3RlcFJlc3VsdHMoZmlsbERhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmICghZmlsbERhdGE/LmZsdXggfHwgIXRoaXMuZmx1eCkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5mbHV4LnNvbWUoKHMpID0+IHMudHlwZSA9PT0gRmx1eFR5cGUuVmFsaWRhdGlvbikpIHJldHVybjtcblxuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBmaWxsZWRTdGVwIG9mIGZpbGxEYXRhLmZsdXgpIHtcbiAgICAgIGNvbnN0IGNvbmZpZ1N0ZXAgPSB0aGlzLmZsdXguZmluZChcbiAgICAgICAgKHMpID0+IHMuaWRlbnRpZmllciA9PT0gZmlsbGVkU3RlcC5zdGVwSWQgJiYgcy50eXBlID09PSBGbHV4VHlwZS5WYWxpZGF0aW9uXG4gICAgICApO1xuICAgICAgaWYgKCFjb25maWdTdGVwKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgZmlsbFZhbHVlSWQgPSBmaWxsZWRTdGVwLnNlY3Rpb25zPy5bMF0/LmNvbnRyb2xzPy5bMF0/LmZpbGxWYWx1ZUlkO1xuICAgICAgaWYgKGZpbGxWYWx1ZUlkICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbnVtZXJpY0lkID0gTnVtYmVyKGZpbGxWYWx1ZUlkKTtcbiAgICAgICAgaWYgKHRoaXMubW9kZWxbY29uZmlnU3RlcC5pZGVudGlmaWVyXT8uaWQgIT09IG51bWVyaWNJZCkge1xuICAgICAgICAgIHRoaXMubW9kZWxbY29uZmlnU3RlcC5pZGVudGlmaWVyXSA9IHsgaWQ6IG51bWVyaWNJZCB9O1xuICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXAgPSB0aGlzLmdldEZvcm1seUZpbHRlcmVkU3RlcHMoKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkU3RlcHNJZGVudGlmaWVycyA9IHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXAubWFwKFxuICAgICAgICAoZikgPT4gZi5wcm9wcz8uWydzdGVwSWQnXVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHZpc2libGVTdGVwcyA9IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZmlsdGVyVmlzaWJsZVN0ZXBzKFxuICAgICAgICB0aGlzLmZsdXgsIGZpbHRlcmVkU3RlcHNJZGVudGlmaWVyc1xuICAgICAgKTtcbiAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgICB0aGlzLnZpc2libGVGaWVsZHNVcGRhdGVkLmVtaXQodmlzaWJsZVN0ZXBzKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImxvYWRpbmctb3ZlcmxheVwiPlxuICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cbjwvZGl2PlxuPGRpdiBbaGlkZGVuXT1cImlzTG9hZGluZ1wiPlxuICA8ZGl2ICpuZ0lmPVwic2hvd0xhbmd1YWdlU2VsZWN0b3JcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwicmlnaHQtYWxpZ25lZFwiPlxuICAgIDxidXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImZsYWdzXCIgbWF0LWljb24tYnV0dG9uIGNsYXNzPVwibS1yLTVcIj5cbiAgICAgIDxpbWdcbiAgICAgICAgW3NyY109XCJyZXR1cm5GTGFnKGN1cnJlbnRMYW5ndWFnZUlzbylcIlxuICAgICAgICBjbGFzcz1cInJvdW5kZWQtY2lyY2xlIG9iamVjdC1jb3ZlciBpY29uLTIwXCJcbiAgICAgIC8+XG4gICAgPC9idXR0b24+XG4gICAgPG1hdC1tZW51ICNmbGFncz1cIm1hdE1lbnVcIiBjbGFzcz1cImNhcmRXaXRoU2hhZG93XCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgKm5nRm9yPVwibGV0IGxhbmcgb2YgYXBwbGljYXRpb25MYW5ndWFnZXMoKVwiXG4gICAgICAgIChjbGljayk9XCJjaGFuZ2VMYW5ndWFnZShsYW5nLmlzbylcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgIFtzcmNdPVwicmV0dXJuRkxhZyhsYW5nLmlzbylcIlxuICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLWNpcmNsZSBvYmplY3QtY292ZXIgaWNvbi0yMFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdC1zdWJ0aXRsZS0xIGYtcy0xNFwiPnt7IGxhbmcubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L21hdC1tZW51PlxuICA8L2Rpdj5cblxuICA8YnIgLz5cbiAgPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCI+XG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cInN1Ym1pdCgpXCI+XG4gICAgICA8Zm9ybWx5LWZvcm1cbiAgICAgICAgW21vZGVsXT1cIm1vZGVsXCJcbiAgICAgICAgW2ZpZWxkc109XCJmb3JtbHlDb25maWdcIlxuICAgICAgICBbb3B0aW9uc109XCJvcHRpb25zXCJcbiAgICAgICAgW2Zvcm1dPVwiZm9ybVwiXG4gICAgICA+PC9mb3JtbHktZm9ybT5cbiAgICA8L2Zvcm0+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
2752
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2luLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvb3JpZ2luLWZvcm0vc3JjL2xpYi9vcmlnaW4tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9vcmlnaW4tZm9ybS9zcmMvbGliL29yaWdpbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBSU4sWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxXQUFXLEVBR1osTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsT0FBTyxFQUNQLGNBQWMsRUFDZCxTQUFTLEVBQ1QsUUFBUSxFQUdSLFVBQVUsRUFDVixFQUFFLEVBQ0YsU0FBUyxFQUVULEdBQUcsRUFDSCxZQUFZLEVBQ1osSUFBSSxFQUNMLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBTy9DLE9BQU8sRUFLTCxRQUFRLEVBQ1IsYUFBYSxFQUNiLGVBQWUsRUFDZixzQkFBc0IsRUFHdkIsTUFBTSxzQkFBc0IsQ0FBQztBQUs5QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFZLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBVWpELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBUWxFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBS0wsdUJBQXVCLEVBR3hCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPMUMsTUFBTSxPQUFPLHNCQUFzQjtJQTBHakMsWUFDVSxPQUEwQixFQUMxQixLQUF3QixFQUN4QixRQUFtQixFQUMzQixLQUFtQixFQUNYLFlBQTBCLEVBQzFCLHNCQUE4QyxFQUM5QyxXQUE0QixFQUM1QixXQUFrQyxFQUNsQyxZQUEwQixFQUMxQixhQUE0QixFQUM1QixrQkFBc0MsRUFDdEMsK0JBQWdFLEVBQ2hFLGlCQUFvQyxFQUNwQyxvQkFBMEM7UUFiMUMsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFDMUIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUVuQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixnQkFBVyxHQUFYLFdBQVcsQ0FBdUI7UUFDbEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxvQ0FBK0IsR0FBL0IsK0JBQStCLENBQWlDO1FBQ2hFLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQXpHM0Msb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDakMseUJBQW9CLEdBQVksSUFBSSxDQUFDO1FBQ3JDLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUl6QixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQVMxQyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQy9DLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDL0MsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNoRCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFOUIsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXJELFNBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixpQkFBWSxHQUF3QixFQUFFLENBQUM7UUFDdkMsbUJBQWMsR0FBd0IsRUFBRSxDQUFDO1FBQ3pDLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFFZixZQUFPLEdBQXNCLEVBQUUsQ0FBQztRQUNoQyxjQUFTLEdBQVksSUFBSSxDQUFDO1FBRTFCLGtCQUFhLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdEQsMEJBQXFCLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdkQsb0JBQWUsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUM5Qyw2QkFBd0IsR0FBb0IsRUFBRSxDQUFDO1FBQy9DLGtDQUE2QixHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXpFLDhCQUE4QjtRQUN0Qix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IsNEJBQXVCLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUQseUJBQW9CLEdBQUcsS0FBSyxDQUFDLENBQUMsNENBQTRDO1FBUTFFLG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBQzVCLGVBQVUsR0FBVyxFQUFFLENBQUM7UUFDeEIsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQ3RDLG1DQUFtQztRQUM1QixrQkFBYSxHQUFVO1lBQzVCO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUU7YUFDcEI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsUUFBUTtnQkFDbEIsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFO2FBQ3BCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRTthQUNwQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxVQUFVO2dCQUNwQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsVUFBVSxDQUFDLEVBQUU7YUFDcEI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsSUFBSSxFQUFFLFVBQVUsQ0FBQyxFQUFFO2FBQ3BCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxVQUFVLENBQUMsRUFBRTthQUNwQjtTQUNGLENBQUM7UUFJRixVQUFLLEdBQUcsSUFBSSxDQUFDO1FBcTJHYixtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFuMUduQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFFeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ2hDLE1BQU0sWUFBWSxHQUNoQixJQUFJLENBQUMsK0JBQStCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3BFLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVyRCxNQUFNLHFCQUFxQixHQUN6QixJQUFJLENBQUMsK0JBQStCLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUNoRSxLQUFLLEVBQUUsTUFBdUIsRUFBRSxFQUFFO1lBQ2hDLElBQUksTUFBTSxDQUFDLG1CQUFtQixLQUFLLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3BELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNuQixPQUFPLENBQUMsR0FBRyxDQUNULDhEQUE4RCxFQUM5RCxNQUFNLENBQUMsSUFBSSxDQUNaLENBQUM7b0JBQ0YsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ2hCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNqRCxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNoRCxDQUFDO29CQUVELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3RDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLENBQUMsS0FBSyxDQUNYLDhDQUE4QyxFQUM5QyxNQUFNLENBQUMsS0FBSyxDQUNiLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztRQUNKLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUU5RCw0Q0FBNEM7UUFDNUMsTUFBTSxrQkFBa0IsR0FDdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQzlELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUM7WUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUNMLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVyRCxNQUFNLGtCQUFrQixHQUN0QixJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBQ0Qsc0ZBQXNGO1FBQ3hGLENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNaLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUMvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FDdkQsQ0FBQztZQUNGLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FDeEMsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FDbkIsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLENBQUM7UUFFRCxJQUNFLElBQUksQ0FBQyxlQUFlO1lBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztZQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFDakMsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQy9ELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FDbEMsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckUsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNsRSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDO1FBQ3RFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2Qiw0RUFBNEU7WUFDNUUsTUFBTSxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBc0I7UUFDdEMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzFFLElBQ0UsSUFBSSxDQUFDLGVBQWU7Z0JBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSztnQkFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQ2pDLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQy9ELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FDbEMsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFDRSxPQUFPLENBQUMsb0JBQW9CLENBQUM7WUFDN0IsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxXQUFXLEVBQzFDLENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUV0QixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUM3QixNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ2xFLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDOzRCQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzt3QkFDdkMsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUM7d0JBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUN4RCxJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO3dCQUNGLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzs0QkFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDN0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQzs0QkFDbkQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQ0FDcEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQzs0QkFDNUQsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNwRCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3ZCLDRFQUE0RTtnQkFDNUUsTUFBTSxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztZQUN6QyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNqQixDQUFDO29CQUFTLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FDWixNQUFNLGNBQWMsQ0FDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQzVELENBQUM7WUFDSixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMzRSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEQsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUztRQUNiLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sVUFBVSxDQUFDLFFBQWdCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDO0lBQ2xFLENBQUM7SUFFRCxjQUFjLENBQUMsTUFBYztRQUMzQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxzQkFBc0I7YUFDeEIsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2FBQ3pELFNBQVMsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFDRCxlQUFlLENBQUMsV0FBbUI7UUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDM0MsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssV0FBVyxDQUNuQyxDQUFDO1FBQ0YsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQjtRQUM1QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFFRCxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUM3QyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdEIsdUVBQXVFO1FBQ3ZFLE1BQU0sSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFFekMscURBQXFEO1FBQ3JELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTlCLHVFQUF1RTtRQUN2RSxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDO1FBQy9DLENBQUM7UUFFRCxzREFBc0Q7UUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLHFCQUFxQixDQUFDLG9CQUFvQixDQUNyRCxJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFcEMsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7YUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQzthQUNqQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQWEsRUFBRSxFQUFFLENBQ3RDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUN6QyxDQUFDO0lBQ04sQ0FBQztJQUVPLHFCQUFxQixDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBYTtRQUNwRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FDakQsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7UUFDRixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLGlCQUFpQixFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQ2pELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUMsS0FBSyxHQUFHLENBQ2pFLENBQUM7WUFDRixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ3ZCLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDZixRQUFRLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ3pCLEtBQUssU0FBUzs0QkFDWixLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzs0QkFDMUMsTUFBTTt3QkFFUjs0QkFDRSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQztnQ0FDNUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQzdDLENBQUMsV0FBZ0MsRUFBRSxFQUFFLENBQ25DLFdBQVcsQ0FBQyxVQUFVLEtBQUssaUJBQWlCLENBQy9DLENBQUM7Z0NBQ0YsS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUNqRCxDQUFDO2lDQUFNLENBQUM7Z0NBQ04sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDcEIsQ0FBQzs0QkFDRCxNQUFNO29CQUNWLENBQUM7b0JBQ0QsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzdCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFELElBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7b0JBQ2IsQ0FBQyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUNqRCxDQUFDO29CQUNELElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO29CQUNoRSxJQUFJLHdCQUF3QixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDaEUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FDM0IsQ0FBQztvQkFDRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQzVELElBQUksQ0FBQyxJQUFJLEVBQ1Qsd0JBQXdCLENBQ3pCLENBQUM7b0JBQ0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQzFCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQzdDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbEMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFNBQVM7UUFDZixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFlBQVk7aUJBQ2QsU0FBUyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUM7aUJBQ3pDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8scUNBQXFDO1FBQzNDLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFcEQsMEVBQTBFO1FBQzFFLE1BQU0sb0JBQW9CLEdBQXdCLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSTtZQUNuRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJO2lCQUNmLE9BQU8sQ0FBQyxDQUFDLElBQXlDLEVBQUUsRUFBRSxDQUNyRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQTRCLEVBQUUsRUFBRSxDQUNyRCxPQUFPLENBQUMsUUFBUTtpQkFDYixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQztpQkFDM0QsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7Z0JBQzVCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztnQkFDNUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO2FBQ2pDLENBQUMsQ0FBQyxDQUNOLENBQ0Y7aUJBQ0EsTUFBTSxDQUNMLENBQ0UsVUFBZ0MsRUFDaEMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBTyxFQUMxQyxFQUFFO2dCQUNGLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7d0JBQ3ZELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxDQUFDO3dCQUM1RCxJQUFJLEtBQUssRUFBRSxDQUFDOzRCQUNWLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQzlDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLGlCQUFpQixDQUN6QyxDQUFDOzRCQUNGLElBQUksV0FBVyxFQUFFLENBQUM7Z0NBQ2hCLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO2dDQUMxQyxNQUFNOzRCQUNSLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7cUJBQU0sQ0FBQztvQkFDTixVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDO2dCQUNwQyxDQUFDO2dCQUNELE9BQU8sVUFBVSxDQUFDO1lBQ3BCLENBQUMsRUFDRCxFQUF5QixDQUMxQjtZQUNMLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFUCw4RUFBOEU7UUFDOUUsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUM7UUFFbkQsb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNDLElBQUksQ0FBQztnQkFDSCxjQUFjO29CQUNaLE9BQU8sSUFBSSxDQUFDLGNBQWMsS0FBSyxRQUFRO3dCQUNyQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO3dCQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUM1QixDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3JELENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLElBQVMsRUFBRSxTQUFtQixFQUFFLEVBQUU7WUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN6QixvQkFBb0IsQ0FBQyxrQkFBa0IsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNyRSxDQUFDO2dCQUNELE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FDMUIsaUJBQWlCLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FDdEQsQ0FBQztnQkFDRixPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDOUIsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FDOUMsQ0FBQztnQkFDRixPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDekIsb0JBQW9CLENBQUMsa0JBQWtCLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixJQUFJLGNBQWMsS0FBSyxJQUFJLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELGlCQUFpQixDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsdUNBQXVDO1FBQ3ZDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDO1FBQ3ZELElBQUksZUFBZSxJQUFJLE9BQU8sZUFBZSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzNELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQzNELElBQUksYUFBa0IsQ0FBQztnQkFDdkIsSUFDRSxPQUFPLEtBQUssS0FBSyxRQUFRO29CQUN6QixLQUFLLEtBQUssSUFBSTtvQkFDZCxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUNwQixLQUFhLENBQUMsY0FBYyxFQUM3QixDQUFDO29CQUNELHlEQUF5RDtvQkFDekQsTUFBTSxRQUFRLEdBQUcsS0FBWSxDQUFDO29CQUM5QixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO29CQUUzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDM0Qsd0VBQXdFO3dCQUN4RSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO3dCQUN0RCxNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUM7d0JBQ25DLEtBQUssTUFBTSxPQUFPLElBQUksWUFBWSxFQUFFLENBQUM7NEJBQ25DLE1BQU0sU0FBUyxHQUNiLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDOzRCQUNoRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQ0FDcEQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLENBQUM7Z0NBQzdELElBQUksRUFBRSxFQUFFLENBQUM7b0NBQ1AsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FDNUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksaUJBQWlCLENBQzlDLENBQUM7b0NBQ0YsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQ0FDbEQsTUFBTTtnQ0FDUixDQUFDOzRCQUNILENBQUM7d0JBQ0gsQ0FBQzt3QkFDRCxhQUFhOzRCQUNYLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQ0FDdEIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dDQUMxQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUM5QyxDQUFDO3lCQUFNLENBQUM7d0JBQ04sZ0JBQWdCO3dCQUNoQixhQUFhLEdBQUcsUUFBUSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3RELENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLENBQUM7Z0JBQ0Qsb0JBQW9CLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQztnQkFDekQsSUFBSSxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDNUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDO2dCQUM1QyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7SUFDbkQsQ0FBQztJQUNPLG9CQUFvQjtRQUMxQixNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FDakQsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7UUFDRixPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFDTyxLQUFLLENBQUMsc0JBQXNCO1FBQ2xDLElBQUksQ0FBQyxhQUFhLEdBQUc7WUFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUMvQixDQUFDLENBQUMsS0FBSztnQkFDUCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlO1lBQ3BDLFVBQVUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWTtZQUN4RSxZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWU7Z0JBQ2hDLENBQUMsQ0FBQyxLQUFLO2dCQUNQLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVk7WUFDakMsZUFBZSxFQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZTtnQkFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLElBQUksS0FBSztnQkFDcEMsQ0FBQyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFDLEtBQUs7U0FDWixDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQzlELElBQUksMkJBQTJCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3hELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMscUJBQXFCLENBQUMsRUFBRSxxQkFBcUIsQ0FDL0QsQ0FBQztRQUVGLElBQUksbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDeEQsSUFBSSx3QkFBd0IsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQ3BELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQzNCLENBQUM7UUFDRiwrQ0FBK0M7UUFDL0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRSxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FDcEUsSUFBSSxDQUFDLElBQUksRUFDVCx3QkFBd0IsQ0FDekIsQ0FBQztRQUVGLElBQUksQ0FBQyxZQUFZLEdBQUc7WUFDbEI7Z0JBQ0UsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsS0FBSyxFQUFFO29CQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUTt3QkFDdEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVM7d0JBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVztvQkFDcEIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO29CQUNuQixhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlO29CQUM1QyxJQUFJLEVBQUUsWUFBWSxFQUFFLHFDQUFxQztvQkFDekQsWUFBWSxFQUFFLG9CQUFvQjtvQkFDbEMsYUFBYSxFQUFFLElBQUksQ0FBQyxlQUFlO29CQUNuQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7b0JBQ3ZCLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztvQkFDbkMsZUFBZSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGVBQWU7b0JBQzFELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDckIsWUFBWSxFQUFFO3dCQUNaLHVCQUF1QixFQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyx1QkFBdUI7d0JBQzlDLHlCQUF5QixFQUN2QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUI7cUJBQ2pEO29CQUNELGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtvQkFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUTtvQkFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVO29CQUN6QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBQ3JCLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTtvQkFDckMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtvQkFDekMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO29CQUNiLDJCQUEyQixFQUFFLDJCQUEyQjtvQkFDeEQsY0FBYyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDdEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FDMUMsRUFBRSxxQ0FBcUM7b0JBQ3hDLGVBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUMxQyxzQkFBc0IsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQ3hDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7b0JBQ3BDLHFCQUFxQixFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDdkMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQztpQkFDcEM7Z0JBQ0QsVUFBVSxFQUFFLG1CQUFtQjthQUNoQztTQUNGLENBQUM7UUFFRixzRUFBc0U7UUFDdEUsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDN0QsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNuRCxJQUFJLENBQUMsdUNBQXVDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFDLGNBQW1CO1FBQ3RELElBQUksU0FBaUIsQ0FBQztRQUN0QixJQUFJLE9BQWUsQ0FBQztRQUNwQixJQUFJLFFBQVEsR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFcEMsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN2QyxPQUFPLEdBQUcsY0FBYyxDQUFDO1lBQ3pCLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzlCLENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDaEMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDNUIsUUFBUSxHQUFHLGNBQWMsQ0FBQyxRQUFRLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRUQsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBRTVCLElBQUksT0FBTyxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsK0RBQStELENBQ2hFLENBQUM7WUFDRixlQUFlO2dCQUNiLE1BQU0sSUFBSSxDQUFDLGtDQUFrQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdELENBQUM7YUFBTSxJQUFJLE9BQU8sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDakUsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO1FBRTFCLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixRQUFRLEVBQUUsQ0FBQztRQUNiLENBQUM7UUFFRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLHlCQUF5QjtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUQsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLGtCQUFrQixHQUN0QixJQUFJLENBQUMsaUJBQWlCLENBQUMsb0NBQW9DLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpFLElBQUksa0JBQWtCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsQ0FDVCxnQkFBZ0Isa0JBQWtCLENBQUMsTUFBTSxpREFBaUQsQ0FDM0YsQ0FBQztRQUVGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUM1RCxrQkFBa0IsRUFDbEIsSUFBSSxDQUFDLFdBQVcsRUFDaEIsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDUCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQzlDLDRCQUE0QixFQUM1QixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLElBQUksSUFBSSxDQUFDO1lBQy9DLENBQUMsQ0FDRixDQUFDO1lBRUYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsOENBQThDLENBQUMsQ0FBQztZQUM5RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEUsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRSxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQ0FBa0MsQ0FDOUMsZ0JBQXdCO1FBRXhCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDOUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN6QyxJQUNFLENBQUMsQ0FBQyxtQkFBbUI7Z0JBQ3JCLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsRUFDM0MsQ0FBQztnQkFDRCxNQUFNLFVBQVUsR0FDZCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO2dCQUNoRSx1REFBdUQ7Z0JBQ3ZELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUM5QixPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2dCQUNELE1BQU0sYUFBYSxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUM7Z0JBQ3JDLElBQ0UsYUFBYTtvQkFDYixDQUFDLENBQUMsbUJBQW1CLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUMvRCxDQUFDO29CQUNELE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FDOUQsYUFBYSxFQUNiLGdCQUFnQixDQUNqQixDQUFDO1FBRUYsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELDhDQUE4QztZQUM5QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBRXRCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUM1RCxXQUFXLEVBQ1gsSUFBSSxDQUFDLFdBQVcsRUFDaEIsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDUCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQzlDLDRCQUE0QixFQUM1QixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLElBQUksSUFBSSxDQUFDO1lBQy9DLENBQUMsQ0FDRixDQUFDO1lBRUYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0NBQXNDLENBQUMsQ0FBQztnQkFDcEQsK0VBQStFO2dCQUMvRSxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztnQkFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxLQUFhO1FBQ3pDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsdUNBQXVDLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFM0QscUJBQXFCLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRU8sdUNBQXVDLENBQUMsRUFBUTtRQUN0RCxFQUFFLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFO1lBQ2xDLElBQUksRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNuRCxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ2pELElBQUksYUFBYSxFQUFFLENBQUM7b0JBQ2xCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDeEQsRUFBRSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7Z0JBQ3hCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztvQkFDbEUsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO3dCQUN4QixNQUFNLEtBQUssR0FDVCxJQUFJLENBQUMsNkJBQTZCLENBQUMsbUJBQW1CLENBQUMsQ0FBQzt3QkFDMUQsSUFBSSxLQUFLLEVBQUUsQ0FBQzs0QkFDViw4Q0FBOEM7NEJBQzlDLE1BQU0sYUFBYSxHQUNqQixLQUFLLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQzs0QkFDakUsTUFBTSxXQUFXLEdBQ2YsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7NEJBRTNELElBQ0UsYUFBYTtnQ0FDYixLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztnQ0FDNUIsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ3hCLENBQUM7Z0NBQ0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQ0FDdEQsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO2dDQUNuQyxLQUFLLE1BQU0sT0FBTyxJQUFJLGFBQWEsRUFBRSxDQUFDO29DQUNwQyxNQUFNLGNBQWMsR0FDbEIsT0FBTyxPQUFPLEtBQUssUUFBUTt3Q0FDekIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO3dDQUN2QixDQUFDLENBQUMsT0FBTyxDQUFDO29DQUNkLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7d0NBQ3ZELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUM3QixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxjQUFjLENBQy9CLENBQUM7d0NBQ0YsSUFBSSxLQUFLLEVBQUUsQ0FBQzs0Q0FDVixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUM5QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxpQkFBaUIsQ0FDekMsQ0FBQzs0Q0FDRixhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDOzRDQUNyRCxNQUFNO3dDQUNSLENBQUM7b0NBQ0gsQ0FBQztnQ0FDSCxDQUFDO2dDQUNELElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQ0FDN0IsRUFBRSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dDQUM3QyxDQUFDOzRCQUNILENBQUM7aUNBQU0sSUFDTCxXQUFXO2dDQUNYLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO2dDQUMxQixXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDdEIsQ0FBQztnQ0FDRCwwQ0FBMEM7Z0NBQzFDLEVBQUUsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDM0MsQ0FBQztpQ0FBTSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQ0FDN0IsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQ0FDdEQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztvQ0FDdkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQzdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQ2pDLENBQUM7b0NBQ0YsSUFBSSxLQUFLLEVBQUUsQ0FBQzt3Q0FDVixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUM5QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsSUFBSSxpQkFBaUIsQ0FDekMsQ0FBQzt3Q0FDRixJQUFJLFdBQVcsRUFBRSxDQUFDOzRDQUNoQixFQUFFLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7NENBQ3BDLE1BQU07d0NBQ1IsQ0FBQztvQ0FDSCxDQUFDO2dDQUNILENBQUM7NEJBQ0gsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLEVBQUUsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQzs0QkFDcEMsQ0FBQzt3QkFDSCxDQUFDOzZCQUFNLENBQUM7NEJBQ04sZ0RBQWdEOzRCQUNoRCxJQUFJLGFBQWEsR0FDZixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOzRCQUNuRCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQ0FDaEMsSUFDRSxPQUFPLGFBQWEsS0FBSyxRQUFRO29DQUNqQyxhQUFhLEtBQUssSUFBSTtvQ0FDdEIsYUFBYSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQ3JDLENBQUM7b0NBQ0QsYUFBYSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUM7Z0NBQzFDLENBQUM7Z0NBQ0QsRUFBRSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUM7NEJBQ2xDLENBQUM7aUNBQU0sQ0FBQztnQ0FDTixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQ0FDOUQsRUFBRSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7NEJBQ3hCLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLHVDQUF1QyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFDRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sNkJBQTZCLENBQUMsU0FBaUI7UUFDckQsSUFBSSxXQUFXLEdBQVEsU0FBUyxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNyQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ2pCLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7d0JBQzdCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs0QkFDakIsV0FBVyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUM1QixDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQ3RDLENBQUM7NEJBQ0YsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQ0FDaEIsT0FBTyxXQUFXLENBQUM7NEJBQ3JCLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVPLHVCQUF1QixDQUFDLE9BQWU7UUFDN0MsSUFBSSxVQUFVLEdBQVEsU0FBUyxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUMzQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2hCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7d0JBQzlCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzs0QkFDaEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRCQUNsQyxJQUFJLEtBQUssRUFBRSxDQUFDO2dDQUNWLFVBQVUsR0FBRyxLQUFLLENBQUM7NEJBQ3JCLENBQUM7d0JBQ0gsQ0FBQztvQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzNDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztnQkFDOUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FDckIscUJBQXFCLENBQ0ssQ0FBQztnQkFDN0IsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7b0JBQzdDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7b0JBQ25FLHVEQUF1RDtvQkFDdkQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7d0JBQzlCLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBQ0QsTUFBTSxhQUFhLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQztvQkFDckMsSUFDRSxhQUFhO3dCQUNiLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQ2pELENBQUM7d0JBQ0QsT0FBTyxJQUFJLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxLQUFLLENBQUMsMEJBQTBCO1FBQ3RDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxFQUFFLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqQyxDQUFDO2FBQU0sQ0FBQztZQUNOLDZDQUE2QztZQUM3QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFFLE9BQU8sTUFBTSxPQUFPLENBQUMsR0FBRyxDQUN0QixZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FDVCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsMkJBQTJCLENBQ3ZDLElBQWM7UUFFZCxJQUFJLGdCQUFnQixHQUFzQixFQUFFLENBQUM7UUFFN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEUsZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkUsQ0FBQzthQUFNLENBQUM7WUFDTixnQkFBZ0IsR0FBRztnQkFDakIsS0FBSyxFQUFFO29CQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDaEIsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUN0QixPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7b0JBQzVDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7b0JBQzdDLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtpQkFDeEI7Z0JBQ0QsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ3pFLENBQUM7WUFFRixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDdEIsZ0JBQWdCLENBQUMsS0FBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FDMUQsTUFBTSxFQUNOLElBQUksQ0FBQyxZQUFZLEVBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztnQkFDRixnQkFBZ0IsQ0FBQyxLQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUNoRSxhQUFhLEVBQ2IsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUNsQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsMkJBQTJCLENBQ3JELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0lBRUQsc0JBQXNCLENBQUMsU0FBaUIsRUFBRSxLQUFVO1FBQ2xELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsbUJBQW1CLENBQ2pCLE1BQXVDLEVBQ3ZDLEdBQVcsRUFDWCxLQUFVO1FBRVYsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEtBQUssQ0FBQztRQUUxQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDdEIsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3RCLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUN2RCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3JFLElBQUksS0FBSztvQkFBRSxPQUFPLElBQUksQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLEtBQUssQ0FBQyw0QkFBNEIsQ0FDeEMsSUFBYztRQUVkLE1BQU0sWUFBWSxHQUFzQjtZQUN0QyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNoQixPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQzVDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSTthQUNwQjtZQUNELFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQztRQUVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTNELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksTUFBTSxHQUFRLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFtQixFQUFFLEVBQUU7b0JBQ2hELE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FDckMsRUFBRSxDQUFDLE1BQU0sRUFDVCxJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsV0FBVyxDQUFDLEtBQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ3RDLFdBQVcsQ0FBQyxLQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUNwRCxNQUFNLEVBQ04sSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO2dCQUNGLFdBQVcsQ0FBQyxLQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUMzRCxhQUFhLEVBQ2IsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO2dCQUNGLFlBQVksQ0FBQyxLQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUN0RCxNQUFNLEVBQ04sSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO2dCQUNGLFlBQVksQ0FBQyxLQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLG1CQUFtQixDQUM1RCxhQUFhLEVBQ2IsSUFBSSxDQUFDLFlBQVksRUFDakIsSUFBSSxDQUFDLGtCQUFrQixDQUN4QixDQUFDO1lBQ0osQ0FBQztZQUNELFdBQVcsQ0FBQyxLQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN6RCxZQUFZLENBQUMsVUFBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLElBQWMsRUFBRSxZQUErQjtRQUN0RSxJQUFJLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDdkMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzNDLFlBQVksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUMvQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDakQsWUFBWSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLElBQWM7UUFDMUMsT0FBTztZQUNMLElBQUksRUFBRSx1QkFBdUI7WUFDN0IsS0FBSyxFQUFFO2dCQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNmLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDckIsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLO2dCQUMxQixLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQVUsRUFBRSxFQUFFO29CQUMxQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDeEIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDbEMsQ0FBQztnQkFDSCxDQUFDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLDZCQUE2QixDQUNuQyxXQUF3QjtRQUV4QixPQUFPO1lBQ0wsSUFBSSxFQUFFLHFDQUFxQztZQUMzQyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDcEMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUMzQixXQUFXLEVBQUUsV0FBVztnQkFDeEIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVM7Z0JBQ3RDLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCO2FBQ2pDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyx5QkFBeUIsQ0FDL0IsV0FBd0I7UUFFeEIsT0FBTztZQUNMLElBQUksRUFBRSxpQ0FBaUM7WUFDdkMsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWU7Z0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDYixhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTO2dCQUN0QyxPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjthQUNqQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sMkJBQTJCLENBQ2pDLFdBQXdCO1FBRXhCLE9BQU87WUFDTCxJQUFJLEVBQUUsbUNBQW1DO1lBQ3pDLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlO2dCQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzNCLFdBQVcsRUFBRSxXQUFXO2dCQUN4QixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUztnQkFDdEMsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7YUFDakM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLDZCQUE2QixDQUFDLElBQWM7UUFDbEQsT0FBTztZQUNMLElBQUksRUFBRSxxQ0FBcUM7WUFDM0MsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWU7Z0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUztnQkFDdEMsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ2hDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBVSxFQUFFLEVBQUU7b0JBQzFCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUN4QixNQUFNLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUNsQyxDQUFDO2dCQUNILENBQUM7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQjtRQUN0QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xFLElBQUksZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzRCxNQUFNLGdCQUFnQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFTywyQkFBMkIsQ0FBQyxJQUFjO1FBQ2hELElBQUksTUFBTSxHQUFRLEVBQUUsQ0FBQztRQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2QyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxDQUFDLEdBQUcsQ0FBQztvQkFDVCxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FDckIsQ0FBQyxDQUEwQixFQUFFLEVBQUUsQ0FDN0IsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQzVDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPO1lBQ0wsSUFBSSxFQUFFLDZCQUE2QjtZQUNuQyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDcEMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLFFBQVEsRUFBRSxJQUFJO2dCQUNkLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCO2FBQ2pDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFDTyx1QkFBdUIsQ0FBQyxJQUFjO1FBQzVDLElBQUksYUFBYSxHQUFRLEVBQUUsQ0FBQztRQUU1QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtnQkFDN0MsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUMvQyxLQUFLLENBQUMsWUFBWSxFQUNsQixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCwwQ0FBMEM7UUFDMUMsSUFBSSxNQUFNLEdBQVEsRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN2QyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDcEUsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUN2QyxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUM3QixDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FDNUMsRUFBRSxLQUFLLENBQUM7b0JBQ1QsSUFBSSxVQUFVLEVBQUUsQ0FBQzt3QkFDZixNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsVUFBVSxDQUFDO29CQUNoQyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPO1lBQ0wsSUFBSSxFQUFFLGdCQUFnQjtZQUN0QixLQUFLLEVBQUU7Z0JBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ25CLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDdkIsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtnQkFDbkQsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDcEMsYUFBYSxFQUFFLGFBQWE7Z0JBQzVCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLEtBQUssRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7YUFDM0Q7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLG9CQUFvQixDQUFDLElBQWM7UUFDekMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FDcEQsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssNEJBQTRCLENBQ3BELENBQUM7UUFFRixNQUFNLHdCQUF3QixHQUM1QixzQkFBc0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUNsQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQ3RELEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUVqQixPQUFPO1lBQ0wsSUFBSSxFQUFFLGlDQUFpQztZQUN2QyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUNwQixPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsR0FBRyxFQUFFLFFBQVEsRUFBRSx5Q0FBeUM7Z0JBQ3hELFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYTtnQkFDL0IsWUFBWSxFQUFFLEVBQUU7Z0JBQ2hCLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDekIseUJBQXlCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtnQkFDbEQsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhO2dCQUMvQixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLElBQUksQ0FBQztnQkFDM0MsY0FBYyxFQUFFLHdCQUF3QjtnQkFDeEMsWUFBWSxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLHdCQUF3QixDQUFDO29CQUMvQyxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxxQkFBcUIsQ0FDOUQsSUFBSSxDQUFDLFdBQVcsQ0FDakIsQ0FBQztnQkFDSixDQUFDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLDJCQUEyQixDQUFDLElBQWM7UUFDaEQsT0FBTztZQUNMLElBQUksRUFBRSw4QkFBOEI7WUFDcEMsS0FBSyxFQUFFO2dCQUNMLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQVUsRUFBRSxFQUFFO29CQUMxQixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDeEIsTUFBTSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDbEMsQ0FBQztnQkFDSCxDQUFDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLDBCQUEwQixDQUFDLElBQWM7UUFDL0MsT0FBTztZQUNMLElBQUksRUFBRSxvQkFBb0I7WUFDMUIsS0FBSyxFQUFFO2dCQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ2hDLEtBQUssRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO2FBQ3pEO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxJQUFjO1FBQzNDLE9BQU87WUFDTCxJQUFJLEVBQUUsb0JBQW9CO1lBQzFCLEtBQUssRUFBRTtnQkFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUMzQixRQUFRLEVBQUUsSUFBSTtnQkFDZCxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ2IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjthQUNqQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sNEJBQTRCLENBQUMsSUFBYztRQUNqRCwwREFBMEQ7UUFDMUQscUVBQXFFO1FBQ3JFLE9BQU87WUFDTCxJQUFJLEVBQUUscUJBQXFCO1lBQzNCLEtBQUssRUFBRTtnQkFDTCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUMzQixRQUFRLEVBQUUsSUFBSSxFQUFFLDRDQUE0QztnQkFDNUQsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7Z0JBQ2hDLE1BQU0sRUFBRTtvQkFDTixjQUFjLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FDbkMsSUFBSSxDQUFDLE1BQU0sRUFBRSwwQkFBMEIsSUFBSSxFQUFFLEVBQzdDLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEI7b0JBQ0QsY0FBYyxFQUFFLEtBQUssQ0FBQyxlQUFlLENBQ25DLElBQUksQ0FBQyxNQUFNLEVBQUUsMEJBQTBCLElBQUksRUFBRSxFQUM3QyxJQUFJLENBQUMsa0JBQWtCLENBQ3hCO29CQUNELG1CQUFtQixFQUFFLEtBQUssQ0FBQyxlQUFlLENBQ3hDLElBQUksQ0FBQyxNQUFNLEVBQUUsK0JBQStCLElBQUksRUFBRSxFQUNsRCxJQUFJLENBQUMsa0JBQWtCLENBQ3hCO29CQUNELGlCQUFpQixFQUFFLEtBQUssQ0FBQyxlQUFlLENBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUUsNkJBQTZCLElBQUksRUFBRSxFQUNoRCxJQUFJLENBQUMsa0JBQWtCLENBQ3hCO29CQUNELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxlQUFlLENBQ3JDLElBQUksQ0FBQyxNQUFNLEVBQUUsNEJBQTRCLElBQUksRUFBRSxFQUMvQyxJQUFJLENBQUMsa0JBQWtCLENBQ3hCO2lCQUNGO2dCQUNELEtBQUssRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7YUFDNUQ7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLHVCQUF1QixDQUFDLElBQWM7UUFDNUMsT0FBTztZQUNMLElBQUksRUFBRSxlQUFlO1lBQ3JCLEtBQUssRUFBRTtnQkFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDM0IsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZTthQUNyQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sNkJBQTZCLENBQ25DLElBQWM7UUFFZCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixLQUFLLFFBQVEsQ0FBQyxHQUFHO2dCQUNmLENBQUM7b0JBQ0MsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNwQixLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDckIsa0VBQWtFO2dCQUNsRSxzREFBc0Q7Z0JBQ3RELE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixPQUFPLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsT0FBTyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEQsQ0FBQztZQUNELEtBQUssUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLE9BQU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCxLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNwQixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsS0FBSyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakQsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQVksRUFBRSxJQUFjO1FBQzFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQVUsRUFBRSxJQUFjO1FBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxLQUFVLEVBQUUsSUFBYztRQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLDJDQUEyQztZQUMzQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakMsNEJBQTRCO1lBQzVCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxLQUFVLEVBQUUsSUFBYztRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNyQyxDQUFDLENBQXFCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FDdkQsQ0FBQztRQUNGLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUMzQixDQUFDLENBS0EsRUFBRSxFQUFFO1lBQ0gsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQ2hCLENBQUMsQ0FHQSxFQUFFLEVBQUU7Z0JBQ0gsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sS0FBSyxHQUFHO3dCQUNaLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFOzRCQUNiLEtBQUssRUFBRSxDQUFDLENBQUMsU0FBUzt5QkFDbkI7cUJBQ0YsQ0FBQztvQkFFRixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO3dCQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDOUIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQ2xFLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQyxDQUNGLENBQUM7UUFFRixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELHFCQUFxQixDQUFDLElBQWM7UUFDbEMsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FDcEUsS0FBSyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3ZFLENBQUM7UUFFRixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsZUFBZSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLElBQUksQ0FDckQsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUN2RCxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsZUFBZSxDQUFDLEtBQUssR0FBRztnQkFDdEIsR0FBRyxlQUFlLENBQUMsS0FBSztnQkFDeEIsZUFBZSxFQUFFLEtBQUs7YUFDdkIsQ0FBQztZQUNGLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGNBQWM7UUFDcEIsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLG9CQUFvQixDQUNwRCxJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxlQUFlLENBQ3JCLENBQUM7UUFFRixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxRCxZQUFZLENBQUMsRUFBRSxHQUFHLGNBQWMsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FDdkIsWUFBWSxFQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FDNUQsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELEtBQUssQ0FBQyw0QkFBNEIsQ0FDaEMsSUFBMEIsRUFDMUIsUUFBdUI7UUFFdkIsTUFBTSxZQUFZLEdBQXdCLEVBQUUsQ0FBQztRQUU3QyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxRQUFRLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNqRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsSUFBSSxxQkFBcUIsR0FBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDN0IscUJBQXFCLEdBQUc7b0JBQ3RCLElBQUksRUFBRSxXQUFXO29CQUNqQixLQUFLLEVBQUU7d0JBQ0wsS0FBSyxFQUNILE9BQU8sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUN4QixDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQ3RELEVBQUUsS0FBSyxJQUFJLEVBQUU7d0JBRWhCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtxQkFDcEI7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUNqQyxxQkFBcUIsR0FBRztvQkFDdEIsR0FBRyxxQkFBcUI7b0JBQ3hCLElBQUksRUFBRSxXQUFXO29CQUNqQixLQUFLLEVBQUU7d0JBQ0wsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLO3dCQUM5QixhQUFhLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtxQkFDNUM7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsc0NBQXNDLENBQ3pDLE9BQU8sQ0FBQyxtQkFBbUIsRUFDM0IscUJBQXFCLENBQ3RCLENBQUM7WUFDSixDQUFDO1lBQ0QsTUFBTSxVQUFVLEdBQUcsT0FBYyxDQUFDO1lBQ2xDLG1GQUFtRjtZQUNuRixpRkFBaUY7WUFDakYsd0ZBQXdGO1lBQ3hGLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztZQUNyRixJQUFJLG1CQUFtQixJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDaEQscUJBQXFCLEdBQUc7b0JBQ3RCLEdBQUcscUJBQXFCO29CQUN4QixLQUFLLEVBQUU7d0JBQ0wsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLO3dCQUM5QixnQkFBZ0IsRUFBRSxVQUFVLENBQUMsU0FBUztxQkFDdkM7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFDRCxZQUFZLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFFekMsaUZBQWlGO1lBQ2pGLGdGQUFnRjtZQUNoRixNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyw0QkFBNEIsQ0FDN0QsSUFBSSxFQUNKLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxFQUN0QixPQUFPLENBQUMsb0JBQW9CLElBQUksRUFBRSxFQUNsQyxVQUFVLENBQUMsb0JBQW9CLElBQUksU0FBUyxDQUM3QyxDQUFDO1lBRUYsbUVBQW1FO1lBQ25FLHVFQUF1RTtZQUN2RSxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNqQyxlQUFlLENBQUMsT0FBTyxDQUFDO29CQUN0QixJQUFJLEVBQUUsWUFBWTtvQkFDbEIsU0FBUyxFQUFFLHFCQUFxQjtvQkFDaEMsS0FBSyxFQUFFO3dCQUNMLGVBQWUsRUFBRSxVQUFVLENBQUMsaUJBQWlCO3FCQUM5QztpQkFDRixDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsTUFBTSxtQkFBbUIsR0FBc0I7Z0JBQzdDLElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLEtBQUssRUFBRTtvQkFDTCxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7b0JBQ3BCLFdBQVcsRUFDVCxPQUFPLENBQUMsWUFBWSxFQUFFLElBQUksQ0FDeEIsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUN0RCxFQUFFLEtBQUssSUFBSSxFQUFFO29CQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ25CLHdGQUF3RjtvQkFDeEYsa0ZBQWtGO29CQUNsRixnQkFBZ0IsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDO29CQUN2RixtQkFBbUIsRUFBRSxVQUFVLENBQUMsWUFBWSxJQUFJLFNBQVM7aUJBQzFEO2dCQUNELFVBQVUsRUFBRSxlQUFlO2dCQUMzQixtQkFBbUIsRUFBRSxjQUFjO2FBQ3BDLENBQUM7WUFDRixJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsc0NBQXNDLENBQ3pDLE9BQU8sQ0FBQyxtQkFBbUIsRUFDM0IsbUJBQW1CLENBQ3BCLENBQUM7WUFDSixDQUFDO1lBRUQsWUFBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWU7UUFDbkIsSUFBSSxnQkFBZ0IsR0FBc0IsRUFBRSxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLGdCQUFnQixHQUFHO2dCQUNqQixLQUFLLEVBQUU7Z0JBQ0wsb0JBQW9CO2dCQUNwQixnREFBZ0Q7Z0JBQ2hELGtEQUFrRDtpQkFDbkQ7Z0JBQ0QsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUNqRCxTQUFTLEVBQ1QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQ3RCO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFRCxnQ0FBZ0MsQ0FDOUIsVUFBK0IsRUFDL0IsTUFBeUI7UUFFekIsSUFBSSxNQUFNLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakQsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUVELHdCQUF3QixDQUFDLFVBQStCO1FBQ3RELE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQy9DLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN2QixDQUFDLENBQUMsU0FBUyxHQUFHLE1BQU0sR0FBRyxlQUFlLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsbUJBQTJCO1FBQ2hELE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQjtRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7UUFDcEUsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLElBQUksRUFBRSxDQUFDO1FBRTdDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDeEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QyxLQUFLLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztZQUN4QixLQUFLLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQztZQUNyQixLQUFLLENBQUMsU0FBUyxHQUFHO1dBQ2IsU0FBUzs4QkFDVSxJQUFJOztPQUUzQixDQUFDO1lBQ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFZO1FBQzlCLE9BQU87WUFDTCxJQUFJLEVBQUUsWUFBWTtZQUNsQixTQUFTLEVBQUUsb0JBQW9CLElBQUksRUFBRTtZQUNyQyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsSUFBSSxFQUFFLElBQUk7YUFDWDtTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLDRCQUE0QixDQUN4QyxJQUEwQixFQUMxQixRQUF1QixFQUN2QixvQkFBMkMsRUFDM0MsMEJBQW1DO1FBRW5DLE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7UUFDdkMsSUFBSSxRQUFRLEdBQTBDLEVBQUUsQ0FBQztRQUN6RCxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFdEQsMENBQTBDO1FBQzFDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDL0IsZ0RBQWdEO1lBQ2hELElBQ0UsQ0FBQyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsVUFBVTtnQkFDckMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsY0FBYztnQkFFdEMsT0FBTyxLQUFLLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsS0FBSyxFQUFFLEtBQTRDLEVBQUUsWUFBWSxHQUFHLEtBQUssRUFBRSxFQUFFO1lBQzlGLE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7WUFDdkMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sS0FBSyxHQUF3QixFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEdBR0osRUFBRSxDQUFDO1lBQ1QsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLFlBQVk7Z0JBQ2pELENBQUMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDO2dCQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksNkJBQTZCLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO29CQUNoRCxLQUFLLENBQUMsSUFBSSxDQUNSLE1BQU0sSUFBSSxDQUFDLCtCQUErQixDQUN4QyxJQUFJLEVBQ0osQ0FBd0IsQ0FDekIsQ0FDRixDQUFDO2dCQUNKLENBQUM7cUJBQU0sSUFBSSxhQUFhLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO29CQUN2QyxLQUFLLENBQUMsSUFBSSxDQUNSLE1BQU0sSUFBSSxDQUFDLDRCQUE0QixDQUNyQyxJQUFJLEVBQ0osQ0FBd0IsQ0FDekIsQ0FDRixDQUFDO2dCQUNKLENBQUM7cUJBQU0sQ0FBQztvQkFDTixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxDQUFnQixDQUFDLENBQUMsQ0FBQztnQkFDckUsQ0FBQztZQUNILENBQUM7WUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLENBQUMsYUFBYSxLQUFLLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDakQsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7d0JBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDdEIsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO3dCQUNsRCxJQUFJLElBQUksQ0FBQyxDQUFDO3dCQUNWLENBQUMsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztvQkFDL0QsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksQ0FBQyxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3BELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztvQkFDaEUsSUFBSSxJQUFJLENBQUMsQ0FBQztvQkFDVixDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsQ0FBQztxQkFBTSxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN0QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxJQUFJLENBQUMsQ0FBQztvQkFDVixDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckUsQ0FBQztZQUNILENBQUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ3JCLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksYUFBYSxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzdFLENBQUM7WUFDSCxDQUFDO1lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQUNGLHFGQUFxRjtRQUNyRiwyRkFBMkY7UUFDM0YsSUFBSSwwQkFBMEIsR0FBdUIsMEJBQTBCLENBQUM7UUFDaEYsSUFBSSxxQkFBcUIsR0FBdUIsU0FBUyxDQUFDO1FBQzFELEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLG9CQUFvQixDQUFDLEVBQUUsQ0FBQztZQUN2RCxJQUNFLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xELENBQUMsQ0FBQyxJQUFJLElBQUksdUJBQXVCLENBQUMsTUFBTSxFQUN4QyxDQUFDO2dCQUNELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxFQUFFLEdBQUcscUJBQXFCLENBQUM7b0JBQ2pDLElBQUksRUFBRSxFQUFFLENBQUM7d0JBQ1AsTUFBTSxTQUFTLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUNuRCxNQUFNLENBQUMsSUFBSSxDQUFDOzRCQUNWLElBQUksRUFBRSxhQUFhOzRCQUNuQixTQUFTLEVBQUUscUJBQXFCOzRCQUNoQyxLQUFLLEVBQUUsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFOzRCQUM3QixVQUFVLEVBQUUsU0FBUzt5QkFDdEIsQ0FBQyxDQUFDO29CQUNMLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9DLENBQUM7b0JBQ0QsUUFBUSxHQUFHLEVBQUUsQ0FBQztnQkFDaEIsQ0FBQztnQkFDRCxNQUFNLGFBQWEsR0FBRyxDQUFRLENBQUM7Z0JBQy9CLHFCQUFxQixHQUFHLGFBQWEsQ0FBQyxpQkFBaUIsSUFBSSxTQUFTLENBQUM7Z0JBQ3JFLHdFQUF3RTtnQkFDeEUsdUVBQXVFO2dCQUN2RSxNQUFNLFNBQVMsR0FBRywwQkFBMEIsQ0FBQztnQkFDN0MsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUM7Z0JBQzdELDBCQUEwQixHQUFHLGFBQWEsQ0FBQyxlQUFlLElBQUksU0FBUyxDQUFDO2dCQUN4RSxJQUFJLFNBQVMsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQzt3QkFDVixJQUFJLEVBQUUsWUFBWTt3QkFDbEIsU0FBUyxFQUFFLHFCQUFxQjt3QkFDaEMsS0FBSyxFQUFFOzRCQUNMLGVBQWUsRUFBRSxTQUFTOzRCQUMxQixrQkFBa0IsRUFBRSxZQUFZO3lCQUNqQztxQkFDRixDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLElBQUkscUJBQXFCLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxTQUFTLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNuRCxNQUFNLENBQUMsSUFBSSxDQUFDO29CQUNWLElBQUksRUFBRSxhQUFhO29CQUNuQixTQUFTLEVBQUUscUJBQXFCO29CQUNoQyxLQUFLLEVBQUUsRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUU7b0JBQ2hELFVBQVUsRUFBRSxTQUFTO2lCQUN0QixDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLENBQUM7UUFDSCxDQUFDO1FBQ0Qsa0RBQWtEO1FBQ2xELElBQUksMEJBQTBCLEVBQUUsQ0FBQztZQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUNWLElBQUksRUFBRSxZQUFZO2dCQUNsQixTQUFTLEVBQUUscUJBQXFCO2dCQUNoQyxLQUFLLEVBQUUsRUFBRSxlQUFlLEVBQUUsMEJBQTBCLEVBQUU7YUFDdkQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxtQkFBMkI7UUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE1BQU0sU0FBUyxHQUFHLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLEtBQUssQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxFQUFFLEdBQUcsU0FBUyxDQUFDO1lBQ3JCLEtBQUssQ0FBQyxTQUFTLEdBQUc7V0FDYixTQUFTO21CQUNELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDOzs7T0FHekMsQ0FBQztZQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsY0FBc0I7UUFDdEMsTUFBTSxTQUFTLEdBQUcsZUFBZSxjQUFjLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUMsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7WUFDeEIsS0FBSyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUM7WUFDckIsS0FBSyxDQUFDLFNBQVMsR0FBRztXQUNiLFNBQVM7bUJBQ0QsY0FBYzs7T0FFMUIsQ0FBQztZQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUN2QixJQUEwQixFQUMxQixPQUFvQjtRQUVwQixJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxlQUFlO1FBQzFDLElBQUksaUJBQWlCLEdBQUcsdUJBQXVCLENBQUMsQ0FBQywrQkFBK0I7UUFDaEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVELE1BQU0sa0JBQWtCLEdBQ3RCLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQztxQkFDaEUsTUFBTSxDQUFDO1lBQ1osQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM5QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sNEJBQTRCLEdBQUc7WUFDbkMsdUJBQXVCO1lBQ3ZCLHFCQUFxQjtZQUNyQixrQkFBa0I7WUFDbEIsaUJBQWlCO1lBQ2pCLGlCQUFpQjtZQUNqQix1QkFBdUI7U0FDeEIsQ0FBQztRQUNGLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FDakQsT0FBTyxFQUNQLFdBQVcsRUFDWCxPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLDRCQUE0QixDQUM3QixDQUFDO1FBQ0Ysa0RBQWtEO1FBQ2xELElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsUUFBUSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsS0FBSyxlQUFlLENBQUMsV0FBVyxFQUFFLE9BQU87Z0JBQ3ZDLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUI7b0JBQ3ZDLEVBQUUsSUFBOEIsQ0FBQztnQkFDbkMsUUFBUSxPQUFPLEVBQUUsQ0FBQztvQkFDaEIsS0FBSyxzQkFBc0IsQ0FBQyxPQUFPO3dCQUNqQyxZQUFZLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQzt3QkFFN0IsTUFBTTtvQkFDUixLQUFLLHNCQUFzQixDQUFDLEtBQUssQ0FBQztvQkFDbEMsS0FBSyxzQkFBc0IsQ0FBQyxJQUFJLENBQUM7b0JBQ2pDLEtBQUssc0JBQXNCLENBQUMsS0FBSzt3QkFDL0IsWUFBWSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7d0JBQzVCLE1BQU07b0JBQ1IsS0FBSyxzQkFBc0IsQ0FBQyxRQUFRO3dCQUNsQyxZQUFZLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQzt3QkFDL0IsWUFBWSxDQUFDLEtBQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7d0JBQ3ZDLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDO3dCQUM1QyxNQUFNO29CQUNSLEtBQUssc0JBQXNCLENBQUMsUUFBUTt3QkFDbEMsWUFBWSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7d0JBQ2pDLFlBQVksQ0FBQyxLQUFLLEdBQUc7NEJBQ25CLFFBQVEsRUFBRSxJQUFJO3lCQUNmLENBQUM7d0JBQ0YsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7d0JBQ3RDLE1BQU07b0JBQ1I7d0JBQ0UsWUFBWSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7d0JBQzVCLGlCQUFpQixHQUFHLHVCQUF1QixDQUFDO3dCQUM1QyxNQUFNO2dCQUNWLENBQUM7Z0JBQ0QsTUFBTTtZQUNSLEtBQUssZUFBZSxDQUFDLFNBQVMsRUFBRSxZQUFZO2dCQUMxQyxZQUFZLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO2dCQUN2QyxpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQztnQkFFNUMsTUFBTSxxQkFBcUIsR0FDekIsT0FBTyxDQUFDLG1CQUFtQixFQUFFLHVCQUF1QixFQUFFLElBQUksQ0FDeEQsQ0FBQyxDQUEwQixFQUFFLEVBQUUsQ0FDN0IsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQzVDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDakIsTUFBTSx3QkFBd0IsR0FDNUIsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQ3hCLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQzdCLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUM1QyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2pCLFlBQVksQ0FBQyxZQUFZLEdBQUcscUJBQXFCLENBQUM7Z0JBQ2xELFlBQVksQ0FBQyxLQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxxQkFBcUIsQ0FBQztnQkFDckUsWUFBWSxDQUFDLEtBQU0sQ0FBQywwQkFBMEIsQ0FBQztvQkFDN0Msd0JBQXdCLENBQUM7Z0JBRTNCLE1BQU07WUFDUixLQUFLLGVBQWUsQ0FBQyxRQUFRLEVBQUUsV0FBVztnQkFDeEMsWUFBWSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztnQkFDdEMsaUJBQWlCLEdBQUcscUJBQXFCLENBQUM7Z0JBQzFDLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLElBQUksS0FBSyxDQUFDO2dCQUM1RCxZQUFZLENBQUMsS0FBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztnQkFDekMsTUFBTTtZQUNSLEtBQUssZUFBZSxDQUFDLFVBQVUsRUFBRSx3QkFBd0I7Z0JBQ3ZELElBQUksT0FBTyxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixLQUFLLElBQUksRUFBRSxDQUFDO29CQUMxRCxpQkFBaUIsR0FBRyxxQkFBcUIsQ0FBQztnQkFDNUMsQ0FBQztxQkFBTSxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDdkUsaUJBQWlCLEdBQUcsa0JBQWtCLENBQUM7Z0JBQ3pDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQztnQkFDOUMsQ0FBQztnQkFDRCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBQ3RELE1BQU07WUFDUixLQUFLLGVBQWUsQ0FBQyxPQUFPO2dCQUMxQixZQUFZLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsTUFBTTtZQUNSLEtBQUssZUFBZSxDQUFDLFFBQVE7Z0JBQzNCLFlBQVksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUN2QixNQUFNO1lBQ1IsS0FBSyxlQUFlLENBQUMsaUJBQWlCO2dCQUNwQyxZQUFZLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzRCxNQUFNO1lBQ1IsS0FBSyxlQUFlLENBQUMsYUFBYTtnQkFDaEMsWUFBWSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdkQsTUFBTTtZQUNSLEtBQUssZUFBZSxDQUFDLGVBQWU7Z0JBQ2xDLFlBQVksR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pELE1BQU07WUFDUixLQUFLLGVBQWUsQ0FBQyxNQUFNLEVBQUUsVUFBVTtnQkFDckMsWUFBWSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU07WUFDUjtnQkFDRSxZQUFZLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztnQkFDNUIsaUJBQWlCLEdBQUcsdUJBQXVCLENBQUM7UUFDaEQsQ0FBQztRQUNELFlBQVksQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7WUFDdkUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztnQkFDbkMsWUFBWSxDQUFDLEtBQU0sQ0FBQyxVQUFXLENBQUMsT0FBTyxDQUFDO29CQUN0QyxHQUFHO3dCQUNILElBQUksQ0FBQyxtQ0FBbUMsQ0FDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUMvQixDQUFDO1lBQ04sQ0FBQztZQUVELHFCQUFxQjtZQUNyQixNQUFNLGFBQWEsR0FBRyxHQUFHLGlCQUFpQixRQUFRLENBQUM7WUFDbkQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLFlBQVksQ0FBQyxLQUFNLENBQUMsVUFBVyxDQUFDLE9BQU8sQ0FBQztvQkFDdEMsR0FBRzt3QkFDSCxJQUFJLENBQUMsbUNBQW1DLENBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FDL0IsQ0FBQztZQUNOLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsc0NBQXNDLENBQ3pDLE9BQU8sQ0FBQyxtQkFBbUIsRUFDM0IsWUFBWSxDQUNiLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxlQUFlLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQzlDLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQzFFLEVBQUUsS0FBSyxDQUFDO1FBQ1QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLGVBQWUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxZQUFZLENBQUMsS0FBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLGVBQWUsQ0FBQztRQUUvQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRS9DLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxhQUFhLENBQUMsWUFBK0IsRUFBRSxPQUFvQjtRQUNqRSxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FDbkMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEtBQUssT0FBTyxFQUFFLFVBQVUsQ0FDN0QsRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDO1FBQzNCLElBQUksb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLElBQUksZUFBZSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDOUQsb0JBQW9CO2dCQUNqQixlQUErQixDQUFDLElBQUksQ0FDbkMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUNqRCxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDbkIsQ0FBQztRQUVELFlBQVksQ0FBQyxVQUFVLEdBQUc7WUFDeEIsVUFBVSxFQUFFO2dCQUNWLFVBQVUsRUFBRSxDQUFDLElBQXFCLEVBQUUsRUFBRTtvQkFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFDekIsTUFBTSxZQUFZLEdBQUcsSUFBSSxNQUFNLENBQzdCLG1EQUFtRCxDQUNwRCxDQUFDO29CQUNGLElBQUksS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUN2QyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7d0JBQ3ZDLE9BQU8sS0FBSyxDQUFDO29CQUNmLENBQUM7b0JBQ0QsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFDRCxPQUFPLEVBQUUsb0JBQW9CO2FBQzlCO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxZQUErQixFQUFFLE9BQW9CO1FBQ3BFLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLGtDQUFrQyxDQUNuRSxPQUFPLENBQUMsa0JBQWtCLEVBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsc0JBQXNCLENBQ3ZCLENBQUM7UUFFRixZQUFZLENBQUMsVUFBVSxHQUFHO1lBQ3hCLGtCQUFrQixFQUFFO2dCQUNsQixVQUFVLEVBQUUsS0FBSyxFQUFFLElBQXFCLEVBQUUsRUFBRTtvQkFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzt3QkFDaEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2xCLENBQUM7b0JBRUQsTUFBTSxtQkFBbUIsR0FDdkIsT0FBTyxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDO29CQUVsRCxNQUFNLFdBQVcsR0FBdUI7d0JBQ3RDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVzt3QkFDM0IsV0FBVyxFQUFFLG1CQUFtQjt3QkFDaEMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLFVBQVU7cUJBQ3RDLENBQUM7b0JBQ0YsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBRXpELElBQUksUUFBUSxLQUFLLEtBQUssRUFBRSxDQUFDO3dCQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzt3QkFFN0MsT0FBTyxLQUFLLENBQUM7b0JBQ2YsQ0FBQztvQkFFRCxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO2dCQUNELE9BQU8sRUFBRSxvQkFBb0I7YUFDOUI7U0FDRixDQUFDO1FBRUYsSUFBSSxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDNUIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUc7Z0JBQ2pDLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRO2dCQUNuQyxrQkFBa0IsRUFBRSxvQkFBb0I7YUFDekMsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsMkJBQTJCLENBQ3pCLE9BQW9CLEVBQ3BCLElBQVksRUFDWixPQUFlLEVBQ2YsaUJBQXlCLEVBQ3pCLDRCQUFzQztRQUV0QyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FDakQsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7UUFFRixJQUFJLFlBQVksR0FBc0I7WUFDcEMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLEtBQUs7WUFDeEMsSUFBSSxFQUFFLElBQUk7WUFDVixLQUFLLEVBQUU7Z0JBQ0wsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGtCQUFrQjtnQkFDM0MsaUJBQWlCLEVBQUUsaUJBQWlCO2dCQUNwQyxLQUFLLEVBQ0gsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQ3hCLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQzdCLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUM1QyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUVoQixLQUFLLEVBQ0gsT0FBTyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQ3hCLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQzdCLENBQUMsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUM1QyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFFBQVEsRUFBRSxPQUFPLENBQUMsV0FBVztnQkFDN0Isa0JBQWtCLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixFQUFFLGVBQWU7Z0JBQ2hFLFVBQVUsRUFBRTtvQkFDVixLQUFLLEVBQUUsNEJBQTRCLENBQUMsSUFBSSxDQUN0QyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLGlCQUFpQixDQUMvQjt3QkFDQyxDQUFDLENBQUMsRUFBRTt3QkFDSixDQUFDLENBQUMsaUJBQWlCO2lCQUN0QjtnQkFDRCxRQUFRLEVBQUUsSUFBSTtnQkFDZCxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2IsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhO2FBQ3JDO1lBQ0QsV0FBVyxFQUFFLEVBQUU7WUFDZixLQUFLLEVBQUUsRUFBRTtZQUNULFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQztRQUNGLFlBQVksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRTdCLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLFdBQVcsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkUsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDLGtDQUFrQyxDQUM1RCxPQUFPLENBQUMsa0JBQWtCLEVBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsdUJBQXVCLENBQ3hCLENBQUM7WUFFRixZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDO1lBQ3ZFLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHO2dCQUNqQyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsUUFBUTtnQkFDcEMsUUFBUSxFQUFFLGVBQWU7YUFDMUIsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUNFLE9BQU8sQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLFVBQVU7WUFDM0MsT0FBTyxDQUFDLG1CQUFtQixFQUFFLFdBQVc7WUFDeEMsT0FBTyxDQUFDLGtCQUFrQjtZQUMxQixZQUFZLENBQUMsS0FBSyxFQUNsQixDQUFDO1lBQ0QsSUFBSSxlQUFlLEdBQUcsS0FBSyxDQUFDLGtDQUFrQyxDQUM1RCxPQUFPLENBQUMsa0JBQWtCLEVBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsYUFBYSxDQUNkLENBQUM7WUFFRixZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDO1lBQ3ZFLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHO2dCQUNqQyxHQUFHLFlBQVksQ0FBQyxVQUFVLEVBQUUsUUFBUTtnQkFDcEMsUUFBUSxFQUFFLGVBQWU7YUFDMUIsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztRQUNqQyxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUUsSUFDRSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsa0JBQWtCO2dCQUMvQyxZQUFZLENBQUMsS0FBSyxFQUNsQixDQUFDO2dCQUNELHVCQUF1QixHQUFHLEtBQUssQ0FBQyxrQ0FBa0MsQ0FDaEUsT0FBTyxDQUFDLGtCQUFrQixFQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLGtCQUFrQixDQUNuQixDQUFDO2dCQUVGLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDO29CQUN0RCxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDO29CQUM5RCxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRzt3QkFDakMsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVE7d0JBQ3BDLEdBQUcsRUFBRSx1QkFBdUI7cUJBQzdCLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQztvQkFDdEQsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztvQkFDOUQsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUc7d0JBQ2pDLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRO3dCQUNwQyxHQUFHLEVBQUUsdUJBQXVCO3FCQUM3QixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBRUQsMkRBQTJEO1lBQzNELElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLENBQUM7Z0JBQ25ELHVCQUF1QixHQUFHLHVCQUF1QjtvQkFDL0MsS0FBSyxDQUFDLGtDQUFrQyxDQUN0QyxPQUFPLENBQUMsa0JBQWtCLEVBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFDdkIsa0JBQWtCLENBQ25CLENBQUM7Z0JBRUosWUFBWSxDQUFDLFVBQVUsR0FBRztvQkFDeEIsR0FBRyxZQUFZLENBQUMsVUFBVTtvQkFDMUIsYUFBYSxFQUFFO3dCQUNiLFVBQVUsRUFBRSxDQUFDLENBQWtCLEVBQUUsRUFBRTs0QkFDakMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO2dDQUFFLE9BQU8sSUFBSSxDQUFDOzRCQUMxQixJQUFJLENBQUM7Z0NBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7Z0NBQ2xDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQzdCLENBQUM7NEJBQUMsTUFBTSxDQUFDO2dDQUNQLE9BQU8sS0FBSyxDQUFDOzRCQUNmLENBQUM7d0JBQ0gsQ0FBQzt3QkFDRCxPQUFPLEVBQ0wsdUJBQXVCOzRCQUN2QiwyQ0FBMkM7cUJBQzlDO2lCQUNGLENBQUM7Z0JBRUYsWUFBWSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUc7b0JBQ2pDLEdBQUcsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRO29CQUNwQyxPQUFPLEVBQUUsdUJBQXVCO2lCQUNqQyxDQUFDO1lBQ0osQ0FBQztZQUVELHlEQUF5RDtZQUN6RCxJQUFJLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsQ0FBQztnQkFDL0MsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTO29CQUMxQixPQUFPLENBQUMsbUJBQW1CLEVBQUUsYUFBYSxDQUFDO2dCQUM3QyxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBRztvQkFDakMsR0FBRyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVE7b0JBQ3BDLFNBQVMsRUFBRSx1QkFBdUI7aUJBQ25DLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFDRSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsZUFBZTtnQkFDNUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLGFBQWEsRUFDMUMsQ0FBQztnQkFDRCxZQUFZLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQztnQkFDakMsTUFBTSxtQkFBbUIsR0FBRztvQkFDMUIsU0FBUyxFQUFFO3dCQUNULFVBQVUsRUFBRSxDQUFDLENBQWtCLEVBQUUsS0FBd0IsRUFBRSxFQUFFOzRCQUMzRCx1QkFBdUI7Z0NBQ3JCLEtBQUssQ0FBQyxrQ0FBa0MsQ0FDdEMsT0FBTyxDQUFDLGtCQUFrQixFQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLGtCQUFrQixDQUNuQixDQUFDOzRCQUVKLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7NEJBQy9CLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBRWpDLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxDQUFDO2dDQUNqRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7b0NBQUUsT0FBTyxJQUFJLENBQUM7Z0NBQzVDLE9BQU8sQ0FBQyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7NEJBQy9CLENBQUM7NEJBQ0QsSUFBSSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLENBQUM7Z0NBQy9DLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRTtvQ0FBRSxPQUFPLElBQUksQ0FBQztnQ0FDNUMsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQzs0QkFDL0IsQ0FBQzs0QkFDRCxPQUFPLElBQUksQ0FBQzt3QkFDZCxDQUFDO3dCQUNELE9BQU8sRUFBRSxDQUFDLEtBQVUsRUFBRSxLQUF3QixFQUFFLEVBQUU7NEJBQ2hELE9BQU8sdUJBQXVCLENBQUM7d0JBQ2pDLENBQUM7cUJBQ0Y7aUJBQ0YsQ0FBQztnQkFDRixZQUFZLENBQUMsVUFBVSxHQUFHO29CQUN4QixHQUFHLFlBQVksQ0FBQyxVQUFVO29CQUMxQixHQUFHLG1CQUFtQjtpQkFDdkIsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsa0RBQWtEO1FBQ2xELElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FDbkMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEtBQUssT0FBTyxFQUFFLFVBQVUsQ0FDN0QsRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDO1lBQzNCLElBQUksb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1lBQzlCLElBQUksZUFBZSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7Z0JBQzlELG9CQUFvQjtvQkFDakIsZUFBK0IsQ0FBQyxJQUFJLENBQ25DLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FDakQsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ25CLENBQUM7WUFFRCxZQUFZLENBQUMsVUFBVSxHQUFHO2dCQUN4QixVQUFVLEVBQUU7b0JBQ1YsVUFBVSxFQUFFLENBQUMsSUFBcUIsRUFBRSxFQUFFO3dCQUNwQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO3dCQUN6QixNQUFNLFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FDN0IsK0ZBQStGLENBQ2hHLENBQUM7d0JBQ0YsSUFBSSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7NEJBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOzRCQUM3QyxPQUFPLEtBQUssQ0FBQzt3QkFDZixDQUFDO3dCQUNELE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBQ0QsT0FBTyxFQUFFLG9CQUFvQjtpQkFDOUI7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxNQUFNLG9CQUFvQixHQUFHO2dCQUMzQixVQUFVLEVBQUU7b0JBQ1YsVUFBVSxFQUFFLENBQUMsQ0FBa0IsRUFBRSxLQUF3QixFQUFFLEVBQUU7d0JBQzNELElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7d0JBQ3hCLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxDQUFDOzRCQUMzRCx1QkFBdUI7Z0NBQ3JCLEtBQUssQ0FBQyxrQ0FBa0MsQ0FDdEMsT0FBTyxDQUFDLGtCQUFrQixFQUMxQixJQUFJLENBQUMsa0JBQWtCLEVBQ3ZCLHVCQUF1QixDQUN4QixDQUFDOzRCQUNKLE9BQU8sS0FBSyxDQUFDO3dCQUNmLENBQUM7d0JBQ0QsSUFDRSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQzs0QkFDNUIsT0FBTyxDQUFDLG1CQUFtQixFQUFFLFdBQVc7NEJBRXhDLE9BQU8sS0FBSyxDQUFDO3dCQUVmLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBQ0QsT0FBTyxFQUFFLENBQUMsS0FBVSxFQUFFLEtBQXdCLEVBQUUsRUFBRTt3QkFDaEQsSUFBSSx1QkFBdUIsS0FBSyxFQUFFOzRCQUNoQyxPQUFPLDJCQUEyQixDQUFDO3dCQUVyQyxPQUFPLHVCQUF1QixDQUFDO29CQUNqQyxDQUFDO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLFlBQVksQ0FBQyxVQUFVLEdBQUc7Z0JBQ3hCLEdBQUcsWUFBWSxDQUFDLFVBQVU7Z0JBQzFCLEdBQUcsb0JBQW9CO2FBQ3hCLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQywrQkFBK0IsQ0FDbkMsSUFBMEIsRUFDMUIsT0FBNEI7UUFFNUIsSUFBSSxZQUFZLEdBQXNCLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBRXBELFlBQVksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDdkMsWUFBWSxDQUFDLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQztRQUNoRCxZQUFZLENBQUMsS0FBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBRTNELElBQUksZUFBZSxHQUNqQixPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDeEUsRUFBRSxLQUFLO1lBQ1QsT0FBTyxDQUFDLEtBQUs7WUFDYixFQUFFLENBQUM7UUFFTCxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksdUJBQXVCLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEQsTUFBTSxnQkFBZ0IsR0FBRyxPQUF1QyxDQUFDO1lBRWpFLElBQUkscUJBQXFCLEdBQ3ZCLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FDL0QsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUNyRCxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDakIsSUFBSSx3QkFBd0IsR0FDMUIsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDNUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUNyRCxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7WUFFakIsWUFBWSxDQUFDLFlBQVksR0FBRyxxQkFBcUIsQ0FBQztZQUNsRCxZQUFZLENBQUMsS0FBTSxDQUFDLHVCQUF1QixDQUFDLEdBQUcscUJBQXFCLENBQUM7WUFDckUsWUFBWSxDQUFDLEtBQU0sQ0FBQywwQkFBMEIsQ0FBQztnQkFDN0Msd0JBQXdCLENBQUM7WUFDM0IsWUFBWSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztZQUN2QyxZQUFZLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDO1FBQ2xELENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksdUJBQXVCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUQsWUFBWSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3RCxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLHVCQUF1QixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hELFlBQVksR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekQsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxRCxJQUFJLFVBQVUsR0FDWixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ3pCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FDakQsRUFBRSxJQUFJLElBQUksZ0JBQWdCLENBQUM7WUFFOUIsWUFBWSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7WUFDdkMsWUFBWSxDQUFDLElBQUksR0FBRyxrQkFBa0IsQ0FBQztZQUN2QyxZQUFZLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDO1FBQ2xELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFDRSxPQUFPLENBQUMsSUFBSSxJQUFJLHVCQUF1QixDQUFDLGFBQWE7Z0JBQ3JELElBQUksQ0FBQyxvQkFBb0I7Z0JBQ3pCLE9BQU8sQ0FBQywyQkFBMkIsRUFDbkMsQ0FBQztnQkFDRCxNQUFNLFNBQVMsR0FDYixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7Z0JBRWpFLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsUUFBUSxPQUFPLFNBQVMsRUFBRSxDQUFDO3dCQUN6QixLQUFLLFNBQVM7NEJBQ1osWUFBWSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDOzRCQUM5RCxNQUFNO3dCQUNSLEtBQUssUUFBUTs0QkFDWCxJQUFJLFNBQVMsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7Z0NBQ3RDLFlBQVksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQzs0QkFDbEQsQ0FBQztpQ0FBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQ0FDMUIsWUFBWSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDOzRCQUM3QyxDQUFDO2lDQUFNLENBQUM7Z0NBQ04sWUFBWSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDOzRCQUN4RCxDQUFDOzRCQUNELE1BQU07d0JBQ1I7NEJBQ0UsWUFBWSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7NEJBQ3RDLE1BQU07b0JBQ1YsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QixZQUFZLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1lBQ3ZDLFlBQVksQ0FBQyxTQUFTLEdBQUcsc0JBQXNCLENBQUM7UUFDbEQsQ0FBQztRQUVELFlBQVksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxZQUFZLENBQUMsS0FBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM1QyxZQUFZLENBQUMsS0FBTSxDQUFDLDZCQUE2QixDQUFDO1lBQ2hELE9BQU8sQ0FBQywyQkFBMkIsQ0FBQztRQUN0QyxZQUFZLENBQUMsS0FBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLGVBQWUsQ0FBQztRQUMvQyxZQUFZLENBQUMsS0FBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUV6RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWpELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxLQUFLLENBQUMsNEJBQTRCLENBQ2hDLElBQTBCLEVBQzFCLE9BQTRCO1FBRTVCLElBQUksWUFBWSxHQUFzQixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUVwRCxZQUFZLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1FBQ3ZDLFlBQVksQ0FBQyxTQUFTLEdBQUcsc0JBQXNCLENBQUM7UUFDaEQsWUFBWSxDQUFDLEtBQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUUzRCxJQUFJLGVBQWUsR0FDakIsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQ3hFLEVBQUUsS0FBSztZQUNULE9BQU8sQ0FBQyxLQUFLO1lBQ2IsRUFBRSxDQUFDO1FBRUwsWUFBWSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3JDLFlBQVksQ0FBQyxLQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzVDLFlBQVksQ0FBQyxLQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUN6RCxZQUFZLENBQUMsS0FBTSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1FBQ25FLFlBQVksQ0FBQyxLQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsZUFBZSxDQUFDO1FBRS9DLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ25FLFlBQVksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWpELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxzQ0FBc0MsQ0FDNUMsbUJBQTRDLEVBQzVDLFlBQStCO1FBRS9CLGlDQUFpQztRQUNqQyxJQUNFLG1CQUFtQjtZQUNuQixtQkFBbUIsQ0FBQywyQkFBMkIsRUFDL0MsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLDJCQUEyQixDQUFDO1lBQ2xFLE1BQU0saUJBQWlCLEdBQUcsbUJBQW1CLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDO1lBRXRFLFlBQVksQ0FBQyxXQUFXLEdBQUc7Z0JBQ3pCLElBQUksRUFBRSxDQUFDLEtBQXdCLEVBQUUsRUFBRTtvQkFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUM5QyxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLElBQUksQ0FBQyxLQUFLLENBQ1gsQ0FBQztvQkFDRixPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUNyQixDQUFDO2FBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsU0FBaUIsRUFBRSxPQUEwQjtRQUN4RSxPQUFPLENBQUMsS0FBTSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQVEsRUFBRSxFQUFFO1lBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQzVCLElBQUkscUJBQXFCLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FDNUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25ELElBQUkscUJBQXFCLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXBDLElBQUksdUNBQXVDLEdBQ3pDLElBQUksQ0FBQyw0Q0FBNEMsQ0FDL0MscUJBQXFCLEVBQ3JCLEdBQUcsQ0FDSixDQUFDO2dCQUNKLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUN4QyxjQUFjLENBQ1UsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLENBQUMsdUNBQXVDLENBQ2hELHVDQUF1QyxFQUN2QyxPQUFPLEVBQ1AsT0FBTyxDQUFDLElBQUksRUFDWixrQkFBa0IsRUFBRSwrQkFBK0IsSUFBSSxFQUFFLENBQzFELENBQUM7WUFDSixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLENBQUM7WUFDRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsNENBQTRDLENBQzFDLGVBQWdDLEVBQ2hDLGFBQWtCO1FBRWxCLE1BQU0sZUFBZSxHQUFvQixFQUFFLENBQUM7UUFFNUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ3JDLE1BQU0sY0FBYyxHQUNsQixVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ2xDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUN4QixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxhQUFhLENBQUMsRUFBRSxDQUMvQyxDQUNGLElBQUksRUFBRSxDQUFDO1lBRVYsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLGFBQWEsR0FBa0I7b0JBQ25DLEdBQUcsVUFBVTtvQkFDYixNQUFNLEVBQUUsY0FBYztpQkFDdkIsQ0FBQztnQkFFRixlQUFlLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCx3QkFBd0IsQ0FDdEIsU0FBaUIsRUFDakIsaUJBQTJCLEVBQzNCLFFBQWEsRUFBRTtRQUVmLHNEQUFzRDtRQUN0RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUNyQyxLQUFLLEVBQ0wsU0FBUyxDQUNTLENBQUM7UUFFckIsTUFBTSxPQUFPLEdBQUcsV0FBVyxFQUFFLEVBQUU7WUFDN0IsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2hCLENBQUMsQ0FBRSxXQUFpQyxDQUFDO1FBQ3ZDLHdEQUF3RDtRQUN4RCxJQUFJLFdBQVcsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxjQUFjLENBQUMsR0FBUSxFQUFFLElBQVk7UUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDaEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN4QixPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksNEJBQTRCO1FBQ2pDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYSxDQUFDLFNBQWlCO1FBQ3BDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCO1FBQ3RCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxLQUFLLENBQUMsbUJBQW1CLENBQ3ZCLE9BQW9CLEVBQ3BCLE9BQTBCO1FBRTFCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQztRQUVqRCw2Q0FBNkM7UUFDN0MsSUFBSSxZQUFZLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDM0MsT0FBTyxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQztRQUNyQyxDQUFDO2FBQU0sSUFBSSxZQUFZLENBQUMsc0JBQXNCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDeEQsT0FBTyxDQUFDLElBQUksR0FBRyxjQUFjLENBQUM7UUFDaEMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsSUFBSSxHQUFHLGlDQUFpQyxDQUFDO1FBQ25ELENBQUM7UUFFRCxPQUFPLENBQUMsS0FBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUU5QyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDO1FBRW5ELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDMUQsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDM0IsT0FBTyxDQUFDLEtBQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxjQUFjLENBQUM7b0JBQ2hELElBQUksQ0FBQyxpQ0FBaUMsQ0FDcEMsVUFBVSxFQUNWLE9BQU8sRUFDUCxZQUFZLENBQ2IsQ0FBQztvQkFDRixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDekQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLHFEQUFxRDtvQkFDckQsT0FBTyxDQUFDLEtBQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxjQUFjLENBQUM7b0JBQ2hELElBQUksQ0FBQyxpQ0FBaUMsQ0FDcEMsVUFBVSxFQUNWLE9BQU8sRUFDUCxZQUFZLENBQ2IsQ0FBQztvQkFDRixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDekQsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxJQUFJLENBQ1Ysb0NBQW9DLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FDaEUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8seUJBQXlCLENBQy9CLFVBQXFDLEVBQ3JDLEtBQVU7UUFFVixJQUNFLENBQUMsVUFBVTtZQUNYLENBQUMsVUFBVSxDQUFDLE1BQU07WUFDbEIsS0FBSyxLQUFLLElBQUk7WUFDZCxLQUFLLEtBQUssU0FBUyxFQUNuQixDQUFDO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbkQsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQzthQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRU8sS0FBSyxDQUFDLHlCQUF5QixDQUNyQyxNQUEyQixFQUMzQixhQUFrQyxJQUFJLENBQUMsWUFBWTtRQUVuRCxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDcEIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBRXBDLEtBQUssTUFBTSxLQUFLLElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEdBQWEsQ0FBQztZQUNyQyxJQUNFLFFBQVE7Z0JBQ1IsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLGNBQWMsQ0FBQztnQkFDN0IsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUM3QixDQUFDO2dCQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN4QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUM5QixjQUFjLENBQ1UsQ0FBQztnQkFDM0IsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQVcsQ0FBQztnQkFDN0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBRTlELElBQUksVUFBVSxHQUFRLElBQUksQ0FBQztnQkFFM0IsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDckUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQzdCLENBQUM7cUJBQU0sSUFDTCxLQUFLLENBQUMsWUFBWSxLQUFLLElBQUk7b0JBQzNCLEtBQUssQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUNoQyxDQUFDO29CQUNELFVBQVUsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO2dCQUNsQyxDQUFDO3FCQUFNLElBQ0wsSUFBSSxDQUFDLEtBQUs7b0JBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJO29CQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsRUFDbEMsQ0FBQztvQkFDRCxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEMsQ0FBQztnQkFFRCxJQUFJLG1CQUFtQixHQUEwQyxJQUFJLENBQUM7Z0JBQ3RFLElBQUksVUFBVSxLQUFLLElBQUksSUFBSSxjQUFjLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO29CQUN0RCxtQkFBbUIsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQ2xELGNBQWMsRUFDZCxVQUFVLENBQ1gsQ0FBQztnQkFDSixDQUFDO2dCQUVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUN2QixTQUFTO2dCQUNYLENBQUM7Z0JBRUQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBRTlDLElBQ0UsbUJBQW1CO29CQUNuQixtQkFBbUIsQ0FBQyxFQUFFLElBQUksSUFBSTtvQkFDOUIsY0FBYyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQzFCLENBQUM7b0JBQ0QsTUFBTSw4QkFBOEIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUM1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsS0FBSyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBRTNELElBQUksOEJBQThCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUM5QyxNQUFNLDJCQUEyQixHQUMvQixJQUFJLENBQUMsNENBQTRDLENBQy9DLDhCQUE4QixFQUM5QixtQkFBbUIsQ0FDcEIsQ0FBQzt3QkFFSixJQUFJLDJCQUEyQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDM0MsTUFBTSxJQUFJLENBQUMsdUNBQXVDLENBQ2hELDJCQUEyQixFQUMzQixpQkFBaUIsRUFDakIsaUJBQWlCLENBQUMsSUFBSSxFQUN0QixZQUFZLEVBQUUsK0JBQStCLElBQUksRUFBRSxDQUNwRCxDQUFDO3dCQUNKLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNyRSxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQ0UsTUFBTSxLQUFLLElBQUksQ0FBQyxZQUFZO1lBQzVCLE1BQU0sS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFDM0MsQ0FBQztZQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRUQsaUNBQWlDLENBQy9CLFVBQXlCLEVBQ3pCLE9BQTBCLEVBQzFCLHFCQUE0QztRQUU1QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNsQixJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FDL0MsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7WUFFRixxREFBcUQ7WUFDckQsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFVBQVUsQ0FBQztZQUM3QyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUNyRCxPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUM1RCxPQUFPLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxDQUFDO1lBRXpDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxLQUFLLEVBQUUsS0FBSztnQkFDWixLQUFLLEVBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUN4QixLQUFLLENBQUMsaUJBQWlCLEVBQ3ZCLGlCQUFpQixDQUNsQixJQUFJLEtBQUssQ0FBQyxJQUFJO2dCQUNqQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO2dCQUMzQywrQkFBK0IsRUFDN0IscUJBQXFCLENBQUMsK0JBQStCO2FBQ3hELENBQUMsQ0FBQyxDQUFDO1lBRUosT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQztnQkFDMUMscUJBQXFCLENBQUMsMkJBQTJCLElBQUksRUFBRSxDQUFDO1lBQzFELE9BQU8sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUM7Z0JBQ3JDLHFCQUFxQixDQUFDLHNCQUFzQixJQUFJLEtBQUssQ0FBQztZQUV4RCxJQUFJLGtCQUFrQixHQUEyQixJQUFJLENBQUM7WUFDdEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQWEsQ0FBQztZQUN6QyxNQUFNLHdCQUF3QixHQUM1QixxQkFBcUIsQ0FBQyx3QkFBd0IsQ0FBQztZQUNqRCxJQUNFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDO2dCQUMvQyx3QkFBd0IsSUFBSSxJQUFJLEVBQ2hDLENBQUM7Z0JBQ0Qsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUM5QyxVQUFVLEVBQ1Ysd0JBQXdCLENBQ3pCLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTyxDQUFDLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztZQUUxQyw0Q0FBNEM7WUFDNUMsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLHdCQUF3QixDQUFDO1lBRXJFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDOUIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDdEMsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3BDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUNuQyxDQUFDLElBRUEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQ25DLENBQUM7d0JBQ0YsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDOzRCQUMzRCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDOzRCQUNoRCxNQUFNO3dCQUNSLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSyxDQUFDLHVDQUF1QyxDQUMzQyx1QkFBOEIsRUFDOUIscUJBQXdDLEVBQ3hDLElBQVMsRUFDVCwrQkFBc0Q7UUFFdEQsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSwyQkFBMkIsR0FDL0IscUJBQXFCLENBQUMsS0FBSyxFQUFFLENBQUMsNkJBQTZCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFckUsTUFBTSxvQkFBb0IsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNuRSwyQkFBMkIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNoRCxDQUFDO1lBRUYsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsRUFBRTtnQkFDbkQsTUFBTSx1QkFBdUIsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUM7Z0JBRXpELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLElBQUk7cUJBQ3JDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztxQkFDMUIsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO3FCQUM5QixJQUFJLENBQ0gsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNQLElBQUksRUFBRSxtQkFBbUIsRUFBRSxjQUFjO29CQUN2Qyx1QkFBdUIsSUFBSSxJQUFJLEVBQUUsZUFBZSxLQUFLLElBQUksQ0FDOUQsQ0FBQztnQkFFSixNQUFNLFdBQVcsR0FDZixzQkFBc0IsRUFBRSxVQUFVO29CQUNsQyxTQUFTLHVCQUF1QixFQUFFLENBQUM7Z0JBRXJDLElBQUksd0JBQXdCLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDO2dCQUV4RCxNQUFNLHdCQUF3QixHQUFHLCtCQUErQjtxQkFDN0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLHVCQUF1QixDQUFDO29CQUN6RCxFQUFFLFlBQVksRUFBRSxJQUFJLENBQ2xCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FDaEQsRUFBRSxLQUFLLENBQUM7Z0JBRVgsSUFDRSx3QkFBd0I7b0JBQ3hCLHdCQUF3QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFDdEMsQ0FBQztvQkFDRCx3QkFBd0IsR0FBRyx3QkFBd0IsQ0FBQztnQkFDdEQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztnQkFDaEMsQ0FBQztnQkFDRCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FDakQsSUFBSSxDQUFDLGtCQUFrQixFQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7Z0JBRUYsTUFBTSxRQUFRLEdBQXNCO29CQUNsQyxHQUFHLEVBQUUsV0FBVztvQkFDaEIsSUFBSSxFQUFFLElBQUk7b0JBQ1YsS0FBSyxFQUFFO3dCQUNMLEtBQUssRUFBRSx3QkFBd0I7d0JBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTt3QkFDbkIsWUFBWSxFQUFFLHVCQUF1Qjt3QkFDckMsY0FBYyxFQUFFLG1CQUFtQjt3QkFDbkMsU0FBUyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7d0JBQ2xDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxhQUFhO3dCQUN6QyxnQkFBZ0IsRUFBRSxJQUFJO3dCQUN0QixrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO3dCQUMzQyxpQkFBaUIsRUFBRSxpQkFBaUI7d0JBQ3BDLFFBQVEsRUFBRSxJQUFJO3dCQUNkLFVBQVUsRUFBRTs0QkFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLG1DQUFtQyxDQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FDaEM7eUJBQ0Y7d0JBQ0QsT0FBTyxFQUFFLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7NEJBQ3hELEtBQUssRUFBRSxLQUFLOzRCQUNaLEtBQUssRUFDSCxLQUFLLENBQUMsb0JBQW9CLENBQ3hCLEtBQUssQ0FBQyxpQkFBaUIsRUFDdkIsaUJBQWlCLENBQ2xCLElBQUksS0FBSyxDQUFDLElBQUk7NEJBQ2pCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7eUJBQzVDLENBQUMsQ0FBQztxQkFDSjtpQkFDRixDQUFDO2dCQUVGLElBQUksbUJBQW1CLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3ZDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FDNUMsbUJBQW1CLEVBQ25CLG1CQUFtQixDQUFDLGNBQWMsQ0FDbkMsQ0FBQztvQkFDRixJQUFJLFVBQVUsRUFBRSxDQUFDO3dCQUNmLFFBQVEsQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDO29CQUNyQyxDQUFDO2dCQUNILENBQUM7Z0JBRUQsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNO29CQUNuRCxDQUFDLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLFVBQVU7b0JBQ3pDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO29CQUNyQixNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQzVDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLHFCQUFxQixDQUFDLEdBQUcsQ0FDbkQsQ0FBQztvQkFDRixJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUN2QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQ3RDLGdCQUFnQixFQUNoQixXQUFXLENBQ1osQ0FBQzt3QkFFRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQ2hELGdCQUFnQixFQUNoQixXQUFXLENBQ1osQ0FBQzt3QkFDRixRQUFRLENBQUMsU0FBUzs0QkFDaEIsZUFBZSxLQUFLLENBQUM7Z0NBQ25CLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTO2dDQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUVuRCxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBRW5ELE1BQU0sY0FBYyxHQUNsQixJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7d0JBQzVELFFBQVEsQ0FBQyxTQUFTLElBQUksY0FBYyxDQUFDO3dCQUNyQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dCQUNqRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDNUIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLE1BQTJCLEVBQUUsS0FBYTtRQUM5RCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDbkIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDbEMsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLGVBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNqRSxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztnQkFDM0QsVUFBVTtvQkFDUixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUMxRSxDQUFDO2lCQUFNLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRSxVQUFVLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3JDLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELG9DQUFvQyxDQUNsQyxNQUEyQixFQUMzQixVQUFrQixFQUNsQixRQUFnQjtRQUVoQixJQUFJLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztRQUU5QixLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6RCxtQkFBbUIsSUFBSSxVQUFVLENBQUM7UUFDcEMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQscUJBQXFCLENBQUMsd0JBQTJDO1FBQy9ELE1BQU0sMkJBQTJCLEdBQy9CLHdCQUF3QixDQUFDLEtBQUssRUFBRSxDQUFDLGdCQUFnQixDQUFDO1lBQ2hELEVBQUUsMkJBQTJCLENBQUM7UUFFbEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQztZQUMvQyxNQUFNLGdCQUFnQixHQUFHLHdCQUF3QixDQUFDLE1BQU07Z0JBQ3RELENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDNUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNULElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUM1QyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyx3QkFBd0IsQ0FBQyxHQUFHLENBQ3RELENBQUM7Z0JBRUYsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDdkIsS0FBSyxNQUFNLElBQUksSUFBSSwyQkFBMkIsRUFBRSxDQUFDO3dCQUMvQyxNQUFNLFFBQVEsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDO3dCQUVqQyxLQUFLLElBQUksQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOzRCQUMvRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7NEJBQzVELElBQUksZUFBZSxJQUFJLGVBQWUsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQ0FDcEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dDQUNyQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUNoQyxDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUMzQixtQkFBMkIsRUFDM0IscUJBQXdDLEVBQ3hDLElBQVMsRUFDVCwrQkFBc0Q7UUFFdEQsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDcEUsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxvQkFBb0IsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO2dCQUNoRCxNQUFNLFdBQVcsR0FDZiwrQkFBK0I7cUJBQzVCLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxtQkFBbUIsQ0FBQztvQkFDckQsRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDcEUsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNsQixJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixvQkFBb0IsR0FBRyxXQUFXLENBQUM7Z0JBQ3JDLENBQUM7Z0JBQ0QsTUFBTSxRQUFRLEdBQXNCO29CQUNsQyxHQUFHLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLFVBQVUsbUJBQW1CLEVBQUU7b0JBQ2hFLElBQUksRUFBRSxJQUFJO29CQUNWLEtBQUssRUFBRTt3QkFDTCxLQUFLLEVBQUUsb0JBQW9CO3dCQUMzQixjQUFjLEVBQUUsZUFBZTt3QkFDL0IsU0FBUyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7d0JBQ2xDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxhQUFhO3dCQUN6QyxPQUFPLEVBQUUsZUFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7NEJBQy9DLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTs0QkFDZixLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUk7eUJBQ2xCLENBQUMsQ0FBQzt3QkFDSCxRQUFRLEVBQUUsSUFBSTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsS0FBSyxFQUFFLElBQUksQ0FBQyxtQ0FBbUMsQ0FDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLENBQ2hDO3lCQUNGO3FCQUNGO29CQUNELEtBQUssRUFBRTt3QkFDTCxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTs0QkFDaEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQzs0QkFDekMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzs0QkFFakQsS0FBSyxDQUFDLFdBQVcsRUFBRSxZQUFZO2lDQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO2lDQUM3QixTQUFTLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxFQUFFO2dDQUNqQyxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksQ0FDakQsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssYUFBYSxDQUNsQyxDQUFDO2dDQUNGLElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29DQUN6RCxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FDaEMsY0FBYyxDQUFDLG1CQUFtQixFQUNsQyxLQUFLLEVBQ0wsSUFBSSxFQUNKLCtCQUErQixDQUNoQyxDQUFDO2dDQUNKLENBQUM7cUNBQU0sQ0FBQztvQ0FDTixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7b0NBQzlCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2dDQUM1QixDQUFDOzRCQUNILENBQUMsQ0FBQyxDQUFDOzRCQUVMLEtBQUssQ0FBQyxLQUFNLENBQUMsU0FBUyxHQUFHLEdBQUcsRUFBRTtnQ0FDNUIsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO2dDQUNwQixZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7NEJBQzFCLENBQUMsQ0FBQzt3QkFDSixDQUFDO3FCQUNGO2lCQUNGLENBQUM7Z0JBRUYsTUFBTSxnQkFBZ0IsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNO29CQUNuRCxDQUFDLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLFVBQVU7b0JBQ3pDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO29CQUNyQixNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQzVDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLHFCQUFxQixDQUFDLEdBQUcsQ0FDbkQsQ0FBQztvQkFDRixJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUN2QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQ3RDLGdCQUFnQixFQUNoQixXQUFXLENBQ1osQ0FBQzt3QkFFRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQ2hELGdCQUFnQixFQUNoQixXQUFXLENBQ1osQ0FBQzt3QkFDRixRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsQ0FBQzt3QkFDbEUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dCQUVuRCxNQUFNLGNBQWMsR0FDbEIsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO3dCQUM1RCxRQUFRLENBQUMsU0FBUyxJQUFJLGNBQWMsQ0FBQzt3QkFDckMsbURBQW1EO3dCQUNuRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDNUIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxJQUFJLENBQ1YsdUNBQXVDLG1CQUFtQixFQUFFLENBQzdELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGtCQUFrQixDQUFDLE1BQTJCLEVBQUUsV0FBbUI7UUFDakUsTUFBTSxlQUFlLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDdEQsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBRTVCLEtBQUssSUFBSSxDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JELElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNoQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELGNBQWMsQ0FDWixNQUEyQixFQUMzQixHQUFXO1FBRVgsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6QixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNqRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ2xFLElBQUksY0FBYztvQkFBRSxPQUFPLGNBQWMsQ0FBQztZQUM1QyxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUN0QixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLEtBQUs7b0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxXQUE4QjtRQUM5QyxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxNQUFNO1lBQ3pDLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFVBQVU7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUVULElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixNQUFNLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQzVDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLFdBQVcsQ0FBQyxHQUFHLENBQ3pDLENBQUM7WUFFRixJQUFJLFdBQVcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QixNQUFNLGVBQWUsR0FBRyxHQUFHLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQztnQkFFcEQsd0NBQXdDO2dCQUN4QyxLQUFLLElBQUksQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUMvRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7b0JBQzVELElBQUksZUFBZSxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQzt3QkFDbkUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUM1QyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQywyQkFBMkI7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLENBQUM7WUFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1lBQzdELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxjQUFjLENBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUM3QixlQUFlLENBQUMsTUFBTSxDQUN2QixDQUNGLENBQUM7WUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN0QixPQUFPLENBQUMsS0FBSyxDQUNYLHdDQUF3QyxFQUN4QyxRQUFRLENBQUMsTUFBTSxDQUNoQixDQUFDO2dCQUNGLE9BQU87WUFDVCxDQUFDO1lBRUQsa0ZBQWtGO1lBQ2xGLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQzdELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLFFBQWdCO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN4QixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRXZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBYyxDQUFDO1lBQzVDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0MsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekIsQ0FBQztJQUNILENBQUM7SUFFRCxTQUFTLENBQ1AsTUFBMkIsRUFDM0IsR0FBVztRQUVYLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUN0QixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUNoQixPQUFPLFdBQVcsQ0FBQztnQkFDckIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8seUJBQXlCLENBQUMsUUFBYTtRQUM3QyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxRQUFRLEdBQUcscUJBQXFCLENBQUMseUJBQXlCLENBQzVELFFBQVEsRUFDUixJQUFJLENBQUMsSUFBSSxFQUNULElBQUksQ0FBQyxhQUFhLEVBQ2xCLElBQUksQ0FBQyxrQkFBa0IsQ0FDeEIsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFTyxzQkFBc0IsQ0FDNUIsVUFBcUMsRUFDckMsY0FBc0I7UUFFdEIsT0FBTyxxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FDakQsVUFBVSxFQUNWLGNBQWMsRUFDZCxJQUFJLENBQUMsa0JBQWtCLENBQ3hCLENBQUM7SUFDSixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU8sd0JBQXdCO1FBQzlCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDcEQsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsNkJBQTZCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLGFBQW9CO1FBQ25DLElBQUksQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFO1lBQ2hDLEtBQUssRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksTUFBTSxDQUFDLEtBQUs7WUFDckUsUUFBUSxFQUFFLFdBQVcsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRTtTQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxtQ0FBbUMsQ0FBQyxRQUFhO1FBQ3ZELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7YUFDNUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxrQkFBa0IsQ0FBQzthQUNwRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUM7YUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBd0I7UUFDOUMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUN4RSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNWLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNmLENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixPQUFPLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksNEJBQTRCO1FBQ2pDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztZQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBR0Q7OztPQUdHO0lBQ0ksMEJBQTBCLENBQUMsUUFBYTtRQUM3QyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFFbkUsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLEtBQUssTUFBTSxVQUFVLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUMvQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osQ0FBQyxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLFVBQVUsQ0FDdkUsQ0FBQztZQUNGLElBQUksQ0FBQyxVQUFVO2dCQUFFLFNBQVM7WUFFMUIsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQztZQUN6RSxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDeEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7b0JBQ3RELFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3BCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNoRSxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FDbEUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FDM0IsQ0FBQztZQUNGLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FDNUQsSUFBSSxDQUFDLElBQUksRUFDVCx3QkFBd0IsQ0FDekIsQ0FBQztZQUNGLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7K0dBci9HVSxzQkFBc0I7bUdBQXRCLHNCQUFzQixtcEJBQ25CLFdBQVcscUVDOUYzQixndUNBd0NBOzs0RkRxRGEsc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLGlCQUFpQjt1ZkFLQSxZQUFZO3NCQUF0QyxZQUFZO3VCQUFDLFdBQVc7Z0JBR2hCLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBY0ksZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBGb3JtbHlGaWVsZCxcbiAgRm9ybWx5RmllbGRDb25maWcsXG4gIEZvcm1seUZvcm1PcHRpb25zXG59IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHtcbiAgU3ViamVjdCxcbiAgZmlyc3RWYWx1ZUZyb20sXG4gIHN0YXJ0V2l0aCxcbiAgcGFpcndpc2UsXG4gIGRlYm91bmNlVGltZSxcbiAgc3dpdGNoTWFwLFxuICBjYXRjaEVycm9yLFxuICBvZixcbiAgdGFrZVVudGlsLFxuICBPYnNlcnZhYmxlLFxuICBtYXAsXG4gIFN1YnNjcmlwdGlvbixcbiAgZnJvbVxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExhYmVsS2V5cyB9IGZyb20gJy4vZW51bXMvbGFiZWwua2V5cyc7XG5pbXBvcnQgeyBBcGlWYWxpZGF0ZVJlcXVlc3QgfSBmcm9tICcuL21vZGVscy9hcHBsaWNhdGlvbi5tb2RlbCc7XG5pbXBvcnQge1xuICBEaWN0aW9uYXJ5RHRvLFxuICBEaWN0aW9uYXJ5VmFsdWUsXG4gIERpY3Rpb25hcnlWYWx1ZUR0b1xufSBmcm9tICcuL21vZGVscy9kaWN0aW9uYXJ5Lm1vZGVsJztcbmltcG9ydCB7XG4gIEZvcm1Nb2RlbCxcbiAgRGlzcGxheU1vZGVsLFxuICBHZW5lcmFsRGF0YU1vZGVsLFxuICBTdGVwc1NldHRpbmdzLFxuICBGbHV4VHlwZSxcbiAgRGltZW5zaW9uVHlwZSxcbiAgU3RlcENvbnRyb2xUeXBlLFxuICBNYW51YWxJbnB1dENvbnRyb2xUeXBlLFxuICBQcmVzZW50YXRpb25QYXJhZ3JhcGhDb250cm9sLFxuICBEaWN0aW9uYXJ5Q29udHJvbERhdGFcbn0gZnJvbSAnLi9tb2RlbHMvZm9ybXMubW9kZWwnO1xuaW1wb3J0IHsgTGFiZWxJbmZvLCBUcmFuc2xhdGlvbkluZm8gfSBmcm9tICcuL21vZGVscy9sYWJlbC1pbmZvLm1vZGVsJztcbmltcG9ydCB7IExhYmVsIH0gZnJvbSAnLi9tb2RlbHMvbGFiZWwubW9kZWwnO1xuaW1wb3J0IHsgTGFuZ3VhZ2UgfSBmcm9tICcuL21vZGVscy9sYW5ndWFnZS5tb2RlbCc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5TGFiZWxJbmZvIH0gZnJvbSAnLi9vdGhlcnMvZGljdGlvbmFyeS1sYWJlbC1pbmZvJztcbmltcG9ydCB7IEVudmlyb25tZW50VHlwZSB9IGZyb20gJy4vb3RoZXJzL2Vudmlyb25tZW50LXR5cGUnO1xuaW1wb3J0IHsgQ3NzUnVsZXMsIFV0aWxzIH0gZnJvbSAnLi9vdGhlcnMvdXRpbHMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25EYXRhU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvYXBwbGljYXRpb25EYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGFiZWxTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9sYWJlbHMuc2VydmljZSc7XG5pbXBvcnQgeyBQcm94eVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3Byb3h5LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGljdGlvbmFyeVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2RpY3Rpb25hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBMYW5ndWFnZVNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2xhbmd1YWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgT3JpZ2luRm9ybUF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9vcmlnaW4tZm9ybS1hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybXNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9mb3Jtcy5zZXJ2aWNlJztcbmltcG9ydCB7IElucHV0Q29uZmlnIH0gZnJvbSAnLi9vcmlnaW4tZm9ybS1jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4vb3RoZXJzL2NvbmZpZy1zZXJ2aWNlJztcbmltcG9ydCB7IE1vZGVsUG9wdWxhdGlvbkhlbHBlciB9IGZyb20gJy4vbW9kZWwtcG9wdWxhdGlvbi5oZWxwZXInO1xuaW1wb3J0IHsgVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy90cmFuc2xhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIE9wZXJhdGlvblJlc3VsdCxcbiAgT3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZVxufSBmcm9tICcuL3NlcnZpY2VzL29yaWdpbi1mb3JtLXNpZ25hbHItaGFuZGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGlvblN0ZXBIYW5kbGVyIH0gZnJvbSAnLi9hY3Rpb24tc3RlcC1oYW5kbGVyJztcbmltcG9ydCB7IFNjcm9sbFRvRXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9zY3JvbGwtdG8tZXJyb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtQ3NzSGVscGVyIH0gZnJvbSAnLi9mb3JtLWNzcy5oZWxwZXInO1xuaW1wb3J0IHtcbiAgQmFzZUNvbnRyb2wsXG4gIENvbnRyb2xEYXRhLFxuICBEZXBlbmRlbnREaWN0aW9uYXJ5RGF0YSxcbiAgUHJlc2VudGF0aW9uQ29udHJvbCxcbiAgUHJlc2VudGF0aW9uQ29udHJvbFR5cGUsXG4gIFNlY3Rpb25EYXRhLFxuICBTdGVwRGF0YVxufSBmcm9tICcuL21vZGVscy9mbHV4Lm1vZGVsJztcbmltcG9ydCB7IEZMQUdfSUNPTlMgfSBmcm9tICcuL2ZsYWctaWNvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtb3JpZ2luLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vb3JpZ2luLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9vcmlnaW4tZm9ybS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbGxlY3RvckZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGRyZW4oRm9ybWx5RmllbGQpIGZvcm1seUZpZWxkczogUXVlcnlMaXN0PEZvcm1seUZpZWxkPjtcblxuICAvL3RoZXNlIGFyZSBzcGVjaWZpYyB0byB0aGUgbGliXG4gIEBJbnB1dCgpIGNvbmZpZ0NvbXBvbmVudDogSW5wdXRDb25maWcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpIGNvbmZpZ1V1aWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGN1cnJlbnRTdGVwSWQ6IHN0cmluZztcbiAgLy9lbmQgc3BlY2lmaWMgdG8gbGliXG5cbiAgQElucHV0KCkgYXBwTW9kZWw6IEZvcm1Nb2RlbDtcbiAgQElucHV0KCkgc2lnbkJhc2VVcmw6IHN0cmluZztcbiAgQElucHV0KCkgY3VycmVudExhbmd1YWdlSXNvOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZpbGxEYXRhOiBhbnk7XG4gIEBJbnB1dCgpIGluaXRGbG93VmFsdWVzOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGVudjogc3RyaW5nO1xuICBASW5wdXQoKSBzaG93RGlzcGxheU1vZGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0xhbmd1YWdlU2VsZWN0b3I6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBpc0RlbW9Nb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlzRGVidWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYXBwRGF0YVV1aWQ6IHN0cmluZztcbiAgQElucHV0KCkgYmxvY2tQcmV2aW91c1N0ZXA6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRhdGFVcmxJZDogc3RyaW5nO1xuICBASW5wdXQoKSBub0J1dHRvbnNJblZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBmbHV4OiBTdGVwRGF0YVtdO1xuICBwcml2YXRlIGRpc3BsYXk6IERpc3BsYXlNb2RlbDtcbiAgcHJpdmF0ZSBkZXNpZ246IENzc1J1bGVzO1xuICBwcml2YXRlIGdlbmVyYWxEYXRhOiBHZW5lcmFsRGF0YU1vZGVsO1xuICBwcml2YXRlIGxhYmVsczogTGFiZWxbXTtcbiAgcHJpdmF0ZSBzdGVwRGljdGlvbmFyeURlcGVuZGVudElkczogc3RyaW5nW107XG4gIHByaXZhdGUgYXZhaWxhYmxlTGFuZ3VhZ2VzOiBMYW5ndWFnZVtdO1xuICBwcml2YXRlIHN0ZXBzU2V0dGluZ3M6IFN0ZXBzU2V0dGluZ3M7XG4gIGZvcm1seUNvbmZpZ1VwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIHZpc2libGVGaWVsZHNVcGRhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIGZvcm1seVVwZGF0ZUFuZEdvTmV4dCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBmb3JtbHlHb05leHQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQE91dHB1dCgpIGNvbXBsZXRpb25FdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gIGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICBmb3JtbHlBbGxTdGVwczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdO1xuICBhY3RpdmVTdGVwID0gMDtcbiAgbW9kZWw6IGFueTtcbiAgb3B0aW9uczogRm9ybWx5Rm9ybU9wdGlvbnMgPSB7fTtcbiAgaXNMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcblxuICBkaWN0aW9uYXJ5TWFwOiBNYXA8c3RyaW5nLCBEaWN0aW9uYXJ5RHRvPiA9IG5ldyBNYXAoKTtcbiAgZGljdGlvbmFyeUlkVG9VdWlkTWFwOiBNYXA8bnVtYmVyLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICBnZW5lcmFsRGF0YUtleXMgPSBMYWJlbEtleXMuYXBwQ29uZmlnRWRpdC5nZW5lcmFsRGF0YTtcbiAgcHJpdmF0ZSBmaWVsZFVuc3Vic2NyaWJlU3ViamVjdHM6IFN1YmplY3Q8dm9pZD5bXSA9IFtdO1xuICBwcml2YXRlIGNvbGxlY3RvckhhbmRsZXJTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgLy8gQWN0aW9uIHN0ZXAgZXhlY3V0aW9uIHN0YXRlXG4gIHByaXZhdGUgaXNFeGVjdXRpbmdBY3Rpb25zID0gZmFsc2U7XG4gIHByaXZhdGUgYWN0aW9uU3RlcFN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHVibGljIGlzU2F2aW5nQWZ0ZXJBY3Rpb25zID0gZmFsc2U7IC8vIE1ha2UgdGhpcyBwdWJsaWMgc28gc3RlcHBlciBjYW4gYWNjZXNzIGl0XG5cbiAgLy8gaWRlbnRpZmljYXRpb24ga3ljIGNvbXBvbmVudFxuICBwdWJsaWMga3ljQXBpVXJsOiBzdHJpbmc7XG4gIHB1YmxpYyBreWNPcmRlcklkOiBzdHJpbmc7XG4gIHB1YmxpYyBreWNUb2tlbjogc3RyaW5nO1xuICBwdWJsaWMga3ljRW52OiBzdHJpbmc7XG4gIHB1YmxpYyBreWNSZWRpcmVjdElkOiBzdHJpbmc7XG4gIHB1YmxpYyBreWNQaG9uZU51bWJlcjogc3RyaW5nID0gJyc7XG4gIHB1YmxpYyBreWNMYW5nSXNvOiBzdHJpbmcgPSAnJztcbiAgcHVibGljIGt5Y1Nob3dDaXRpemVuc2hpcDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMga3ljU2Nyb2xsTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBlbmQgaWRlbnRpZmljYXRpb24ga3ljIGNvbXBvbmVudFxuICBwdWJsaWMgbGFuZ3VhZ2VGbGFnczogYW55W10gPSBbXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdFbmdsaXNoJyxcbiAgICAgIGNvZGU6ICdlbicsXG4gICAgICB0eXBlOiAnVVMnLFxuICAgICAgaWNvbjogRkxBR19JQ09OUy5lblxuICAgIH0sXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdSb21hbmEnLFxuICAgICAgY29kZTogJ3JvJyxcbiAgICAgIGljb246IEZMQUdfSUNPTlMucm9cbiAgICB9LFxuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnRGV1dHNjaCcsXG4gICAgICBjb2RlOiAnZGUnLFxuICAgICAgaWNvbjogRkxBR19JQ09OUy5kZVxuICAgIH0sXG4gICAge1xuICAgICAgbGFuZ3VhZ2U6ICdGcmFuw6dhaXMnLFxuICAgICAgY29kZTogJ2ZyJyxcbiAgICAgIGljb246IEZMQUdfSUNPTlMuZnJcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnSXRhbGlhbm8nLFxuICAgICAgY29kZTogJ2l0JyxcbiAgICAgIGljb246IEZMQUdfSUNPTlMuaXRcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhbmd1YWdlOiAnRXNwYcOxb2wnLFxuICAgICAgY29kZTogJ2VzJyxcbiAgICAgIGljb246IEZMQUdfSUNPTlMuZXNcbiAgICB9XG4gIF07XG4gIGZvcm1seUNvbGxlY3RpbmdGaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW107XG4gIGZvcm1seVByZXNlbnRhdGlvbkZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXTtcbiAgY29udHJvbElkc1dpdGhWYWx1ZXM6IGFueTtcbiAgX3NlbGYgPSB0aGlzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2VydmljZTogRGljdGlvbmFyeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByb3h5OiBQcm94eVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYWJlbFNlcnZpY2U6IExhYmVsU2VydmljZSxcbiAgICBwcml2YXRlIGFwcGxpY2F0aW9uRGF0YVNlcnZpY2U6IEFwcGxpY2F0aW9uRGF0YVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsYW5nU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IE9yaWdpbkZvcm1BdXRoU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1zU2VydmljZTogRm9ybXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgb3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZTogT3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGlvblN0ZXBIYW5kbGVyOiBBY3Rpb25TdGVwSGFuZGxlcixcbiAgICBwcml2YXRlIHNjcm9sbFRvRXJyb3JTZXJ2aWNlOiBTY3JvbGxUb0Vycm9yU2VydmljZVxuICApIHtcbiAgICB0aGlzLmt5Y0FwaVVybCA9IHByb3h5LmFwaVVSTDtcbiAgICB0aGlzLmt5Y09yZGVySWQgPSBwcm94eS5vcmRlcklEITtcbiAgICB0aGlzLmt5Y1Rva2VuID0gcHJveHkudG9rZW47XG4gICAgdGhpcy5reWNFbnYgPSBwcm94eS5lbnY7XG5cbiAgICB0aGlzLmt5Y0xhbmdJc28gPSBwcm94eS5sYW5nSXNvO1xuICAgIGNvbnN0IGlzTG9hZGluZ1N1YiA9XG4gICAgICB0aGlzLm9yaWdpbkZvcm1TaWduYWxySGFuZGxlclNlcnZpY2UuaXNMb2FkaW5nJC5zdWJzY3JpYmUoKGxvYWRpbmcpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2FkaW5nICE9PSBsb2FkaW5nKSB7XG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBsb2FkaW5nO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB0aGlzLmNvbGxlY3RvckhhbmRsZXJTdWJzY3JpcHRpb25zLmFkZChpc0xvYWRpbmdTdWIpO1xuXG4gICAgY29uc3Qgb3BlcmF0aW9uQ29tcGxldGVkU3ViID1cbiAgICAgIHRoaXMub3JpZ2luRm9ybVNpZ25hbHJIYW5kbGVyU2VydmljZS5vcGVyYXRpb25Db21wbGV0ZWQkLnN1YnNjcmliZShcbiAgICAgICAgYXN5bmMgKHJlc3VsdDogT3BlcmF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5vcGVyYXRpb25JZGVudGlmaWVyID09PSAnS1lDX1BST0NFU1NJTkcnKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgJ0tZQyBQcm9jZXNzaW5nIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgKHZpYSBIYW5kbGVyIFNlcnZpY2UpOicsXG4gICAgICAgICAgICAgICAgcmVzdWx0LmRhdGFcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxsRGF0YSA9IEpTT04ucGFyc2UocmVzdWx0LmRhdGEuZmlsbERhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMucG9wdWxhdGVNb2RlbFdpdGhGaWxsRGF0YSh0aGlzLmZpbGxEYXRhKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuZm9ybWx5VXBkYXRlQW5kR29OZXh0LmVtaXQoe30pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAnS1lDIFByb2Nlc3NpbmcgZmFpbGVkICh2aWEgSGFuZGxlciBTZXJ2aWNlKTonLFxuICAgICAgICAgICAgICAgIHJlc3VsdC5lcnJvclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB0aGlzLmNvbGxlY3RvckhhbmRsZXJTdWJzY3JpcHRpb25zLmFkZChvcGVyYXRpb25Db21wbGV0ZWRTdWIpO1xuXG4gICAgLy8gU3Vic2NyaWJlIHRvIGFjdGlvbiBzdGVwIGV4ZWN1dGlvbiBldmVudHNcbiAgICBjb25zdCBhY3Rpb25FeGVjdXRpbmdTdWIgPVxuICAgICAgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5hY3Rpb25FeGVjdXRpbmckLnN1YnNjcmliZSgoZXhlY3V0aW5nKSA9PiB7XG4gICAgICAgIHRoaXMuaXNFeGVjdXRpbmdBY3Rpb25zID0gZXhlY3V0aW5nO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGV4ZWN1dGluZztcbiAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgICB0aGlzLmFjdGlvblN0ZXBTdWJzY3JpcHRpb25zLmFkZChhY3Rpb25FeGVjdXRpbmdTdWIpO1xuXG4gICAgY29uc3QgYWN0aW9uQ29tcGxldGVkU3ViID1cbiAgICAgIHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuYWN0aW9uQ29tcGxldGVkJC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygn8J+OrCBBY3Rpb24gc3RlcCBjb21wbGV0ZWQ6JywgcmVzdWx0KTtcbiAgICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBBY3Rpb24gc3RlcCBmYWlsZWQ6JywgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3RlOiBXZSBkb24ndCBhdXRvLXByb2dyZXNzIGhlcmUgYXMgaXQncyBoYW5kbGVkIGluIGV4ZWN1dGVBY3Rpb25TdGVwc0JlZm9yZU1vdmluZ1xuICAgICAgfSk7XG4gICAgdGhpcy5hY3Rpb25TdGVwU3Vic2NyaXB0aW9ucy5hZGQoYWN0aW9uQ29tcGxldGVkU3ViKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmRhdGFVcmxJZCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLmFwcGxpY2F0aW9uRGF0YVNlcnZpY2UuZ2V0RGF0YVVybCh0aGlzLmRhdGFVcmxJZClcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuY29uZmlnVXVpZCA9IHJlc3VsdC5hcHBJZDtcbiAgICAgICAgdGhpcy5hcHBEYXRhVXVpZCA9IHJlc3VsdC5hcHBEYXRhSWQ7XG4gICAgICAgIHRoaXMuZW52ID0gcmVzdWx0LmVudjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5hcHBEYXRhVXVpZCAmJiB0aGlzLmN1cnJlbnRTdGVwSWQpIHtcbiAgICAgIHRoaXMuYXBwbGljYXRpb25EYXRhU2VydmljZS5zZXRDdXJyZW50U3RlcChcbiAgICAgICAgdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcElkXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hcHBEYXRhVXVpZCkge1xuICAgICAgdGhpcy5hcHBEYXRhVXVpZCA9IFV0aWxzLmdlbmVyYXRlVVVJRCgpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnQ29tcG9uZW50ICYmXG4gICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudC5Ub2tlbiAmJlxuICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuUmVmcmVzaFRva2VuXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UudXBkYXRlQ29uZmlnRnJvbUlucHV0KHRoaXMuY29uZmlnQ29tcG9uZW50KTtcbiAgICAgIGF3YWl0IHRoaXMuYXV0aFNlcnZpY2Uuc2V0VG9rZW5zKFxuICAgICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudC5Ub2tlbixcbiAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuUmVmcmVzaFRva2VuXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzIHx8IHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5sYW5nU2VydmljZS5nZXRMYW5ndWFnZXMoKSkudGhlbigobGlzdCkgPT4ge1xuICAgICAgICBpZiAobGlzdCAmJiBsaXN0Lml0ZW1zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMgPSBsaXN0Lml0ZW1zO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5sb2FkQXBwRGF0YSgpO1xuICAgIGlmICghdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28gJiYgdGhpcy5hcHBNb2RlbCkge1xuICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28gPSB0aGlzLmFwcE1vZGVsLmdlbmVyYWxEYXRhLmRlZmF1bHRMYW5ndWFnZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXBwTW9kZWwpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdEFzeW5jKCk7XG4gICAgICAvLyBFeGVjdXRlIGFueSBhY3Rpb24vc3RhdHVzIHN0ZXBzIHRoYXQgYXBwZWFyIGJlZm9yZSB0aGUgZmlyc3QgdmlzaWJsZSBzdGVwXG4gICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVMZWFkaW5nQWN0aW9uU3RlcHMoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbmZpZ0NvbXBvbmVudCddICYmICFjaGFuZ2VzWydjb25maWdDb21wb25lbnQnXS5maXJzdENoYW5nZSkge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudCAmJlxuICAgICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudC5Ub2tlbiAmJlxuICAgICAgICB0aGlzLmNvbmZpZ0NvbXBvbmVudC5SZWZyZXNoVG9rZW5cbiAgICAgICkge1xuICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UudXBkYXRlQ29uZmlnRnJvbUlucHV0KHRoaXMuY29uZmlnQ29tcG9uZW50KTtcbiAgICAgICAgYXdhaXQgdGhpcy5hdXRoU2VydmljZS5zZXRUb2tlbnMoXG4gICAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuVG9rZW4sXG4gICAgICAgICAgdGhpcy5jb25maWdDb21wb25lbnQuUmVmcmVzaFRva2VuXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGNoYW5nZXNbJ2N1cnJlbnRMYW5ndWFnZUlzbyddICYmXG4gICAgICAhY2hhbmdlc1snY3VycmVudExhbmd1YWdlSXNvJ10uZmlyc3RDaGFuZ2VcbiAgICApIHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCF0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcykge1xuICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMubGFuZ1NlcnZpY2UuZ2V0TGFuZ3VhZ2VzKCkpLnRoZW4oKGxpc3QpID0+IHtcbiAgICAgICAgICAgIGlmIChsaXN0ICYmIGxpc3QuaXRlbXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMgPSBsaXN0Lml0ZW1zO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFwcERhdGFVdWlkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGFwcERhdGEgPSBhd2FpdCB0aGlzLmFwcGxpY2F0aW9uRGF0YVNlcnZpY2UuZ2V0U3RlcHMoXG4gICAgICAgICAgICAgIHRoaXMuYXBwRGF0YVV1aWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoYXBwRGF0YSAmJiBhcHBEYXRhLmZpbGxEYXRhKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlsbERhdGEgPSBKU09OLnBhcnNlKGFwcERhdGEuZmlsbERhdGEpO1xuICAgICAgICAgICAgICB0aGlzLmJsb2NrUHJldmlvdXNTdGVwID0gYXBwRGF0YS5ibG9ja1ByZXZpb3VzU3RlcDtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsbERhdGEubWV0YWRhdGEubGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyA9IHRoaXMuZmlsbERhdGEubWV0YWRhdGEubGFuZ3VhZ2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmV0cmlldmluZyBhcHAgZGF0YScsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0QXN5bmMoKTtcbiAgICAgICAgLy8gRXhlY3V0ZSBhbnkgYWN0aW9uL3N0YXR1cyBzdGVwcyB0aGF0IGFwcGVhciBiZWZvcmUgdGhlIGZpcnN0IHZpc2libGUgc3RlcFxuICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVMZWFkaW5nQWN0aW9uU3RlcHMoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxvYWRBcHBEYXRhKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2U6IHsgY29uZmlndXJhdGlvbjogYW55OyBmaWxsRGF0YT86IGFueSB9ID1cbiAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgICAgdGhpcy5mb3Jtc1NlcnZpY2UubG9hZEZvcm1CeVV1aWQodGhpcy5jb25maWdVdWlkLCB0aGlzLmVudilcbiAgICAgICAgKTtcbiAgICAgIHRoaXMuYXBwTW9kZWwgPSBKU09OLnBhcnNlKHJlc3BvbnNlLmNvbmZpZ3VyYXRpb24pO1xuICAgICAgdGhpcy5maWxsRGF0YSA9IHJlc3BvbnNlLmZpbGxEYXRhID8gSlNPTi5wYXJzZShyZXNwb25zZS5maWxsRGF0YSkgOiBudWxsO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGZvcm0gZGF0YScsIGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbml0QXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy51bnN1YnNjcmliZUZyb21BbGxGaWVsZHMoKTtcbiAgICBhd2FpdCB0aGlzLmJ1aWxkRm9ybWx5QXN5bmMoKTtcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVSZWZlcmVuY2VGaWVsZHModGhpcy5mb3JtbHlDb25maWcpO1xuICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgdGhpcy5mb3JtbHlDb25maWdVcGRhdGVkLmVtaXQoKTtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBsaWNhdGlvbkxhbmd1YWdlcygpOiBMYW5ndWFnZVtdIHtcbiAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVMYW5ndWFnZXM/LmZpbHRlcigoYSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuYXBwTW9kZWw/LmdlbmVyYWxEYXRhPy5sYW5ndWFnZXM/LmluZGV4T2YoYS5pc28pID49IDA7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmV0dXJuRkxhZyhsYW5ndWFnZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VGbGFncy5maW5kKChsKSA9PiBsLmNvZGUgPT0gbGFuZ3VhZ2UpPy5pY29uO1xuICB9XG5cbiAgY2hhbmdlTGFuZ3VhZ2UoJGV2ZW50OiBzdHJpbmcpIHtcbiAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyA9ICRldmVudDtcbiAgICB0aGlzLmFwcGxpY2F0aW9uRGF0YVNlcnZpY2VcbiAgICAgIC5jaGFuZ2VMYW5ndWFnZSh0aGlzLmFwcERhdGFVdWlkLCB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbylcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmluaXRBc3luYygpO1xuICB9XG4gIGdldExhbmd1YWdlTmFtZShsYW5ndWFnZUlzbzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLmZpbmQoXG4gICAgICAobGFuZykgPT4gbGFuZy5pc28gPT09IGxhbmd1YWdlSXNvXG4gICAgKTtcbiAgICByZXR1cm4gbGFuZ3VhZ2UgPyBsYW5ndWFnZS5uYW1lIDogJyc7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkRm9ybWx5QXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY3VycmVudExhbmd1YWdlSXNvKSB7XG4gICAgICBhd2FpdCB0aGlzLmdldExhYmVscygpO1xuICAgIH1cblxuICAgIC8vIFNURVAgMTogSW5pdGlhbGl6ZSBmbHV4IGFuZCBvdGhlciBwcm9wZXJ0aWVzIGZpcnN0XG4gICAgdGhpcy5mbHV4ID0gdGhpcy5hcHBNb2RlbC5mbHV4O1xuICAgIHRoaXMuZGlzcGxheSA9IHRoaXMuYXBwTW9kZWwuZGlzcGxheTtcbiAgICB0aGlzLmRlc2lnbiA9IHRoaXMuYXBwTW9kZWwuZ2VuZXJhdGVkQ3NzO1xuICAgIHRoaXMuZ2VuZXJhbERhdGEgPSB0aGlzLmFwcE1vZGVsLmdlbmVyYWxEYXRhO1xuICAgIHRoaXMuYWRkUmVuZGVyZWRDc3MoKTtcblxuICAgIC8vIFNURVAgMjogTG9hZCBBTEwgZGljdGlvbmFyaWVzIHVwZnJvbnQgKG5vdyB0aGF0IGZsdXggaXMgaW5pdGlhbGl6ZWQpXG4gICAgYXdhaXQgdGhpcy5sb2FkQWxsUmVxdWlyZWREaWN0aW9uYXJpZXMoKTtcblxuICAgIC8vIFNURVAgMzogQ29udGludWUgd2l0aCBleGlzdGluZyBmb3JtIGJ1aWxkaW5nIGxvZ2ljXG4gICAgdGhpcy5mb3JtbHlDb25maWcgPSBbXTtcbiAgICB0aGlzLmZvcm1seUNvbGxlY3RpbmdGaWVsZHMgPSBbXTtcbiAgICB0aGlzLmZvcm1seVByZXNlbnRhdGlvbkZpZWxkcyA9IFtdO1xuICAgIHRoaXMubW9kZWwgPSB7fTtcbiAgICB0aGlzLmZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcblxuICAgIC8vIFBvcHVsYXRlIGNvbnRyb2wgSURzIHdpdGggdmFsdWVzIGlmIGZpbGxEYXRhIG9yIGluaXRGbG93VmFsdWVzIGV4aXN0XG4gICAgaWYgKHRoaXMuZmlsbERhdGEgfHwgdGhpcy5pbml0Rmxvd1ZhbHVlcykge1xuICAgICAgdGhpcy5wb3B1bGF0ZUNvbnRyb2xJZHNXaXRoVmFsdWVEaWN0aW9uYXJ5KCk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBtb2RlbCB3aXRoIGRlZmF1bHQgdmFsdWVzIGlmIG5vIGZpbGxEYXRhXG4gICAgaWYgKCF0aGlzLmZpbGxEYXRhKSB7XG4gICAgICB0aGlzLm1vZGVsID0gTW9kZWxQb3B1bGF0aW9uSGVscGVyLmFwcGx5RGVmYXVsdHNUb01vZGVsKFxuICAgICAgICB0aGlzLmZsdXgsXG4gICAgICAgIHRoaXMuZGljdGlvbmFyeU1hcCxcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXNcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9wdWxhdGVNb2RlbFdpdGhGaWxsRGF0YSh0aGlzLmZpbGxEYXRhKTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh0aGlzLm1vZGVsKTtcbiAgICBhd2FpdCB0aGlzLmJ1aWxkRm9ybWx5Q29uZmlnQXN5bmMoKTtcblxuICAgIC8vIEluaXRpYWxpemUgcmVmZXJlbmNlcyBmb3IgZGVmYXVsdCB2YWx1ZXNcbiAgICBpZiAoIXRoaXMuZmlsbERhdGEpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVJlZmVyZW5jZUZpZWxkcyh0aGlzLmZvcm1seUNvbmZpZyk7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoc3RhcnRXaXRoKG51bGwpLCBwYWlyd2lzZSgpKVxuICAgICAgLnN1YnNjcmliZSgoW3ByZXYsIG5leHRdOiBbYW55LCBhbnldKSA9PlxuICAgICAgICB0aGlzLmhhbmRsZUZvcm1WYWx1ZUNoYW5nZShbcHJldiwgbmV4dF0pXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGb3JtVmFsdWVDaGFuZ2UoW3ByZXYsIG5leHRdOiBbYW55LCBhbnldKSB7XG4gICAgY29uc3QgY3VycmVudExhbmd1YWdlSWQgPSBVdGlscy5maW5kTGFuZ3VhZ2VJZEJ5SXNvKFxuICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbmV4dCkge1xuICAgICAgaWYgKG5leHRba2V5XT8udmFsdWVUcmFuc2xhdGlvbnMpIHtcbiAgICAgICAgdmFyIHMgPSBKU09OLnN0cmluZ2lmeShuZXh0W2tleV0pO1xuICAgICAgICB2YXIgcmVwbGFjZWQgPSBzLnJlcGxhY2UoL1widmFsdWVUcmFuc2xhdGlvbnNcIjovZywgJ1widHJhbnNsYXRpb25zXCI6Jyk7XG4gICAgICAgIG5leHRba2V5XSA9IEpTT04ucGFyc2UocmVwbGFjZWQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZvcm1seVByZXNlbnRhdGlvbkZpZWxkcy5maWx0ZXIoXG4gICAgICAgIChpKSA9PiBpLnByb3BzICYmIGkucHJvcHNbJ2NvbGxlY3Rpb25Db250cm9sSWRlbnRpZmllciddID09PSBrZXlcbiAgICAgICk7XG4gICAgICBpZiAoZmllbGRzICYmIGZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgIGxldCB2YWx1ZSA9ICcnO1xuICAgICAgICAgIHN3aXRjaCAodHlwZW9mIG5leHRba2V5XSkge1xuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgIHZhbHVlID0gbmV4dFtrZXldID8gJyZjaGVjazsnIDogJyZjcm9zczsnO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgaWYgKG5leHRba2V5XT8udHJhbnNsYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSBuZXh0W2tleV0udHJhbnNsYXRpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAodHJhbnNsYXRpb246IHsgbGFuZ3VhZ2VJZDogYW55IH0pID0+XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uLmxhbmd1YWdlSWQgPT09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRyYW5zbGF0aW9uID8gdHJhbnNsYXRpb24udmFsdWUgOiBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gbmV4dFtrZXldO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaWVsZC5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdGVwRGljdGlvbmFyeURlcGVuZGVudElkcy5maW5kKChhKSA9PiBhID09IGtleSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5leHRba2V5XT8uaWQgJiZcbiAgICAgICAgICAocHJldiA9PSBudWxsIHx8IHByZXZba2V5XT8uaWQgIT09IG5leHRba2V5XT8uaWQpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXAgPSB0aGlzLmdldEZvcm1seUZpbHRlcmVkU3RlcHMoKTtcbiAgICAgICAgICB2YXIgZmlsdGVyZWRTdGVwc0lkZW50aWZpZXJzID0gdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cC5tYXAoXG4gICAgICAgICAgICAoZikgPT4gZi5wcm9wcz8uWydzdGVwSWQnXVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZVN0ZXBzID0gdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5maWx0ZXJWaXNpYmxlU3RlcHMoXG4gICAgICAgICAgICB0aGlzLmZsdXgsXG4gICAgICAgICAgICBmaWx0ZXJlZFN0ZXBzSWRlbnRpZmllcnNcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgICAgICAgdGhpcy52aXNpYmxlRmllbGRzVXBkYXRlZC5lbWl0KHZpc2libGVTdGVwcyk7XG4gICAgICAgICAgdGhpcy5mb3JtbHlDb25maWdVcGRhdGVkLmVtaXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGFiZWxzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5sYWJlbFNlcnZpY2VcbiAgICAgICAgLmdldExhYmVscyh0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbywgZmFsc2UpXG4gICAgICAgIC5zdWJzY3JpYmUoKGwpID0+IHtcbiAgICAgICAgICB0aGlzLmxhYmVscyA9IGw7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcG9wdWxhdGVDb250cm9sSWRzV2l0aFZhbHVlRGljdGlvbmFyeSgpIHtcbiAgICB2YXIgY3VycmVudExhbmd1YWdlSWQgPSB0aGlzLmdldEN1cnJlbnRMYW5ndWFnZUlkKCk7XG5cbiAgICAvLyBCdWlsZCBkaWN0aW9uYXJ5IGZyb20gZmlsbERhdGEuZmx1eCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBzdGFydCBlbXB0eVxuICAgIGNvbnN0IGNvbnRyb2xJZHNXaXRoVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gdGhpcy5maWxsRGF0YT8uZmx1eFxuICAgICAgPyB0aGlzLmZpbGxEYXRhLmZsdXhcbiAgICAgICAgICAuZmxhdE1hcCgoc3RlcDogeyBzZWN0aW9uczogeyBjb250cm9sczogYW55W10gfVtdIH0pID0+XG4gICAgICAgICAgICBzdGVwLnNlY3Rpb25zLmZsYXRNYXAoKHNlY3Rpb246IHsgY29udHJvbHM6IGFueVtdIH0pID0+XG4gICAgICAgICAgICAgIHNlY3Rpb24uY29udHJvbHNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChjb250cm9sKSA9PiBjb250cm9sLmNvbnRyb2xJZCAmJiBjb250cm9sLmZpbGxWYWx1ZSlcbiAgICAgICAgICAgICAgICAubWFwKChjb250cm9sKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgY29udHJvbElkOiBjb250cm9sLmNvbnRyb2xJZCxcbiAgICAgICAgICAgICAgICAgIGZpbGxWYWx1ZTogY29udHJvbC5maWxsVmFsdWUsXG4gICAgICAgICAgICAgICAgICBmaWxsVmFsdWVJZDogY29udHJvbC5maWxsVmFsdWVJZFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICBkaWN0aW9uYXJ5OiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcbiAgICAgICAgICAgICAgeyBjb250cm9sSWQsIGZpbGxWYWx1ZSwgZmlsbFZhbHVlSWQgfTogYW55XG4gICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgaWYgKGZpbGxWYWx1ZUlkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCBkaWN0XSBvZiB0aGlzLmRpY3Rpb25hcnlNYXAuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRpY3QudmFsdWVzPy5maW5kKCh2KSA9PiB2LmlkID09IGZpbGxWYWx1ZUlkKTtcbiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHZhbHVlLnZhbHVlVHJhbnNsYXRpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgKHQpID0+IHQubGFuZ3VhZ2VJZCA9PSBjdXJyZW50TGFuZ3VhZ2VJZFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5W2NvbnRyb2xJZF0gPSB0cmFuc2xhdGlvbi52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5W2NvbnRyb2xJZF0gPSBmaWxsVmFsdWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICAgIClcbiAgICAgIDoge307XG5cbiAgICAvLyBHZXQgaW5pdEZsb3dWYWx1ZXMgZnJvbSBmaWxsRGF0YSBvciBmcm9tIGRpcmVjdCBpbnB1dCAodGhpcy5pbml0Rmxvd1ZhbHVlcylcbiAgICBsZXQgaW5pdEZsb3dWYWx1ZXMgPSB0aGlzLmZpbGxEYXRhPy5pbml0Rmxvd1ZhbHVlcztcblxuICAgIC8vIElmIG5vdCBpbiBmaWxsRGF0YSwgdHJ5IHRvIHBhcnNlIGZyb20gZGlyZWN0IGluaXRGbG93VmFsdWVzIGlucHV0XG4gICAgaWYgKCFpbml0Rmxvd1ZhbHVlcyAmJiB0aGlzLmluaXRGbG93VmFsdWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpbml0Rmxvd1ZhbHVlcyA9XG4gICAgICAgICAgdHlwZW9mIHRoaXMuaW5pdEZsb3dWYWx1ZXMgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IEpTT04ucGFyc2UodGhpcy5pbml0Rmxvd1ZhbHVlcylcbiAgICAgICAgICAgIDogdGhpcy5pbml0Rmxvd1ZhbHVlcztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gcGFyc2UgaW5pdEZsb3dWYWx1ZXM6JywgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWRkSW5pdEZsb3dWYWx1ZXMgPSAobm9kZTogYW55LCBwYXRoUGFydHM6IHN0cmluZ1tdKSA9PiB7XG4gICAgICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHBhdGhQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29udHJvbElkc1dpdGhWYWx1ZXNbYGluaXRGbG93VmFsdWVzXyR7cGF0aFBhcnRzLmpvaW4oJ18nKX1gXSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICAgICAgbm9kZS5mb3JFYWNoKChjaGlsZCwgaWR4KSA9PlxuICAgICAgICAgIGFkZEluaXRGbG93VmFsdWVzKGNoaWxkLCBbLi4ucGF0aFBhcnRzLCBTdHJpbmcoaWR4KV0pXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBub2RlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBPYmplY3Qua2V5cyhub2RlKS5mb3JFYWNoKChrKSA9PlxuICAgICAgICAgIGFkZEluaXRGbG93VmFsdWVzKG5vZGVba10sIFsuLi5wYXRoUGFydHMsIGtdKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXRoUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb250cm9sSWRzV2l0aFZhbHVlc1tgaW5pdEZsb3dWYWx1ZXNfJHtwYXRoUGFydHMuam9pbignXycpfWBdID1cbiAgICAgICAgICBTdHJpbmcobm9kZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChpbml0Rmxvd1ZhbHVlcyAhPT0gbnVsbCAmJiBpbml0Rmxvd1ZhbHVlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZGRJbml0Rmxvd1ZhbHVlcyhpbml0Rmxvd1ZhbHVlcywgW10pO1xuICAgIH1cbiAgICAvLyBBZGQgaW5oZXJpdGVkIGZpZWxkcyBmcm9tIHBhcmVudCBhcHBcbiAgICBjb25zdCBpbmhlcml0ZWRGaWVsZHMgPSB0aGlzLmZpbGxEYXRhPy5pbmhlcml0ZWRGaWVsZHM7XG4gICAgaWYgKGluaGVyaXRlZEZpZWxkcyAmJiB0eXBlb2YgaW5oZXJpdGVkRmllbGRzID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5oZXJpdGVkRmllbGRzKSkge1xuICAgICAgICBsZXQgcmVzb2x2ZWRWYWx1ZTogYW55O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICAgKHZhbHVlIGFzIGFueSkuZGljdGlvbmFyeVVVSURcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gRW5yaWNoZWQgZm9ybWF0OiBoYW5kbGUgbXVsdGktc2VsZWN0IGFuZCBzaW5nbGUtc2VsZWN0XG4gICAgICAgICAgY29uc3QgZW5yaWNoZWQgPSB2YWx1ZSBhcyBhbnk7XG4gICAgICAgICAgY29uc3QgZmlsbFZhbHVlSWRzID0gZW5yaWNoZWQuZmlsbFZhbHVlSWRzO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsbFZhbHVlSWRzKSAmJiBmaWxsVmFsdWVJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gTXVsdGktc2VsZWN0OiBsb29rIHVwIGVhY2ggSUQgaW4gZGljdGlvbmFyeU1hcCBmb3IgdHJhbnNsYXRlZCBkaXNwbGF5XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IHRoaXMuZ2V0Q3VycmVudExhbmd1YWdlSWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlSWQgb2YgZmlsbFZhbHVlSWRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG51bWVyaWNJZCA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlSWQgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQodmFsdWVJZCwgMTApIDogdmFsdWVJZDtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbLCBkaWN0XSBvZiB0aGlzLmRpY3Rpb25hcnlNYXAuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHYgPSBkaWN0LnZhbHVlcz8uZmluZCgodjogYW55KSA9PiB2LmlkID09PSBudW1lcmljSWQpO1xuICAgICAgICAgICAgICAgIGlmIChkdikge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSBkdi52YWx1ZVRyYW5zbGF0aW9ucz8uZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHQ6IGFueSkgPT4gdC5sYW5ndWFnZUlkID09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlcy5wdXNoKHRyYW5zbGF0aW9uPy52YWx1ZSB8fCBkdi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZSA9XG4gICAgICAgICAgICAgIGRpc3BsYXlWYWx1ZXMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gZGlzcGxheVZhbHVlcy5qb2luKCcsICcpXG4gICAgICAgICAgICAgICAgOiAoZW5yaWNoZWQuZmlsbFZhbHVlID8/IFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTaW5nbGUtc2VsZWN0XG4gICAgICAgICAgICByZXNvbHZlZFZhbHVlID0gZW5yaWNoZWQuZmlsbFZhbHVlID8/IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmVkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sSWRzV2l0aFZhbHVlc1tgaW5oZXJpdGVkXyR7a2V5fWBdID0gcmVzb2x2ZWRWYWx1ZTtcbiAgICAgICAgaWYgKGNvbnRyb2xJZHNXaXRoVmFsdWVzW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnRyb2xJZHNXaXRoVmFsdWVzW2tleV0gPSByZXNvbHZlZFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29udHJvbElkc1dpdGhWYWx1ZXMgPSBjb250cm9sSWRzV2l0aFZhbHVlcztcbiAgfVxuICBwcml2YXRlIGdldEN1cnJlbnRMYW5ndWFnZUlkKCk6IG51bWJlciB7XG4gICAgY29uc3QgY3VycmVudExhbmd1YWdlSWQgPSBVdGlscy5maW5kTGFuZ3VhZ2VJZEJ5SXNvKFxuICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICk7XG4gICAgcmV0dXJuIGN1cnJlbnRMYW5ndWFnZUlkO1xuICB9XG4gIHByaXZhdGUgYXN5bmMgYnVpbGRGb3JtbHlDb25maWdBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0ZXBzU2V0dGluZ3MgPSB7XG4gICAgICBzaG93Q291bnRlcjogdGhpcy5zaG93RGlzcGxheU1vZGVcbiAgICAgICAgPyBmYWxzZVxuICAgICAgICA6IHRoaXMuZ2VuZXJhbERhdGEuc2hvd0NvdW50ZXJTdGVwLFxuICAgICAgc2hvd0xhYmVsczogdGhpcy5zaG93RGlzcGxheU1vZGUgPyBmYWxzZSA6IHRoaXMuZ2VuZXJhbERhdGEuc2hvd05hbWVTdGVwLFxuICAgICAgc2hvd0FsbFN0ZXBzOiB0aGlzLnNob3dEaXNwbGF5TW9kZVxuICAgICAgICA/IGZhbHNlXG4gICAgICAgIDogdGhpcy5nZW5lcmFsRGF0YS5zaG93QWxsU3RlcHMsXG4gICAgICBzaG93UHJvZ3Jlc3NCYXI6XG4gICAgICAgIHRoaXMuZ2VuZXJhbERhdGEuc2hvd1Byb2dyZXNzQmFyICYmXG4gICAgICAgIHRoaXMuZ2VuZXJhbERhdGEuc2hvd0FsbFN0ZXBzID09IGZhbHNlXG4gICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgOiBmYWxzZVxuICAgIH07XG5cbiAgICB0aGlzLmZvcm1seUFsbFN0ZXBzID0gYXdhaXQgdGhpcy5idWlsZEZvcm1seUZpZWxkR3JvdXBBc3luYygpO1xuICAgIHZhciBoYXNEaWN0aW9uYXJ5RGVwZW5kZW50U3RlcHMgPSB0aGlzLmZvcm1seUFsbFN0ZXBzLnNvbWUoXG4gICAgICAoZikgPT4gZi5wcm9wcz8uWydkZXBlbmRlbnREaWN0aW9uYXJ5J10/LmlzRGljdGlvbmFyeURlcGVuZGVudFxuICAgICk7XG5cbiAgICB2YXIgZm9ybWx5RmlsdGVyZWRTdGVwcyA9IHRoaXMuZ2V0Rm9ybWx5RmlsdGVyZWRTdGVwcygpO1xuICAgIHZhciBmaWx0ZXJlZFN0ZXBzSWRlbnRpZmllcnMgPSBmb3JtbHlGaWx0ZXJlZFN0ZXBzLm1hcChcbiAgICAgIChmKSA9PiBmLnByb3BzPy5bJ3N0ZXBJZCddXG4gICAgKTtcbiAgICAvLyBHZXQgdmlzaWJsZSBzdGVwcyBmb3IgYWNjdXJhdGUgc3RlcCBjb3VudGluZ1xuICAgIGNvbnN0IHZpc2libGVTdGVwcyA9IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZmlsdGVyVmlzaWJsZVN0ZXBzKHRoaXMuZmx1eCk7XG4gICAgY29uc3QgZmlsdGVyZWRWaXNpYmxlU3RlcHMgPSB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmZpbHRlclZpc2libGVTdGVwcyhcbiAgICAgIHRoaXMuZmx1eCxcbiAgICAgIGZpbHRlcmVkU3RlcHNJZGVudGlmaWVyc1xuICAgICk7XG5cbiAgICB0aGlzLmZvcm1seUNvbmZpZyA9IFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3N0ZXBwZXInLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGFwcERhdGFJZDogdGhpcy5maWxsRGF0YVxuICAgICAgICAgICAgPyB0aGlzLmZpbGxEYXRhPy5tZXRhZGF0YT8uYXBwRGF0YUlkXG4gICAgICAgICAgICA6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgICAgZGVzaWduOiB0aGlzLmRlc2lnbixcbiAgICAgICAgICBhcHBsaWNhdGlvbklkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgICBmbHV4OiB2aXNpYmxlU3RlcHMsIC8vIFBhc3Mgb25seSB2aXNpYmxlIHN0ZXBzIHRvIHN0ZXBwZXJcbiAgICAgICAgICBmaWx0ZXJlZEZsdXg6IGZpbHRlcmVkVmlzaWJsZVN0ZXBzLFxuICAgICAgICAgIGlzRGlzcGxheU1vZGU6IHRoaXMuc2hvd0Rpc3BsYXlNb2RlLFxuICAgICAgICAgIGZpbGxEYXRhOiB0aGlzLmZpbGxEYXRhLFxuICAgICAgICAgIGluaXRGbG93VmFsdWVzOiB0aGlzLmluaXRGbG93VmFsdWVzLFxuICAgICAgICAgIGRlZmF1bHRMYW5ndWFnZTogdGhpcy5hcHBNb2RlbC5nZW5lcmFsRGF0YS5kZWZhdWx0TGFuZ3VhZ2UsXG4gICAgICAgICAgZGlzcGxheTogdGhpcy5kaXNwbGF5LFxuICAgICAgICAgIGRlc2lnbkNvbmZpZzoge1xuICAgICAgICAgICAgYnV0dG9uc1ZlcnRpY2FsUG9zaXRpb246XG4gICAgICAgICAgICAgIHRoaXMuYXBwTW9kZWwuZGVzaWduLmJ1dHRvbnNWZXJ0aWNhbFBvc2l0aW9uLFxuICAgICAgICAgICAgYnV0dG9uc0hvcml6b250YWxQb3NpdGlvbjpcbiAgICAgICAgICAgICAgdGhpcy5hcHBNb2RlbC5kZXNpZ24uYnV0dG9uc0hvcml6b250YWxQb3NpdGlvblxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RlcHNTZXR0aW5nczogdGhpcy5zdGVwc1NldHRpbmdzLFxuICAgICAgICAgIG1ldGFEYXRhOiB0aGlzLmZpbGxEYXRhPy5tZXRhZGF0YSxcbiAgICAgICAgICBkZW1vTW9kZTogdGhpcy5pc0RlbW9Nb2RlLFxuICAgICAgICAgIGlzRGVidWc6IHRoaXMuaXNEZWJ1ZyxcbiAgICAgICAgICBub0J1dHRvbnNJblZpZXc6IHRoaXMubm9CdXR0b25zSW5WaWV3LFxuICAgICAgICAgIGJsb2NrUHJldmlvdXNTdGVwOiB0aGlzLmJsb2NrUHJldmlvdXNTdGVwLFxuICAgICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgICAgaGFzRGljdGlvbmFyeURlcGVuZGVudFN0ZXBzOiBoYXNEaWN0aW9uYXJ5RGVwZW5kZW50U3RlcHMsXG4gICAgICAgICAgaGFzQWN0aW9uU3RlcHM6IHRoaXMuZmx1eC5zb21lKChzdGVwKSA9PlxuICAgICAgICAgICAgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5pc0FjdGlvblN0ZXAoc3RlcClcbiAgICAgICAgICApLCAvLyBJbmRpY2F0ZSBpZiB0aGVyZSBhcmUgYWN0aW9uIHN0ZXBzXG4gICAgICAgICAgY29tcGxldGlvbkV2ZW50OiAoKSA9PiB0aGlzLm9uQ29tcGxldGlvbigpLFxuICAgICAgICAgIG9uU2VsZWN0ZWRQYWdlQ2hhbmdpbmc6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGVkUGFnZUNoYW5naW5nKGluZGV4KSxcbiAgICAgICAgICBvblNlbGVjdGVkUGFnZUNoYW5nZWQ6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGVkUGFnZUNoYW5nZWQoaW5kZXgpXG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkR3JvdXA6IGZvcm1seUZpbHRlcmVkU3RlcHNcbiAgICAgIH1cbiAgICBdO1xuXG4gICAgLy8gRm9yIGRpc3BsYXkgbW9kZSwgcG9wdWxhdGUgdmFsdWVzIGltbWVkaWF0ZWx5IGFmdGVyIGNvbmZpZyBpcyBidWlsdFxuICAgIGlmICh0aGlzLnNob3dEaXNwbGF5TW9kZSAmJiB0aGlzLmZvcm1seUNvbmZpZ1swXT8uZmllbGRHcm91cCkge1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXApIHtcbiAgICAgICAgdGhpcy5zZXRQcmVzZW50YXRpb25Db250cm9sVmFsdWVzUmVjdXJzaXZlbHkoc3RlcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvblNlbGVjdGVkUGFnZUNoYW5naW5nKHN0ZXBUcmFuc2l0aW9uOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgZnJvbUluZGV4OiBudW1iZXI7XG4gICAgbGV0IHRvSW5kZXg6IG51bWJlcjtcbiAgICBsZXQgY2FsbGJhY2s6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIGlmICh0eXBlb2Ygc3RlcFRyYW5zaXRpb24gPT09ICdudW1iZXInKSB7XG4gICAgICB0b0luZGV4ID0gc3RlcFRyYW5zaXRpb247XG4gICAgICBmcm9tSW5kZXggPSB0aGlzLmFjdGl2ZVN0ZXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZyb21JbmRleCA9IHN0ZXBUcmFuc2l0aW9uLmZyb207XG4gICAgICB0b0luZGV4ID0gc3RlcFRyYW5zaXRpb24udG87XG4gICAgICBjYWxsYmFjayA9IHN0ZXBUcmFuc2l0aW9uLmNhbGxiYWNrIHx8ICgoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgbGV0IGFjdGlvbnNFeGVjdXRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHRvSW5kZXggPiBmcm9tSW5kZXgpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAn4p6h77iPIE1vdmluZyBmb3J3YXJkIC0gZXhlY3V0aW5nIGFjdGlvbiBzdGVwcyBhZnRlciBjdXJyZW50IHN0ZXAnXG4gICAgICApO1xuICAgICAgYWN0aW9uc0V4ZWN1dGVkID1cbiAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlQWN0aW9uU3RlcHNBZnRlckN1cnJlbnRTdGVwKGZyb21JbmRleCk7XG4gICAgfSBlbHNlIGlmICh0b0luZGV4IDwgZnJvbUluZGV4KSB7XG4gICAgICBjb25zb2xlLmxvZygn4qyF77iPIE1vdmluZyBiYWNrd2FyZCAtIG5vIGFjdGlvbiBleGVjdXRpb24gbmVlZGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SEIFN0YXlpbmcgb24gc2FtZSBzdGVwIC0gbm8gYWN0aW9uIGV4ZWN1dGlvbiBuZWVkZWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZVN0ZXAgPSB0b0luZGV4O1xuXG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25zRXhlY3V0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYWN0aW9uL3N0YXR1cyBzdGVwcyB0aGF0IGFwcGVhciBiZWZvcmUgdGhlIGZpcnN0IHZpc2libGUgc3RlcC5cbiAgICogQ2FsbGVkIG9uIGZvcm0gaW5pdGlhbGl6YXRpb24gdG8gaGFuZGxlIGxlYWRpbmcgYWN0aW9uIHN0ZXBzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlTGVhZGluZ0FjdGlvblN0ZXBzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hcHBEYXRhVXVpZCB8fCAhdGhpcy5mbHV4IHx8IHRoaXMuZmx1eC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsZWFkaW5nQWN0aW9uU3RlcHMgPVxuICAgICAgdGhpcy5hY3Rpb25TdGVwSGFuZGxlci5nZXRBY3Rpb25TdGVwc0JlZm9yZUZpcnN0VmlzaWJsZVN0ZXAodGhpcy5mbHV4KTtcblxuICAgIGlmIChsZWFkaW5nQWN0aW9uU3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXG4gICAgICBg8J+OrCBFeGVjdXRpbmcgJHtsZWFkaW5nQWN0aW9uU3RlcHMubGVuZ3RofSBsZWFkaW5nIGFjdGlvbiBzdGVwcyBiZWZvcmUgZmlyc3QgdmlzaWJsZSBzdGVwYFxuICAgICk7XG5cbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZXhlY3V0ZUFjdGlvblN0ZXBzKFxuICAgICAgICBsZWFkaW5nQWN0aW9uU3RlcHMsXG4gICAgICAgIHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIChzdGVwKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9hZGluZ01lc3NhZ2UgPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICAgJ2xvYWRpbmdNZXNzYWdlVHJhbnNsYXRpb25zJyxcbiAgICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSBsb2FkaW5nTWVzc2FnZSB8fCBudWxsO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ+KchSBMZWFkaW5nIGFjdGlvbiBzdGVwcyBleGVjdXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBMZWFkaW5nIGFjdGlvbiBzdGVwcyBmYWlsZWQ6JywgcmVzdWx0LmVycm9yKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcign4p2MIEVycm9yIGV4ZWN1dGluZyBsZWFkaW5nIGFjdGlvbiBzdGVwczonLCBlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUFjdGlvblN0ZXBzQWZ0ZXJDdXJyZW50U3RlcChcbiAgICBjdXJyZW50U3RlcEluZGV4OiBudW1iZXJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuaXNFeGVjdXRpbmdBY3Rpb25zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IGZpbHRlcmVkU3RlcHMgPSB0aGlzLmZsdXguZmlsdGVyKChzKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHMuZGVwZW5kZW50RGljdGlvbmFyeSAmJlxuICAgICAgICBzLmRlcGVuZGVudERpY3Rpb25hcnkuaXNEaWN0aW9uYXJ5RGVwZW5kZW50XG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbW9kZWxWYWx1ZSA9XG4gICAgICAgICAgdGhpcy5tb2RlbFtzLmRlcGVuZGVudERpY3Rpb25hcnkuZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyXTtcbiAgICAgICAgLy8gU2tpcCBkZXBlbmRlbmN5IGNoZWNrIGZvciBtdWx0aXBsZSBzZWxlY3Rpb24gKGFycmF5KVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkVmFsdWUgPSBtb2RlbFZhbHVlPy5pZDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkVmFsdWUgJiZcbiAgICAgICAgICBzLmRlcGVuZGVudERpY3Rpb25hcnkuZGVwZW5kZW50VmFsdWVJZHMuaW5jbHVkZXMoc2VsZWN0ZWRWYWx1ZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY3Rpb25TdGVwcyA9IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZ2V0QWN0aW9uU3RlcHNBdEluZGV4KFxuICAgICAgZmlsdGVyZWRTdGVwcyxcbiAgICAgIGN1cnJlbnRTdGVwSW5kZXhcbiAgICApO1xuXG4gICAgaWYgKGFjdGlvblN0ZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmFwcERhdGFVdWlkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSBzYXZpbmcgZmxhZyBiZWZvcmUgc3RhcnRpbmcgYWN0aW9uc1xuICAgICAgdGhpcy5pc1NhdmluZ0FmdGVyQWN0aW9ucyA9IHRydWU7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZXhlY3V0ZUFjdGlvblN0ZXBzKFxuICAgICAgICBhY3Rpb25TdGVwcyxcbiAgICAgICAgdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgKHN0ZXApID0+IHtcbiAgICAgICAgICBjb25zdCBsb2FkaW5nTWVzc2FnZSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgICAnbG9hZGluZ01lc3NhZ2VUcmFuc2xhdGlvbnMnLFxuICAgICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9IGxvYWRpbmdNZXNzYWdlIHx8IG51bGw7XG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBjb25zb2xlLmxvZygn4pyFIEFjdGlvbiBzdGVwcyBleGVjdXRlZCBzdWNjZXNzZnVsbHknKTtcbiAgICAgICAgLy8gS2VlcCBsb2FkaW5nIHN0YXRlIHRydWUgLSBpdCB3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgc2F2ZUFwcERhdGFTdGVwIGNvbXBsZXRlc1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ+KdjCBBY3Rpb24gc3RlcHMgZXhlY3V0aW9uIGZhaWxlZDonLCByZXN1bHQuZXJyb3IpO1xuICAgICAgICB0aGlzLmlzU2F2aW5nQWZ0ZXJBY3Rpb25zID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcign4p2MIEVycm9yIGV4ZWN1dGluZyBhY3Rpb24gc3RlcHM6JywgZXJyb3IpO1xuICAgICAgdGhpcy5pc1NhdmluZ0FmdGVyQWN0aW9ucyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uU2VsZWN0ZWRQYWdlQ2hhbmdlZChpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZm9ybWx5Q29uZmlnWzBdLmZpZWxkR3JvdXApIHtcbiAgICAgIHZhciBzZWxlY3RlZFBhZ2UgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwW2luZGV4XTtcbiAgICAgIHRoaXMuc2V0UHJlc2VudGF0aW9uQ29udHJvbFZhbHVlc1JlY3Vyc2l2ZWx5KHNlbGVjdGVkUGFnZSk7XG5cbiAgICAgIE1vZGVsUG9wdWxhdGlvbkhlbHBlci5hcHBseVByZWNvbXBsZXRpb25Ub01vZGVsKHRoaXMubW9kZWwsIHRoaXMuZmx1eCk7XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh0aGlzLm1vZGVsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFByZXNlbnRhdGlvbkNvbnRyb2xWYWx1ZXNSZWN1cnNpdmVseShmYz86IGFueSkge1xuICAgIGZjPy5maWVsZEdyb3VwPy5mb3JFYWNoKChmZzogYW55KSA9PiB7XG4gICAgICBpZiAoZmcucHJvcHMgJiYgZmcucHJvcHNbJ2lzRGlzcGxheU1vZGUnXSA9PT0gdHJ1ZSkge1xuICAgICAgICB2YXIgbWV0aG9kRmllbGRJZCA9IGZnLnByb3BzWydhcGlNZXRob2RGaWVsZElkJ107XG4gICAgICAgIGlmIChtZXRob2RGaWVsZElkKSB7XG4gICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5maW5kSW5BcGlDYWxsc1Jlc3BvbnNlcyhtZXRob2RGaWVsZElkKTtcbiAgICAgICAgICBmZy5kZWZhdWx0VmFsdWUgPSB2YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFzc29jaWF0ZWRDb250cm9sSWQgPSBmZy5wcm9wc1snY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyJ107XG4gICAgICAgICAgaWYgKGFzc29jaWF0ZWRDb250cm9sSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kID1cbiAgICAgICAgICAgICAgdGhpcy5maW5kQ29udHJvbEluRmlsbERhdGFDb250cm9scyhhc3NvY2lhdGVkQ29udHJvbElkKTtcbiAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAvLyBNdWx0aXBsZSBzZWxlY3Rpb24gLSBzaG93IHZhbHVlcyB3aXRoIGNvbW1hXG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlSWRzQXJyYXkgPVxuICAgICAgICAgICAgICAgIGZvdW5kLmZpbGxWYWx1ZUlkcyB8fCBmb3VuZC5maWxsdmFsdWVpZHMgfHwgZm91bmQuRmlsbFZhbHVlSWRzO1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZXNBcnJheSA9XG4gICAgICAgICAgICAgICAgZm91bmQuZmlsbFZhbHVlcyB8fCBmb3VuZC5maWxsdmFsdWVzIHx8IGZvdW5kLkZpbGxWYWx1ZXM7XG5cbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHZhbHVlSWRzQXJyYXkgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlSWRzQXJyYXkpICYmXG4gICAgICAgICAgICAgICAgdmFsdWVJZHNBcnJheS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZUlkID0gdGhpcy5nZXRDdXJyZW50TGFuZ3VhZ2VJZCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlWYWx1ZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZUlkIG9mIHZhbHVlSWRzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG51bWVyaWNWYWx1ZUlkID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlSWQgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUludCh2YWx1ZUlkLCAxMClcbiAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlSWQ7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRpY3RdIG9mIHRoaXMuZGljdGlvbmFyeU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkaWN0LnZhbHVlcz8uZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAodikgPT4gdi5pZCA9PT0gbnVtZXJpY1ZhbHVlSWRcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB2YWx1ZS52YWx1ZVRyYW5zbGF0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHQpID0+IHQubGFuZ3VhZ2VJZCA9PSBjdXJyZW50TGFuZ3VhZ2VJZFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVZhbHVlcy5wdXNoKHRyYW5zbGF0aW9uPy52YWx1ZSB8fCB2YWx1ZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlzcGxheVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBmZy5kZWZhdWx0VmFsdWUgPSBkaXNwbGF5VmFsdWVzLmpvaW4oJywgJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHZhbHVlc0FycmF5ICYmXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZXNBcnJheSkgJiZcbiAgICAgICAgICAgICAgICB2YWx1ZXNBcnJheS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB1c2UgZmlsbFZhbHVlcyBhcnJheSBkaXJlY3RseVxuICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IHZhbHVlc0FycmF5LmpvaW4oJywgJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmQuZmlsbFZhbHVlSWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGFuZ3VhZ2VJZCA9IHRoaXMuZ2V0Q3VycmVudExhbmd1YWdlSWQoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGRpY3RdIG9mIHRoaXMuZGljdGlvbmFyeU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGljdC52YWx1ZXM/LmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICh2KSA9PiB2LmlkID09IGZvdW5kLmZpbGxWYWx1ZUlkXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdmFsdWUudmFsdWVUcmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAodCkgPT4gdC5sYW5ndWFnZUlkID09IGN1cnJlbnRMYW5ndWFnZUlkXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IHRyYW5zbGF0aW9uLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IGZvdW5kLmZpbGxWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgY29udHJvbElkc1dpdGhWYWx1ZXMgZm9yIGluaXRGbG93VmFsdWVzXG4gICAgICAgICAgICAgIGxldCBpbml0Rmxvd1ZhbHVlID1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xJZHNXaXRoVmFsdWVzPy5bYXNzb2NpYXRlZENvbnRyb2xJZF07XG4gICAgICAgICAgICAgIGlmIChpbml0Rmxvd1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgaW5pdEZsb3dWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgIGluaXRGbG93VmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgIGluaXRGbG93VmFsdWUuZmlsbFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIGluaXRGbG93VmFsdWUgPSBpbml0Rmxvd1ZhbHVlLmZpbGxWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmcuZGVmYXVsdFZhbHVlID0gaW5pdEZsb3dWYWx1ZTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmZpbmRJbkFwaUNhbGxzUmVzcG9uc2VzKGFzc29jaWF0ZWRDb250cm9sSWQpO1xuICAgICAgICAgICAgICAgIGZnLmRlZmF1bHRWYWx1ZSA9IHZhbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRQcmVzZW50YXRpb25Db250cm9sVmFsdWVzUmVjdXJzaXZlbHkoZmcpO1xuICAgICAgfVxuICAgICAgaWYgKGZnLnByb3BzWydjZHInXSkge1xuICAgICAgICBmZy5wcm9wc1snY2RyJ10uZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQ29udHJvbEluRmlsbERhdGFDb250cm9scyhjb250cm9sSWQ6IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IGNvbnRyb2xEYXRhOiBhbnkgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMuZmlsbERhdGEpIHtcbiAgICAgIHRoaXMuZmlsbERhdGEuZmx1eD8uZm9yRWFjaCgoZjogYW55KSA9PiB7XG4gICAgICAgIGlmICghY29udHJvbERhdGEpIHtcbiAgICAgICAgICBmLnNlY3Rpb25zPy5mb3JFYWNoKChzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICghY29udHJvbERhdGEpIHtcbiAgICAgICAgICAgICAgY29udHJvbERhdGEgPSBzLmNvbnRyb2xzPy5maW5kKFxuICAgICAgICAgICAgICAgIChjOiBhbnkpID0+IGMuY29udHJvbElkID09PSBjb250cm9sSWRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNvbnRyb2xEYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xEYXRhO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbERhdGE7XG4gIH1cblxuICBwcml2YXRlIGZpbmRJbkFwaUNhbGxzUmVzcG9uc2VzKGZpZWxkSWQ6IHN0cmluZyk6IGFueSB7XG4gICAgbGV0IGZvdW5kVmFsdWU6IGFueSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5maWxsRGF0YSkge1xuICAgICAgdGhpcy5maWxsRGF0YS5BUElDYWxscz8uZm9yRWFjaCgoYXBpOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFmb3VuZFZhbHVlKSB7XG4gICAgICAgICAgYXBpLk1ldGhvZHM/LmZvckVhY2goKG06IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFmb3VuZFZhbHVlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gbS5GaWVsZHM/LltmaWVsZElkXTtcbiAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgZm91bmRWYWx1ZSA9IGZvdW5kO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZm91bmRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9ybWx5RmlsdGVyZWRTdGVwcygpIHtcbiAgICBsZXQgc3RlcHMgPSB0aGlzLmZvcm1seUFsbFN0ZXBzLmZpbHRlcigocykgPT4ge1xuICAgICAgaWYgKHMucHJvcHMgJiYgcy5wcm9wc1snZGVwZW5kZW50RGljdGlvbmFyeSddKSB7XG4gICAgICAgIGNvbnN0IGRlcERpY3QgPSBzLnByb3BzW1xuICAgICAgICAgICdkZXBlbmRlbnREaWN0aW9uYXJ5J1xuICAgICAgICBdIGFzIERlcGVuZGVudERpY3Rpb25hcnlEYXRhO1xuICAgICAgICBpZiAoZGVwRGljdCAmJiBkZXBEaWN0LmlzRGljdGlvbmFyeURlcGVuZGVudCkge1xuICAgICAgICAgIGNvbnN0IG1vZGVsVmFsdWUgPSB0aGlzLm1vZGVsW2RlcERpY3QuZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyXTtcbiAgICAgICAgICAvLyBTa2lwIGRlcGVuZGVuY3kgY2hlY2sgZm9yIG11bHRpcGxlIHNlbGVjdGlvbiAoYXJyYXkpXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gbW9kZWxWYWx1ZT8uaWQ7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZSAmJlxuICAgICAgICAgICAgZGVwRGljdC5kZXBlbmRlbnRWYWx1ZUlkcy5pbmNsdWRlcyhzZWxlY3RlZFZhbHVlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc3RlcHM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkRm9ybWx5RmllbGRHcm91cEFzeW5jKCk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWdbXT4ge1xuICAgIHRoaXMuc3RlcERpY3Rpb25hcnlEZXBlbmRlbnRJZHMgPSBbXTtcbiAgICBpZiAodGhpcy5zaG93RGlzcGxheU1vZGUpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBhd2FpdCB0aGlzLmJ1aWREaXNwbGF5U3RlcCgpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbc3RlcF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaWx0ZXIgb3V0IGFjdGlvbiBzdGVwcyBmcm9tIHZpc2libGUgc3RlcHNcbiAgICAgIGNvbnN0IHZpc2libGVTdGVwcyA9IHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZmlsdGVyVmlzaWJsZVN0ZXBzKHRoaXMuZmx1eCk7XG4gICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHZpc2libGVTdGVwcy5tYXAoKHN0ZXApID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZEZvcm1seUZpZWxkQ29uZmlnQXN5bmMoc3RlcCk7XG4gICAgICAgIH0pID8/IFtdXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRGb3JtbHlGaWVsZENvbmZpZ0FzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhXG4gICk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWc+IHtcbiAgICBsZXQgc3RlcEZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7fTtcblxuICAgIGlmIChzdGVwLnR5cGUgIT09IEZsdXhUeXBlLkN1c3RvbSAmJiBzdGVwLnR5cGUgIT09IEZsdXhUeXBlLkZpbmFsKSB7XG4gICAgICBzdGVwRm9ybWx5Q29uZmlnID0gYXdhaXQgdGhpcy5idWlsZFN5c3RlbUZpZWxkRm9ybWx5Q29uZmlnKHN0ZXApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGVwRm9ybWx5Q29uZmlnID0ge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGxhYmVsOiBzdGVwLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHN0ZXAubmFtZSxcbiAgICAgICAgICBidXR0b25zOiB0aGlzLmNvbnN0cnVjdEJ1dHRvbnMoc3RlcC5idXR0b25zKSxcbiAgICAgICAgICBkZXBlbmRlbnREaWN0aW9uYXJ5OiBzdGVwLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgICAgc3RlcElkOiBzdGVwLmlkZW50aWZpZXJcbiAgICAgICAgfSxcbiAgICAgICAgZmllbGRHcm91cDogYXdhaXQgdGhpcy5idWlsZFNlY3Rpb25zRmllbGRHcm91cEFzeW5jKHN0ZXAsIHN0ZXAuc2VjdGlvbnMpXG4gICAgICB9O1xuXG4gICAgICBpZiAoc3RlcC50cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgc3RlcEZvcm1seUNvbmZpZy5wcm9wcyFbJ2xhYmVsJ10gPSBVdGlscy5maW5kVHJhbnNsYXRpb25JbmZvKFxuICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgICBzdGVwRm9ybWx5Q29uZmlnLnByb3BzIVsnZGVzY3JpcHRpb24nXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdGVwRm9ybWx5Q29uZmlnICYmIHN0ZXBGb3JtbHlDb25maWcucHJvcHMpIHtcbiAgICAgIHRoaXMuc2V0U3RlcEJhc2VQcm9wcyhzdGVwLCBzdGVwRm9ybWx5Q29uZmlnKTtcbiAgICB9XG4gICAgaWYgKHN0ZXAuZGVwZW5kZW50RGljdGlvbmFyeT8uaXNEaWN0aW9uYXJ5RGVwZW5kZW50KSB7XG4gICAgICB0aGlzLnN0ZXBEaWN0aW9uYXJ5RGVwZW5kZW50SWRzLnB1c2goXG4gICAgICAgIHN0ZXAuZGVwZW5kZW50RGljdGlvbmFyeS5kaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBzdGVwRm9ybWx5Q29uZmlnO1xuICB9XG5cbiAgdHJpZ2dlckNvbXBvbmVudFVwZGF0ZShjb250cm9sSWQ6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2V0Rm9ybWx5RmllbGRWYWx1ZSh0aGlzLmZvcm1seUFsbFN0ZXBzLCBjb250cm9sSWQsIHZhbHVlKTtcbiAgfVxuXG4gIHNldEZvcm1seUZpZWxkVmFsdWUoXG4gICAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdIHwgdW5kZWZpbmVkLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmaWVsZHMpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgaWYgKGZpZWxkLmZvcm1Db250cm9sKSB7XG4gICAgICAgICAgZmllbGQuZm9ybUNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZC5maWVsZEdyb3VwICYmIEFycmF5LmlzQXJyYXkoZmllbGQuZmllbGRHcm91cCkpIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLnNldEZvcm1seUZpZWxkVmFsdWUoZmllbGQuZmllbGRHcm91cCwga2V5LCB2YWx1ZSk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFN5c3RlbUZpZWxkRm9ybWx5Q29uZmlnKFxuICAgIHN0ZXA6IFN0ZXBEYXRhXG4gICk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWc+IHtcbiAgICBjb25zdCBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAgcHJvcHM6IHtcbiAgICAgICAgbGFiZWw6IHN0ZXAubmFtZSxcbiAgICAgICAgYnV0dG9uczogdGhpcy5jb25zdHJ1Y3RCdXR0b25zKHN0ZXAuYnV0dG9ucyksXG4gICAgICAgIGZsdXhUeXBlOiBzdGVwLnR5cGVcbiAgICAgIH0sXG4gICAgICBmaWVsZEdyb3VwOiBbXVxuICAgIH07XG5cbiAgICB0aGlzLnNldFN0ZXBCYXNlUHJvcHMoc3RlcCwgZm9ybWx5Q29uZmlnKTtcbiAgICB2YXIgZmllbGRDb25maWcgPSB0aGlzLmNyZWF0ZUZvcm1seVN5c3RlbUZpZWxkQ29uZmlnKHN0ZXApO1xuXG4gICAgaWYgKGZpZWxkQ29uZmlnKSB7XG4gICAgICBpZiAoc3RlcC50cmFuc2xhdGlvbnMpIHtcbiAgICAgICAgbGV0IGxhYmVsczogYW55ID0ge307XG4gICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLmZvckVhY2goKHRyOiBUcmFuc2xhdGlvbkluZm8pID0+IHtcbiAgICAgICAgICBsYWJlbHNbdHIubmFtZV0gPSBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICB0ci52YWx1ZXMsXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICBmaWVsZENvbmZpZy5wcm9wcyFbJ2xhYmVscyddID0gbGFiZWxzO1xuICAgICAgICBmaWVsZENvbmZpZy5wcm9wcyFbJ25hbWUnXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ25hbWUnLFxuICAgICAgICAgIHN0ZXAudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICAgIGZpZWxkQ29uZmlnLnByb3BzIVsnZGVzY3JpcHRpb24nXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhWydsYWJlbCddID0gVXRpbHMuZmluZFRyYW5zbGF0aW9uSW5mbyhcbiAgICAgICAgICAnbmFtZScsXG4gICAgICAgICAgc3RlcC50cmFuc2xhdGlvbnMsXG4gICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKTtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnZGVzY3JpcHRpb24nXSA9IFV0aWxzLmZpbmRUcmFuc2xhdGlvbkluZm8oXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAgICAgICBzdGVwLnRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZmllbGRDb25maWcucHJvcHMhWydzdGVwc1NldHRpbmdzJ10gPSB0aGlzLnN0ZXBzU2V0dGluZ3M7XG4gICAgICBmb3JtbHlDb25maWcuZmllbGRHcm91cCEucHVzaChmaWVsZENvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1seUNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3RlcEJhc2VQcm9wcyhzdGVwOiBTdGVwRGF0YSwgZm9ybWx5Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZykge1xuICAgIGlmIChmb3JtbHlDb25maWcucHJvcHMpIHtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snbmFtZSddID0gc3RlcC5uYW1lO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzWydmbHV4VHlwZSddID0gc3RlcC50eXBlO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzWydzdGVwSWQnXSA9IHN0ZXAuaWRlbnRpZmllcjtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snaXNWaXNpYmxlJ10gPSBzdGVwLmlzVmlzaWJsZTtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wc1snZGVwZW5kZW50RGljdGlvbmFyeSddID0gc3RlcC5kZXBlbmRlbnREaWN0aW9uYXJ5O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlU2lnbkZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXNpZ24tY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGZsdXg6IHRoaXMuZmx1eCxcbiAgICAgICAgcGFyZW50Rm9ybTogdGhpcy5mb3JtLFxuICAgICAgICBnZXRNb2RlbDogKCkgPT4gdGhpcy5tb2RlbCxcbiAgICAgICAgZXZlbnQ6IGFzeW5jIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50ID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RlcHBlckdvTmV4dEFzeW5jKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlRG93bmxvYWREb2NzRmllbGRDb25maWcoXG4gICAgY29udHJvbERhdGE6IEJhc2VDb250cm9sXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1kb3dubG9hZC1kb2N1bWVudHMtY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBjb250cm9sRGF0YTogY29udHJvbERhdGEsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGRvY3VtZW50c0RhdGE6IHRoaXMuYXBwTW9kZWwuZG9jdW1lbnRzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVZpZXdEb2NzRmllbGRDb25maWcoXG4gICAgY29udHJvbERhdGE6IEJhc2VDb250cm9sXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS12aWV3LWRvY3VtZW50cy1jb21wb25lbnQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGNvbnRyb2xEYXRhOiBjb250cm9sRGF0YSxcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgZG9jdW1lbnRzRGF0YTogdGhpcy5hcHBNb2RlbC5kb2N1bWVudHMsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlVXBsb2FkRG9jc0ZpZWxkQ29uZmlnKFxuICAgIGNvbnRyb2xEYXRhOiBCYXNlQ29udHJvbFxuICApOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktdXBsb2FkLWRvY3VtZW50cy1jb21wb25lbnQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGNvbnRyb2xEYXRhOiBjb250cm9sRGF0YSxcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgZG9jdW1lbnRzRGF0YTogdGhpcy5hcHBNb2RlbC5kb2N1bWVudHMsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlR2VuZXJhdGVEb2NzRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktZ2VuZXJhdGUtZG9jdW1lbnRzLWNvbXBvbmVudCcsXG4gICAgICBwcm9wczoge1xuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWQsXG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGRvY3VtZW50c0RhdGE6IHRoaXMuYXBwTW9kZWwuZG9jdW1lbnRzLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgZXZlbnQ6IGFzeW5jIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50ID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RlcHBlckdvTmV4dEFzeW5jKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHN0ZXBwZXJHb05leHRBc3luYygpIHtcbiAgICBjb25zdCBzdGVwcGVyQ29tcG9uZW50ID0gdGhpcy5mb3JtbHlDb25maWdbMF0ucHJvcHMhWydjb21wb25lbnQnXTtcbiAgICBpZiAoc3RlcHBlckNvbXBvbmVudCAmJiBzdGVwcGVyQ29tcG9uZW50Lm5hdmlnYXRlTmV4dEFzeW5jKSB7XG4gICAgICBhd2FpdCBzdGVwcGVyQ29tcG9uZW50Lm5hdmlnYXRlTmV4dEFzeW5jKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVFbnJvbGxDYXJkRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgbGV0IGxhYmVsczogYW55ID0ge307XG4gICAgT2JqZWN0LmtleXMoc3RlcC5jb25maWcpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGtleS5lbmRzV2l0aCgnTGFiZWwnKSkge1xuICAgICAgICBsYWJlbHNba2V5XSA9XG4gICAgICAgICAgc3RlcD8uY29uZmlnW2tleV0/LmZpbmQoXG4gICAgICAgICAgICAoaTogeyBsYW5ndWFnZUlzbzogc3RyaW5nIH0pID0+XG4gICAgICAgICAgICAgIGkubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWUgPz8gJyc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktZW5yb2wtY2FyZC1jb21wb25lbnQnLFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgYXBwSWQ6IHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGRhdGFVcmxJZDogdGhpcy5kYXRhVXJsSWQsXG4gICAgICAgIHN0ZXBEYXRhOiBzdGVwLFxuICAgICAgICBsYWJlbHM6IGxhYmVscyxcbiAgICAgICAgbGFuZ0lzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHByaXZhdGUgQ3JlYXRlSWRTY2FuRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgbGV0IGVycm9yTWVzc2FnZXM6IGFueSA9IHt9O1xuXG4gICAgaWYgKHN0ZXAuZXJyb3JzVHJhbnNsYXRpb25zKSB7XG4gICAgICBzdGVwLmVycm9yc1RyYW5zbGF0aW9ucy5mb3JFYWNoKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGVycm9yTWVzc2FnZXNbZXJyb3IuY29kZV0gPSBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgZXJyb3IudHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IHRyYW5zbGF0YWJsZSBsYWJlbHMgZnJvbSBjb25maWdcbiAgICBsZXQgbGFiZWxzOiBhbnkgPSB7fTtcbiAgICBpZiAoc3RlcC5jb25maWcpIHtcbiAgICAgIE9iamVjdC5rZXlzKHN0ZXAuY29uZmlnKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleS5lbmRzV2l0aCgnVHJhbnNsYXRpb25zJykgJiYgQXJyYXkuaXNBcnJheShzdGVwLmNvbmZpZ1trZXldKSkge1xuICAgICAgICAgIGNvbnN0IGxhYmVsS2V5ID0ga2V5LnJlcGxhY2UoJ1RyYW5zbGF0aW9ucycsICcnKTtcbiAgICAgICAgICBjb25zdCB0cmFuc2xhdGVkID0gc3RlcC5jb25maWdba2V5XT8uZmluZChcbiAgICAgICAgICAgIChpOiB7IGxhbmd1YWdlSXNvOiBzdHJpbmcgfSkgPT5cbiAgICAgICAgICAgICAgaS5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZTtcbiAgICAgICAgICBpZiAodHJhbnNsYXRlZCkge1xuICAgICAgICAgICAgbGFiZWxzW2xhYmVsS2V5XSA9IHRyYW5zbGF0ZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2Zvcm1seS1zY2FuLWlkJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGNvbmZpZzogc3RlcC5jb25maWcsXG4gICAgICAgIHN0ZXBUeXBlOiBzdGVwLnR5cGUsXG4gICAgICAgIHN0ZXBJZDogc3RlcC5pZGVudGlmaWVyLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQgfHwgVXRpbHMuZ2VuZXJhdGVVVUlEKCksXG4gICAgICAgIGFwcElkOiB0aGlzLmFwcE1vZGVsLmFwcGxpY2F0aW9uVXVpZCxcbiAgICAgICAgZXJyb3JNZXNzYWdlczogZXJyb3JNZXNzYWdlcyxcbiAgICAgICAgbGFiZWxzOiBsYWJlbHMsXG4gICAgICAgIGV2ZW50OiAoZXZlbnQ6IGFueSkgPT4gdGhpcy5vbklkU2NhbkNvbXBsZXRlZChldmVudCwgc3RlcClcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVLeWNGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICBjb25zdCBsb2FkaW5nTXNnVHJhbnNsYXRpb25zID0gc3RlcC50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAodDogYW55KSA9PiB0Lm5hbWUgPT09ICdsb2FkaW5nTWVzc2FnZVRyYW5zbGF0aW9ucydcbiAgICApO1xuXG4gICAgY29uc3QgdHJhbnNsYXRlZExvYWRpbmdNZXNzYWdlID1cbiAgICAgIGxvYWRpbmdNc2dUcmFuc2xhdGlvbnM/LnZhbHVlcz8uZmluZChcbiAgICAgICAgKHY6IGFueSkgPT4gdi5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICk/LnZhbHVlIHx8ICcnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktaWRlbnRpZmljYXRpb24tY29tcG9uZW50JyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIHRva2VuOiB0aGlzLmt5Y1Rva2VuLFxuICAgICAgICBhcGlfdXJsOiB0aGlzLmt5Y0FwaVVybCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBlbnY6ICdET0NLRVInLCAvLyBDb25zaWRlciBtYWtpbmcgdGhpcyBkeW5hbWljIGlmIG5lZWRlZFxuICAgICAgICByZWRpcmVjdF9pZDogdGhpcy5reWNSZWRpcmVjdElkLFxuICAgICAgICBwaG9uZV9udW1iZXI6ICcnLFxuICAgICAgICBsYW5nX2lzbzogdGhpcy5reWNMYW5nSXNvLFxuICAgICAgICBzaG93X2NpdGl6ZW5zaGlwX3NlbGVjdG9yOiB0aGlzLmt5Y1Nob3dDaXRpemVuc2hpcCxcbiAgICAgICAgc2Nyb2xsX21vZGU6IHRoaXMua3ljU2Nyb2xsTW9kZSxcbiAgICAgICAgbWF4UmV0cmllczogc3RlcC5jb25maWc/Lm1heEt5Y1JldHJpZXMgPz8gMyxcbiAgICAgICAgbG9hZGluZ01lc3NhZ2U6IHRyYW5zbGF0ZWRMb2FkaW5nTWVzc2FnZSxcbiAgICAgICAgZWN0Q29tcGxldGVkOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9IHRyYW5zbGF0ZWRMb2FkaW5nTWVzc2FnZTtcbiAgICAgICAgICBhd2FpdCB0aGlzLm9yaWdpbkZvcm1TaWduYWxySGFuZGxlclNlcnZpY2UuaW5pdGlhdGVLeWNQcm9jZXNzaW5nKFxuICAgICAgICAgICAgdGhpcy5hcHBEYXRhVXVpZFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVQaG9uZUVtYWlsRmllbGRDb25maWcoc3RlcDogU3RlcERhdGEpOiBGb3JtbHlGaWVsZENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktdmFsaWRhdGUtY29udGFjdC1pbmZvJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIHN0ZXBEYXRhOiBzdGVwLFxuICAgICAgICBhcHBEYXRhSWQ6IHRoaXMuYXBwRGF0YVV1aWQsXG4gICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgIGV2ZW50OiBhc3luYyAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0ZXBwZXJHb05leHRBc3luYygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVZpZXdPZmZlckZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXZpZXctb2ZmZXJzJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGFwcERhdGFJZDogdGhpcy5hcHBEYXRhVXVpZCxcbiAgICAgICAgc3RlcERhdGE6IHN0ZXAsXG4gICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgIGFwcE1vZGVsOiB0aGlzLmFwcE1vZGVsLFxuICAgICAgICBsYW5nSXNvOiB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgZXZlbnQ6IChldmVudDogYW55KSA9PiB0aGlzLm9uT2ZmZXJTZWxlY3RlZChldmVudCwgc3RlcClcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBDcmVhdGVQYXVzZUZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LWZpZWxkLXBhdXNlJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGlkZW50aWZpZXI6IHN0ZXAuaWRlbnRpZmllcixcbiAgICAgICAgY29uZmlnOiBzdGVwLmNvbmZpZyxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgYXBwTW9kZWw6IHRoaXMuYXBwTW9kZWwsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgQ3JlYXRlT3BlbkJhbmtpbmdGaWVsZENvbmZpZyhzdGVwOiBTdGVwRGF0YSk6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICAvLyBQYXNzIHRoZSBmdWxsIHN0ZXAgZGF0YSB3aGljaCBpbmNsdWRlcyBhbGwgdHJhbnNsYXRpb25zXG4gICAgLy8gVGhlIGNvbXBvbmVudCB3aWxsIGV4dHJhY3Qgd2hhdCBpdCBuZWVkcyBiYXNlZCBvbiBjdXJyZW50IGxhbmd1YWdlXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmb3JtbHktb3Blbi1iYW5raW5nJyxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGlkZW50aWZpZXI6IHN0ZXAuaWRlbnRpZmllcixcbiAgICAgICAgY29uZmlnOiBzdGVwLmNvbmZpZyxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCwgLy8gVGhpcyBjb250YWlucyB0aGUgZnVsbCB0cmFuc2xhdGlvbnMgYXJyYXlcbiAgICAgICAgZW52OiB0aGlzLmVudixcbiAgICAgICAgYXBwTW9kZWw6IHRoaXMuYXBwTW9kZWwsXG4gICAgICAgIGxhbmdJc286IHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICBsYWJlbHM6IHtcbiAgICAgICAgICBpbml0aWFsTWVzc2FnZTogVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgc3RlcC5jb25maWc/LmluaXRpYWxNZXNzYWdlVHJhbnNsYXRpb25zIHx8IFtdLFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApLFxuICAgICAgICAgIHdhaXRpbmdNZXNzYWdlOiBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICBzdGVwLmNvbmZpZz8ud2FpdGluZ01lc3NhZ2VUcmFuc2xhdGlvbnMgfHwgW10sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICksXG4gICAgICAgICAgY29uc2VudEVycm9yTWVzc2FnZTogVXRpbHMuZmluZFRyYW5zbGF0aW9uKFxuICAgICAgICAgICAgc3RlcC5jb25maWc/LmNvbnNlbnRFcnJvck1lc3NhZ2VUcmFuc2xhdGlvbnMgfHwgW10sXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICAgICksXG4gICAgICAgICAgY29tcGxldGlvbk1lc3NhZ2U6IFV0aWxzLmZpbmRUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIHN0ZXAuY29uZmlnPy5jb21wbGV0aW9uTWVzc2FnZVRyYW5zbGF0aW9ucyB8fCBbXSxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKSxcbiAgICAgICAgICByZXRyeUJ1dHRvbkxhYmVsOiBVdGlscy5maW5kVHJhbnNsYXRpb24oXG4gICAgICAgICAgICBzdGVwLmNvbmZpZz8ucmV0cnlCdXR0b25MYWJlbFRyYW5zbGF0aW9ucyB8fCBbXSxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKVxuICAgICAgICB9LFxuICAgICAgICBldmVudDogKGV2ZW50OiBhbnkpID0+IHRoaXMub25PcGVuQmFua2luZ0V2ZW50KGV2ZW50LCBzdGVwKVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIENyZWF0ZVN0YXR1c0ZpZWxkQ29uZmlnKHN0ZXA6IFN0ZXBEYXRhKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybWx5LXN0YXR1cycsXG4gICAgICBwcm9wczoge1xuICAgICAgICBjb25maWc6IHN0ZXAuY29uZmlnLFxuICAgICAgICBzdGVwRGF0YTogc3RlcCxcbiAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICBhcHBJZDogdGhpcy5hcHBNb2RlbC5hcHBsaWNhdGlvblV1aWRcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGb3JtbHlTeXN0ZW1GaWVsZENvbmZpZyhcbiAgICBzdGVwOiBTdGVwRGF0YVxuICApOiBGb3JtbHlGaWVsZENvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgc3dpdGNoIChzdGVwLnR5cGUpIHtcbiAgICAgIGNhc2UgRmx1eFR5cGUuS3ljOlxuICAgICAgICB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlS3ljRmllbGRDb25maWcoc3RlcCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEZsdXhUeXBlLkVtYWlsOlxuICAgICAgY2FzZSBGbHV4VHlwZS5QaG9uZToge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVQaG9uZUVtYWlsRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLkFjdGlvbjoge1xuICAgICAgICAvLyBBY3Rpb24gc3RlcHMgYXJlIG5vdyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgQWN0aW9uU3RlcEhhbmRsZXJcbiAgICAgICAgLy8gVGhleSBzaG91bGQgbm90IGFwcGVhciBhcyB2aXNpYmxlIGZvcm1seSBjb21wb25lbnRzXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLklkU2Nhbjoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVJZFNjYW5GaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuR2VuZXJhdGVEb2N1bWVudDoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVHZW5lcmF0ZURvY3NGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuU2lnbjoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVTaWduRmllbGRDb25maWcoc3RlcCk7XG4gICAgICB9XG4gICAgICBjYXNlIEZsdXhUeXBlLlZpZXdPZmZlcjoge1xuICAgICAgICByZXR1cm4gdGhpcy5DcmVhdGVWaWV3T2ZmZXJGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuU3RhdHVzOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZVN0YXR1c0ZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5FVVBMQVRFU0M6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlRW5yb2xsQ2FyZEZpZWxkQ29uZmlnKHN0ZXApO1xuICAgICAgfVxuICAgICAgY2FzZSBGbHV4VHlwZS5ORVRPUElBOiB7XG4gICAgICAgIHJldHVybiB0aGlzLkNyZWF0ZUVucm9sbENhcmRGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuUGF1c2U6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlUGF1c2VGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgRmx1eFR5cGUuT3BlbkJhbmtpbmc6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuQ3JlYXRlT3BlbkJhbmtpbmdGaWVsZENvbmZpZyhzdGVwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIG9uT2ZmZXJTZWxlY3RlZChvZmZlcklkOiBhbnksIHN0ZXA6IFN0ZXBEYXRhKSB7XG4gICAgdGhpcy5mb3JtbHlVcGRhdGVBbmRHb05leHQuZW1pdCh7IHNlbGVjdGVkT2ZmZXJJZDogb2ZmZXJJZCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25TaWduRXZlbnQoZXZlbnQ6IGFueSwgc3RlcDogU3RlcERhdGEpIHtcbiAgICBjb25zb2xlLmxvZygnU2lnbiBldmVudCByZWNlaXZlZDonLCBldmVudCk7XG4gICAgdGhpcy51cGRhdGVTdGVwQnV0dG9uU3RhdGUoc3RlcCk7XG4gIH1cblxuICBwcml2YXRlIG9uT3BlbkJhbmtpbmdFdmVudChldmVudDogYW55LCBzdGVwOiBTdGVwRGF0YSkge1xuICAgIGNvbnNvbGUubG9nKCdPcGVuQmFua2luZyBldmVudCByZWNlaXZlZDonLCBldmVudCk7XG4gICAgaWYgKGV2ZW50ID09PSAnc3VjY2VzcycpIHtcbiAgICAgIC8vIE9wZW4gQmFua2luZyBmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiAgICAgIHRoaXMudXBkYXRlU3RlcEJ1dHRvblN0YXRlKHN0ZXApO1xuICAgICAgLy8gQXV0by1wcm9jZWVkIHRvIG5leHQgc3RlcFxuICAgICAgdGhpcy5mb3JtbHlVcGRhdGVBbmRHb05leHQuZW1pdCh7fSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbklkU2NhbkNvbXBsZXRlZChldmVudDogYW55LCBzdGVwOiBTdGVwRGF0YSkge1xuICAgIGNvbnNvbGUubG9nKCdTaWduIGV2ZW50IHJlY2VpdmVkOicsIGV2ZW50KTtcbiAgICBjb25zdCBmaWxsRGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZmlsbERhdGEpO1xuICAgIGNvbnN0IHN0ZXBGaWxsRGF0YSA9IGZpbGxEYXRhLmZsdXguZmluZChcbiAgICAgIChzOiB7IHN0ZXBJZDogc3RyaW5nIH0pID0+IHMuc3RlcElkID09IHN0ZXAuaWRlbnRpZmllclxuICAgICk7XG4gICAgc3RlcEZpbGxEYXRhLnNlY3Rpb25zLmZvckVhY2goXG4gICAgICAoczoge1xuICAgICAgICBjb250cm9sczoge1xuICAgICAgICAgIGNvbnRyb2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGZpbGxWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICB9W107XG4gICAgICB9KSA9PiB7XG4gICAgICAgIHMuY29udHJvbHMuZm9yRWFjaChcbiAgICAgICAgICAoYzoge1xuICAgICAgICAgICAgY29udHJvbElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBmaWxsVmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICB9KSA9PiB7XG4gICAgICAgICAgICBpZiAoYy5jb250cm9sSWQpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB7XG4gICAgICAgICAgICAgICAgW2MuY29udHJvbElkXToge1xuICAgICAgICAgICAgICAgICAgdmFsdWU6IGMuZmlsbFZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uY29udGFpbnMoYy5jb250cm9sSWQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGMuY29udHJvbElkLCBuZXcgRm9ybUNvbnRyb2woYy5maWxsVmFsdWUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy51cGRhdGVTdGVwQnV0dG9uU3RhdGUoc3RlcCk7XG4gIH1cblxuICB1cGRhdGVTdGVwQnV0dG9uU3RhdGUoc3RlcDogU3RlcERhdGEpIHtcbiAgICBsZXQgZm9ybWx5U3RlcEZpZWxkID0gdGhpcy5mb3JtbHlDb25maWdbMF0uZmllbGRHcm91cD8uZmluZCgoZmllbGQpID0+XG4gICAgICBmaWVsZC5maWVsZEdyb3VwPy5maW5kKChmKSA9PiBmLnByb3BzPy5bJ3N0ZXBJZCddID09PSBzdGVwLmlkZW50aWZpZXIpXG4gICAgKTtcblxuICAgIGlmICghZm9ybWx5U3RlcEZpZWxkKSB7XG4gICAgICBmb3JtbHlTdGVwRmllbGQgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwPy5maW5kKFxuICAgICAgICAoZmllbGQpID0+IGZpZWxkLnByb3BzPy5bJ3N0ZXBJZCddID09PSBzdGVwLmlkZW50aWZpZXJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1seVN0ZXBGaWVsZCkge1xuICAgICAgZm9ybWx5U3RlcEZpZWxkLnByb3BzID0ge1xuICAgICAgICAuLi5mb3JtbHlTdGVwRmllbGQucHJvcHMsXG4gICAgICAgIGJ1dHRvbnNEaXNhYmxlZDogZmFsc2VcbiAgICAgIH07XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgdGhpcy5mb3JtbHlDb25maWdVcGRhdGVkLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFJlbmRlcmVkQ3NzKCkge1xuICAgIGNvbnN0IHN0eWxlU3RyaW5nID0gRm9ybUNzc0hlbHBlci5jb252ZXJ0VG9TdHlsZVN0cmluZyhcbiAgICAgIHRoaXMuZGVzaWduLFxuICAgICAgdGhpcy5zaG93RGlzcGxheU1vZGVcbiAgICApO1xuXG4gICAgY29uc3Qgc3R5bGVFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlRWxlbWVudC5pZCA9ICdyZW5kZXJlZC1jc3MnO1xuICAgIGNvbnN0IHJlbmRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZW5kZXJlZC1jc3MnKTtcbiAgICBpZiAocmVuZEVsKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGRvY3VtZW50LmJvZHksIHJlbmRFbCk7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoXG4gICAgICBzdHlsZUVsZW1lbnQsXG4gICAgICB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoVXRpbHMucmVtb3ZlTmV3TGluZXMoc3R5bGVTdHJpbmcpKVxuICAgICk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5ib2R5LCBzdHlsZUVsZW1lbnQpO1xuICB9XG5cbiAgYXN5bmMgYnVpbGRTZWN0aW9uc0ZpZWxkR3JvdXBBc3luYyhcbiAgICBzdGVwOiBTdGVwRGF0YSB8IHVuZGVmaW5lZCxcbiAgICBzZWN0aW9uczogU2VjdGlvbkRhdGFbXVxuICApOiBQcm9taXNlPEZvcm1seUZpZWxkQ29uZmlnW10+IHtcbiAgICBjb25zdCBzdGVwU2VjdGlvbnM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgc2VjdGlvbnMgJiYgaW5kZXggPCBzZWN0aW9ucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHNlY3Rpb24gPSBzZWN0aW9uc1tpbmRleF07XG4gICAgICBsZXQgc2VwYXJhdG9yRm9ybWx5Q29uZmlnOiBhbnkgPSB7fTtcbiAgICAgIGlmIChzZWN0aW9uLnNob3dTZWN0aW9uVGl0bGUpIHtcbiAgICAgICAgc2VwYXJhdG9yRm9ybWx5Q29uZmlnID0ge1xuICAgICAgICAgIHR5cGU6ICdzZXBhcmF0b3InLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICB0aXRsZTpcbiAgICAgICAgICAgICAgc2VjdGlvbi50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAgICAgKHQ6IGFueSkgPT4gdC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICAgICAgKT8udmFsdWUgPz8gJycsXG5cbiAgICAgICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ25cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWN0aW9uLnNob3dTZWN0aW9uU2VwYXJhdG9yKSB7XG4gICAgICAgIHNlcGFyYXRvckZvcm1seUNvbmZpZyA9IHtcbiAgICAgICAgICAuLi5zZXBhcmF0b3JGb3JtbHlDb25maWcsXG4gICAgICAgICAgdHlwZTogJ3NlcGFyYXRvcicsXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIC4uLnNlcGFyYXRvckZvcm1seUNvbmZpZy5wcm9wcyxcbiAgICAgICAgICAgIHNob3dTZXBhcmF0b3I6IHNlY3Rpb24uc2hvd1NlY3Rpb25TZXBhcmF0b3JcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnkpIHtcbiAgICAgICAgdGhpcy5hdHRhY2hUb0RlcGVuZGVudERpY3Rpb25hcnlJZk5lY2Vzc2FyeShcbiAgICAgICAgICBzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgICAgc2VwYXJhdG9yRm9ybWx5Q29uZmlnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWN0aW9uQW55ID0gc2VjdGlvbiBhcyBhbnk7XG4gICAgICAvLyBXaGVuIHRoZSBzZWN0aW9uIGhhcyBhIHZpc2libGUgdGl0bGUgb3Igc2VwYXJhdG9yLCBzZWN0aW9uTWFyZ2luVG9wIGlzIHBhc3NlZCB0b1xuICAgICAgLy8gc2VwYXJhdG9yRm9ybWx5Q29uZmlnIHNvIGl0IGFwcGVhcnMgQUJPVkUgdGhlIHRpdGxlL2hyLiBXaGVuIG5laXRoZXIgaXMgc2hvd24sXG4gICAgICAvLyB0aGUgY29udHJvbHMgQVJFIHRoZSB0b3Agb2YgdGhlIHNlY3Rpb24sIHNvIHNlY3Rpb25NYXJnaW5Ub3Agc3RheXMgb24gY3VzdG9tLXNlY3Rpb24uXG4gICAgICBjb25zdCBoYXNUaXRsZU9yU2VwYXJhdG9yID0gc2VjdGlvbi5zaG93U2VjdGlvblRpdGxlIHx8IHNlY3Rpb24uc2hvd1NlY3Rpb25TZXBhcmF0b3I7XG4gICAgICBpZiAoaGFzVGl0bGVPclNlcGFyYXRvciAmJiBzZWN0aW9uQW55Lm1hcmdpblRvcCkge1xuICAgICAgICBzZXBhcmF0b3JGb3JtbHlDb25maWcgPSB7XG4gICAgICAgICAgLi4uc2VwYXJhdG9yRm9ybWx5Q29uZmlnLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAuLi5zZXBhcmF0b3JGb3JtbHlDb25maWcucHJvcHMsXG4gICAgICAgICAgICBzZWN0aW9uTWFyZ2luVG9wOiBzZWN0aW9uQW55Lm1hcmdpblRvcCxcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBzdGVwU2VjdGlvbnMucHVzaChzZXBhcmF0b3JGb3JtbHlDb25maWcpO1xuXG4gICAgICAvLyBmaXJzdFJvd01hcmdpbkJvdHRvbSBpcyBwYXNzZWQgaW50byBidWlsZENvbnRyb2xzRmllbGRHcm91cEFzeW5jIHNvIGl0IGVuZHMgdXBcbiAgICAgIC8vIGluIHRoZSBzcGFjZXIgQUZURVIgdGhlIGZpcnN0IHJvdyAobm90IGJlZm9yZSBpdCksIG1hdGNoaW5nIHVzZXIgZXhwZWN0YXRpb24uXG4gICAgICBjb25zdCBzZWN0aW9uQ29udHJvbHMgPSBhd2FpdCB0aGlzLmJ1aWxkQ29udHJvbHNGaWVsZEdyb3VwQXN5bmMoXG4gICAgICAgIHN0ZXAsXG4gICAgICAgIHNlY3Rpb24uY29udHJvbHMgfHwgW10sXG4gICAgICAgIHNlY3Rpb24ucHJlc2VudGF0aW9uQ29udHJvbHMgfHwgW10sXG4gICAgICAgIHNlY3Rpb25BbnkuZmlyc3RSb3dNYXJnaW5Cb3R0b20gfHwgdW5kZWZpbmVkXG4gICAgICApO1xuXG4gICAgICAvLyBQcmVwZW5kIGEgc3BhY2VyIG9ubHkgZm9yIGZpcnN0Um93TWFyZ2luVG9wIChzcGFjZSBBQk9WRSByb3cgMCkuXG4gICAgICAvLyBmaXJzdFJvd01hcmdpbkJvdHRvbSBpcyBoYW5kbGVkIGluc2lkZSBidWlsZENvbnRyb2xzRmllbGRHcm91cEFzeW5jLlxuICAgICAgaWYgKHNlY3Rpb25BbnkuZmlyc3RSb3dNYXJnaW5Ub3ApIHtcbiAgICAgICAgc2VjdGlvbkNvbnRyb2xzLnVuc2hpZnQoe1xuICAgICAgICAgIHR5cGU6ICdyb3ctc3BhY2VyJyxcbiAgICAgICAgICBjbGFzc05hbWU6ICdwZXJjZW50YWdlLXdpZHRoLTEyJyxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgc3BhY2VyTWFyZ2luVG9wOiBzZWN0aW9uQW55LmZpcnN0Um93TWFyZ2luVG9wLFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlY3Rpb25Gb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnID0ge1xuICAgICAgICB0eXBlOiAnY3VzdG9tLXNlY3Rpb24nLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGxhYmVsOiBzZWN0aW9uLnRpdGxlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgc2VjdGlvbi50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAgICh0OiBhbnkpID0+IHQubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgICApPy52YWx1ZSA/PyAnJyxcbiAgICAgICAgICBkZXNpZ246IHRoaXMuZGVzaWduLFxuICAgICAgICAgIC8vIFdoZW4gdGl0bGUvc2VwYXJhdG9yIGlzIHNob3duLCBzZWN0aW9uTWFyZ2luVG9wIGxpdmVzIG9uIHNlcGFyYXRvckZvcm1seUNvbmZpZyBhYm92ZS5cbiAgICAgICAgICAvLyBXaGVuIG5laXRoZXIgaXMgc2hvd24sIHRoZSBjb250cm9scyBhcmUgdGhlIHRvcCBvZiBzZWN0aW9uIHNvIGtlZXAgbWFyZ2luIGhlcmUuXG4gICAgICAgICAgc2VjdGlvbk1hcmdpblRvcDogaGFzVGl0bGVPclNlcGFyYXRvciA/IHVuZGVmaW5lZCA6IChzZWN0aW9uQW55Lm1hcmdpblRvcCB8fCB1bmRlZmluZWQpLFxuICAgICAgICAgIHNlY3Rpb25NYXJnaW5Cb3R0b206IHNlY3Rpb25BbnkubWFyZ2luQm90dG9tIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgICAgZmllbGRHcm91cDogc2VjdGlvbkNvbnRyb2xzLFxuICAgICAgICBmaWVsZEdyb3VwQ2xhc3NOYW1lOiAnZGlzcGxheS1mbGV4J1xuICAgICAgfTtcbiAgICAgIGlmIChzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnkpIHtcbiAgICAgICAgdGhpcy5hdHRhY2hUb0RlcGVuZGVudERpY3Rpb25hcnlJZk5lY2Vzc2FyeShcbiAgICAgICAgICBzZWN0aW9uLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgICAgc2VjdGlvbkZvcm1seUNvbmZpZ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBzdGVwU2VjdGlvbnMucHVzaChzZWN0aW9uRm9ybWx5Q29uZmlnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RlcFNlY3Rpb25zO1xuICB9XG5cbiAgYXN5bmMgYnVpZERpc3BsYXlTdGVwKCk6IFByb21pc2U8Rm9ybWx5RmllbGRDb25maWc+IHtcbiAgICBsZXQgc3RlcEZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7fTtcbiAgICBpZiAodGhpcy5kaXNwbGF5Py5zZWN0aW9ucz8ubGVuZ3RoID4gMCkge1xuICAgICAgc3RlcEZvcm1seUNvbmZpZyA9IHtcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAvLyBsYWJlbDogc3RlcC5uYW1lLFxuICAgICAgICAgIC8vIGJ1dHRvbnM6IHRoaXMuY29uc3RydWN0QnV0dG9ucyhzdGVwLmJ1dHRvbnMpLFxuICAgICAgICAgIC8vICBkZXBlbmRlbnREaWN0aW9uYXJ5OiBzdGVwLmRlcGVuZGVudERpY3Rpb25hcnksXG4gICAgICAgIH0sXG4gICAgICAgIGZpZWxkR3JvdXA6IGF3YWl0IHRoaXMuYnVpbGRTZWN0aW9uc0ZpZWxkR3JvdXBBc3luYyhcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdGhpcy5kaXNwbGF5LnNlY3Rpb25zXG4gICAgICAgIClcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBzdGVwRm9ybWx5Q29uZmlnO1xuICB9XG5cbiAgYWRkTmV3Um93VG9Gb3JtRmllbGRzSWZOZWNlc3NhcnkoXG4gICAgZmllbGRHcm91cDogRm9ybWx5RmllbGRDb25maWdbXSxcbiAgICBuZXdSb3c6IEZvcm1seUZpZWxkQ29uZmlnXG4gICkge1xuICAgIGlmIChuZXdSb3cuZmllbGRHcm91cCAmJiBuZXdSb3cuZmllbGRHcm91cC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZUZvcm1GaWVsZHNXaWR0aChuZXdSb3cuZmllbGRHcm91cCk7XG4gICAgICBmaWVsZEdyb3VwLnB1c2gobmV3Um93KTtcbiAgICB9XG4gIH1cblxuICBjYWxjdWxhdGVGb3JtRmllbGRzV2lkdGgoZm9ybUZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSkge1xuICAgIGNvbnN0IGNvbFdpZHRoUGVySXRlbSA9IDEyIC8gZm9ybUZpZWxkcy5sZW5ndGg7XG4gICAgZm9ybUZpZWxkcy5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBmLmNsYXNzTmFtZSA9ICdjb2wtJyArIGNvbFdpZHRoUGVySXRlbTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFBlcmNlbnRhZ2VDbGFzc05hbWUocGVyY2VudGFnZURpbWVuc2lvbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB0b3RhbENvbHVtbnMgPSAxMjsgLy8gMTItY29sdW1uIGdyaWRcbiAgICBjb25zdCBzcGFuID0gTWF0aC5yb3VuZCgocGVyY2VudGFnZURpbWVuc2lvbiAvIDEwMCkgKiB0b3RhbENvbHVtbnMpO1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGBwZXJjZW50YWdlLXdpZHRoLSR7c3Bhbn1gO1xuXG4gICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjbGFzc05hbWUpKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgIHN0eWxlLmlkID0gY2xhc3NOYW1lO1xuICAgICAgc3R5bGUuaW5uZXJIVE1MID0gYFxuICAgICAgICAuJHtjbGFzc05hbWV9IHtcbiAgICAgICAgICBncmlkLWNvbHVtbjogc3BhbiAke3NwYW59O1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICBjcmVhdGVGaWxsZXJDb250cm9sKHNwYW46IG51bWJlcik6IEZvcm1seUZpZWxkQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ3Jvdy1maWxsZXInLFxuICAgICAgY2xhc3NOYW1lOiBgcGVyY2VudGFnZS13aWR0aC0ke3NwYW59YCxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGxhYmVsOiAnJyxcbiAgICAgICAgZGlzYWJsZWQ6IHRydWUsXG4gICAgICAgIGhpZGU6IHRydWVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZENvbnRyb2xzRmllbGRHcm91cEFzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRyb2xzOiBDb250cm9sRGF0YVtdLFxuICAgIHByZXNlbnRhdGlvbkNvbnRyb2xzOiBQcmVzZW50YXRpb25Db250cm9sW10sXG4gICAgaW5pdGlhbFBlbmRpbmdNYXJnaW5Cb3R0b20/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gICAgbGV0IHJvd0l0ZW1zOiAoQ29udHJvbERhdGEgfCBQcmVzZW50YXRpb25Db250cm9sKVtdID0gW107XG4gICAgY29udHJvbHMgPSBjb250cm9scy5maWx0ZXIoKGMpID0+ICFjLmlzT25seUZvckNvbmZpZyk7XG5cbiAgICAvLyBGaWx0ZXIgb3V0IGNvbnRyb2xzIHRoYXQgYXJlIGluY29tcGxldGVcbiAgICBjb250cm9scyA9IGNvbnRyb2xzLmZpbHRlcigoYykgPT4ge1xuICAgICAgLy8gU2tpcCBjb250cm9scyB0aGF0IGFyZSBtaXNzaW5nIGVzc2VudGlhbCBkYXRhXG4gICAgICBpZiAoXG4gICAgICAgIGMudHlwZSA9PT0gU3RlcENvbnRyb2xUeXBlLkRpY3Rpb25hcnkgJiZcbiAgICAgICAgIWMuc3BlY2lmaWNDb250cm9sRGF0YT8uZGljdGlvbmFyeVVVSURcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9jZXNzUm93ID0gYXN5bmMgKGl0ZW1zOiAoQ29udHJvbERhdGEgfCBQcmVzZW50YXRpb25Db250cm9sKVtdLCB1c2VGbGV4V2lkdGggPSBmYWxzZSkgPT4ge1xuICAgICAgY29uc3QgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gICAgICBjb25zdCB0b3RhbCA9IDEyO1xuICAgICAgY29uc3QgYnVpbHQ6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgICAgIGNvbnN0IGF1dG86IHtcbiAgICAgICAgYzogQ29udHJvbERhdGEgfCBQcmVzZW50YXRpb25Db250cm9sO1xuICAgICAgICBmOiBGb3JtbHlGaWVsZENvbmZpZztcbiAgICAgIH1bXSA9IFtdO1xuICAgICAgbGV0IHVzZWQgPSAwO1xuICAgICAgY29uc3QgZ2V0V2lkdGhDbGFzcyA9IChkaW06IG51bWJlcikgPT4gdXNlRmxleFdpZHRoXG4gICAgICAgID8gdGhpcy5nZXRGbGV4V2lkdGhDbGFzc05hbWUoZGltKVxuICAgICAgICA6IHRoaXMuZ2V0UGVyY2VudGFnZUNsYXNzTmFtZShkaW0pO1xuICAgICAgZm9yIChjb25zdCBpIG9mIGl0ZW1zKSB7XG4gICAgICAgIGlmICgnY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyJyBpbiBpID09PSB0cnVlKSB7XG4gICAgICAgICAgYnVpbHQucHVzaChcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYnVpbGRQcmVzZW50YXRpb25Gb3JtRmllbGRBc3luYyhcbiAgICAgICAgICAgICAgc3RlcCxcbiAgICAgICAgICAgICAgaSBhcyBQcmVzZW50YXRpb25Db250cm9sXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICgnYXBpTWV0aG9kSWQnIGluIGkgPT09IHRydWUpIHtcbiAgICAgICAgICBidWlsdC5wdXNoKFxuICAgICAgICAgICAgYXdhaXQgdGhpcy5idWlsZEFwaU1ldGhvZEZvcm1GaWVsZEFzeW5jKFxuICAgICAgICAgICAgICBzdGVwLFxuICAgICAgICAgICAgICBpIGFzIFByZXNlbnRhdGlvbkNvbnRyb2xcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1aWx0LnB1c2goYXdhaXQgdGhpcy5idWlsZEZvcm1GaWVsZEFzeW5jKHN0ZXAsIGkgYXMgQ29udHJvbERhdGEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjID0gaXRlbXNbaV07XG4gICAgICAgIGNvbnN0IGYgPSBidWlsdFtpXTtcbiAgICAgICAgaWYgKGMuZGltZW5zaW9uVHlwZSA9PT0gRGltZW5zaW9uVHlwZS5QZXJjZW50YWdlKSB7XG4gICAgICAgICAgaWYgKGMuYXV0b0RpbWVuc2lvbikge1xuICAgICAgICAgICAgYXV0by5wdXNoKHsgYywgZiB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcyA9IE1hdGgucm91bmQoKGMuZGltZW5zaW9uIC8gMTAwKSAqIHRvdGFsKTtcbiAgICAgICAgICAgIHVzZWQgKz0gcztcbiAgICAgICAgICAgIGYuY2xhc3NOYW1lID0gYCR7Zi5jbGFzc05hbWV9ICR7Z2V0V2lkdGhDbGFzcyhjLmRpbWVuc2lvbil9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYy5kaW1lbnNpb25UeXBlID09PSBEaW1lbnNpb25UeXBlLlBpeGVscykge1xuICAgICAgICAgIGNvbnN0IHMgPSBNYXRoLnJvdW5kKChjLmRpbWVuc2lvbiAvIHdpbmRvdy5pbm5lcldpZHRoKSAqIHRvdGFsKTtcbiAgICAgICAgICB1c2VkICs9IHM7XG4gICAgICAgICAgZi5jbGFzc05hbWUgPSBgJHtmLmNsYXNzTmFtZX0gJHtnZXRXaWR0aENsYXNzKChzIC8gdG90YWwpICogMTAwKX1gO1xuICAgICAgICB9IGVsc2UgaWYgKGMuYXV0b0RpbWVuc2lvbikge1xuICAgICAgICAgIGF1dG8ucHVzaCh7IGMsIGYgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXNlZCArPSAxO1xuICAgICAgICAgIGYuY2xhc3NOYW1lID0gYCR7Zi5jbGFzc05hbWV9ICR7Z2V0V2lkdGhDbGFzcygoMSAvIHRvdGFsKSAqIDEwMCl9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcmVtID0gdG90YWwgLSB1c2VkO1xuICAgICAgaWYgKGF1dG8ubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBzaGFyZSA9IE1hdGgubWF4KE1hdGguZmxvb3IocmVtIC8gYXV0by5sZW5ndGgpLCAxKTtcbiAgICAgICAgZm9yIChjb25zdCBhIG9mIGF1dG8pIHtcbiAgICAgICAgICBhLmYuY2xhc3NOYW1lID0gYCR7YS5mLmNsYXNzTmFtZX0gJHtnZXRXaWR0aENsYXNzKChzaGFyZSAvIHRvdGFsKSAqIDEwMCl9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmllbGRzLnB1c2goLi4uYnVpbHQpO1xuICAgICAgcmV0dXJuIGZpZWxkcztcbiAgICB9O1xuICAgIC8vIHBlbmRpbmdQcmV2Um93TWFyZ2luQm90dG9tOiBjYXJyaWVzIHRoZSBtYXJnaW5Cb3R0b20gb2YgdGhlIHByZWNlZGluZyByb3cgaW50byB0aGVcbiAgICAvLyBuZXh0IHNwYWNlcidzIG1hcmdpblRvcCBzbyB0aGF0IFwicm93IG1hcmdpbiBib3R0b21cIiBhcHBlYXJzIEJFTE9XIHRoZSByb3csIG5vdCBhYm92ZSBpdC5cbiAgICBsZXQgcGVuZGluZ1ByZXZSb3dNYXJnaW5Cb3R0b206IHN0cmluZyB8IHVuZGVmaW5lZCA9IGluaXRpYWxQZW5kaW5nTWFyZ2luQm90dG9tO1xuICAgIGxldCBwZW5kaW5nSnVzdGlmeUNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IGMgb2YgWy4uLmNvbnRyb2xzLCAuLi5wcmVzZW50YXRpb25Db250cm9sc10pIHtcbiAgICAgIGlmIChcbiAgICAgICAgKCd0eXBlJyBpbiBjICYmIGMudHlwZSA9PT0gU3RlcENvbnRyb2xUeXBlLk5ld1JvdykgfHxcbiAgICAgICAgYy50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLk5ld1Jvd1xuICAgICAgKSB7XG4gICAgICAgIGlmIChyb3dJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgamMgPSBwZW5kaW5nSnVzdGlmeUNvbnRlbnQ7XG4gICAgICAgICAgaWYgKGpjKSB7XG4gICAgICAgICAgICBjb25zdCByb3dGaWVsZHMgPSBhd2FpdCBwcm9jZXNzUm93KHJvd0l0ZW1zLCB0cnVlKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogJ3Jvdy13cmFwcGVyJyxcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncGVyY2VudGFnZS13aWR0aC0xMicsXG4gICAgICAgICAgICAgIHByb3BzOiB7IGp1c3RpZnlDb250ZW50OiBqYyB9LFxuICAgICAgICAgICAgICBmaWVsZEdyb3VwOiByb3dGaWVsZHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi4oYXdhaXQgcHJvY2Vzc1Jvdyhyb3dJdGVtcykpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcm93SXRlbXMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdSb3dDb250cm9sID0gYyBhcyBhbnk7XG4gICAgICAgIHBlbmRpbmdKdXN0aWZ5Q29udGVudCA9IG5ld1Jvd0NvbnRyb2wucm93SnVzdGlmeUNvbnRlbnQgfHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBzcGFjZXJNYXJnaW5Ub3AgID0gYm90dG9tIG1hcmdpbiBvZiB0aGUgUFJFVklPVVMgcm93IChzcGFjZSBiZWxvdyBpdClcbiAgICAgICAgLy8gc3BhY2VyTWFyZ2luQm90dG9tID0gdG9wIG1hcmdpbiBvZiB0aGUgQ1VSUkVOVCByb3cgIChzcGFjZSBhYm92ZSBpdClcbiAgICAgICAgY29uc3Qgc3BhY2VyVG9wID0gcGVuZGluZ1ByZXZSb3dNYXJnaW5Cb3R0b207XG4gICAgICAgIGNvbnN0IHNwYWNlckJvdHRvbSA9IG5ld1Jvd0NvbnRyb2wucm93TWFyZ2luVG9wIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgcGVuZGluZ1ByZXZSb3dNYXJnaW5Cb3R0b20gPSBuZXdSb3dDb250cm9sLnJvd01hcmdpbkJvdHRvbSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzcGFjZXJUb3AgfHwgc3BhY2VyQm90dG9tKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ3Jvdy1zcGFjZXInLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiAncGVyY2VudGFnZS13aWR0aC0xMicsXG4gICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICBzcGFjZXJNYXJnaW5Ub3A6IHNwYWNlclRvcCxcbiAgICAgICAgICAgICAgc3BhY2VyTWFyZ2luQm90dG9tOiBzcGFjZXJCb3R0b20sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvd0l0ZW1zLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyb3dJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGVuZGluZ0p1c3RpZnlDb250ZW50KSB7XG4gICAgICAgIGNvbnN0IHJvd0ZpZWxkcyA9IGF3YWl0IHByb2Nlc3NSb3cocm93SXRlbXMsIHRydWUpO1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3Jvdy13cmFwcGVyJyxcbiAgICAgICAgICBjbGFzc05hbWU6ICdwZXJjZW50YWdlLXdpZHRoLTEyJyxcbiAgICAgICAgICBwcm9wczogeyBqdXN0aWZ5Q29udGVudDogcGVuZGluZ0p1c3RpZnlDb250ZW50IH0sXG4gICAgICAgICAgZmllbGRHcm91cDogcm93RmllbGRzXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnB1c2goLi4uKGF3YWl0IHByb2Nlc3NSb3cocm93SXRlbXMpKSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRyYWlsaW5nIHNwYWNlciBmb3IgdGhlIGxhc3Qgcm93J3MgbWFyZ2luQm90dG9tXG4gICAgaWYgKHBlbmRpbmdQcmV2Um93TWFyZ2luQm90dG9tKSB7XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIHR5cGU6ICdyb3ctc3BhY2VyJyxcbiAgICAgICAgY2xhc3NOYW1lOiAncGVyY2VudGFnZS13aWR0aC0xMicsXG4gICAgICAgIHByb3BzOiB7IHNwYWNlck1hcmdpblRvcDogcGVuZGluZ1ByZXZSb3dNYXJnaW5Cb3R0b20gfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXRGbGV4V2lkdGhDbGFzc05hbWUocGVyY2VudGFnZURpbWVuc2lvbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGFuID0gTWF0aC5yb3VuZCgocGVyY2VudGFnZURpbWVuc2lvbiAvIDEwMCkgKiAxMik7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gYGZsZXgtd2lkdGgtJHtzcGFufWA7XG4gICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjbGFzc05hbWUpKSB7XG4gICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgIHN0eWxlLmlkID0gY2xhc3NOYW1lO1xuICAgICAgc3R5bGUuaW5uZXJIVE1MID0gYFxuICAgICAgICAuJHtjbGFzc05hbWV9IHtcbiAgICAgICAgICB3aWR0aDogJHtNYXRoLnJvdW5kKChzcGFuIC8gMTIpICogMTAwKX0lO1xuICAgICAgICAgIGZsZXgtc2hyaW5rOiAxO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgfVxuICAgIHJldHVybiBjbGFzc05hbWU7XG4gIH1cblxuICBnZXRQaXhlbENsYXNzTmFtZShwaXhlbERpbWVuc2lvbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBgcGl4ZWwtd2lkdGgtJHtwaXhlbERpbWVuc2lvbn1gO1xuICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2xhc3NOYW1lKSkge1xuICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgc3R5bGUudHlwZSA9ICd0ZXh0L2Nzcyc7XG4gICAgICBzdHlsZS5pZCA9IGNsYXNzTmFtZTtcbiAgICAgIHN0eWxlLmlubmVySFRNTCA9IGBcbiAgICAgICAgLiR7Y2xhc3NOYW1lfSB7XG4gICAgICAgICAgd2lkdGg6ICR7cGl4ZWxEaW1lbnNpb259cHg7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkRm9ybUZpZWxkQXN5bmMoXG4gICAgc3RlcDogU3RlcERhdGEgfCB1bmRlZmluZWQsXG4gICAgY29udHJvbDogQ29udHJvbERhdGFcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGxldCBpbml0aWFsVHlwZSA9ICdpbnB1dCc7IC8vIERlZmF1bHQgdHlwZVxuICAgIGxldCBjb21wb25lbnRTdHlsZUtleSA9IGAuY29tcG9uZW50LXRleHQtZmllbGRgOyAvLyBEZWZhdWx0IHN0eWxlIGZvciB0ZXh0IGlucHV0XG4gICAgY29uc3QgYmFzZVN0eWxlID0gdGhpcy5kZXNpZ25bYC5mb250LSR7aW5pdGlhbFR5cGV9YF0gfHwge307XG4gICAgY29uc3QgY29udHJvbFN0eWxlU3RyaW5nID1cbiAgICAgIHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoYmFzZVN0eWxlKTtcbiAgICBsZXQgcGF0dGVybiA9ICcnO1xuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93ZWRDaGFyYWN0ZXJzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwYXR0ZXJuID0gbmV3IFJlZ0V4cChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEuYWxsb3dlZENoYXJhY3RlcnMpXG4gICAgICAgICAgLnNvdXJjZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignaW5jb3JyZWN0IHJlZ2V4IHBhdHRlcm4nLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnRzVG9FeGNsdWRlRnJvbVN0eWxlID0gW1xuICAgICAgJy5jb21wb25lbnQtdGV4dC1maWVsZCcsXG4gICAgICAnLmNvbXBvbmVudC1jaGVja2JveCcsXG4gICAgICAnLmNvbXBvbmVudC1yYWRpbycsXG4gICAgICAnLmNvbXBvbmVudC1kYXRlJyxcbiAgICAgICcuY29tcG9uZW50LWRhdGEnLFxuICAgICAgJy5jb21wb25lbnQtZGljdGlvbmFyeSdcbiAgICBdO1xuICAgIGxldCBmb3JtbHlDb25maWcgPSB0aGlzLmdldERlZmF1bHRGb3JtbHlGaWVsZENvbmZpZyhcbiAgICAgIGNvbnRyb2wsXG4gICAgICBpbml0aWFsVHlwZSxcbiAgICAgIHBhdHRlcm4sXG4gICAgICBjb21wb25lbnRTdHlsZUtleSxcbiAgICAgIGNvbXBvbmVudHNUb0V4Y2x1ZGVGcm9tU3R5bGVcbiAgICApO1xuICAgIC8vY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLnR5cGUgPT09IDMgIGlzIGVtYWlsXG4gICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8udHlwZSA9PT0gMykge1xuICAgICAgdGhpcy5hZGRWYWxpZGF0b3JzKGZvcm1seUNvbmZpZywgY29udHJvbCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNBcGlWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLmFkZEFwaVZhbGlkYXRvcnMoZm9ybWx5Q29uZmlnLCBjb250cm9sKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbnRyb2wudHlwZSkge1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuTWFudWFsSW5wdXQ6IC8vIFRleHRcbiAgICAgICAgdmFyIHN1YlR5cGUgPSBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGFcbiAgICAgICAgICA/LnR5cGUgYXMgTWFudWFsSW5wdXRDb250cm9sVHlwZTtcbiAgICAgICAgc3dpdGNoIChzdWJUeXBlKSB7XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLk51bWVyaWM6XG4gICAgICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdudW1iZXInO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIE1hbnVhbElucHV0Q29udHJvbFR5cGUuRW1haWw6XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHQ6XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlBob25lOlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnaW5wdXQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLlRleHRBcmVhOlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAndGV4dGFyZWEnO1xuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnYXV0b3NpemUnXSA9IHRydWU7XG4gICAgICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBNYW51YWxJbnB1dENvbnRyb2xUeXBlLkRhdGVUaW1lOlxuICAgICAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZGF0ZXBpY2tlcic7XG4gICAgICAgICAgICBmb3JtbHlDb25maWcucHJvcHMgPSB7XG4gICAgICAgICAgICAgIHJlYWRvbmx5OiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29tcG9uZW50U3R5bGVLZXkgPSAnLmNvbXBvbmVudC1kYXRlJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdpbnB1dCc7XG4gICAgICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5QYXJhZ3JhcGg6IC8vIFBhcmFncmFwaFxuICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdmb3JtbHktcGFyYWdyYXBoJztcbiAgICAgICAgY29tcG9uZW50U3R5bGVLZXkgPSAnLmNvbXBvbmVudC10ZXh0LWZpZWxkJztcblxuICAgICAgICBjb25zdCB0cmFuc2xhdGVkRGVzY3JpcHRpb24gPVxuICAgICAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uZGVzY3JpcHRpb25UcmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAoZDogeyBsYW5ndWFnZUlzbzogc3RyaW5nIH0pID0+XG4gICAgICAgICAgICAgIGQubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWUgfHwgJyc7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRQYXJhZ3JhcGhUaXRsZSA9XG4gICAgICAgICAgY29udHJvbC50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAoZDogeyBsYW5ndWFnZUlzbzogc3RyaW5nIH0pID0+XG4gICAgICAgICAgICAgIGQubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWUgfHwgJyc7XG4gICAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSB0cmFuc2xhdGVkRGVzY3JpcHRpb247XG4gICAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ3RyYW5zbGF0ZWREZXNjcmlwdGlvbiddID0gdHJhbnNsYXRlZERlc2NyaXB0aW9uO1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhWyd0cmFuc2xhdGVkUGFyYWdyYXBoVGl0bGUnXSA9XG4gICAgICAgICAgdHJhbnNsYXRlZFBhcmFncmFwaFRpdGxlO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuQ2hlY2tCb3g6IC8vIENoZWNrYm94XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1jaGVja2JveCc7XG4gICAgICAgIGNvbXBvbmVudFN0eWxlS2V5ID0gJy5jb21wb25lbnQtY2hlY2tib3gnO1xuICAgICAgICB2YXIgY2hlY2tlZCA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uY2hlY2tlZCA/PyBmYWxzZTtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnY2hlY2tlZCddID0gY2hlY2tlZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFN0ZXBDb250cm9sVHlwZS5EaWN0aW9uYXJ5OiAvLyBEaWN0aW9uYXJ5IChkcm9wZG93bilcbiAgICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5zaG93QXNDaGVja2JveGVzID09PSB0cnVlKSB7XG4gICAgICAgICAgY29tcG9uZW50U3R5bGVLZXkgPSAnLmNvbXBvbmVudC1jaGVja2JveCc7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLnNob3dBc1JhZGlvQnV0dG9uc0xpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LXJhZGlvJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LWRpY3Rpb25hcnknO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuY29uc3RydWN0RGljdGlvbmFyeShjb250cm9sLCBmb3JtbHlDb25maWcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RlcENvbnRyb2xUeXBlLkJ1dHRvbnM6XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuRmx1eEluZm86XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuRG93bmxvYWREb2N1bWVudHM6XG4gICAgICAgIGZvcm1seUNvbmZpZyA9IHRoaXMuQ3JlYXRlRG93bmxvYWREb2NzRmllbGRDb25maWcoY29udHJvbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuVmlld0RvY3VtZW50czpcbiAgICAgICAgZm9ybWx5Q29uZmlnID0gdGhpcy5DcmVhdGVWaWV3RG9jc0ZpZWxkQ29uZmlnKGNvbnRyb2wpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3RlcENvbnRyb2xUeXBlLlVwbG9hZERvY3VtZW50czpcbiAgICAgICAgZm9ybWx5Q29uZmlnID0gdGhpcy5DcmVhdGVVcGxvYWREb2NzRmllbGRDb25maWcoY29udHJvbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTdGVwQ29udHJvbFR5cGUuTmV3Um93OiAvLyBOZXcgUm93XG4gICAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnaW5wdXQnO1xuICAgICAgICBjb21wb25lbnRTdHlsZUtleSA9ICcuY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIH1cbiAgICBmb3JtbHlDb25maWcuY2xhc3NOYW1lID0gY29tcG9uZW50U3R5bGVLZXkuc3Vic3RyaW5nKDEpO1xuXG4gICAgaWYgKCFjb21wb25lbnRzVG9FeGNsdWRlRnJvbVN0eWxlLmZpbmQoKGMpID0+IGMgPT09IGNvbXBvbmVudFN0eWxlS2V5KSkge1xuICAgICAgaWYgKHRoaXMuZGVzaWduW2NvbXBvbmVudFN0eWxlS2V5XSkge1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhLmF0dHJpYnV0ZXMhWydzdHlsZSddICs9XG4gICAgICAgICAgJzsnICtcbiAgICAgICAgICB0aGlzLnN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKFxuICAgICAgICAgICAgdGhpcy5kZXNpZ25bY29tcG9uZW50U3R5bGVLZXldXG4gICAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgbGFiZWwgc3R5bGVzXG4gICAgICBjb25zdCBsYWJlbFN0eWxlS2V5ID0gYCR7Y29tcG9uZW50U3R5bGVLZXl9LWxhYmVsYDtcbiAgICAgIGlmICh0aGlzLmRlc2lnbltsYWJlbFN0eWxlS2V5XSkge1xuICAgICAgICBmb3JtbHlDb25maWcucHJvcHMhLmF0dHJpYnV0ZXMhWydzdHlsZSddICs9XG4gICAgICAgICAgJzsnICtcbiAgICAgICAgICB0aGlzLnN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKFxuICAgICAgICAgICAgdGhpcy5kZXNpZ25bY29tcG9uZW50U3R5bGVLZXldXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbnRyb2wuZGVwZW5kZW50RGljdGlvbmFyeSkge1xuICAgICAgdGhpcy5hdHRhY2hUb0RlcGVuZGVudERpY3Rpb25hcnlJZk5lY2Vzc2FyeShcbiAgICAgICAgY29udHJvbC5kZXBlbmRlbnREaWN0aW9uYXJ5LFxuICAgICAgICBmb3JtbHlDb25maWdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IHRyYW5zbGF0ZWRUaXRsZSA9IGNvbnRyb2wudHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgKGQ6IHsgbGFuZ3VhZ2VJc286IHN0cmluZyB9KSA9PiBkLmxhbmd1YWdlSXNvID09PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICk/LnZhbHVlO1xuICAgIGlmICghdHJhbnNsYXRlZFRpdGxlKSB7XG4gICAgICB0cmFuc2xhdGVkVGl0bGUgPSBjb250cm9sLnRpdGxlO1xuICAgIH1cbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydsYWJlbCddID0gdHJhbnNsYXRlZFRpdGxlO1xuXG4gICAgdGhpcy5mb3JtbHlDb2xsZWN0aW5nRmllbGRzLnB1c2goZm9ybWx5Q29uZmlnKTtcblxuICAgIHJldHVybiBmb3JtbHlDb25maWc7XG4gIH1cblxuICBhZGRWYWxpZGF0b3JzKGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcsIGNvbnRyb2w6IENvbnRyb2xEYXRhKSB7XG4gICAgdmFyIGVtYWlsRXJyb3JMYWJlbCA9IHRoaXMuZmx1eD8uZmluZChcbiAgICAgIChmKSA9PiBmPy5jb25maWc/LmNvbXBvbmVudENvbGxlY3RlZCA9PT0gY29udHJvbD8uaWRlbnRpZmllclxuICAgICk/LmNvbmZpZz8uZW1haWxFcnJvckxhYmVsO1xuICAgIHZhciBlbWFpbEVycm9yTGFiZWxWYWx1ZSA9ICcnO1xuICAgIGlmIChlbWFpbEVycm9yTGFiZWwgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KGVtYWlsRXJyb3JMYWJlbCkpIHtcbiAgICAgIGVtYWlsRXJyb3JMYWJlbFZhbHVlID1cbiAgICAgICAgKGVtYWlsRXJyb3JMYWJlbCBhcyBMYWJlbEluZm9bXSkuZmluZChcbiAgICAgICAgICAobCkgPT4gbC5sYW5ndWFnZUlzbyA9PT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgKT8udmFsdWUgPz8gJyc7XG4gICAgfVxuXG4gICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRvcnMgPSB7XG4gICAgICBlbWFpbFZhbGlkOiB7XG4gICAgICAgIGV4cHJlc3Npb246IChjb250OiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnQudmFsdWU7XG4gICAgICAgICAgY29uc3QgZW1haWxQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXFxcLlthLXpBLVpdezIsfSQnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsdWUgJiYgIWVtYWlsUGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgY29udC5zZXRFcnJvcnMoeyBpbnZhbGlkRW1haWw6IHRydWUgfSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBtZXNzYWdlOiBlbWFpbEVycm9yTGFiZWxWYWx1ZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhZGRBcGlWYWxpZGF0b3JzKGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcsIGNvbnRyb2w6IENvbnRyb2xEYXRhKSB7XG4gICAgY29uc3QgdGhyb3VnaEFwaVZhbGlkYXRpb24gPSBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgY29udHJvbC5lcnJvcnNUcmFuc2xhdGlvbnMsXG4gICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICd0aHJvdWdoQXBpVmFsaWRhdGlvbidcbiAgICApO1xuXG4gICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRvcnMgPSB7XG4gICAgICB2YWxpZGF0ZVRocm91Z2hBcGk6IHtcbiAgICAgICAgZXhwcmVzc2lvbjogYXN5bmMgKGNvbnQ6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgIGlmICghY29udC52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFwaVZhbGlkYXRpb25NZXRob2QgPVxuICAgICAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLmFwaVZhbGlkYXRpb25NZXRob2Q7XG5cbiAgICAgICAgICBjb25zdCBkYXRhUmVxdWVzdDogQXBpVmFsaWRhdGVSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgYXBwRGF0YUlkOiB0aGlzLmFwcERhdGFVdWlkLFxuICAgICAgICAgICAgYXBpTWV0aG9kSWQ6IGFwaVZhbGlkYXRpb25NZXRob2QsXG4gICAgICAgICAgICBjb250cm9sSWRlbnRpZmllcjogY29udHJvbC5pZGVudGlmaWVyXG4gICAgICAgICAgfTtcbiAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnZhbGlkYXRlTWV0aG9kQXBpKGRhdGFSZXF1ZXN0KTtcblxuICAgICAgICAgIGlmIChyZXNwb25zZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnQuc2V0RXJyb3JzKHsgdmFsaWRhdGVUaHJvdWdoQXBpOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIG1lc3NhZ2U6IHRocm91Z2hBcGlWYWxpZGF0aW9uXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChmb3JtbHlDb25maWcudmFsaWRhdGlvbikge1xuICAgICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24ubWVzc2FnZXMgPSB7XG4gICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzLFxuICAgICAgICB2YWxpZGF0ZVRocm91Z2hBcGk6IHRocm91Z2hBcGlWYWxpZGF0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGdldERlZmF1bHRGb3JtbHlGaWVsZENvbmZpZyhcbiAgICBjb250cm9sOiBDb250cm9sRGF0YSxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgcGF0dGVybjogc3RyaW5nLFxuICAgIGNvbXBvbmVudFN0eWxlS2V5OiBzdHJpbmcsXG4gICAgY29tcG9uZW50c1RvRXhjbHVkZUZyb21TdHlsZTogc3RyaW5nW11cbiAgKTogRm9ybWx5RmllbGRDb25maWcge1xuICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZUlkID0gVXRpbHMuZmluZExhbmd1YWdlSWRCeUlzbyhcbiAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICApO1xuXG4gICAgbGV0IGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICBrZXk6IGNvbnRyb2wuaWRlbnRpZmllciB8fCBjb250cm9sLnRpdGxlLFxuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIGN1cnJlbnRMYW5ndWFnZUlzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgIGN1cnJlbnRMYW5ndWFnZUlkOiBjdXJyZW50TGFuZ3VhZ2VJZCxcbiAgICAgICAgbGFiZWw6XG4gICAgICAgICAgY29udHJvbC50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAodDogeyBsYW5ndWFnZUlzbzogc3RyaW5nIH0pID0+XG4gICAgICAgICAgICAgIHQubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWUgfHwgJycsXG5cbiAgICAgICAgdGl0bGU6XG4gICAgICAgICAgY29udHJvbC50cmFuc2xhdGlvbnM/LmZpbmQoXG4gICAgICAgICAgICAodDogeyBsYW5ndWFnZUlzbzogc3RyaW5nIH0pID0+XG4gICAgICAgICAgICAgIHQubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWUgfHwgJycsXG4gICAgICAgIGRlc2lnbjogdGhpcy5kZXNpZ24sXG4gICAgICAgIHJlcXVpcmVkOiBjb250cm9sLmlzTWFuZGF0b3J5LFxuICAgICAgICB2YWxpZGF0ZVRocm91Z2hBcGk6IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNBcGlWYWxpZGF0aW9uLFxuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgc3R5bGU6IGNvbXBvbmVudHNUb0V4Y2x1ZGVGcm9tU3R5bGUuZmluZChcbiAgICAgICAgICAgIChjKSA9PiBjID09PSBjb21wb25lbnRTdHlsZUtleVxuICAgICAgICAgIClcbiAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgIDogY29tcG9uZW50U3R5bGVLZXlcbiAgICAgICAgfSxcbiAgICAgICAgYXV0b3NpemU6IHRydWUsXG4gICAgICAgIG9wdGlvbnM6IFt7fV0sXG4gICAgICAgIGZpZWxkR3JvdXA6IFtdLFxuICAgICAgICBhdXRvRGltZW5zaW9uOiBjb250cm9sLmF1dG9EaW1lbnNpb25cbiAgICAgIH0sXG4gICAgICBleHByZXNzaW9uczoge30sXG4gICAgICBob29rczoge30sXG4gICAgICB2YWxpZGF0b3JzOiB7fVxuICAgIH07XG4gICAgZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24gPSB7fTtcblxuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzTWFuZGF0b3J5ICYmIGZvcm1seUNvbmZpZy5wcm9wcykge1xuICAgICAgdmFyIHJlcXVpcmVkTWVzc2FnZSA9IFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgJ2lzTWFuZGF0b3J5VmFsaWRhdGlvbidcbiAgICAgICk7XG5cbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wcy5yZXF1aXJlZCA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnk7XG4gICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24/Lm1lc3NhZ2VzLFxuICAgICAgICByZXF1aXJlZDogcmVxdWlyZWRNZXNzYWdlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNvbnRyb2wudHlwZSA9PT0gU3RlcENvbnRyb2xUeXBlLkRpY3Rpb25hcnkgJiZcbiAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnkgJiZcbiAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zICYmXG4gICAgICBmb3JtbHlDb25maWcucHJvcHNcbiAgICApIHtcbiAgICAgIHZhciByZXF1aXJlZE1lc3NhZ2UgPSBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICdpc01hbmRhdG9yeSdcbiAgICAgICk7XG5cbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wcy5yZXF1aXJlZCA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnk7XG4gICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24/Lm1lc3NhZ2VzLFxuICAgICAgICByZXF1aXJlZDogcmVxdWlyZWRNZXNzYWdlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxldCBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzU2ltcGxlVmFsaWRhdGlvbiAmJiBmb3JtbHlDb25maWcucHJvcHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5pc1NpbXBsZVZhbGlkYXRpb24gJiZcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzXG4gICAgICApIHtcbiAgICAgICAgc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPSBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICdzaW1wbGVWYWxpZGF0aW9uJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/Lm1pblZhbHVlPy50b1N0cmluZygpKSB7XG4gICAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLm1pbiA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS5taW5WYWx1ZTtcbiAgICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgICAgIG1pbjogc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2VcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8ubWF4VmFsdWU/LnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICBmb3JtbHlDb25maWcucHJvcHMubWF4ID0gY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhLm1heFZhbHVlO1xuICAgICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRpb24/Lm1lc3NhZ2VzLFxuICAgICAgICAgICAgbWF4OiBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcGF0dGVybiB2YWxpZGF0aW9uIGlmIGFsbG93ZWRDaGFyYWN0ZXJzIGlzIGRlZmluZWRcbiAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93ZWRDaGFyYWN0ZXJzKSB7XG4gICAgICAgIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlID0gc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2UgPVxuICAgICAgICAgIFV0aWxzLmZpbmRFcnJvclRyYW5zbGF0aW9uVmFsdWVPckRlZmF1bHQoXG4gICAgICAgICAgICBjb250cm9sLmVycm9yc1RyYW5zbGF0aW9ucyxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvLFxuICAgICAgICAgICAgJ3NpbXBsZVZhbGlkYXRpb24nXG4gICAgICAgICAgKTtcblxuICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdG9ycyxcbiAgICAgICAgICBjdXN0b21QYXR0ZXJuOiB7XG4gICAgICAgICAgICBleHByZXNzaW9uOiAoYzogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghYy52YWx1ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZWdleC50ZXN0KGMudmFsdWUpO1xuICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSB8fFxuICAgICAgICAgICAgICAnVmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcXVpcmVkIHBhdHRlcm4nXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0aW9uLm1lc3NhZ2VzID0ge1xuICAgICAgICAgIC4uLmZvcm1seUNvbmZpZy52YWxpZGF0aW9uPy5tZXNzYWdlcyxcbiAgICAgICAgICBwYXR0ZXJuOiBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBtYXhMZW5ndGggdmFsaWRhdGlvbiBpZiBtYXhDaGFyYWN0ZXJzIGlzIGRlZmluZWRcbiAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/Lm1heENoYXJhY3RlcnMpIHtcbiAgICAgICAgZm9ybWx5Q29uZmlnLnByb3BzLm1heExlbmd0aCA9XG4gICAgICAgICAgY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy5tYXhDaGFyYWN0ZXJzO1xuICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdGlvbi5tZXNzYWdlcyA9IHtcbiAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdGlvbj8ubWVzc2FnZXMsXG4gICAgICAgICAgbWF4TGVuZ3RoOiBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seUZ1dHVyZSB8fFxuICAgICAgICBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seVBhc3RcbiAgICAgICkge1xuICAgICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdkYXRlcGlja2VyJztcbiAgICAgICAgY29uc3QgY2hlY2tEYXRlVmFsaWRhdGlvbiA9IHtcbiAgICAgICAgICBjaGVja0RhdGU6IHtcbiAgICAgICAgICAgIGV4cHJlc3Npb246IChjOiBBYnN0cmFjdENvbnRyb2wsIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgICBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9XG4gICAgICAgICAgICAgICAgVXRpbHMuZmluZEVycm9yVHJhbnNsYXRpb25WYWx1ZU9yRGVmYXVsdChcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2wuZXJyb3JzVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICAgICAgICAgICAnc2ltcGxlVmFsaWRhdGlvbidcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgY3VycmVudERhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG5cbiAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uYWxsb3dPbmx5RnV0dXJlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjLnZhbHVlIHx8IGMudmFsdWUgPT09ICcnKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYy52YWx1ZSA+IGN1cnJlbnREYXRlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmFsbG93T25seVBhc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWMudmFsdWUgfHwgYy52YWx1ZSA9PT0gJycpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBjLnZhbHVlIDwgY3VycmVudERhdGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWVzc2FnZTogKGVycm9yOiBhbnksIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gc2ltcGxlVmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgICAgICAuLi5mb3JtbHlDb25maWcudmFsaWRhdG9ycyxcbiAgICAgICAgICAuLi5jaGVja0RhdGVWYWxpZGF0aW9uXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9jb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEudHlwZSA9PT0gNCAgaXMgcGhvbmVcbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy50eXBlID09PSA0KSB7XG4gICAgICB2YXIgcGhvbmVFcnJvckxhYmVsID0gdGhpcy5mbHV4Py5maW5kKFxuICAgICAgICAoZikgPT4gZj8uY29uZmlnPy5jb21wb25lbnRDb2xsZWN0ZWQgPT09IGNvbnRyb2w/LmlkZW50aWZpZXJcbiAgICAgICk/LmNvbmZpZz8ucGhvbmVFcnJvckxhYmVsO1xuICAgICAgdmFyIHBob25lRXJyb3JMYWJlbFZhbHVlID0gJyc7XG4gICAgICBpZiAocGhvbmVFcnJvckxhYmVsICE9IG51bGwgJiYgQXJyYXkuaXNBcnJheShwaG9uZUVycm9yTGFiZWwpKSB7XG4gICAgICAgIHBob25lRXJyb3JMYWJlbFZhbHVlID1cbiAgICAgICAgICAocGhvbmVFcnJvckxhYmVsIGFzIExhYmVsSW5mb1tdKS5maW5kKFxuICAgICAgICAgICAgKGwpID0+IGwubGFuZ3VhZ2VJc28gPT09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICAgKT8udmFsdWUgPz8gJyc7XG4gICAgICB9XG5cbiAgICAgIGZvcm1seUNvbmZpZy52YWxpZGF0b3JzID0ge1xuICAgICAgICBwaG9uZVZhbGlkOiB7XG4gICAgICAgICAgZXhwcmVzc2lvbjogKGNvbnQ6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb250LnZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcGhvbmVQYXR0ZXJuID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgJ14oXFxcXCs0fCk/KDA3WzAtOF17MX1bMC05XXsxfXwwMlswLTldezJ9fDAzWzAtOV17Mn0pezF9PyhcXFxcc3xcXFxcLnwtKT8oWzAtOV17M30oXFxcXHN8XFxcXC58LXwpKXsyfSQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmICFwaG9uZVBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgY29udC5zZXRFcnJvcnMoeyBpbnZhbGlkUGhvbmVOdW1iZXI6IHRydWUgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVzc2FnZTogcGhvbmVFcnJvckxhYmVsVmFsdWVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoY29udHJvbC5zcGVjaWZpY0NvbnRyb2xEYXRhPy50eXBlID09PSAyKSB7XG4gICAgICBjb25zdCBjaGVja0RhdGUyVmFsaWRhdGlvbiA9IHtcbiAgICAgICAgY2hlY2tEYXRlMjoge1xuICAgICAgICAgIGV4cHJlc3Npb246IChjOiBBYnN0cmFjdENvbnRyb2wsIGZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykgPT4ge1xuICAgICAgICAgICAgdmFyIGRhdGVWYWx1ZSA9IGMudmFsdWU7XG4gICAgICAgICAgICBpZiAoIWRhdGVWYWx1ZSAmJiBjb250cm9sLnNwZWNpZmljQ29udHJvbERhdGE/LmlzTWFuZGF0b3J5KSB7XG4gICAgICAgICAgICAgIHNpbXBsZVZhbGlkYXRpb25NZXNzYWdlID1cbiAgICAgICAgICAgICAgICBVdGlscy5maW5kRXJyb3JUcmFuc2xhdGlvblZhbHVlT3JEZWZhdWx0KFxuICAgICAgICAgICAgICAgICAgY29udHJvbC5lcnJvcnNUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbyxcbiAgICAgICAgICAgICAgICAgICdpc01hbmRhdG9yeVZhbGlkYXRpb24nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBpc05hTihEYXRlLnBhcnNlKGRhdGVWYWx1ZSkpICYmXG4gICAgICAgICAgICAgIGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YT8uaXNNYW5kYXRvcnlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lc3NhZ2U6IChlcnJvcjogYW55LCBmaWVsZDogRm9ybWx5RmllbGRDb25maWcpID0+IHtcbiAgICAgICAgICAgIGlmIChzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZSA9PT0gJycpXG4gICAgICAgICAgICAgIHJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSc7XG5cbiAgICAgICAgICAgIHJldHVybiBzaW1wbGVWYWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBmb3JtbHlDb25maWcudmFsaWRhdG9ycyA9IHtcbiAgICAgICAgLi4uZm9ybWx5Q29uZmlnLnZhbGlkYXRvcnMsXG4gICAgICAgIC4uLmNoZWNrRGF0ZTJWYWxpZGF0aW9uXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtbHlDb25maWc7XG4gIH1cblxuICBhc3luYyBidWlsZFByZXNlbnRhdGlvbkZvcm1GaWVsZEFzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRyb2w6IFByZXNlbnRhdGlvbkNvbnRyb2xcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGxldCBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnID0geyBwcm9wczoge30gfTtcblxuICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1wYXJhZ3JhcGgnO1xuICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSAnY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2Rlc2lnbiddID0gdGhpcy5hcHBNb2RlbC5nZW5lcmF0ZWRDc3M7XG5cbiAgICB2YXIgdHJhbnNsYXRlZFRpdGxlID1cbiAgICAgIGNvbnRyb2wudHJhbnNsYXRpb25zLmZpbmQoKGQpID0+IGQubGFuZ3VhZ2VJc28gPT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28pXG4gICAgICAgID8udmFsdWUgPz9cbiAgICAgIGNvbnRyb2wudGl0bGUgPz9cbiAgICAgICcnO1xuXG4gICAgaWYgKGNvbnRyb2wudHlwZSA9PSBQcmVzZW50YXRpb25Db250cm9sVHlwZS5QYXJhZ3JhcGgpIHtcbiAgICAgIGNvbnN0IHBhcmFncmFwaENvbnRyb2wgPSBjb250cm9sIGFzIFByZXNlbnRhdGlvblBhcmFncmFwaENvbnRyb2w7XG5cbiAgICAgIHZhciB0cmFuc2xhdGVkRGVzY3JpcHRpb24gPVxuICAgICAgICBwYXJhZ3JhcGhDb250cm9sLnNwZWNpZmljQ29udHJvbERhdGEuZGVzY3JpcHRpb25UcmFuc2xhdGlvbnMuZmluZChcbiAgICAgICAgICAoZDogYW55KSA9PiBkLmxhbmd1YWdlSXNvID09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICAgICk/LnZhbHVlID8/ICcnO1xuICAgICAgdmFyIHRyYW5zbGF0ZWRQYXJhZ3JhcGhUaXRsZSA9XG4gICAgICAgIHBhcmFncmFwaENvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YS50ZXh0LmZpbmQoXG4gICAgICAgICAgKGQ6IGFueSkgPT4gZC5sYW5ndWFnZUlzbyA9PSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApPy52YWx1ZSA/PyAnJztcblxuICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IHRyYW5zbGF0ZWREZXNjcmlwdGlvbjtcbiAgICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ3RyYW5zbGF0ZWREZXNjcmlwdGlvbiddID0gdHJhbnNsYXRlZERlc2NyaXB0aW9uO1xuICAgICAgZm9ybWx5Q29uZmlnLnByb3BzIVsndHJhbnNsYXRlZFBhcmFncmFwaFRpdGxlJ10gPVxuICAgICAgICB0cmFuc2xhdGVkUGFyYWdyYXBoVGl0bGU7XG4gICAgICBmb3JtbHlDb25maWcudHlwZSA9ICdmb3JtbHktcGFyYWdyYXBoJztcbiAgICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSAnY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLkRvd25sb2FkKSB7XG4gICAgICBmb3JtbHlDb25maWcgPSB0aGlzLkNyZWF0ZURvd25sb2FkRG9jc0ZpZWxkQ29uZmlnKGNvbnRyb2wpO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09IFByZXNlbnRhdGlvbkNvbnRyb2xUeXBlLlZpZXcpIHtcbiAgICAgIGZvcm1seUNvbmZpZyA9IHRoaXMuQ3JlYXRlVmlld0RvY3NGaWVsZENvbmZpZyhjb250cm9sKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2wudHlwZSA9PSBQcmVzZW50YXRpb25Db250cm9sVHlwZS5TdGF0dXMpIHtcbiAgICAgIGxldCBzdGF0dXNOYW1lID1cbiAgICAgICAgdGhpcy5hcHBNb2RlbC5zdGF0dXNlcy5maW5kKFxuICAgICAgICAgIChzKSA9PiBzLmlkID09PSB0aGlzLmZpbGxEYXRhPy5tZXRhZGF0YS5zdGF0dXNJZFxuICAgICAgICApPy5uYW1lIHx8ICdubyBzdGF0dXMgbmFtZSc7XG5cbiAgICAgIGZvcm1seUNvbmZpZy5kZWZhdWx0VmFsdWUgPSBzdGF0dXNOYW1lO1xuICAgICAgZm9ybWx5Q29uZmlnLnR5cGUgPSAnZm9ybWx5LXBhcmFncmFwaCc7XG4gICAgICBmb3JtbHlDb25maWcuY2xhc3NOYW1lID0gJ2NvbXBvbmVudC10ZXh0LWZpZWxkJztcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICBjb250cm9sLnR5cGUgPT0gUHJlc2VudGF0aW9uQ29udHJvbFR5cGUuRmx1eENvbXBvbmVudCAmJlxuICAgICAgICB0aGlzLmNvbnRyb2xJZHNXaXRoVmFsdWVzICYmXG4gICAgICAgIGNvbnRyb2wuY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZmlsbFZhbHVlID1cbiAgICAgICAgICB0aGlzLmNvbnRyb2xJZHNXaXRoVmFsdWVzW2NvbnRyb2wuY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyXTtcblxuICAgICAgICBpZiAoZmlsbFZhbHVlKSB7XG4gICAgICAgICAgc3dpdGNoICh0eXBlb2YgZmlsbFZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IGZpbGxWYWx1ZSA/ICcmY2hlY2s7JyA6ICcmY3Jvc3M7JztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgICAgICBpZiAoZmlsbFZhbHVlLmZpbGxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IGZpbGxWYWx1ZS5maWxsVmFsdWU7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsbFZhbHVlLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gZmlsbFZhbHVlLm5hbWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9ybWx5Q29uZmlnLmRlZmF1bHRWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KGZpbGxWYWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gZmlsbFZhbHVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdHlwZSBpcyBzZXQgZm9yIHByZXNlbnRhdGlvbiBjb250cm9sc1xuICAgIGlmICghZm9ybWx5Q29uZmlnLnR5cGUpIHtcbiAgICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1wYXJhZ3JhcGgnO1xuICAgICAgZm9ybWx5Q29uZmlnLmNsYXNzTmFtZSA9ICdjb21wb25lbnQtdGV4dC1maWVsZCc7XG4gICAgfVxuXG4gICAgZm9ybWx5Q29uZmlnLmlkID0gY29udHJvbC5pZGVudGlmaWVyO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2lzRGlzcGxheU1vZGUnXSA9IHRydWU7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnY29sbGVjdGlvbkNvbnRyb2xJZGVudGlmaWVyJ10gPVxuICAgICAgY29udHJvbC5jb2xsZWN0aW9uQ29udHJvbElkZW50aWZpZXI7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnbGFiZWwnXSA9IHRyYW5zbGF0ZWRUaXRsZTtcbiAgICBmb3JtbHlDb25maWcucHJvcHMhWydsYW5nSXNvJ10gPSB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzbztcblxuICAgIHRoaXMuZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzLnB1c2goZm9ybWx5Q29uZmlnKTtcblxuICAgIHJldHVybiBmb3JtbHlDb25maWc7XG4gIH1cblxuICBhc3luYyBidWlsZEFwaU1ldGhvZEZvcm1GaWVsZEFzeW5jKFxuICAgIHN0ZXA6IFN0ZXBEYXRhIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRyb2w6IFByZXNlbnRhdGlvbkNvbnRyb2xcbiAgKTogUHJvbWlzZTxGb3JtbHlGaWVsZENvbmZpZz4ge1xuICAgIGxldCBmb3JtbHlDb25maWc6IEZvcm1seUZpZWxkQ29uZmlnID0geyBwcm9wczoge30gfTtcblxuICAgIGZvcm1seUNvbmZpZy50eXBlID0gJ2Zvcm1seS1wYXJhZ3JhcGgnO1xuICAgIGZvcm1seUNvbmZpZy5jbGFzc05hbWUgPSAnY29tcG9uZW50LXRleHQtZmllbGQnO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2Rlc2lnbiddID0gdGhpcy5hcHBNb2RlbC5nZW5lcmF0ZWRDc3M7XG5cbiAgICB2YXIgdHJhbnNsYXRlZFRpdGxlID1cbiAgICAgIGNvbnRyb2wudHJhbnNsYXRpb25zLmZpbmQoKGQpID0+IGQubGFuZ3VhZ2VJc28gPT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28pXG4gICAgICAgID8udmFsdWUgPz9cbiAgICAgIGNvbnRyb2wudGl0bGUgPz9cbiAgICAgICcnO1xuXG4gICAgZm9ybWx5Q29uZmlnLmlkID0gY29udHJvbC5pZGVudGlmaWVyO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2lzRGlzcGxheU1vZGUnXSA9IHRydWU7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnYXBpTWV0aG9kSWQnXSA9IGNvbnRyb2wuYXBpTWV0aG9kSWQ7XG4gICAgZm9ybWx5Q29uZmlnLnByb3BzIVsnYXBpTWV0aG9kRmllbGRJZCddID0gY29udHJvbC5hcGlNZXRob2RGaWVsZElkO1xuICAgIGZvcm1seUNvbmZpZy5wcm9wcyFbJ2xhYmVsJ10gPSB0cmFuc2xhdGVkVGl0bGU7XG5cbiAgICBpZiAoY29udHJvbC5hcGlNZXRob2RGaWVsZElkKSB7XG4gICAgICBjb25zdCB2YWwgPSB0aGlzLmZpbmRJbkFwaUNhbGxzUmVzcG9uc2VzKGNvbnRyb2wuYXBpTWV0aG9kRmllbGRJZCk7XG4gICAgICBmb3JtbHlDb25maWcuZGVmYXVsdFZhbHVlID0gdmFsO1xuICAgIH1cblxuICAgIHRoaXMuZm9ybWx5UHJlc2VudGF0aW9uRmllbGRzLnB1c2goZm9ybWx5Q29uZmlnKTtcblxuICAgIHJldHVybiBmb3JtbHlDb25maWc7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFRvRGVwZW5kZW50RGljdGlvbmFyeUlmTmVjZXNzYXJ5KFxuICAgIGRlcGVuZGVudERpY3Rpb25hcnk6IERlcGVuZGVudERpY3Rpb25hcnlEYXRhLFxuICAgIGZvcm1seUNvbmZpZzogRm9ybWx5RmllbGRDb25maWdcbiAgKSB7XG4gICAgLy8gSGFuZGxlIGRpY3Rpb25hcnkgZGVwZW5kZW5jaWVzXG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeSAmJlxuICAgICAgZGVwZW5kZW50RGljdGlvbmFyeS5kaWN0aW9uYXJ5Q29udHJvbElkZW50aWZpZXJcbiAgICApIHtcbiAgICAgIGNvbnN0IHBhcmVudEtleSA9IGRlcGVuZGVudERpY3Rpb25hcnkuZGljdGlvbmFyeUNvbnRyb2xJZGVudGlmaWVyO1xuICAgICAgY29uc3QgZGVwZW5kZW50VmFsdWVJZHMgPSBkZXBlbmRlbnREaWN0aW9uYXJ5LmRlcGVuZGVudFZhbHVlSWRzIHx8IFtdO1xuXG4gICAgICBmb3JtbHlDb25maWcuZXhwcmVzc2lvbnMgPSB7XG4gICAgICAgIGhpZGU6IChmaWVsZDogRm9ybWx5RmllbGRDb25maWcpID0+IHtcbiAgICAgICAgICBjb25zdCBzaG91bGRTaG93ID0gdGhpcy5zaG91bGRTaG93RGVwZW5kZW50RmllbGQoXG4gICAgICAgICAgICBwYXJlbnRLZXksXG4gICAgICAgICAgICBkZXBlbmRlbnRWYWx1ZUlkcyxcbiAgICAgICAgICAgIHRoaXMubW9kZWxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiAhc2hvdWxkU2hvdztcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaFRvVmFsdWVDaGFuZ2VzKGNvbnRyb2xJZDogc3RyaW5nLCBvcHRpb25zOiBGb3JtbHlGaWVsZENvbmZpZykge1xuICAgIG9wdGlvbnMucHJvcHMhWydvblNlbGVjdGVkVmFsdWVDaGFuZ2VkJ10gPSBhc3luYyAodmFsOiBhbnkpID0+IHtcbiAgICAgIHRoaXMubW9kZWxbY29udHJvbElkXSA9IHZhbDtcbiAgICAgIHZhciByZWZlcmVuY2VEaWN0aW9uYXJpZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICB0aGlzLmRpY3Rpb25hcnlNYXAudmFsdWVzKClcbiAgICAgICkuZmlsdGVyKChkKSA9PiBkLnJlZmVyZW5jZUlkID09IHZhbC5kaWN0aW9uYXJ5SWQpO1xuICAgICAgaWYgKHJlZmVyZW5jZURpY3Rpb25hcmllcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnJlbW92ZVJlZmVyZW5jZUZpZWxkcyhvcHRpb25zKTtcblxuICAgICAgICB2YXIgcmVmZXJlbmNlRGljdGlvbmFyaWVzV2l0aEZpbHRlcmVkVmFsdWVzID1cbiAgICAgICAgICB0aGlzLmNyZWF0ZVJlZmVyZW5jZURpY3Rpb25hcmllc0Zyb21TZWxlY3RlZFZhbHVlKFxuICAgICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyaWVzLFxuICAgICAgICAgICAgdmFsXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGFyZW50U3BlY2lmaWNEYXRhID0gb3B0aW9ucy5wcm9wcz8uW1xuICAgICAgICAgICdzcGVjaWZpY0RhdGEnXG4gICAgICAgIF0gYXMgRGljdGlvbmFyeUNvbnRyb2xEYXRhO1xuICAgICAgICBhd2FpdCB0aGlzLmFkZFJlZmVyZW5jZURpY3Rpb25hcnlGaWVsZHNJZk5lY2Vzc2FyeShcbiAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJpZXNXaXRoRmlsdGVyZWRWYWx1ZXMsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBvcHRpb25zLnR5cGUsXG4gICAgICAgICAgcGFyZW50U3BlY2lmaWNEYXRhPy5yZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zIHx8IFtdXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZVJlZmVyZW5jZUZpZWxkcyhvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgfTtcbiAgfVxuXG4gIGNyZWF0ZVJlZmVyZW5jZURpY3Rpb25hcmllc0Zyb21TZWxlY3RlZFZhbHVlKFxuICAgIGFsbERpY3Rpb25hcmllczogRGljdGlvbmFyeUR0b1tdLFxuICAgIHNlbGVjdGVkVmFsdWU6IGFueVxuICApOiBEaWN0aW9uYXJ5RHRvW10ge1xuICAgIGNvbnN0IG5ld0RpY3Rpb25hcmllczogRGljdGlvbmFyeUR0b1tdID0gW107XG5cbiAgICBhbGxEaWN0aW9uYXJpZXMuZm9yRWFjaCgoZGljdGlvbmFyeSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVyZWRWYWx1ZXMgPVxuICAgICAgICBkaWN0aW9uYXJ5LnZhbHVlcz8uZmlsdGVyKCh2YWx1ZSkgPT5cbiAgICAgICAgICB2YWx1ZS5yZWZlcmVuY2VWYWx1ZXMuc29tZShcbiAgICAgICAgICAgIChyZWZWYWx1ZSkgPT4gcmVmVmFsdWUuaWQgPT09IHNlbGVjdGVkVmFsdWUuaWRcbiAgICAgICAgICApXG4gICAgICAgICkgfHwgW107XG5cbiAgICAgIGlmIChmaWx0ZXJlZFZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5ld0RpY3Rpb25hcnk6IERpY3Rpb25hcnlEdG8gPSB7XG4gICAgICAgICAgLi4uZGljdGlvbmFyeSxcbiAgICAgICAgICB2YWx1ZXM6IGZpbHRlcmVkVmFsdWVzXG4gICAgICAgIH07XG5cbiAgICAgICAgbmV3RGljdGlvbmFyaWVzLnB1c2gobmV3RGljdGlvbmFyeSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3RGljdGlvbmFyaWVzO1xuICB9XG5cbiAgc2hvdWxkU2hvd0RlcGVuZGVudEZpZWxkKFxuICAgIHBhcmVudEtleTogc3RyaW5nLFxuICAgIGRlcGVuZGVudFZhbHVlSWRzOiBudW1iZXJbXSxcbiAgICBtb2RlbDogYW55ID0ge31cbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gUmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSBwYXJlbnQgZGljdGlvbmFyeSBjb250cm9sXG4gICAgY29uc3QgcGFyZW50VmFsdWUgPSB0aGlzLmdldE5lc3RlZFZhbHVlKFxuICAgICAgbW9kZWwsXG4gICAgICBwYXJlbnRLZXlcbiAgICApIGFzIERpY3Rpb25hcnlWYWx1ZTtcblxuICAgIGNvbnN0IGlkVmFsdWUgPSBwYXJlbnRWYWx1ZT8uaWRcbiAgICAgID8gcGFyZW50VmFsdWUuaWRcbiAgICAgIDogKHBhcmVudFZhbHVlIGFzIHVua25vd24gYXMgbnVtYmVyKTtcbiAgICAvLyBDaGVjayBpZiB0aGUgcGFyZW50IHZhbHVlIGlzIGluIHRoZSBkZXBlbmRlbnRWYWx1ZUlkc1xuICAgIGlmIChwYXJlbnRWYWx1ZSAmJiBkZXBlbmRlbnRWYWx1ZUlkcy5pbmNsdWRlcyhpZFZhbHVlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldE5lc3RlZFZhbHVlKG9iajogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gICAgbGV0IHZhbHVlID0gb2JqO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIHZhbHVlID0gdmFsdWVba2V5XTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHN1Ym1pdCgpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZygnRm9ybSBEYXRhOicsIHRoaXMuZm9ybS52YWx1ZSk7XG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICBjb25zb2xlLmxvZygnRm9ybSBkYXRhIGhhcyB2YWxpZGF0aW9uIGVycm9ycy4nKTtcbiAgICAgIHRoaXMuc2Nyb2xsVG9FcnJvclNlcnZpY2Uuc2Nyb2xsVG9GaXJzdEVycm9yKHRoaXMuZm9ybSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBtZXRob2QgdG8gdHJpZ2dlciBzY3JvbGwgdG8gZmlyc3QgZXJyb3IgLSBjYW4gYmUgY2FsbGVkIGZyb20gb3RoZXIgY29tcG9uZW50c1xuICAgKi9cbiAgcHVibGljIHNjcm9sbFRvRmlyc3RWYWxpZGF0aW9uRXJyb3IoKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxUb0Vycm9yU2VydmljZS5zY3JvbGxUb0ZpcnN0RXJyb3IodGhpcy5mb3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWMgbWV0aG9kIHRvIHNjcm9sbCB0byBhIHNwZWNpZmljIGZpZWxkIGJ5IG5hbWVcbiAgICovXG4gIHB1YmxpYyBzY3JvbGxUb0ZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxUb0Vycm9yU2VydmljZS5zY3JvbGxUb0ZpZWxkKGZpZWxkTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVidWcgbWV0aG9kIHRvIGhlbHAgdHJvdWJsZXNob290IHNjcm9sbCBpc3N1ZXNcbiAgICovXG4gIHB1YmxpYyBkZWJ1Z0Zvcm1FbGVtZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbFRvRXJyb3JTZXJ2aWNlLmRlYnVnTG9nRm9ybUVsZW1lbnRzKCk7XG4gIH1cblxuICBhc3luYyBjb25zdHJ1Y3REaWN0aW9uYXJ5KFxuICAgIGNvbnRyb2w6IENvbnRyb2xEYXRhLFxuICAgIG9wdGlvbnM6IEZvcm1seUZpZWxkQ29uZmlnXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNwZWNpZmljRGF0YSA9IGNvbnRyb2wuc3BlY2lmaWNDb250cm9sRGF0YTtcblxuICAgIC8vIERldGVybWluZSBjb21wb25lbnQgdHlwZSBiYXNlZCBvbiBzZXR0aW5nc1xuICAgIGlmIChzcGVjaWZpY0RhdGEuc2hvd0FzQ2hlY2tib3hlcyA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy50eXBlID0gJ2Zvcm1seS1jaGVja2JveGVzJztcbiAgICB9IGVsc2UgaWYgKHNwZWNpZmljRGF0YS5zaG93QXNSYWRpb0J1dHRvbnNMaXN0ID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnR5cGUgPSAnZm9ybWx5LXJhZGlvJztcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucy50eXBlID0gJ2Zvcm1seS1kaWN0aW9uYXJ5LWRyb3Bkb3duLXRyZWUnO1xuICAgIH1cblxuICAgIG9wdGlvbnMucHJvcHMhWydzcGVjaWZpY0RhdGEnXSA9IHNwZWNpZmljRGF0YTtcblxuICAgIGNvbnN0IGRpY3Rpb25hcnlVdWlkID0gc3BlY2lmaWNEYXRhLmRpY3Rpb25hcnlVVUlEO1xuXG4gICAgaWYgKGRpY3Rpb25hcnlVdWlkKSB7XG4gICAgICBjb25zdCBkaWN0aW9uYXJ5ID0gdGhpcy5kaWN0aW9uYXJ5TWFwLmdldChkaWN0aW9uYXJ5VXVpZCk7XG4gICAgICBpZiAoZGljdGlvbmFyeSkge1xuICAgICAgICBpZiAoZGljdGlvbmFyeS5yZWZlcmVuY2VJZCkge1xuICAgICAgICAgIG9wdGlvbnMucHJvcHMhWydkaWN0aW9uYXJ5SWQnXSA9IGRpY3Rpb25hcnlVdWlkO1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0RGljdGlvbmFyeVdpdGhSZWZlcmVuY2VzKFxuICAgICAgICAgICAgZGljdGlvbmFyeSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBzcGVjaWZpY0RhdGFcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuYXR0YWNoVG9WYWx1ZUNoYW5nZXMoY29udHJvbC5pZGVudGlmaWVyLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUeXBlIGlzIGFscmVhZHkgc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1ldGhvZFxuICAgICAgICAgIG9wdGlvbnMucHJvcHMhWydkaWN0aW9uYXJ5SWQnXSA9IGRpY3Rpb25hcnlVdWlkO1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0RGljdGlvbmFyeVdpdGhSZWZlcmVuY2VzKFxuICAgICAgICAgICAgZGljdGlvbmFyeSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBzcGVjaWZpY0RhdGFcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMuYXR0YWNoVG9WYWx1ZUNoYW5nZXMoY29udHJvbC5pZGVudGlmaWVyLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBEaWN0aW9uYXJ5IG5vdCBmb3VuZCBmb3IgVVVJRCAke2RpY3Rpb25hcnlVdWlkfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBVVUlEIG5vdCBmb3VuZCBmb3IgZGljdGlvbmFyeSBJRCAke3NwZWNpZmljRGF0YS5kaWN0aW9uYXJ5SWR9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmREaWN0aW9uYXJ5VmFsdWVPYmplY3QoXG4gICAgZGljdGlvbmFyeTogRGljdGlvbmFyeUR0byB8IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogYW55XG4gICk6IERpY3Rpb25hcnlWYWx1ZUR0byB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKFxuICAgICAgIWRpY3Rpb25hcnkgfHxcbiAgICAgICFkaWN0aW9uYXJ5LnZhbHVlcyB8fFxuICAgICAgdmFsdWUgPT09IG51bGwgfHxcbiAgICAgIHZhbHVlID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlPy5pZCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZGljdGlvbmFyeS52YWx1ZXMuZmluZCgodikgPT4gdi5pZCA9PT0gdmFsdWUuaWQpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCB2YWx1ZUlkID0gTnVtYmVyKHZhbHVlKTtcbiAgICAgIGlmICghaXNOYU4odmFsdWVJZCkpIHtcbiAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnkudmFsdWVzLmZpbmQoKHYpID0+IHYuaWQgPT09IHZhbHVlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplUmVmZXJlbmNlRmllbGRzKFxuICAgIGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSxcbiAgICByb290Q29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gdGhpcy5mb3JtbHlDb25maWdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFmaWVsZHMpIHJldHVybjtcbiAgICBjb25zdCBmaWVsZHNUb1Byb2Nlc3MgPSBbLi4uZmllbGRzXTtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzVG9Qcm9jZXNzKSB7XG4gICAgICBjb25zdCBmaWVsZEtleSA9IGZpZWxkLmtleSBhcyBzdHJpbmc7XG4gICAgICBpZiAoXG4gICAgICAgIGZpZWxkS2V5ICYmXG4gICAgICAgIGZpZWxkLnByb3BzPy5bJ2RpY3Rpb25hcnlJZCddICYmXG4gICAgICAgIGZpZWxkLnByb3BzPy5bJ3NwZWNpZmljRGF0YSddXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGRLZXkpO1xuICAgICAgICBjb25zdCBzcGVjaWZpY0RhdGEgPSBmaWVsZC5wcm9wc1tcbiAgICAgICAgICAnc3BlY2lmaWNEYXRhJ1xuICAgICAgICBdIGFzIERpY3Rpb25hcnlDb250cm9sRGF0YTtcbiAgICAgICAgY29uc3QgZGljdGlvbmFyeVV1aWQgPSBmaWVsZC5wcm9wc1snZGljdGlvbmFyeUlkJ10gYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCBtYWluRGljdGlvbmFyeSA9IHRoaXMuZGljdGlvbmFyeU1hcC5nZXQoZGljdGlvbmFyeVV1aWQpO1xuXG4gICAgICAgIGxldCB2YWx1ZVRvVXNlOiBhbnkgPSBudWxsO1xuXG4gICAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wudmFsdWUgIT09IG51bGwgJiYgY29udHJvbC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsdWVUb1VzZSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZmllbGQuZGVmYXVsdFZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgZmllbGQuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFsdWVUb1VzZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLm1vZGVsICYmXG4gICAgICAgICAgdGhpcy5tb2RlbFtmaWVsZEtleV0gIT09IG51bGwgJiZcbiAgICAgICAgICB0aGlzLm1vZGVsW2ZpZWxkS2V5XSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIHZhbHVlVG9Vc2UgPSB0aGlzLm1vZGVsW2ZpZWxkS2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWxlY3RlZFZhbHVlT2JqZWN0OiBEaWN0aW9uYXJ5VmFsdWVEdG8gfCB1bmRlZmluZWQgfCBudWxsID0gbnVsbDtcbiAgICAgICAgaWYgKHZhbHVlVG9Vc2UgIT09IG51bGwgJiYgbWFpbkRpY3Rpb25hcnk/LmlkICE9IG51bGwpIHtcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlT2JqZWN0ID0gdGhpcy5maW5kRGljdGlvbmFyeVZhbHVlT2JqZWN0KFxuICAgICAgICAgICAgbWFpbkRpY3Rpb25hcnksXG4gICAgICAgICAgICB2YWx1ZVRvVXNlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpZWxkQ29uZmlnSW5UcmVlID0gdGhpcy5maW5kRmllbGRCeUtleShyb290Q29uZmlnLCBmaWVsZEtleSk7XG4gICAgICAgIGlmICghZmllbGRDb25maWdJblRyZWUpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVtb3ZlUmVmZXJlbmNlRmllbGRzKGZpZWxkQ29uZmlnSW5UcmVlKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgc2VsZWN0ZWRWYWx1ZU9iamVjdCAmJlxuICAgICAgICAgIHNlbGVjdGVkVmFsdWVPYmplY3QuaWQgIT0gbnVsbCAmJlxuICAgICAgICAgIG1haW5EaWN0aW9uYXJ5Py5pZCAhPSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHBvdGVudGlhbFJlZmVyZW5jZURpY3Rpb25hcmllcyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnlNYXAudmFsdWVzKClcbiAgICAgICAgICApLmZpbHRlcigoZGljdCkgPT4gZGljdC5yZWZlcmVuY2VJZCA9PT0gbWFpbkRpY3Rpb25hcnkuaWQpO1xuXG4gICAgICAgICAgaWYgKHBvdGVudGlhbFJlZmVyZW5jZURpY3Rpb25hcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCByZWZlcmVuY2VEaWN0aW9uYXJpZXNUb1Nob3cgPVxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVJlZmVyZW5jZURpY3Rpb25hcmllc0Zyb21TZWxlY3RlZFZhbHVlKFxuICAgICAgICAgICAgICAgIHBvdGVudGlhbFJlZmVyZW5jZURpY3Rpb25hcmllcyxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFZhbHVlT2JqZWN0XG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChyZWZlcmVuY2VEaWN0aW9uYXJpZXNUb1Nob3cubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZFJlZmVyZW5jZURpY3Rpb25hcnlGaWVsZHNJZk5lY2Vzc2FyeShcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJpZXNUb1Nob3csXG4gICAgICAgICAgICAgICAgZmllbGRDb25maWdJblRyZWUsXG4gICAgICAgICAgICAgICAgZmllbGRDb25maWdJblRyZWUudHlwZSxcbiAgICAgICAgICAgICAgICBzcGVjaWZpY0RhdGE/LnJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnMgfHwgW11cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkLmZpZWxkR3JvdXAgJiYgZmllbGQuZmllbGRHcm91cC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVJlZmVyZW5jZUZpZWxkcyhmaWVsZC5maWVsZEdyb3VwLCByb290Q29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgZmllbGRzID09PSB0aGlzLmZvcm1seUNvbmZpZyB8fFxuICAgICAgZmllbGRzID09PSB0aGlzLmZvcm1seUNvbmZpZ1swXT8uZmllbGRHcm91cFxuICAgICkge1xuICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICAgIHRoaXMuZm9ybWx5Q29uZmlnVXBkYXRlZC5lbWl0KCk7XG4gICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3REaWN0aW9uYXJ5V2l0aFJlZmVyZW5jZXMoXG4gICAgZGljdGlvbmFyeTogRGljdGlvbmFyeUR0byxcbiAgICBvcHRpb25zOiBGb3JtbHlGaWVsZENvbmZpZyxcbiAgICBkaWN0aW9uYXJ5Q29udHJvbERhdGE6IERpY3Rpb25hcnlDb250cm9sRGF0YVxuICApIHtcbiAgICBpZiAob3B0aW9ucy5wcm9wcykge1xuICAgICAgdmFyIGN1cnJlbnRMYW5ndWFnZUlkID0gVXRpbHMuZmluZExhbmd1YWdlSWRCeUlzbyhcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMsXG4gICAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlSXNvXG4gICAgICApO1xuXG4gICAgICAvLyBQYXNzIHByZWxvYWRlZCBkaWN0aW9uYXJ5IGRhdGEgdG8gZm9ybWx5IGNvbXBvbmVudFxuICAgICAgb3B0aW9ucy5wcm9wc1snZGljdGlvbmFyeURhdGEnXSA9IGRpY3Rpb25hcnk7XG4gICAgICBvcHRpb25zLnByb3BzWydsYW5ndWFnZXMnXSA9IHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzO1xuICAgICAgb3B0aW9ucy5wcm9wc1sncHJlbG9hZGVkRGljdGlvbmFyaWVzJ10gPSB0aGlzLmRpY3Rpb25hcnlNYXA7XG4gICAgICBvcHRpb25zLnByb3BzWyd1c2VQcmVsb2FkZWREYXRhJ10gPSB0cnVlO1xuXG4gICAgICBvcHRpb25zLnByb3BzLm9wdGlvbnMgPSBkaWN0aW9uYXJ5LnZhbHVlcz8ubWFwKCh2YWx1ZSkgPT4gKHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBsYWJlbDpcbiAgICAgICAgICBVdGlscy5maW5kVmFsdWVUcmFuc2xhdGlvbihcbiAgICAgICAgICAgIHZhbHVlLnZhbHVlVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgY3VycmVudExhbmd1YWdlSWRcbiAgICAgICAgICApIHx8IHZhbHVlLm5hbWUsXG4gICAgICAgIGN1cnJlbnRMYW5ndWFnZUlzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgIHJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnM6XG4gICAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xEYXRhLnJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnNcbiAgICAgIH0pKTtcblxuICAgICAgb3B0aW9ucy5wcm9wc1snc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzJ10gPVxuICAgICAgICBkaWN0aW9uYXJ5Q29udHJvbERhdGEuc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzIHx8IFtdO1xuICAgICAgb3B0aW9ucy5wcm9wc1snYWxsb3dNdWx0aXBsZVNlbGVjdGlvbiddID1cbiAgICAgICAgZGljdGlvbmFyeUNvbnRyb2xEYXRhLmFsbG93TXVsdGlwbGVTZWxlY3Rpb24gfHwgZmFsc2U7XG5cbiAgICAgIGxldCBpbml0aWFsVmFsdWVPYmplY3Q6IERpY3Rpb25hcnlWYWx1ZSB8IG51bGwgPSBudWxsO1xuICAgICAgY29uc3QgY29udHJvbEtleSA9IG9wdGlvbnMua2V5IGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGRpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZCA9XG4gICAgICAgIGRpY3Rpb25hcnlDb250cm9sRGF0YS5kaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWQ7XG4gICAgICBpZiAoXG4gICAgICAgICEodGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsW2NvbnRyb2xLZXldICE9IG51bGwpICYmXG4gICAgICAgIGRpY3Rpb25hcnlEZWZhdWx0VmFsdWVJZCAhPSBudWxsXG4gICAgICApIHtcbiAgICAgICAgaW5pdGlhbFZhbHVlT2JqZWN0ID0gdGhpcy5maW5kQW5kTWFwRGVmYXVsdFZhbHVlKFxuICAgICAgICAgIGRpY3Rpb25hcnksXG4gICAgICAgICAgZGljdGlvbmFyeURlZmF1bHRWYWx1ZUlkXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG9wdGlvbnMuZGVmYXVsdFZhbHVlID0gaW5pdGlhbFZhbHVlT2JqZWN0O1xuXG4gICAgICAvLyBQYXNzIGRlZmF1bHQgdmFsdWUgSUQgdG8gZm9ybWx5IGNvbXBvbmVudFxuICAgICAgb3B0aW9ucy5wcm9wc1snZGljdGlvbmFyeURlZmF1bHRWYWx1ZUlkJ10gPSBkaWN0aW9uYXJ5RGVmYXVsdFZhbHVlSWQ7XG5cbiAgICAgIGNvbnN0IGNvbnRyb2xJZCA9IG9wdGlvbnMua2V5O1xuICAgICAgaWYgKHRoaXMuZmlsbERhdGEgJiYgdGhpcy5maWxsRGF0YS5mbHV4KSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiB0aGlzLmZpbGxEYXRhLmZsdXgpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc3RlcC5zZWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHNlY3Rpb24uY29udHJvbHMuZmluZChcbiAgICAgICAgICAgICAgKGN0cmw6IHtcbiAgICAgICAgICAgICAgICBjb250cm9sSWQ6IHN0cmluZyB8IG51bWJlciB8IChzdHJpbmcgfCBudW1iZXIpW10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH0pID0+IGN0cmwuY29udHJvbElkID09PSBjb250cm9sSWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmZpbGxWYWx1ZSAmJiBjb250cm9sLmZpbGxWYWx1ZS5uYW1lKSB7XG4gICAgICAgICAgICAgIG9wdGlvbnMucHJvcHNbJ3ZhbHVlJ10gPSBjb250cm9sLmZpbGxWYWx1ZS5uYW1lO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFJlZmVyZW5jZURpY3Rpb25hcnlGaWVsZHNJZk5lY2Vzc2FyeShcbiAgICByZWZlcnJlbmNlZERpY3Rpb25hcmllczogYW55W10sXG4gICAgcGFyZW50RGljdGlvbmFyeUZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZyxcbiAgICB0eXBlOiBhbnksXG4gICAgcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uczogRGljdGlvbmFyeUxhYmVsSW5mb1tdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChyZWZlcnJlbmNlZERpY3Rpb25hcmllcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMgPVxuICAgICAgICBwYXJlbnREaWN0aW9uYXJ5RmllbGQucHJvcHM/Llsnc2VsZWN0ZWRSZWxhdGVkRGljdGlvbmFyaWVzJ10gfHwgW107XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkRGljdGlvbmFyaWVzID0gcmVmZXJyZW5jZWREaWN0aW9uYXJpZXMuZmlsdGVyKChkaWN0KSA9PlxuICAgICAgICBzZWxlY3RlZFJlbGF0ZWREaWN0aW9uYXJpZXMuaW5jbHVkZXMoZGljdC51dWlkKVxuICAgICAgKTtcblxuICAgICAgc2VsZWN0ZWREaWN0aW9uYXJpZXMuZm9yRWFjaCgocmVmZXJlbmNlRGljdGlvbmFyeSkgPT4ge1xuICAgICAgICBjb25zdCByZWZlcmVuY2VEaWN0aW9uYXJ5VXVpZCA9IHJlZmVyZW5jZURpY3Rpb25hcnkudXVpZDtcblxuICAgICAgICBjb25zdCBjb21wb25lbnRPbmx5Rm9yQ29uZmlnID0gdGhpcy5mbHV4XG4gICAgICAgICAgLmZsYXRNYXAoKHMpID0+IHMuc2VjdGlvbnMpXG4gICAgICAgICAgLmZsYXRNYXAoKHNlYykgPT4gc2VjLmNvbnRyb2xzKVxuICAgICAgICAgIC5maW5kKFxuICAgICAgICAgICAgKGN0cmwpID0+XG4gICAgICAgICAgICAgIGN0cmw/LnNwZWNpZmljQ29udHJvbERhdGE/LmRpY3Rpb25hcnlVVUlEID09PVxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcnlVdWlkICYmIGN0cmw/LmlzT25seUZvckNvbmZpZyA9PT0gdHJ1ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgbmV3RmllbGRLZXkgPVxuICAgICAgICAgIGNvbXBvbmVudE9ubHlGb3JDb25maWc/LmlkZW50aWZpZXIgPz9cbiAgICAgICAgICBgZXh0cmFfJHtyZWZlcmVuY2VEaWN0aW9uYXJ5VXVpZH1gO1xuXG4gICAgICAgIGxldCByZWZlcmVuY2VEaWN0aW9uYXJ5TGFiZWwgPSByZWZlcmVuY2VEaWN0aW9uYXJ5Lm5hbWU7XG5cbiAgICAgICAgY29uc3Qgc3BlY2lmaWNUcmFuc2xhdGlvblZhbHVlID0gcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uc1xuICAgICAgICAgIC5maW5kKChkKSA9PiBkLmRpY3Rpb25hcnlVVUlEID09IHJlZmVyZW5jZURpY3Rpb25hcnlVdWlkKVxuICAgICAgICAgID8udHJhbnNsYXRpb25zPy5maW5kKFxuICAgICAgICAgICAgKHQpID0+IHQubGFuZ3VhZ2VJc28gPT0gdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICApPy52YWx1ZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgc3BlY2lmaWNUcmFuc2xhdGlvblZhbHVlICYmXG4gICAgICAgICAgc3BlY2lmaWNUcmFuc2xhdGlvblZhbHVlLnRyaW0oKSAhPT0gJydcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyeUxhYmVsID0gc3BlY2lmaWNUcmFuc2xhdGlvblZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZmVyZW5jZURpY3Rpb25hcnlMYWJlbCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMYW5ndWFnZUlkID0gVXRpbHMuZmluZExhbmd1YWdlSWRCeUlzbyhcbiAgICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUlzb1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG5ld0ZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZyA9IHtcbiAgICAgICAgICBrZXk6IG5ld0ZpZWxkS2V5LFxuICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIGxhYmVsOiByZWZlcmVuY2VEaWN0aW9uYXJ5TGFiZWwsXG4gICAgICAgICAgICBkZXNpZ246IHRoaXMuZGVzaWduLFxuICAgICAgICAgICAgZGljdGlvbmFyeUlkOiByZWZlcmVuY2VEaWN0aW9uYXJ5VXVpZCxcbiAgICAgICAgICAgIGRpY3Rpb25hcnlEYXRhOiByZWZlcmVuY2VEaWN0aW9uYXJ5LFxuICAgICAgICAgICAgbGFuZ3VhZ2VzOiB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgICAgICAgIHByZWxvYWRlZERpY3Rpb25hcmllczogdGhpcy5kaWN0aW9uYXJ5TWFwLFxuICAgICAgICAgICAgdXNlUHJlbG9hZGVkRGF0YTogdHJ1ZSxcbiAgICAgICAgICAgIGN1cnJlbnRMYW5ndWFnZUlzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc28sXG4gICAgICAgICAgICBjdXJyZW50TGFuZ3VhZ2VJZDogY3VycmVudExhbmd1YWdlSWQsXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuc3R5bGVPYmplY3RUb1N0cmluZ0V4Y2VwdEJhY2tncm91bmQoXG4gICAgICAgICAgICAgICAgdGhpcy5kZXNpZ25bYC5mb250LWxpc3RgXSB8fCB7fVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3B0aW9uczogcmVmZXJlbmNlRGljdGlvbmFyeS52YWx1ZXM/Lm1hcCgodmFsdWU6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICBsYWJlbDpcbiAgICAgICAgICAgICAgICBVdGlscy5maW5kVmFsdWVUcmFuc2xhdGlvbihcbiAgICAgICAgICAgICAgICAgIHZhbHVlLnZhbHVlVHJhbnNsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgY3VycmVudExhbmd1YWdlSWRcbiAgICAgICAgICAgICAgICApIHx8IHZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgIGN1cnJlbnRMYW5ndWFnZUlzbzogdGhpcy5jdXJyZW50TGFuZ3VhZ2VJc29cbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocmVmZXJlbmNlRGljdGlvbmFyeS5kZWZhdWx0VmFsdWVJZCkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWwgPSB0aGlzLmZpbmRBbmRNYXBEZWZhdWx0VmFsdWUoXG4gICAgICAgICAgICByZWZlcmVuY2VEaWN0aW9uYXJ5LFxuICAgICAgICAgICAgcmVmZXJlbmNlRGljdGlvbmFyeS5kZWZhdWx0VmFsdWVJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGRlZmF1bHRWYWwpIHtcbiAgICAgICAgICAgIG5ld0ZpZWxkLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50RmllbGRHcm91cCA9IHBhcmVudERpY3Rpb25hcnlGaWVsZC5wYXJlbnRcbiAgICAgICAgICA/IHBhcmVudERpY3Rpb25hcnlGaWVsZC5wYXJlbnQuZmllbGRHcm91cFxuICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgaWYgKHBhcmVudEZpZWxkR3JvdXApIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnRJbmRleCA9IHBhcmVudEZpZWxkR3JvdXAuZmluZEluZGV4KFxuICAgICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5rZXkgPT09IHBhcmVudERpY3Rpb25hcnlGaWVsZC5rZXlcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXJlbnRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gdGhpcy5maW5kTGFzdENoaWxkSW5kZXgoXG4gICAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAsXG4gICAgICAgICAgICAgIHBhcmVudEluZGV4XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlVG9BZGQgPSB0aGlzLmdldEV4aXN0aW5nUGVyY2VudGFnZShcbiAgICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cCxcbiAgICAgICAgICAgICAgcGFyZW50SW5kZXhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBuZXdGaWVsZC5jbGFzc05hbWUgPVxuICAgICAgICAgICAgICBwZXJjZW50YWdlVG9BZGQgPT09IDBcbiAgICAgICAgICAgICAgICA/IHBhcmVudERpY3Rpb25hcnlGaWVsZC5jbGFzc05hbWVcbiAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0UGVyY2VudGFnZUNsYXNzTmFtZShwZXJjZW50YWdlVG9BZGQpO1xuXG4gICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLnNwbGljZShlbmRJbmRleCArIDEsIDAsIG5ld0ZpZWxkKTtcblxuICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lVG9BZGQgPVxuICAgICAgICAgICAgICB0eXBlID09PSAncmFkaW8nID8gYCBjb21wb25lbnQtcmFkaW9gIDogYCBjb21wb25lbnQtZGF0YWA7XG4gICAgICAgICAgICBuZXdGaWVsZC5jbGFzc05hbWUgKz0gY2xhc3NOYW1lVG9BZGQ7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaFRvVmFsdWVDaGFuZ2VzKG5ld0ZpZWxkS2V5LCBuZXdGaWVsZCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RXhpc3RpbmdQZXJjZW50YWdlKGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSwgaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xuICAgIGNvbnN0IGZpZWxkID0gZmllbGRzW2luZGV4XTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBmaWVsZC5jbGFzc05hbWU7XG4gICAgaWYgKGZpZWxkLnR5cGU/LnRvU3RyaW5nKCkgIT09IFN0ZXBDb250cm9sVHlwZS5OZXdSb3cudG9TdHJpbmcoKSkge1xuICAgICAgaWYgKGNsYXNzTmFtZSAmJiBjbGFzc05hbWUuc3RhcnRzV2l0aCgncGVyY2VudGFnZS13aWR0aC0nKSkge1xuICAgICAgICBwZXJjZW50YWdlID1cbiAgICAgICAgICAocGFyc2VJbnQoY2xhc3NOYW1lLnJlcGxhY2UoJ3BlcmNlbnRhZ2Utd2lkdGgtJywgJycpLCAxMCkgKiAxMDApIC8gMTI7XG4gICAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSAmJiBjbGFzc05hbWUuc3RhcnRzV2l0aCgncGl4ZWwtd2lkdGgtJykpIHtcbiAgICAgICAgY29uc3QgcGl4ZWxzID0gcGFyc2VJbnQoY2xhc3NOYW1lLnJlcGxhY2UoJ3BpeGVsLXdpZHRoLScsICcnKSwgMTApO1xuICAgICAgICBwZXJjZW50YWdlID0gKHBpeGVscyAvIDEwMDApICogMTAwO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGVyY2VudGFnZTtcbiAgfVxuXG4gIGNhbGN1bGF0ZVJlbWFpbmluZ1BlcmNlbnRhZ2VGb3JSYW5nZShcbiAgICBmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgIGVuZEluZGV4OiBudW1iZXJcbiAgKTogbnVtYmVyIHtcbiAgICBsZXQgcmVtYWluaW5nUGVyY2VudGFnZSA9IDEwMDtcblxuICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4OyBpIDw9IGVuZEluZGV4OyBpKyspIHtcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0aGlzLmdldEV4aXN0aW5nUGVyY2VudGFnZShmaWVsZHMsIGkpO1xuICAgICAgcmVtYWluaW5nUGVyY2VudGFnZSAtPSBwZXJjZW50YWdlO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5tYXgocmVtYWluaW5nUGVyY2VudGFnZSwgMCk7XG4gIH1cblxuICByZW1vdmVSZWZlcmVuY2VGaWVsZHMoY3VycmVudEZvcm1seUZpZWxkQ29uZmlnOiBGb3JtbHlGaWVsZENvbmZpZykge1xuICAgIGNvbnN0IHJlZmVycmVkSW5EaWN0aW9uYXJpZXNVVUlkcyA9XG4gICAgICBjdXJyZW50Rm9ybWx5RmllbGRDb25maWcucHJvcHM/LlsnZGljdGlvbmFyeURhdGEnXVxuICAgICAgICA/LnJlZmVycmVkSW5EaWN0aW9uYXJpZXNVVUlkcztcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHJlZmVycmVkSW5EaWN0aW9uYXJpZXNVVUlkcykpIHtcbiAgICAgIGNvbnN0IHBhcmVudEZpZWxkR3JvdXAgPSBjdXJyZW50Rm9ybWx5RmllbGRDb25maWcucGFyZW50XG4gICAgICAgID8gY3VycmVudEZvcm1seUZpZWxkQ29uZmlnLnBhcmVudC5maWVsZEdyb3VwXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGlmIChwYXJlbnRGaWVsZEdyb3VwKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEluZGV4ID0gcGFyZW50RmllbGRHcm91cC5maW5kSW5kZXgoXG4gICAgICAgICAgKGZpZWxkKSA9PiBmaWVsZC5rZXkgPT09IGN1cnJlbnRGb3JtbHlGaWVsZENvbmZpZy5rZXlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocGFyZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJlZmVycmVkSW5EaWN0aW9uYXJpZXNVVUlkcykge1xuICAgICAgICAgICAgY29uc3QgaWRUb0ZpbmQgPSAnZXh0cmFfJyArIGl0ZW07XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYXJlbnRGaWVsZEdyb3VwLmxlbmd0aCAtIDE7IGkgPiBwYXJlbnRJbmRleDsgaS0tKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRGaWVsZEtleSA9IHBhcmVudEZpZWxkR3JvdXBbaV0ua2V5Py50b1N0cmluZygpO1xuICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkS2V5ICYmIGN1cnJlbnRGaWVsZEtleSA9PT0gaWRUb0ZpbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyRm9ybUNvbnRyb2xWYWx1ZShpZFRvRmluZCk7XG4gICAgICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBhZGRDaGlsZERpY3Rpb25hcnlGaWVsZChcbiAgICBjaGlsZERpY3Rpb25hcnlVdWlkOiBzdHJpbmcsXG4gICAgcGFyZW50RGljdGlvbmFyeUZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZyxcbiAgICB0eXBlOiBhbnksXG4gICAgcmVsYXRlZERpY3Rpb25hcmllc1RyYW5zbGF0aW9uczogRGljdGlvbmFyeUxhYmVsSW5mb1tdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjaGlsZERpY3Rpb25hcnlVdWlkKSB7XG4gICAgICBjb25zdCBjaGlsZERpY3Rpb25hcnkgPSB0aGlzLmRpY3Rpb25hcnlNYXAuZ2V0KGNoaWxkRGljdGlvbmFyeVV1aWQpO1xuICAgICAgaWYgKGNoaWxkRGljdGlvbmFyeSkge1xuICAgICAgICBsZXQgY2hpbGREaWN0aW9uYXJ5TGFiZWwgPSBjaGlsZERpY3Rpb25hcnkubmFtZTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPVxuICAgICAgICAgIHJlbGF0ZWREaWN0aW9uYXJpZXNUcmFuc2xhdGlvbnNcbiAgICAgICAgICAgIC5maW5kKChkKSA9PiBkLmRpY3Rpb25hcnlVVUlEID09IGNoaWxkRGljdGlvbmFyeVV1aWQpXG4gICAgICAgICAgICA/LnRyYW5zbGF0aW9ucy5maW5kKCh0KSA9PiB0Lmxhbmd1YWdlSXNvID09IHRoaXMuY3VycmVudExhbmd1YWdlSXNvKVxuICAgICAgICAgICAgPy52YWx1ZSB8fCAnJztcbiAgICAgICAgaWYgKHRyYW5zbGF0aW9uKSB7XG4gICAgICAgICAgY2hpbGREaWN0aW9uYXJ5TGFiZWwgPSB0cmFuc2xhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdGaWVsZDogRm9ybWx5RmllbGRDb25maWcgPSB7XG4gICAgICAgICAga2V5OiBgJHtwYXJlbnREaWN0aW9uYXJ5RmllbGQua2V5fV9jaGlsZF8ke2NoaWxkRGljdGlvbmFyeVV1aWR9YCxcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBsYWJlbDogY2hpbGREaWN0aW9uYXJ5TGFiZWwsXG4gICAgICAgICAgICBkaWN0aW9uYXJ5RGF0YTogY2hpbGREaWN0aW9uYXJ5LFxuICAgICAgICAgICAgbGFuZ3VhZ2VzOiB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgICAgICAgIHByZWxvYWRlZERpY3Rpb25hcmllczogdGhpcy5kaWN0aW9uYXJ5TWFwLFxuICAgICAgICAgICAgb3B0aW9uczogY2hpbGREaWN0aW9uYXJ5LnZhbHVlcz8ubWFwKCh2YWx1ZSkgPT4gKHtcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLmlkLFxuICAgICAgICAgICAgICBsYWJlbDogdmFsdWUubmFtZVxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgIHN0eWxlOiB0aGlzLnN0eWxlT2JqZWN0VG9TdHJpbmdFeGNlcHRCYWNrZ3JvdW5kKFxuICAgICAgICAgICAgICAgIHRoaXMuZGVzaWduW2AuZm9udC1saXN0YF0gfHwge31cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICAgIG9uSW5pdDogKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgICAgICAgICAgIHRoaXMuZmllbGRVbnN1YnNjcmliZVN1YmplY3RzLnB1c2godW5zdWJzY3JpYmUkKTtcblxuICAgICAgICAgICAgICBmaWVsZC5mb3JtQ29udHJvbD8udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHVuc3Vic2NyaWJlJCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShhc3luYyAoc2VsZWN0ZWRWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSBjaGlsZERpY3Rpb25hcnkudmFsdWVzPy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAodmFsKSA9PiB2YWwuaWQgPT09IHNlbGVjdGVkVmFsdWVcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgc2VsZWN0ZWRPcHRpb24uY2hpbGREaWN0aW9uYXJ5VVVJRCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFkZENoaWxkRGljdGlvbmFyeUZpZWxkKFxuICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uLmNoaWxkRGljdGlvbmFyeVVVSUQsXG4gICAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkRGljdGlvbmFyaWVzVHJhbnNsYXRpb25zXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUNoaWxkRmllbGRzKGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtbHlDb25maWcoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBmaWVsZC5ob29rcyEub25EZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHBhcmVudEZpZWxkR3JvdXAgPSBwYXJlbnREaWN0aW9uYXJ5RmllbGQucGFyZW50XG4gICAgICAgICAgPyBwYXJlbnREaWN0aW9uYXJ5RmllbGQucGFyZW50LmZpZWxkR3JvdXBcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGlmIChwYXJlbnRGaWVsZEdyb3VwKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50SW5kZXggPSBwYXJlbnRGaWVsZEdyb3VwLmZpbmRJbmRleChcbiAgICAgICAgICAgIChmaWVsZCkgPT4gZmllbGQua2V5ID09PSBwYXJlbnREaWN0aW9uYXJ5RmllbGQua2V5XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFyZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHRoaXMuZmluZExhc3RDaGlsZEluZGV4KFxuICAgICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLFxuICAgICAgICAgICAgICBwYXJlbnRJbmRleFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgcGVyY2VudGFnZVRvQWRkID0gdGhpcy5nZXRFeGlzdGluZ1BlcmNlbnRhZ2UoXG4gICAgICAgICAgICAgIHBhcmVudEZpZWxkR3JvdXAsXG4gICAgICAgICAgICAgIHBhcmVudEluZGV4XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbmV3RmllbGQuY2xhc3NOYW1lID0gdGhpcy5nZXRQZXJjZW50YWdlQ2xhc3NOYW1lKHBlcmNlbnRhZ2VUb0FkZCk7XG4gICAgICAgICAgICBwYXJlbnRGaWVsZEdyb3VwLnNwbGljZShlbmRJbmRleCArIDEsIDAsIG5ld0ZpZWxkKTtcblxuICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lVG9BZGQgPVxuICAgICAgICAgICAgICB0eXBlID09PSAncmFkaW8nID8gYCBjb21wb25lbnQtcmFkaW9gIDogYCBjb21wb25lbnQtZGF0YWA7XG4gICAgICAgICAgICBuZXdGaWVsZC5jbGFzc05hbWUgKz0gY2xhc3NOYW1lVG9BZGQ7XG4gICAgICAgICAgICAvL3RoaXMuYXR0YWNoVG9WYWx1ZUNoYW5nZXMobmV3RmllbGRLZXksIG5ld0ZpZWxkKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybWx5Q29uZmlnKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYENoaWxkIGRpY3Rpb25hcnkgbm90IGZvdW5kIGZvciBVVUlEICR7Y2hpbGREaWN0aW9uYXJ5VXVpZH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Db21wbGV0aW9uKCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdPcmlnaW4gZm9ybSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgdGhpcy5jb21wbGV0aW9uRXZlbnQuZW1pdCgpO1xuICB9XG5cbiAgZmluZExhc3RDaGlsZEluZGV4KGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSwgcGFyZW50SW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcGFyZW50S2V5UHJlZml4ID0gYCR7ZmllbGRzW3BhcmVudEluZGV4XS5rZXl9X2A7XG4gICAgbGV0IGxhc3RJbmRleCA9IHBhcmVudEluZGV4O1xuXG4gICAgZm9yIChsZXQgaSA9IHBhcmVudEluZGV4ICsgMTsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGZpZWxkc1tpXS5rZXk/LnRvU3RyaW5nKCkuc3RhcnRzV2l0aChwYXJlbnRLZXlQcmVmaXgpKSB7XG4gICAgICAgIGxhc3RJbmRleCA9IGk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFzdEluZGV4O1xuICB9XG5cbiAgZmluZEZpZWxkQnlLZXkoXG4gICAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdLFxuICAgIGtleTogc3RyaW5nXG4gICk6IEZvcm1seUZpZWxkQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKCFmaWVsZHMpIHJldHVybiBudWxsO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3N0ZXBwZXInICYmIGZpZWxkLmZpZWxkR3JvdXApIHtcbiAgICAgICAgY29uc3QgZm91bmRJblN0ZXBwZXIgPSB0aGlzLmZpbmRGaWVsZEJ5S2V5KGZpZWxkLmZpZWxkR3JvdXAsIGtleSk7XG4gICAgICAgIGlmIChmb3VuZEluU3RlcHBlcikgcmV0dXJuIGZvdW5kSW5TdGVwcGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLmZpZWxkR3JvdXApIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRGaWVsZEJ5S2V5KGZpZWxkLmZpZWxkR3JvdXAsIGtleSk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlbW92ZUNoaWxkRmllbGRzKHBhcmVudEZpZWxkOiBGb3JtbHlGaWVsZENvbmZpZykge1xuICAgIGNvbnN0IHBhcmVudEZpZWxkR3JvdXAgPSBwYXJlbnRGaWVsZC5wYXJlbnRcbiAgICAgID8gcGFyZW50RmllbGQucGFyZW50LmZpZWxkR3JvdXBcbiAgICAgIDogbnVsbDtcblxuICAgIGlmIChwYXJlbnRGaWVsZEdyb3VwKSB7XG4gICAgICBjb25zdCBwYXJlbnRJbmRleCA9IHBhcmVudEZpZWxkR3JvdXAuZmluZEluZGV4KFxuICAgICAgICAoZmllbGQpID0+IGZpZWxkLmtleSA9PT0gcGFyZW50RmllbGQua2V5XG4gICAgICApO1xuXG4gICAgICBpZiAocGFyZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEtleVByZWZpeCA9IGAke3BhcmVudEZpZWxkLmtleX1fY2hpbGRfYDtcblxuICAgICAgICAvLyBSZW1vdmUgb25seSB0aGUgcmVsZXZhbnQgY2hpbGQgZmllbGRzXG4gICAgICAgIGZvciAobGV0IGkgPSBwYXJlbnRGaWVsZEdyb3VwLmxlbmd0aCAtIDE7IGkgPiBwYXJlbnRJbmRleDsgaS0tKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudEZpZWxkS2V5ID0gcGFyZW50RmllbGRHcm91cFtpXS5rZXk/LnRvU3RyaW5nKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRGaWVsZEtleSAmJiBjdXJyZW50RmllbGRLZXkuc3RhcnRzV2l0aChwYXJlbnRLZXlQcmVmaXgpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyRm9ybUNvbnRyb2xWYWx1ZShjdXJyZW50RmllbGRLZXkpO1xuICAgICAgICAgICAgcGFyZW50RmllbGRHcm91cC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5FVzogTG9hZCBBTEwgZGljdGlvbmFyaWVzIG5lZWRlZCBmb3IgdGhpcyBhcHAgdXNpbmcgdGhlIG5ldyBhcHAtYmFzZWQgZW5kcG9pbnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbG9hZEFsbFJlcXVpcmVkRGljdGlvbmFyaWVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hcHBNb2RlbD8uYXBwbGljYXRpb25VdWlkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIGFwcCBVVUlEIGF2YWlsYWJsZSBmb3IgZGljdGlvbmFyeSBsb2FkaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgIHRoaXMuc2VydmljZS5sb2FkQXBwRGljdGlvbmFyaWVzKFxuICAgICAgICAgIHRoaXMuYXBwTW9kZWwuYXBwbGljYXRpb25VdWlkLFxuICAgICAgICAgIEVudmlyb25tZW50VHlwZS5Db25maWdcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ+KdjCBCYWNrZW5kIGZhaWxlZCB0byBsb2FkIGRpY3Rpb25hcmllczonLFxuICAgICAgICAgIHJlc3BvbnNlLmVycm9yc1xuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNpbXBsZSBhc3NpZ25tZW50IC0gQUxMIGRpY3Rpb25hcmllcyBhbmQgZGVwZW5kZW5jaWVzIGFscmVhZHkgbG9hZGVkIGJ5IGJhY2tlbmRcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJlc3BvbnNlLmRpY3Rpb25hcmllcykuZm9yRWFjaCgoW3V1aWQsIGRpY3RdKSA9PiB7XG4gICAgICAgIHRoaXMuZGljdGlvbmFyeU1hcC5zZXQodXVpZCwgZGljdCk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcign4p2MIEZhaWxlZCB0byBsb2FkIGFwcCBkaWN0aW9uYXJpZXM6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRm9ybUNvbnRyb2xWYWx1ZShmaWVsZEtleTogc3RyaW5nKSB7XG4gICAgY29uc3Qga2V5cyA9IGZpZWxkS2V5LnNwbGl0KCcuJyk7XG4gICAgbGV0IGNvbnRyb2wgPSB0aGlzLmZvcm07XG4gICAgbGV0IG1vZGVsID0gdGhpcy5tb2RlbDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGNvbnRyb2wgPSBjb250cm9sLmdldChrZXlzW2ldKSBhcyBGb3JtR3JvdXA7XG4gICAgICBtb2RlbCA9IG1vZGVsW2tleXNbaV1dO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsS2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuZ2V0KGZpbmFsS2V5KSkge1xuICAgICAgY29udHJvbC5yZW1vdmVDb250cm9sKGZpbmFsS2V5KTtcbiAgICB9XG5cbiAgICBpZiAobW9kZWwgJiYgbW9kZWxbZmluYWxLZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlbGV0ZSBtb2RlbFtmaW5hbEtleV07XG4gICAgfVxuICB9XG5cbiAgZmluZEZpZWxkKFxuICAgIGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSxcbiAgICBrZXk6IHN0cmluZ1xuICApOiBGb3JtbHlGaWVsZENvbmZpZyB8IG51bGwge1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBpZiAoZmllbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkLmZpZWxkR3JvdXApIHtcbiAgICAgICAgY29uc3QgbmVzdGVkRmllbGQgPSB0aGlzLmZpbmRGaWVsZChmaWVsZC5maWVsZEdyb3VwLCBrZXkpO1xuICAgICAgICBpZiAobmVzdGVkRmllbGQpIHtcbiAgICAgICAgICByZXR1cm4gbmVzdGVkRmllbGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHBvcHVsYXRlTW9kZWxXaXRoRmlsbERhdGEoZmlsbERhdGE6IGFueSk6IHZvaWQge1xuICAgIGlmIChmaWxsRGF0YSkge1xuICAgICAgbGV0IGF1eE1vZGVsID0gTW9kZWxQb3B1bGF0aW9uSGVscGVyLnBvcHVsYXRlTW9kZWxXaXRoRmlsbERhdGEoXG4gICAgICAgIGZpbGxEYXRhLFxuICAgICAgICB0aGlzLmZsdXgsXG4gICAgICAgIHRoaXMuZGljdGlvbmFyeU1hcCxcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXNcbiAgICAgICk7XG4gICAgICB0aGlzLm1vZGVsID0geyAuLi5hdXhNb2RlbCB9O1xuICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQW5kTWFwRGVmYXVsdFZhbHVlKFxuICAgIGRpY3Rpb25hcnk6IERpY3Rpb25hcnlEdG8gfCB1bmRlZmluZWQsXG4gICAgZGVmYXVsdFZhbHVlSWQ6IG51bWJlclxuICApOiBEaWN0aW9uYXJ5VmFsdWUgfCBudWxsIHtcbiAgICByZXR1cm4gTW9kZWxQb3B1bGF0aW9uSGVscGVyLmZpbmRBbmRNYXBEZWZhdWx0VmFsdWUoXG4gICAgICBkaWN0aW9uYXJ5LFxuICAgICAgZGVmYXVsdFZhbHVlSWQsXG4gICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlc1xuICAgICk7XG4gIH1cblxuICB1cGRhdGVGb3JtbHlDb25maWcoKSB7XG4gICAgdGhpcy5mb3JtbHlDb25maWcgPSBbLi4udGhpcy5mb3JtbHlDb25maWddO1xuICB9XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZUZyb21BbGxGaWVsZHMoKSB7XG4gICAgZm9yIChjb25zdCBzdWJqZWN0IG9mIHRoaXMuZmllbGRVbnN1YnNjcmliZVN1YmplY3RzKSB7XG4gICAgICBzdWJqZWN0Lm5leHQoKTtcbiAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICB9XG4gICAgdGhpcy5maWVsZFVuc3Vic2NyaWJlU3ViamVjdHMgPSBbXTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudW5zdWJzY3JpYmVGcm9tQWxsRmllbGRzKCk7XG4gICAgaWYgKHRoaXMuY29sbGVjdG9ySGFuZGxlclN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHRoaXMuY29sbGVjdG9ySGFuZGxlclN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWN0aW9uU3RlcFN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHRoaXMuYWN0aW9uU3RlcFN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuYWN0aW9uU3RlcEhhbmRsZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdEJ1dHRvbnMoYnV0dG9uc0NvbmZpZzogYW55W10pOiBhbnlbXSB7XG4gICAgaWYgKCFidXR0b25zQ29uZmlnIHx8IGJ1dHRvbnNDb25maWcubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBidXR0b25zQ29uZmlnLm1hcCgoYnV0dG9uKSA9PiAoe1xuICAgICAgdHlwZTogYnV0dG9uLnZhbHVlLnRvTG93ZXJDYXNlKCksXG4gICAgICBsYWJlbDogYnV0dG9uLnRyYW5zbGF0aW9ucz8uW3RoaXMuY3VycmVudExhbmd1YWdlSXNvXSB8fCBidXR0b24udmFsdWUsXG4gICAgICBzdHlsZUtleTogYC5idXR0b24tJHtidXR0b24udmFsdWUudG9Mb3dlckNhc2UoKX1gXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdHlsZU9iamVjdFRvU3RyaW5nRXhjZXB0QmFja2dyb3VuZChzdHlsZU9iajogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoc3R5bGVPYmopXG4gICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IGtleSAhPT0gJ2JhY2tncm91bmQtY29sb3InKVxuICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgJHtrZXl9OiAke3ZhbHVlfWApXG4gICAgICAuam9pbignOyAnKTtcbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlTWV0aG9kQXBpKGRhdGE6IEFwaVZhbGlkYXRlUmVxdWVzdCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChkYXRhLmFwaU1ldGhvZElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGFwaVJlc3BvbnNlID0gZnJvbSh0aGlzLmFwcGxpY2F0aW9uRGF0YVNlcnZpY2UudmFsaWRhdGVBcGkoZGF0YSkpLnBpcGUoXG4gICAgICBtYXAoKG9icykgPT4ge1xuICAgICAgICByZXR1cm4gISFvYnM7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20oYXBpUmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBtZXRob2QgdG8gY2xlYXIgdGhlIHNhdmluZyBhZnRlciBhY3Rpb25zIHN0YXRlXG4gICAqIENhbGxlZCBieSBzdGVwcGVyIGNvbXBvbmVudCBhZnRlciBzYXZlQXBwRGF0YVN0ZXAgY29tcGxldGVzXG4gICAqL1xuICBwdWJsaWMgY2xlYXJTYXZpbmdBZnRlckFjdGlvbnNTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1NhdmluZ0FmdGVyQWN0aW9ucykge1xuICAgICAgdGhpcy5pc1NhdmluZ0FmdGVyQWN0aW9ucyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuICBsb2FkaW5nTWVzc2FnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFJlYWRzIFZhbGlkYXRpb24gc3RlcCByZXN1bHRzIGZyb20gZmlsbERhdGEsIHNldHMgbW9kZWwgdmFsdWVzLFxuICAgKiBhbmQgcmVjYWxjdWxhdGVzIHZpc2libGUgc3RlcHMgc28gZGVwZW5kZW50cyBiZWNvbWUgdmlzaWJsZS5cbiAgICovXG4gIHB1YmxpYyBhcHBseVZhbGlkYXRpb25TdGVwUmVzdWx0cyhmaWxsRGF0YTogYW55KTogdm9pZCB7XG4gICAgaWYgKCFmaWxsRGF0YT8uZmx1eCB8fCAhdGhpcy5mbHV4KSByZXR1cm47XG4gICAgaWYgKCF0aGlzLmZsdXguc29tZSgocykgPT4gcy50eXBlID09PSBGbHV4VHlwZS5WYWxpZGF0aW9uKSkgcmV0dXJuO1xuXG4gICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGZpbGxlZFN0ZXAgb2YgZmlsbERhdGEuZmx1eCkge1xuICAgICAgY29uc3QgY29uZmlnU3RlcCA9IHRoaXMuZmx1eC5maW5kKFxuICAgICAgICAocykgPT5cbiAgICAgICAgICBzLmlkZW50aWZpZXIgPT09IGZpbGxlZFN0ZXAuc3RlcElkICYmIHMudHlwZSA9PT0gRmx1eFR5cGUuVmFsaWRhdGlvblxuICAgICAgKTtcbiAgICAgIGlmICghY29uZmlnU3RlcCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGZpbGxWYWx1ZUlkID0gZmlsbGVkU3RlcC5zZWN0aW9ucz8uWzBdPy5jb250cm9scz8uWzBdPy5maWxsVmFsdWVJZDtcbiAgICAgIGlmIChmaWxsVmFsdWVJZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG51bWVyaWNJZCA9IE51bWJlcihmaWxsVmFsdWVJZCk7XG4gICAgICAgIGlmICh0aGlzLm1vZGVsW2NvbmZpZ1N0ZXAuaWRlbnRpZmllcl0/LmlkICE9PSBudW1lcmljSWQpIHtcbiAgICAgICAgICB0aGlzLm1vZGVsW2NvbmZpZ1N0ZXAuaWRlbnRpZmllcl0gPSB7IGlkOiBudW1lcmljSWQgfTtcbiAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNDaGFuZ2VzKSB7XG4gICAgICB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwID0gdGhpcy5nZXRGb3JtbHlGaWx0ZXJlZFN0ZXBzKCk7XG4gICAgICBjb25zdCBmaWx0ZXJlZFN0ZXBzSWRlbnRpZmllcnMgPSB0aGlzLmZvcm1seUNvbmZpZ1swXS5maWVsZEdyb3VwLm1hcChcbiAgICAgICAgKGYpID0+IGYucHJvcHM/Llsnc3RlcElkJ11cbiAgICAgICk7XG4gICAgICBjb25zdCB2aXNpYmxlU3RlcHMgPSB0aGlzLmFjdGlvblN0ZXBIYW5kbGVyLmZpbHRlclZpc2libGVTdGVwcyhcbiAgICAgICAgdGhpcy5mbHV4LFxuICAgICAgICBmaWx0ZXJlZFN0ZXBzSWRlbnRpZmllcnNcbiAgICAgICk7XG4gICAgICB0aGlzLnVwZGF0ZUZvcm1seUNvbmZpZygpO1xuICAgICAgdGhpcy52aXNpYmxlRmllbGRzVXBkYXRlZC5lbWl0KHZpc2libGVTdGVwcyk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJsb2FkaW5nLW92ZXJsYXlcIj5cbiAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XG48L2Rpdj5cbjxkaXYgW2hpZGRlbl09XCJpc0xvYWRpbmdcIj5cbiAgPGRpdiAqbmdJZj1cInNob3dMYW5ndWFnZVNlbGVjdG9yXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBjbGFzcz1cInJpZ2h0LWFsaWduZWRcIj5cbiAgICA8YnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJmbGFnc1wiIG1hdC1pY29uLWJ1dHRvbiBjbGFzcz1cIm0tci01XCI+XG4gICAgICA8aW1nXG4gICAgICAgIFtzcmNdPVwicmV0dXJuRkxhZyhjdXJyZW50TGFuZ3VhZ2VJc28pXCJcbiAgICAgICAgY2xhc3M9XCJyb3VuZGVkLWNpcmNsZSBvYmplY3QtY292ZXIgaWNvbi0yMFwiXG4gICAgICAvPlxuICAgIDwvYnV0dG9uPlxuICAgIDxtYXQtbWVudSAjZmxhZ3M9XCJtYXRNZW51XCIgY2xhc3M9XCJjYXJkV2l0aFNoYWRvd1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICpuZ0Zvcj1cImxldCBsYW5nIG9mIGFwcGxpY2F0aW9uTGFuZ3VhZ2VzKClcIlxuICAgICAgICAoY2xpY2spPVwiY2hhbmdlTGFuZ3VhZ2UobGFuZy5pc28pXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8aW1nXG4gICAgICAgICAgICBbc3JjXT1cInJldHVybkZMYWcobGFuZy5pc28pXCJcbiAgICAgICAgICAgIGNsYXNzPVwicm91bmRlZC1jaXJjbGUgb2JqZWN0LWNvdmVyIGljb24tMjBcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXQtc3VidGl0bGUtMSBmLXMtMTRcIj57eyBsYW5nLm5hbWUgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9tYXQtbWVudT5cbiAgPC9kaXY+XG5cbiAgPGJyIC8+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiPlxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiPlxuICAgICAgPGZvcm1seS1mb3JtXG4gICAgICAgIFttb2RlbF09XCJtb2RlbFwiXG4gICAgICAgIFtmaWVsZHNdPVwiZm9ybWx5Q29uZmlnXCJcbiAgICAgICAgW29wdGlvbnNdPVwib3B0aW9uc1wiXG4gICAgICAgIFtmb3JtXT1cImZvcm1cIlxuICAgICAgPjwvZm9ybWx5LWZvcm0+XG4gICAgPC9mb3JtPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19