@esfaenza/es-table 11.2.22-beta7 → 11.2.24

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 (34) hide show
  1. package/bundles/esfaenza-es-table.umd.js +145 -90
  2. package/bundles/esfaenza-es-table.umd.js.map +1 -1
  3. package/bundles/esfaenza-es-table.umd.min.js +1 -1
  4. package/bundles/esfaenza-es-table.umd.min.js.map +1 -1
  5. package/esfaenza-es-table.metadata.json +1 -1
  6. package/esm2015/lib/components/es-table/es_table.component.js +56 -39
  7. package/esm2015/lib/components/pager/table_pager.component.js +10 -4
  8. package/esm2015/lib/core/handlers/classes/ColumnMetadataHandler.js +25 -12
  9. package/esm2015/lib/core/handlers/classes/DynamicModeHandler.js +2 -1
  10. package/esm2015/lib/core/handlers/classes/ExportHandler.js +3 -1
  11. package/esm2015/lib/core/handlers/classes/HierarchyModeHandler.js +3 -1
  12. package/esm2015/lib/core/handlers/classes/ItemsHandler.js +17 -7
  13. package/esm2015/lib/core/handlers/classes/ReportModeHandler.js +4 -1
  14. package/esm2015/lib/core/handlers/classes/RowGroupingHandler.js +4 -3
  15. package/esm2015/lib/core/handlers/classes/SelectionHandler.js +23 -20
  16. package/esm2015/lib/core/handlers/classes/UtilitiesHandler.js +11 -12
  17. package/esm2015/lib/domain/internals/classes/ThElement.js +2 -0
  18. package/esm2015/lib/domain/internals/index.js +2 -1
  19. package/fesm2015/esfaenza-es-table.js +146 -90
  20. package/fesm2015/esfaenza-es-table.js.map +1 -1
  21. package/lib/components/es-table/es_table.component.d.ts +17 -39
  22. package/lib/components/pager/table_pager.component.d.ts +4 -0
  23. package/lib/core/handlers/classes/ColumnMetadataHandler.d.ts +6 -5
  24. package/lib/core/handlers/classes/DynamicModeHandler.d.ts +1 -0
  25. package/lib/core/handlers/classes/ExportHandler.d.ts +2 -0
  26. package/lib/core/handlers/classes/HierarchyModeHandler.d.ts +2 -0
  27. package/lib/core/handlers/classes/ItemsHandler.d.ts +4 -4
  28. package/lib/core/handlers/classes/ReportModeHandler.d.ts +2 -0
  29. package/lib/core/handlers/classes/RowGroupingHandler.d.ts +3 -3
  30. package/lib/core/handlers/classes/SelectionHandler.d.ts +6 -10
  31. package/lib/core/handlers/classes/UtilitiesHandler.d.ts +5 -4
  32. package/lib/domain/internals/classes/ThElement.d.ts +13 -0
  33. package/lib/domain/internals/index.d.ts +1 -0
  34. package/package.json +5 -5
@@ -1,5 +1,8 @@
1
+ // Modelli
1
2
  import { Group, GroupAggregation, GroupOrAggregation, GroupPager, GroupRouteFragment } from "../../../domain";
3
+ /** Classe che gestisce la modalità Row Grouping dell'es-table */
2
4
  export class RowGroupingHandler {
5
+ /** @ignore Costruttore */
3
6
  constructor(est, utilities, dateExts) {
4
7
  this.est = est;
5
8
  this.utilities = utilities;
@@ -449,8 +452,6 @@ export class RowGroupingHandler {
449
452
  * @param {string} fromat Formato su cui formattare il valore. Può essere ad esempio "small", "long" "verylong" per le date o F{0-9} per i numeri decimali
450
453
  *
451
454
  * @returns {string} Valore dell'aggregazione formattato come si deve
452
- *
453
- * @todo ROWGROUPING
454
455
  */
455
456
  formatAggregationValue(value, format) {
456
457
  if (!format)
@@ -471,4 +472,4 @@ export class RowGroupingHandler {
471
472
  return value;
472
473
  }
473
474
  }
474
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm93R3JvdXBpbmdIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9jb3JlL2hhbmRsZXJzL2NsYXNzZXMvUm93R3JvdXBpbmdIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE9BQU8sRUFBMEIsS0FBSyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUlySixNQUFNLE9BQU8sa0JBQWtCO0lBUzNCLFlBQW9CLEdBQXFCLEVBQVUsU0FBMkIsRUFBVSxRQUFxQjtRQUF6RixRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQVA3RyxxRkFBcUY7UUFDOUUsaUJBQVksR0FBdUIsSUFBSSxHQUFHLEVBQWlCLENBQUM7UUFDbkUsNkdBQTZHO1FBQ3RHLGdCQUFXLEdBQXVCLElBQUksR0FBRyxFQUFpQixDQUFDO1FBQ2xFLDZHQUE2RztRQUN0Ryx1QkFBa0IsR0FBeUIsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFFb0MsQ0FBQztJQUVsSDs7Ozs7Ozs7O09BU0c7SUFDSSwwQkFBMEIsQ0FBQyxJQUFvQixFQUFFLFlBQW9COztRQUN4RSx3SUFBd0k7UUFDeEksOEVBQThFO1FBQzlFLElBQUksQ0FBQyxPQUFBLElBQUksQ0FBQyxlQUFlLDBDQUFFLE1BQU0sS0FBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7WUFDL0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztZQUM3QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxFQUFpQixD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QUFRLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLElBQUksT0FBTyxFQUFFLE1BQU0sSUFBSSxVQUFVLENBQUMsQ0FBQztRQUVyRixnR0FBZ0c7UUFDaEcsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2V4dGVuc2lvbnNcIjtcclxuXHJcbmltcG9ydCB7IEVzVGFibGVDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vLi4vY29tcG9uZW50cy9lcy10YWJsZS9lc190YWJsZS5jb21wb25lbnRcIlxyXG5pbXBvcnQgeyBFc1RoIH0gZnJvbSBcIi4uLy4uLy4uL2NvbXBvbmVudHMvZXMtdGgvZXNfdGguY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEVzVGhEaXJlY3RpdmUgfSBmcm9tIFwiLi4vLi4vLi4vZGlyZWN0aXZlcy9lc190aC5kaXJlY3RpdmVcIjtcclxuXHJcbmltcG9ydCB7IEFwcE9yZGVyaW5nLCBBcHBTZWFyY2gsIEdyb3VwLCBHcm91cEFnZ3JlZ2F0aW9uLCBHcm91cE9yQWdncmVnYXRpb24sIEdyb3VwUGFnZXIsIEdyb3VwUm91dGVGcmFnbWVudCwgVGhBZ2dyZWdhdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9kb21haW5cIjtcclxuXHJcbmltcG9ydCB7IFV0aWxpdGllc0hhbmRsZXIgfSBmcm9tIFwiLi9VdGlsaXRpZXNIYW5kbGVyXCI7XHJcblxyXG5leHBvcnQgY2xhc3MgUm93R3JvdXBpbmdIYW5kbGVyIHtcclxuXHJcbiAgICAvKiogQ2FjaGUgcGVyIHNhbHZhcmUgcGVyIG9nbmkgY2hpYXZlIGRpIG9nbmkgZ3J1cHBvIGNoaSDDqCBpbCBncnVwcG8gcmFwcHJlc2VudGF0byAqL1xyXG4gICAgcHVibGljIHJnR3JvdXBDYWNoZTogTWFwPHN0cmluZywgR3JvdXA+ID0gbmV3IE1hcDxzdHJpbmcsIEdyb3VwPigpO1xyXG4gICAgLyoqIENhY2hlIHBlciBzYWx2YXJlIHBlciBvZ25pIGNoaWF2ZSBkaSBvZ25pIGdydXBwbyBjaGkgc29ubyBnbGkgb2dnZXR0aSBzb3R0b3N0YW50aSwgbm9uIGRlaSBzb3R0b2dydXBwaSAqL1xyXG4gICAgcHVibGljIHJnSXRlbUNhY2hlOiBNYXA8c3RyaW5nLCBhbnlbXT4gPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XHJcbiAgICAvKiogQ2FjaGUgcGVyIHNhbHZhcmUgcGVyIG9nbmkgY2hpYXZlIGRpIG9nbmkgZ3J1cHBvIGNoaSBzb25vIGdsaSBvZ2dldHRpIHNvdHRvc3RhbnRpLCBub24gZGVpIHNvdHRvZ3J1cHBpICovXHJcbiAgICBwdWJsaWMgcmdDaGlsZEdyb3Vwc0NhY2hlOiBNYXA8c3RyaW5nLCBHcm91cFtdPiA9IG5ldyBNYXA8c3RyaW5nLCBHcm91cFtdPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZXN0OiBFc1RhYmxlQ29tcG9uZW50LCBwcml2YXRlIHV0aWxpdGllczogVXRpbGl0aWVzSGFuZGxlciwgcHJpdmF0ZSBkYXRlRXh0czogRGF0ZVNlcnZpY2UpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW4gbW9kYWxpdMOgIHJvd2dyb3VwaW5nIHF1YW5kbyBtaSBhcnJpdmEgdW4gbnVvdm8gYmxvY2NvIGRpIG9nZ2V0dGkgZGV2byBhZ2dpdW5nZXJsbyBhbGxhIHZpc3RhIGF0dHVhbGU6XHJcbiAgICAgKlxyXG4gICAgICogMSkgU2Ugbm9uIHZpZW5lIHJpY2hpZXN0byBpbCBkZXR0YWdsaW8gZGkgYWxjdW4gZ3J1cHBvIHNpZ25pZmljYSBjaGUgZGV2byBjb25zaWRlcmFyZSBtaSBzaWFubyBhcnJpdmF0aSB0dXR0aSBpIGdydXBwaSBwcmluY2lwYWxpXHJcbiAgICAgKiAyKSBTZSB2aWVuZSByaWNoaWVzdG8gaWwgZGV0dGFnbGlvIGRpIHVuIGdydXBwbyBkaXZlcnNvIGRhbGwndWx0aW1vIGRldm8gYWdnaXVuZ2VyZSBkb3BvIGFsIGdydXBwbyBjbGljY2F0byBsYSBsaXN0YSBkZWkgc290dG9ncnVwcGlcclxuICAgICAqIDIpIFNlIHZpZW5lIHJpY2hpZXN0byBpbCBkZXR0YWdsaW8gZGVsbCd1bHRpbW8gZ3J1cHBvIGRldm8gYWdnaXVuZ2VyZSBkb3BvIGFsIGdydXBwbyBjbGljY2F0byBsYSBsaXN0YSBkZWdsaSBvZ2dldHRpXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnl9IHZpZXcgQXBwU2VhcmNoPFQ+IGRhIGN1aSBzb25vIGFycml2YXRpIGdsaSBvZ2dldHRpXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZ3JvdXBpbmdLZXlzIExpdmVsbGkgZGkgcmFnZ3J1cHBhbWVudG8gZGEgYXNwZXR0YXJzaSBzdWkgZGF0aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlTmV3RGF0YU9uUm93R3JvdXBpbmcodmlldzogQXBwU2VhcmNoPGFueT4sIGdyb3VwaW5nS2V5czogbnVtYmVyKSB7XHJcbiAgICAgICAgLy8gMSkgU2Ugbm9uIHZpZW5lIHJpY2hpZXN0byBpbCBkZXR0YWdsaW8gZGkgYWxjdW4gZ3J1cHBvIHNpZ25pZmljYSBjaGUgbGEgY2hpYW1hdGEgcmVzdGl0dWlzY2UgbGEgbGlzdGEgcGFnaW5hdGEgZGVpIGdydXBwaSBwcmluY2lwYWxpLlxyXG4gICAgICAgIC8vICAgIExpIHRyYXR0byBjb21lIHNlIGZvc3NlIHVuYSBxdWFsc2lhc2kgYWx0cmEgcXVlcnkgcGFnaW5hdGEgc3UgTiBlbGVtZW50aVxyXG4gICAgICAgIGlmICgodmlldy5yZXF1ZXN0ZWRncm91cHM/Lmxlbmd0aCB8fCAwKSA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXN0LmJvdW5kU291cmNlID0gdGhpcy5lc3QuVE1QQm91bmRTb3VyY2U7XHJcbiAgICAgICAgICAgIHRoaXMucmdHcm91cENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEdyb3VwPigpO1xyXG4gICAgICAgICAgICB0aGlzLnJnSXRlbUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xyXG4gICAgICAgICAgICB0aGlzLnJnQ2hpbGRHcm91cHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBHcm91cFtdPigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lc3QuVE1QQm91bmRTb3VyY2UuZm9yRWFjaChpdG0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaXRtLl90aGlzUm91dGUgPSBpdG0uX2dyb3VwID8gW3sgY29sdW1uOiAoPEdyb3VwPml0bSkuY29sdW1uLCB2YWx1ZTogKDxHcm91cD5pdG0pLnZhbHVlIH1dIDogW107XHJcbiAgICAgICAgICAgICAgICBpdG0uX3RoaXNLZXkgPSBpdG0uX2dyb3VwID8gKDxHcm91cD5pdG0pLnZhbHVlIDogbnVsbDtcclxuICAgICAgICAgICAgICAgIGl0bS5fZ3JvdXBsZXZlbCA9IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZ0dyb3VwQ2FjaGUuc2V0KGl0bS5fdGhpc0tleSwgaXRtKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBSZXNldHRvIGxhIHJpY2VyY2EgYWxsYSBjYWNoZSBkaSBxdWVzdGEgXCJzZXNzaW9uZVwiXHJcbiAgICAgICAgICAgIGxldCBmaXJzdEl0ZW0gPSB0aGlzLmVzdC5UTVBCb3VuZFNvdXJjZVswXTtcclxuICAgICAgICAgICAgdGhpcy5lc3QuTWFpbkdyb3VwVmlldyA9IE9iamVjdC5hc3NpZ24oe30sIHZpZXcpO1xyXG4gICAgICAgICAgICB0aGlzLmVzdC5ncm91cFNlYXJjaFJlcXVlc3RzQ2FjaGUgPSBbeyBwYXRoOiAnJywgcm91dGU6IFt7IGNvbHVtbjogKDxHcm91cD5maXJzdEl0ZW0pLmNvbHVtbiwgdmFsdWU6ICg8R3JvdXA+Zmlyc3RJdGVtKS52YWx1ZSB9XSwgdmlldzogdGhpcy5lc3QuTWFpbkdyb3VwVmlldywgZ3JvdXBfY29sdW1uOiAoPEdyb3VwPnRoaXMuZXN0LlRNUEJvdW5kU291cmNlWzBdKS5jb2x1bW4gfV07XHJcbiAgICAgICAgICAgIHRoaXMuZXN0LkJhc2VJdGVtc0NvdW50ID0gdmlldy5vYmplY3Rjb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIDIpIFNlIHZpZW5lIHJpY2hpZXN0byBpbCBkZXR0YWdsaW8gZGkgdW4gcXVhbHNpYXNpIGdydXBwbyBkaXZlcnNvIGRhbGwndWx0aW1vIHZ1b2wgZGlyZSBjaGUgZGV2byBhZ2dpdW5nZXJlIFxyXG4gICAgICAgICAgICAvLyAgICBkb3BvIGFsIGdydXBwbyBjaGUgaG8gY2xpY2NhdG8gbGEgbGlzdGEgZGVpIGdydXBwaSB0aXJhdGEgZnVvcmkgcXVlc3RhIHZvbHRhIChpbnRlcm1lZGlhdGVHcm91cCA9IHRydWUpXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICogICBHcnVwcG9BICAgICAgICAgICAgICAgICAgICAgIEdydXBwb0FcclxuICAgICAgICAgICAgKiAgIEdydXBwb0IgICAgICAgICAgICAgICAgICAgICAgR3J1cHBvQlxyXG4gICAgICAgICAgICAqICAgR3J1cHBvQyA8LSBDbGljY28gcXVpICAgICAgICBHcnVwcG9DXHJcbiAgICAgICAgICAgICogICBHcnVwcG9EICAgICAgICAgICAgICAgICAgICAgICAgICBHcnVwcG9DMVxyXG4gICAgICAgICAgICAqICAgR3J1cHBvRSAgICAgICAgICAgICAgICAgICAgICAgICAgR3J1cHBvQzJcclxuICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3J1cHBvRFxyXG4gICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcnVwcG9FXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIC8vIDMpIHNlIGkgZ3J1cHBpIHJpY2hpZXN0aSBkYWxsYSB2aWV3IHNvbm8gdWd1YWxpIGFpIGdydXBwaSBwcmVzZW50aSB2dW9sIGRpcmUgY2hlIHN0byBwcmVuZGVuZG8gZ2xpIG9nZ2V0dGkgdmVyaSBlIHByb3ByaSwgc29ubyBpbiBcclxuICAgICAgICAgICAgLy8gdmlldy5pdGVtcyBlIHF1aW5kaSBpbiBUTVBCb3VuZFNvdXJjZSwgaG8gaW5vbHRyZSBsZSBpbmZvcm1hemlvbmkgZGkgcGFnaW5hemlvbmUgKipwZXIgaWwgc2luZ29sbyBzb3R0b2dydXBwbyoqIChpbnRlcm1lZGlhdGVHcm91cCA9IGZhbHNlKVxyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAqICAgR3J1cHBvQSAgICAgICAgICAgICAgICAgICAgICAgICBHcnVwcG9BXHJcbiAgICAgICAgICAgICogICAgICAgR3J1cHBvQzEgICAgICAgICAgICAgICAgICAgICAgICBHcnVwcG9DMVxyXG4gICAgICAgICAgICAqICAgR3J1cHBvQiAgICAgICAgICAgICAgICAgICAgICAgICBHcnVwcG9CXHJcbiAgICAgICAgICAgICogICBHcnVwcG9DICAgICAgICAgICAgICAgICAgICAgICAgIEdydXBwb0NcclxuICAgICAgICAgICAgKiAgICAgICBHcnVwcG9DMSA8LS0gQ2xpY2NvIHF1aSAgICAgICAgIEdydXBwb0MxXHJcbiAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2dnZXR0bzFcclxuICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZ2dldHRvMlxyXG4gICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9nZ2V0dG8zXHJcbiAgICAgICAgICAgICogICAgICAgR3J1cHBvQzIgICAgICAgICAgICAgICAgICAgICAgICBHcnVwcG9DMlxyXG4gICAgICAgICAgICAqICAgR3J1cHBvRCAgICAgICAgICAgICAgICAgICAgICAgICBHcnVwcG9EXHJcbiAgICAgICAgICAgICogICBHcnVwcG9FICAgICAgICAgICAgICAgICAgICAgICAgIEdydXBwb0VcclxuICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IGludGVybWVkaWF0ZUdyb3VwID0gdmlldy5yZXF1ZXN0ZWRncm91cHMubGVuZ3RoICE9IGdyb3VwaW5nS2V5cztcclxuXHJcbiAgICAgICAgICAgIGxldCBpdGVtcyA9IHRoaXMuZXN0LmJvdW5kU291cmNlO1xyXG4gICAgICAgICAgICBsZXQgaW5zZXJ0SW5kZXggPSAwO1xyXG4gICAgICAgICAgICBsZXQgaW5zZXJ0R3JvdXAgPSBudWxsO1xyXG4gICAgICAgICAgICBsZXQgZ3JvdXBLZXk6IHN0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgIGxldCBncm91cFJvdXRlOiBHcm91cFJvdXRlRnJhZ21lbnRbXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gTmF2aWdvIGxhIHN0dXR0dXJhIGRlaSBncnVwcGkgaWdub3JhbmRvIHJpY29yc2l2YW1lbnRlIHR1dHRpIGdsaSBpbmRpY2kgZmlubyBhaSBncnVwcGkgY2hlIG1pIGludGVyZXNzYW5vIGluIG1vZG8gZGEgbm9uIGJlY2NhcmUgaWwgcHJpbW8gXCJHcnVwcG9DMVwiIGRlbCBjYXNvIHNvcHJhXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlldy5yZXF1ZXN0ZWRncm91cHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCByZyA9IHZpZXcucmVxdWVzdGVkZ3JvdXBzW2ldO1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBLZXkgKz0gcmcudmFsdWU7XHJcbiAgICAgICAgICAgICAgICBncm91cFJvdXRlLnB1c2goeyBjb2x1bW46IHJnLmNvbHVtbiwgdmFsdWU6IHJnLnZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGluc2VydEluZGV4OyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdCA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID49IGluc2VydEluZGV4ICYmIHQuX2dyb3VwICYmIHQuY29sdW1uID09IHJnLmNvbHVtbiAmJiB0LnZhbHVlID09IHJnLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEluZGV4ID0gaTsgaW5zZXJ0R3JvdXAgPSB0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMbyBtYXJjbyBleHBhbmRlZCBkYXRvIGNoZSBxdWVzdG8gY2xpY2sgc3VsIGdydXBwbyBwb3RyZWJiZSBub24gZXNzZXJlIHN0YXRvIGZhdHRvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEdyb3VwLl9leHBhbmRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGl0ZW1zQ2FjaGVSZWZlcmVuY2U7XHJcbiAgICAgICAgICAgIGxldCBjaGlsZEdyb3Vwc0NhY2hlUmVmZXJlbmNlO1xyXG5cclxuICAgICAgICAgICAgLy8gU2Ugbm9uIMOoIHVuIGdydXBwbyBpbnRlcm1lZGlvIGRldm8gcmlwdWxpcmUgbGEgY2FjaGUgZGVsIGdydXBwbyBzdSBjdWkgaG8gYXR0dWFsbWVudGUgY2xpY2NhdG8uIEdsaSBvZ2dldHRpIHNhcmFubm8gcmlhZ2dpdW50aSBkb3BvXHJcbiAgICAgICAgICAgIGlmICghaW50ZXJtZWRpYXRlR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmdJdGVtQ2FjaGUuc2V0KGdyb3VwS2V5LCBbXSk7XHJcbiAgICAgICAgICAgICAgICBpdGVtc0NhY2hlUmVmZXJlbmNlID0gdGhpcy5yZ0l0ZW1DYWNoZS5nZXQoZ3JvdXBLZXkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gU2UgaW52ZWNlIMOoIHVuIGdydXBwbyBpbnRlcm1lZGlvIGRldm8gcmlwdWxpcmUgc2lhIHR1dHRpIGkgY2hpbGQgZ3JvdXAgcmljb3JzaXZhbWVudGUsIHNpYSB0dXR0aSBnbGkgaXRlbVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIHRoaXMucmdDaGlsZEdyb3Vwc0NhY2hlLmtleXMoKSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoZ3JvdXBLZXkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJnQ2hpbGRHcm91cHNDYWNoZS5kZWxldGUoa2V5KTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgb2YgdGhpcy5yZ0l0ZW1DYWNoZS5rZXlzKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGdyb3VwS2V5KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZ0l0ZW1DYWNoZS5kZWxldGUoa2V5KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJnQ2hpbGRHcm91cHNDYWNoZS5zZXQoZ3JvdXBLZXksIFtdKTtcclxuICAgICAgICAgICAgICAgIGNoaWxkR3JvdXBzQ2FjaGVSZWZlcmVuY2UgPSB0aGlzLnJnQ2hpbGRHcm91cHNDYWNoZS5nZXQoZ3JvdXBLZXkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBBc3NlZ25vIHVuIGxpdmVsbG8gYWkgdmFsb3JpIGNoZSBhcnJpdmFubyBkYSB1c2FyZSBwZXIgZm9ybWF0dGFyZSBsYSBwYXJ0ZSBncmFmaWNhLiBJbCBwcmltbyBncnVwcG8gY2xpY2NhdG8gc2Fyw6AgYSBsaXZlbGxvIDEsXHJcbiAgICAgICAgICAgIC8vIGlsIHNlY29uZG8gc2Fyw6AgYSBsaXZlbGxvIDIgZSBjb3PDrCB2aWEuLi5cclxuICAgICAgICAgICAgLy8gTGkgbWFyY28gaW5vbHRyZSBjb24gaWwgcGFyZW50IGluIG1vZG8gZGEgcG90ZXIgZWxpbWluYXJlIGkgdmVjY2hpIHF1YWxvcmEgc2Vydmlzc2VcclxuICAgICAgICAgICAgdGhpcy5lc3QuVE1QQm91bmRTb3VyY2UuZm9yRWFjaChpdG0gPT4ge1xyXG4gICAgICAgICAgICAgICAgaXRtLl9wYXJlbnQgPSBncm91cEtleTtcclxuICAgICAgICAgICAgICAgIGl0bS5fcGFyZW50Um91dGUgPSBncm91cFJvdXRlO1xyXG4gICAgICAgICAgICAgICAgaXRtLl90aGlzUm91dGUgPSBpdG0uX2dyb3VwID8gWy4uLmdyb3VwUm91dGUsIG5ldyBHcm91cFJvdXRlRnJhZ21lbnQoKDxHcm91cD5pdG0pLmNvbHVtbiwgKDxHcm91cD5pdG0pLnZhbHVlKV0gOiBbXTtcclxuICAgICAgICAgICAgICAgIGl0bS5fdGhpc0tleSA9IGl0bS5fZ3JvdXAgPyBncm91cEtleSArICg8R3JvdXA+aXRtKS52YWx1ZSA6IGdyb3VwS2V5O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFBlciBsZSByaWNlcmNhIGludGVybWVkaWUgbWV0dG8gaSBncnVwcGkgbmVsbGEgY2FjaGUgZGVpIGdydXBwaVxyXG4gICAgICAgICAgICAgICAgaWYgKGludGVybWVkaWF0ZUdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRtLl9ncm91cGxldmVsID0gdmlldy5yZXF1ZXN0ZWRncm91cHMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmdHcm91cENhY2hlLnNldChpdG0uX3RoaXNLZXksIGl0bSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRHcm91cHNDYWNoZVJlZmVyZW5jZS5wdXNoKGl0bSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBNZXR0byBhbmNoZSBnbGkgb2dnZXR0aSBuZWxsYSBjYWNoZSBub24gcmljb3JzaXZhXHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNDYWNoZVJlZmVyZW5jZS5wdXNoKGl0bSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gRWxpbWlubyBnbGkgb2dnZXR0aSB2ZWNjaGkgXHJcbiAgICAgICAgICAgIC8vIDEpIFJpY2VyY2EgaW50ZXJtZWRpYSwgc3RhdG8gc2FsdmF0byAtIEVsaW1pbm8gdHV0dGkgZ2xpIGl0ZW0gZSB0dXR0aSBpIGdydXBwaSBsYSBjdWkgcm91dGUgw6ggcGnDuSBsdW5nYSBkZWxsYSBjb3JyZW50ZSwgdHV0dGkgZ2xpIGl0ZW0gcmVsYXRpdmkgYWxsYSBwYXRoIGNvcnJlbnRlLCBlIHR1dHRlXHJcbiAgICAgICAgICAgIC8vICAgIGxlIGNhY2hlIGRpIHJpY2VyY2EgZWZmZXR0dWF0ZSBzdSB1bmEgcGF0aCBwacO5IHByb2ZvbmRhIGRlbGwnYXR0dWFsZVxyXG4gICAgICAgICAgICAvLyAyKSBSaWNlcmNhIGZpbmFsZSBvIHJpY2VyY2EgaW50ZXJtZWRpYSBzZW56YSBzdGF0byBzYWx2YXRvIC0gRWxpbWlubyB0dXR0aSBnbGkgaXRlbSByZWxhdGl2aSBhbGxhIHBhdGggY29ycmVudGVcclxuICAgICAgICAgICAgLy8gUGVyIFwic3RhdG8gc2FsdmF0b1wiIHNpIGludGVuZG9ubyByaWNlcmNoZSB2ZWNjaGllIHNhbHZhdGUgcGVyIHBvdGVyIGVzc2VyZSByaWVmZmV0dHVhdGUgaW4gY2FzbyBkaSBvcmRpbmFtZW50aSBzdSBjb2xvbm5lIGRpIGludGVyZXNzZSBcclxuICAgICAgICAgICAgaWYgKGludGVybWVkaWF0ZUdyb3VwICYmIHZpZXcuc2F2ZWRzdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lc3QuYm91bmRTb3VyY2UgPSB0aGlzLmVzdC5ib3VuZFNvdXJjZS5maWx0ZXIodCA9PiAhKHQuX2l0ZW0gfHwgdC5fdGhpc1JvdXRlLmxlbmd0aCA+IGdyb3VwUm91dGUubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVzdC5ncm91cFNlYXJjaFJlcXVlc3RzQ2FjaGUgPSB0aGlzLmVzdC5ncm91cFNlYXJjaFJlcXVlc3RzQ2FjaGUuZmlsdGVyKHQgPT4gISh0LnJvdXRlLmxlbmd0aCA+IGdyb3VwUm91dGUubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXN0LmJvdW5kU291cmNlID0gdGhpcy5lc3QuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gISh0Ll9wYXJlbnQgPT0gZ3JvdXBLZXkpKTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0aGlzR3JvdXAgPSB0aGlzLmVzdC5ib3VuZFNvdXJjZVtpbnNlcnRJbmRleF07XHJcbiAgICAgICAgICAgIGlmIChpbnRlcm1lZGlhdGVHcm91cClcclxuICAgICAgICAgICAgICAgIHRoaXNHcm91cC5fZ3JvdXBzY291bnQgPSAoPEFwcFNlYXJjaDxhbnk+PnRoaXMuZXN0LlZpZXcpPy5ncm91cGNvdW50O1xyXG5cclxuICAgICAgICAgICAgLy8gTGkgc29zdGl0dWlzY28gY29pIG51b3ZpIGRpIHF1ZXN0YSByaWNlcmNhXHJcbiAgICAgICAgICAgIHRoaXMuZXN0LmJvdW5kU291cmNlLnNwbGljZShpbnNlcnRJbmRleCArIDEsIDAsIC4uLnRoaXMuZXN0LlRNUEJvdW5kU291cmNlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEFnZ2l1bmdvIHVuIHNlcGFyYXRvcmUgYWxsYSBmaW5lIG8gYWxsJ2luaXppbyBkaSBxdWVzdGkgZ3J1cHBpIGNoZSBkb3Zyw6Agb2NjdXBhcnNpIGRpIGNhcmljYXJlIEFMVFJJIGdydXBwaSBvIG9nZ2V0dGkgKHNlIHNvbm8gYWxsJ3VsdGltbyBncnVwcG8pXHJcbiAgICAgICAgICAgIGxldCBhZGRMYXN0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZXN0LmJvdW5kU291cmNlLnNwbGljZShpbnNlcnRJbmRleCArIDEgKyAoYWRkTGFzdCA/IHRoaXMuZXN0LlRNUEJvdW5kU291cmNlLmxlbmd0aCA6IDApLCAwLCB0aGlzLmdldEdyb3VwU2VwYXJhdG9yKHZpZXcsIGdyb3VwS2V5LCBncm91cFJvdXRlLCB2aWV3LnJlcXVlc3RlZGdyb3Vwcy5sZW5ndGgsIGludGVybWVkaWF0ZUdyb3VwID8gJ2dyb3VwcycgOiAnaXRlbXMnKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBBZ2dpdW5nbyBsYSByaWNlcmNhIGFsbGEgY2FjaGUgZGkgcXVlc3RhIFwic2Vzc2lvbmVcIlxyXG4gICAgICAgICAgICBsZXQgdG9BZGQgPSB7IHBhdGg6IGdyb3VwS2V5LCByb3V0ZTogZ3JvdXBSb3V0ZSwgdmlldzogT2JqZWN0LmFzc2lnbih7fSwgdmlldyksIGdyb3VwX2NvbHVtbjogaW50ZXJtZWRpYXRlR3JvdXAgPyAoPEdyb3VwPnRoaXMuZXN0LlRNUEJvdW5kU291cmNlWzBdKS5jb2x1bW4gOiAnJyB9O1xyXG4gICAgICAgICAgICBsZXQgcHJldiA9IHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZS5maW5kSW5kZXgodCA9PiB0LnBhdGggPT0gdG9BZGQucGF0aCAmJiB0Lmdyb3VwX2NvbHVtbiA9PSB0b0FkZC5ncm91cF9jb2x1bW4pO1xyXG4gICAgICAgICAgICBpZiAocHJldiA9PSAtMSlcclxuICAgICAgICAgICAgICAgIHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZS5wdXNoKHRvQWRkKTtcclxuXHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZS5zcGxpY2UocHJldiwgMSwgdG9BZGQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlIGluIG1vZGFsaXTDoCBhcnJheSBhcHBsaWNhIGkgcmFnZ3J1cHBhbWVudGkgZGVmaW5pdGkgbGF0byByb3ctZ3JvdXBpbmdcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3RoczogRXNUaFtdIHwgRXNUaERpcmVjdGl2ZVtdfSB0aHMgSGVhZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcnJheU1vZGVSZXZpZXdHcm91cGluZ3ModGhzOiBFc1RoW10gfCBFc1RoRGlyZWN0aXZlW10pIHtcclxuICAgICAgICBpZiAodGhzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnV0aWxpdGllcy5pc0VzVGgodGhzWzBdKSlcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgaGVhZGVyR3JvdXBzOiBHcm91cFtdID0gW107XHJcbiAgICAgICAgbGV0IGhlYWRlckFnZ3JlZ2F0aW9uczogR3JvdXBPckFnZ3JlZ2F0aW9uW10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldIGFzIEVzVGhEaXJlY3RpdmU7XHJcblxyXG4gICAgICAgICAgICBpZiAodGgudGhHcm91cClcclxuICAgICAgICAgICAgICAgIGhlYWRlckdyb3Vwcy5wdXNoKG5ldyBHcm91cCh0aC50aCwgMCwgXCJcIikpO1xyXG4gICAgICAgICAgICBlbHNlIGlmICh0aC50aEFnZ3JlZ2F0aW9uKVxyXG4gICAgICAgICAgICAgICAgaGVhZGVyQWdncmVnYXRpb25zID0gWy4uLmhlYWRlckFnZ3JlZ2F0aW9ucywgLi4udGhpcy5nZXRHcm91cEFnZ3JlZ2F0aW9ucyh0aCldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGhlYWRlckdyb3Vwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIFB1bGl6aWEgZGVsbGUgY2FjaGVcclxuICAgICAgICAgICAgdGhpcy5yZ0dyb3VwQ2FjaGUuY2xlYXIoKTtcclxuICAgICAgICAgICAgdGhpcy5yZ0l0ZW1DYWNoZS5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLnJnQ2hpbGRHcm91cHNDYWNoZS5jbGVhcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lc3QuQXJyYXlHcm91cGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZXN0LmJvdW5kU291cmNlID0gdGhpcy5nZXRHcm91cHNSZWN1cnNpdmUoaGVhZGVyR3JvdXBzLCAwLCB0aGlzLmVzdC5ib3VuZFNvdXJjZSwgaGVhZGVyQWdncmVnYXRpb25zLCBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRhIHVuYSBkaXJldHRpdmEgRXNUaCByZXN0aXR1aXNjZSBsYSBsaXN0YSBkZWxsZSBhZ2dyZWdhemlvbmkgcmljaGllc3RhIHBlciBxdWVzdGEgY29sb25uYSBvIGlsIGdydXBwbyBjaGUgcmFwcHJlc2VudGFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VzVGhEaXJlY3RpdmV9IHRoIERpcmV0dGl2YVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtHcm91cE9yQWdncmVnYXRpb25bXX0gTGlzdGEgZGVpIGdydXBwaSBvIGFnZ3JlZ2F6aW9uaSByZWxhdGl2aSBhbGxhIERpcmV0dGl2YSBwYXNzYXRhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRHcm91cEFnZ3JlZ2F0aW9ucyh0aDogRXNUaERpcmVjdGl2ZSk6IEdyb3VwT3JBZ2dyZWdhdGlvbltdIHtcclxuICAgICAgICBsZXQgcmV0ID0gW107XHJcbiAgICAgICAgLy8gRXM6ICd7bWluOmRkL01NL3l5eXl9IC0ge21heDpkZC9NTS95eXl5fSdcclxuICAgICAgICBpZiAodGgudGhBZ2dyZWdhdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLmdldEVzVGhEaXJlY3RpdmVMaXN0T2ZBZ2dyZWdhdGlvbnModGgpLmZvckVhY2goKGFnZzogVGhBZ2dyZWdhdGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGlzZGF0ZSA9IGFnZy5mb3JtYXQgJiYgWydzbWFsbCcsICdsb25nJywgJ3Zlcnlsb25nJ10uaW5jbHVkZXMoYWdnLmZvcm1hdCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNudW1iZXIgPSBhZ2cuZm9ybWF0ICYmIGFnZy5mb3JtYXQuc3RhcnRzV2l0aChcIkZcIikgJiYgIU51bWJlci5pc05hTihhZ2cuZm9ybWF0LmNoYXJBdCgxKSkgJiYgYWdnLmZvcm1hdC5sZW5ndGggPT0gMjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWlzZGF0ZSAmJiAhaXNudW1iZXIgJiYgYWdnLmZvcm1hdClcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBcIkxlIGFnZ2VyZ2F6aW9uaSBzdXBwb3J0YXRlIGRhbGwnZXMtdGFibGUgc29ubyBzb2xvICdzbWFsbCcsICdsb25nJywgJ3Zlcnlsb25nJyBwZXIgbGUgZGF0ZSBlICdGMC05JyBwZXIgaSBudW1lcmlcIjtcclxuXHJcbiAgICAgICAgICAgICAgICByZXQucHVzaChuZXcgR3JvdXBPckFnZ3JlZ2F0aW9uKHRoLnRoLCBhZ2cuZnVuYywgaXNkYXRlID8gJ2RhdGUnIDogaXNudW1iZXIgPyAnbnVtYmVyJyA6ICdzdHJpbmcnKSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0aC50aEdyb3VwKVxyXG4gICAgICAgICAgICByZXQucHVzaChuZXcgR3JvdXBPckFnZ3JlZ2F0aW9uKHRoLnRoLCBudWxsKSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBEYXRhIHVuYSBkaXJldHRpdmEgY29uIHVuIGZvcm1hdG8gcmVzdGl0dWlzY2UgdHV0dGUgbGUgY29wcGllIEZ1bnppb25lIGRpIEFnZ3JlZ2F6aW9uZSAtIEZvcm1hdG9cclxuICAgICpcclxuICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlfSB0aCBEaXJldHRpdmEgRXNUaCBkaSBjdWkgY2FsY29sYXJlIGxlIGZ1bnppb25pIGRpIGFnZ3JlZ2F6aW9uZSB1c2F0ZVxyXG4gICAgKlxyXG4gICAgKiBAcmV0dXJucyB7eyBmdW5jOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nIH1bXX0gTGlzdGEgZGVsbGUgZnVuemlvbmkgZGkgYWdncmVnYXppb25lIHJpbGV2YXRlXHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRFc1RoRGlyZWN0aXZlTGlzdE9mQWdncmVnYXRpb25zKHRoOiBFc1RoRGlyZWN0aXZlKTogVGhBZ2dyZWdhdGlvbltdIHtcclxuICAgICAgICBpZiAoIXRoLnRoQWdncmVnYXRpb24pXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuXHJcbiAgICAgICAgLy8gU2UgaG8gZ2nDoCBlZmZldHR1YXRvIHF1ZXN0byBjYWxjb2xvIHBlciBxdWVzdG8gdGggcmVzdGl0dWlzY28gbGEgdmVyc2lvbmUgaW4gY2FjaGVcclxuICAgICAgICBpZiAodGguX3RoQWdncmVnYXRpb25zKVxyXG4gICAgICAgICAgICByZXR1cm4gdGguX3RoQWdncmVnYXRpb25zO1xyXG5cclxuICAgICAgICBsZXQgcmV0ID0gW107XHJcbiAgICAgICAgbGV0IGRpc3BsYXkgPSB0aC50aEFnZ3JlZ2F0aW9uO1xyXG4gICAgICAgIHZhciBtYXRjaGVzID0gZGlzcGxheS5tYXRjaCgve1thLXpBLVowLTlcXC86XSp9L2dpKTtcclxuICAgICAgICBpZiAoIW1hdGNoZXMpXHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICBtYXRjaGVzLmZvckVhY2gobSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzcGxpdCA9IG0uc3BsaXQoXCI6XCIpO1xyXG4gICAgICAgICAgICBsZXQgZnVuYyA9IG0sIGZvcm1hdCA9IFwiXCI7XHJcbiAgICAgICAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBFc2NsdWRvIHByaW1vIGUgdWx0aW1vIGNhcmF0dGVyZSAobGUgZ3JhZmZlKVxyXG4gICAgICAgICAgICAgICAgZnVuYyA9IHNwbGl0WzBdLnN1YnN0cigxKTtcclxuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHNwbGl0WzFdLnN1YnN0cigwLCBzcGxpdFsxXS5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0LnB1c2goeyBmdW5jOiA8J21pbicgfCAnbWF4JyB8ICdzdW0nPmZ1bmMsIGZvcm1hdDogZm9ybWF0LCBtYXRjaDogbSB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGguX3RoQWdncmVnYXRpb25zID0gcmV0O1xyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRhIGxhIGRlZmluaXppb25lIGRlaSBncnVwcGkgZGEgZ2VuZXJhcmUgZGEgdW5hIGxpc3RhIGRpIG9nZ2V0dGksIHN1ZGRpdmlkZSBnbGkgb2dnZXR0aSBwYXNzYXRpIGluIGdydXBwaSBlIHNvdHRvZ3J1cHBpXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtHcm91cFtdfSBncnBzIERlZmluaXppb25lIGRlaSBncnVwcGlcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50SW5kZXggSW5kaWNlIGRpIGVsYWJvcmF6aW9uZS4gQWwgbGl2ZWxsbyAwIGhvIHR1dHRpIGdsaSBvZ2dldHRpIGUgZGV2byBnZW5lcmFyZSBpIHByaW1pIGdydXBwaSwgYSBsaXZlbGxvIDEgaG8gdHV0dGkgaSBncnVwcGkgcHJpbmNpcGFsaSBlIGRldm9cclxuICAgICAqIGVsYWJvcmFyZSBpIHNvdHRvZ3J1cHBpLCBlIGNvc8OsIHZpYSByaWNvcnNpdmFtZW50ZS4uLlxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkYSByYWdncnVwcGFyZVxyXG4gICAgICogQHBhcmFtIHtHcm91cE9yQWdncmVnYXRpb25bXX0gYWdncmVnYXRpb25zIEluZm8gZGkgYWdncmVnYXppb25lXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gcGFyZW50IFJpZmVyaW1lbnRvIGFsIGdydXBwbyBwYWRyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEdyb3Vwc1JlY3Vyc2l2ZShncnBzOiBHcm91cFtdLCBjdXJyZW50SW5kZXg6IG51bWJlciwgaXRlbXM6IGFueVtdLCBhZ2dyZWdhdGlvbnM6IEdyb3VwT3JBZ2dyZWdhdGlvbltdLCBwYXJlbnQ/OiBhbnkpOiBhbnlbXSB7XHJcbiAgICAgICAgLy8gU2UgbCdpbmRpY2Ugw6ggMCBkZXZvIHNpY3VyYW1lbnRlIG5hc2NvbmRlcmUgdHV0dGkgZ2xpIG9nZ2V0dGkuIFNvbG8gaSBncnVwcGkgc2FyYW5ubyB2aXN1YWxpenphdGlcclxuICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IDApXHJcbiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goaSA9PiBpLl92aXNpYmxlID0gZmFsc2UpO1xyXG5cclxuICAgICAgICBsZXQgZ3JwID0gZ3Jwc1tjdXJyZW50SW5kZXhdO1xyXG4gICAgICAgIGxldCByZXQ6IGFueVtdID0gW107XHJcbiAgICAgICAgbGV0IGxhc3QgPSBncnBzLmxlbmd0aCA9PSBjdXJyZW50SW5kZXggKyAxO1xyXG4gICAgICAgIGxldCBncm91cHMgPSB0aGlzLnV0aWxpdGllcy5ncm91cEJ5KGl0ZW1zLCBncnAuY29sdW1uKTtcclxuICAgICAgICBmb3IgKGxldCBwcm9wIGluIGdyb3Vwcykge1xyXG4gICAgICAgICAgICBsZXQgaXRtcyA9IGdyb3Vwc1twcm9wXTtcclxuICAgICAgICAgICAgbGV0IGdwID0gbmV3IEdyb3VwKGdycC5jb2x1bW4sIGl0bXMubGVuZ3RoLCBwcm9wKTtcclxuICAgICAgICAgICAgZ3AuYWdncmVnYXRpb25zID0gdGhpcy5nZW5lcmF0ZUFnZ3JlZ2F0aW9ucyhpdG1zLCBhZ2dyZWdhdGlvbnMpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGFueWdwID0gKDxhbnk+Z3ApO1xyXG4gICAgICAgICAgICBhbnlncC5fZ3JvdXAgPSB0cnVlO1xyXG4gICAgICAgICAgICBhbnlncC5fZXhwYW5kZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgIGFueWdwLl90aGlzUm91dGUgPSBbeyBjb2x1bW46IGdwLmNvbHVtbiwgdmFsdWU6IGdwLnZhbHVlIH1dO1xyXG4gICAgICAgICAgICAgICAgYW55Z3AuX3RoaXNLZXkgPSBncC52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGFueWdwLl9ncm91cGxldmVsID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFueWdwLl9wYXJlbnQgPSBwYXJlbnQuX3RoaXNLZXk7XHJcbiAgICAgICAgICAgICAgICBhbnlncC5fcGFyZW50Um91dGUgPSBwYXJlbnQuX3RoaXNSb3V0ZTtcclxuICAgICAgICAgICAgICAgIGFueWdwLl90aGlzUm91dGUgPSBbLi4ucGFyZW50Ll90aGlzUm91dGUsIHsgY29sdW1uOiBncC5jb2x1bW4sIHZhbHVlOiBncC52YWx1ZSB9XTtcclxuICAgICAgICAgICAgICAgIGFueWdwLl90aGlzS2V5ID0gcGFyZW50Ll90aGlzS2V5ICsgZ3AudmFsdWU7XHJcbiAgICAgICAgICAgICAgICBhbnlncC5fZ3JvdXBsZXZlbCA9IHBhcmVudC5fZ3JvdXBsZXZlbCArIDE7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFB1c2hvIGlsIGdydXBwbywgdHV0dGkgaSBncnVwcGkgZGVsIGxpdmVsbG8gc290dG8sIG8gZ2xpIGl0ZW0gc2UgaW8gc29ubyBsJ3VsdGltbyBncnVwcG8uIFxyXG4gICAgICAgICAgICAvLyBMYSB2aXNpYmlsaXTDoCDDqCBzb2xvIHBlciBpbCBncnVwcG8gYSBsaXZlbGxvIDAsIHR1dHRpIGdsaSBhbHRyaSBncnVwcGkgc2FyYW5ubyBtb3N0cmF0aSBvIG5hc2Nvc3RpIGRpIGNvbnNlZ3VlbnphXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT0gMClcclxuICAgICAgICAgICAgICAgIGFueWdwLl92aXNpYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXRpbGl0aWVzLmNhbGN1bGF0ZUhhc2goW2FueWdwXSk7XHJcbiAgICAgICAgICAgIHRoaXMudXRpbGl0aWVzLmNhY2hlQWdncmVnYXRpb25zKGFueWdwKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEFnZ2l1bmdvIGlsIGdydXBwbyBwYWRyZVxyXG4gICAgICAgICAgICByZXQucHVzaChhbnlncCk7XHJcbiAgICAgICAgICAgIHRoaXMucmdHcm91cENhY2hlLnNldChhbnlncC5fdGhpc0tleSwgYW55Z3ApO1xyXG4gICAgICAgICAgICBpZiAoIWxhc3QpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAvL0RhbCBncnVwcG8gcGFkcmUsIHNlIG5vbiDDqCBsJ3VsdGltbyBncnVwcG8gZGVsbGEgY2F0ZW5hLCBjYWxjb2xvIHJpY29yc2l2YW1lbnRlIHR1dHRhIGxhIGNhdGVuYSBzb3R0b1xyXG4gICAgICAgICAgICAgICAgbGV0IHN1Ykdyb3Vwc0FuZEl0ZW1zID0gdGhpcy5nZXRHcm91cHNSZWN1cnNpdmUoZ3JwcywgY3VycmVudEluZGV4ICsgMSwgaXRtcywgYWdncmVnYXRpb25zLCBhbnlncCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRncm91cHMgPSBzdWJHcm91cHNBbmRJdGVtcy5maWx0ZXIodCA9PiB0Ll9ncm91cCAmJiB0Ll9wYXJlbnQgPT0gYW55Z3AuX3RoaXNLZXkpO1xyXG4gICAgICAgICAgICAgICAgYW55Z3AuX2dyb3Vwc2NvdW50ID0gY2hpbGRncm91cHMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEFnZ2l1bmdvIGxhIGNhdGVuYSBkZWwgZ3J1cHBvIHNvdHRvLCBhZ2dpdW5nZW5kbyBhbGxhIGNhY2hlIHNvbG8gaSBncnVwcGkgcGFkcmVcclxuICAgICAgICAgICAgICAgIHJldC5wdXNoKC4uLnN1Ykdyb3Vwc0FuZEl0ZW1zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmdDaGlsZEdyb3Vwc0NhY2hlLnNldChhbnlncC5fdGhpc0tleSwgY2hpbGRncm91cHMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQWwgZ3J1cHBvIHBhZHJlLCBzZSDDqCBsJ3VsdGltbyBhc3NlZ25vIHR1dHRlIGxlIGZvZ2xpZSBhc3NlZ25hbmRvZ2xpIGFuY2hlIGxhIGNoaWF2ZSBkZWwgZ3J1cHBvXHJcbiAgICAgICAgICAgICAgICBpdG1zLmZvckVhY2goaSA9PiBpLl90aGlzS2V5ID0gYW55Z3AuX3RoaXNLZXkpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldC5wdXNoKC4uLml0bXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZ0l0ZW1DYWNoZS5zZXQoYW55Z3AuX3RoaXNLZXksIGl0bXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRhIHVuYSBsaXN0YSBkaSBvZ2dldHRpIGdlbmVyYSBsZSBhZ2dyZWdhemlvbmkgc3BlY2lmaWNhdGUuIFNpIGNvbnNpZGVyYSBkaSBhdmVyZSB0dXR0aSBnbGkgb2dnZXR0aVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55W119IGl0ZW1zIE9nZ2V0dGkgZGkgY3VpIGNhbGNvbGFyZSBsZSBhZ2dyZWdhemlvbmVcclxuICAgICAqIEBwYXJhbSB7R3JvdXBPckFnZ3JlZ2F0aW9uW119IGFnZ3JlZ2F0aW9ucyBBZ2dlcmdhemlvbmkgZGEgZ2VuZXJhcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZUFnZ3JlZ2F0aW9ucyhpdGVtczogYW55W10sIGFnZ3JlZ2F0aW9uczogR3JvdXBPckFnZ3JlZ2F0aW9uW10pOiBHcm91cEFnZ3JlZ2F0aW9uW10ge1xyXG4gICAgICAgIGxldCByZXRzOiBHcm91cEFnZ3JlZ2F0aW9uW10gPSBbXTtcclxuICAgICAgICBsZXQgYWdncmVnYXRpb25WYWx1ZSA9IFwiXCIsIGZlRmllbGQgPSBudWxsLCBzdHJpbmdBZ2cgPSBudWxsLCBkYXRlQWdnID0gbnVsbCwgbnVtYmVyQWdnID0gbnVsbDtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZ2dyZWdhdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGFnZyA9IGFnZ3JlZ2F0aW9uc1tpXTtcclxuICAgICAgICAgICAgZmVGaWVsZCA9IGFnZy5jb2x1bW47XHJcbiAgICAgICAgICAgIGlmICghZmVGaWVsZClcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChhZ2cuZGF0YXR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6IHN0cmluZ0FnZyA9IGl0ZW1zLm1hcChpID0+IGlbZmVGaWVsZF0udG9TdHJpbmcoKSk7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnZGF0ZSc6IGRhdGVBZ2cgPSBpdGVtcy5tYXAoaSA9PiBuZXcgRGF0ZShpW2ZlRmllbGRdKS5nZXRUaW1lKCkpOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6IG51bWJlckFnZyA9IGl0ZW1zLm1hcChpID0+IHBhcnNlRmxvYXQoaVtmZUZpZWxkXSkpOyBicmVhaztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc3dpdGNoIChhZ2cuYWdncmVnYXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ21heCc6XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhZ2cuZGF0YXR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzogYWdncmVnYXRpb25WYWx1ZSA9IHN0cmluZ0FnZy5zb3J0KCkucmV2ZXJzZSgpWzBdOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGF0ZSc6IGFnZ3JlZ2F0aW9uVmFsdWUgPSBuZXcgRGF0ZShNYXRoLm1heCguLi5kYXRlQWdnKSkudG9TdHJpbmcoKTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6IGFnZ3JlZ2F0aW9uVmFsdWUgPSBNYXRoLm1heCguLi5udW1iZXJBZ2cpLnRvU3RyaW5nKCk7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ21pbic6XHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhZ2cuZGF0YXR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzogYWdncmVnYXRpb25WYWx1ZSA9IHN0cmluZ0FnZy5zb3J0KClbMF07IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkYXRlJzogYWdncmVnYXRpb25WYWx1ZSA9IG5ldyBEYXRlKE1hdGgubWluKC4uLmRhdGVBZ2cpKS50b1N0cmluZygpOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzogYWdncmVnYXRpb25WYWx1ZSA9IE1hdGgubWluKC4uLm51bWJlckFnZykudG9TdHJpbmcoKTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnc3VtJzpcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFnZy5kYXRhdHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOiBhZ2dyZWdhdGlvblZhbHVlID0gc3RyaW5nQWdnLmpvaW4oXCIsIFwiKTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGUnOiBhZ2dyZWdhdGlvblZhbHVlID0gXCJcIjsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6IGFnZ3JlZ2F0aW9uVmFsdWUgPSBudW1iZXJBZ2cucmVkdWNlKChwcmUsIGN1cnIpID0+IHByZSArIGN1cnIsIDApLnRvU3RyaW5nKCk7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXRzLnB1c2gobmV3IEdyb3VwQWdncmVnYXRpb24oYWdnLmNvbHVtbiwgYWdnLmFnZ3JlZ2F0aW9uLCBhZ2dyZWdhdGlvblZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmV0cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogT3R0aWVuZSB1biBlbGVtZW50byBkaSBzZXBhcmF6aW9uZSBmcmEgR3J1cHBpIGNoZSBzZXJ2ZSBwZXIgcGFnaW5hcmUgbGUgcmljZXJjaGUgYWxsJ2ludGVybm8gZGkgb2duaSBzaW5nb2xvIGdydXBwb1xyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge0FwcFNlYXJjaDxhbnk+fSB2aWV3IFZpZXcgdXRpbGl6emF0YSBwZXIgbGEgcmljZXJjYS4gTWUgbmUgc2Fsdm8gaSBwYXJhbWV0cmkgbmVsIHNlcGFyYXRvcmUgYXR0dWFsZSBkYXRvIGNoZSBuZSBobyBiaXNvZ25vIHBlciBjYXJpY2FyZSBhbHRyaSBlbGVtZW50aVxyXG4gICAgKiBmYWNlbnRpIHJpZmVyaW1lbnRvIGFsbG8gc3Rlc3NvIGNvbnRlc3RvXHJcbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnQgUGFyZW50IHBhdGggY2hlIHJhcHByZXNlbnRhIGEgcXVhbGUgZ3J1cHBvIMOoIGFmZmliYmlhdG8gcXVlc3RvIHNlcGFyYXRvcmVcclxuICAgICogQHBhcmFtIHtHcm91cFJvdXRlRnJhZ21lbnRbXX0gcm91dGUgUm91dGUgcGF0aCBjaGUgcmFwcHJlc2VudGEgYSBxdWFsZSBncnVwcG8gw6ggYWZmaWJiaWF0byBxdWVzdG8gc2VwYXJhdG9yZVxyXG4gICAgKiBAcGFyYW0ge251bWJlcn0gbGV2ZWwgTGl2ZWxsbyBkZWwgZ3J1cHBvIGRpIGN1aSBxdWVzdG8gZWxlbWVudG8gw6ggc2VwYXJhdG9yZSwgdmllbmUgdXNhdG8gcGVyIGFwcGxpY2FyZSBsYSBjbGFzc2UgXCJlc3QtbHZsLXt7bGV2ZWx9fVwiXHJcbiAgICAqXHJcbiAgICAqIEByZXR1cm5zIHthbnl9IEVsZW1lbnRvIGRpIHNlcGFyYXppb25lIGNvbnRlbmVudGUgdHV0dGkgaSBiaW5kIHBlciBwcmVzZW50YXJlIHVuYSBwYWdpbmF6aW9uZSBzb3R0byBxdWVzdG8gZ3J1cHBvIGxhdG8gaW50ZXJmYWNjaWFcclxuICAgICovXHJcbiAgICBwdWJsaWMgZ2V0R3JvdXBTZXBhcmF0b3IodmlldzogQXBwU2VhcmNoPGFueT4sIHBhcmVudDogc3RyaW5nLCByb3V0ZTogR3JvdXBSb3V0ZUZyYWdtZW50W10sIGxldmVsOiBudW1iZXIsIHNlYXJjaGVzOiAnZ3JvdXBzJyB8ICdpdGVtcycpOiBHcm91cFBhZ2VyIHtcclxuICAgICAgICBsZXQgaXRlbSA9IG5ldyBHcm91cFBhZ2VyKGxldmVsLCByb3V0ZSwgcGFyZW50LCBPYmplY3QuYXNzaWduKHt9LCB2aWV3KSwgc2VhcmNoZXMpO1xyXG4gICAgICAgIGl0ZW0uYnV0dG9ucyA9IHRoaXMudXRpbGl0aWVzLmdldFBhZ2VzQXJyYXkoNiwgdmlldy5wYWdlLCB2aWV3LnBhZ2VzKTtcclxuICAgICAgICB0aGlzLnV0aWxpdGllcy5jYWxjdWxhdGVIYXNoKFtpdGVtXSk7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0YSB1bmEgY29sb25uYSBlZmZldHR1YSBsYSByaWVtaXNzaW9uZSBkaSB0dXR0ZSBsZSByaWNlcmNoZSByZWxhdGl2ZS5cclxuICAgICAqXHJcbiAgICAgKiBFcy4gSG8gMiBjYW1waSBkaSBncnVwcG8gZSBobyBlc3BhbnNvIGZpbm8gYSB2ZWRlcmUgaSB2YWxvcmkgZmlubyBhZCB1biBsaXZlbGxvIHF1YWxzaWFzaS5cclxuICAgICAqIENsaWNjbyBsJ29yZGluYW1lbnRvIHN1bCBzZWNvbmRvIGdydXBwby5cclxuICAgICAqIFR1dHRlIGxlIHJpY2VyY2hlIHJlbGF0aXZlIGFpIHByaW1pIGdydXBwaSBkZXZvbm8gZXNzZXJlIHJpZXNlZ3VpdGUuIFF1YW5kbyBpIHJpc3VsdGF0aSBhcnJpdmVyYW5ubyBjaSBwZW5zZXLDoCBpbCBtZXRvZG8gKipiaW5kRGlzcGxheVRvTG9hZGVkSXRlbXNPckdyb3VwcyoqXHJcbiAgICAgKiBhIHRhZ2xpYXJlIHZpYSBnbGkgb2dnZXR0aSBub24gcGnDuSB2aXN1YWxpenphdGlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sdW1uIENvbG9ubmEgc3UgY3VpIHNpIMOoIGVmZmV0dHVhdGEgdW4nb3BlcmF6aW9uZSBkaSBvcmRpbmFtZW50b1xyXG4gICAgICogQHBhcmFtIHtBcHBPcmRlcmluZ1tdfSBvcmRlcmluZ3MgRGlyZXR0aXZlIGRpIG9yZGluYW1lbnRvIGRhIGFwcGxpY2FyZSBhbGxlIHZhcmllIHNvdHRvcmljZXJjaGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGVtaXRSb3dHcm91cGluZ1NlYXJjaGVzKGNvbHVtbjogc3RyaW5nLCBvcmRlcmluZ3M6IEFwcE9yZGVyaW5nW10pIHtcclxuICAgICAgICAvLyBQZXIgdHV0dGUgbGUgcmljZXJjaGUgaW50ZXJtZWRpZSBjaGUgZGV2byByaXZhbHV0YXJlIGxlIHJlLWVtaXR0byBpbiBtb2RvIGRhIGFnZ2lvcm5hcmdsaSBpIGRhdGlcclxuICAgICAgICB2YXIgbWVhbmluZ2Z1bEFwcFNlYXJjaGVzID0gdGhpcy5lc3QuZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlLmZpbHRlcih0ID0+IHQuZ3JvdXBfY29sdW1uID09IGNvbHVtbikubWFwKHQgPT4gdC52aWV3KTtcclxuXHJcbiAgICAgICAgLy8gU2Ugbm9uIG5lIHRyb3ZvIHNpZ25pZmljYSBjaGUgaG8gZmF0dG8gbCdvcmRpbmFtZW50byBvIHN1Z2xpIGl0ZW0sIG8gc3UgY29sb25uZSByZWxhdGl2ZSBhIHVuIHNvdHRvZ3J1cHBvIG5vbiBjYXJpY2F0b1xyXG4gICAgICAgIGlmICghbWVhbmluZ2Z1bEFwcFNlYXJjaGVzIHx8IG1lYW5pbmdmdWxBcHBTZWFyY2hlcy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgbWVhbmluZ2Z1bEFwcFNlYXJjaGVzID0gdGhpcy5lc3QuZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlLmZpbHRlcih0ID0+ICF0Lmdyb3VwX2NvbHVtbikubWFwKHQgPT4gdC52aWV3KTtcclxuXHJcbiAgICAgICAgLy8gU2Ugbm9uIG5lIHRyb3ZvIHF1aSBzaWduaWZpY2EgY2hlIHN0byBvcmRpbmFuZG8gc3UgY29sb25uZSByZWxhdGl2ZSBhIHVuIHNvdHRvZ3J1cHBvIG5vbiBjYXJpY2F0b1xyXG4gICAgICAgIGlmICghbWVhbmluZ2Z1bEFwcFNlYXJjaGVzIHx8IG1lYW5pbmdmdWxBcHBTZWFyY2hlcy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBtZWFuaW5nZnVsQXBwU2VhcmNoZXMuZm9yRWFjaChhcyA9PiB7XHJcbiAgICAgICAgICAgIC8vIE92dmlhbWVudGUgZ2xpIG9yaWRuYW1lbnRpIGRldm9ubyBlc3NlcmUgcXVlbGxpIGFwcGVuYSBnZW5lcmF0aVxyXG4gICAgICAgICAgICBhcy5vcmRlcnMgPSBvcmRlcmluZ3M7XHJcbiAgICAgICAgICAgIGFzLnNhdmVkc3RhdGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmVzdC5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSwgYXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGNoZSBjYWxjb2xhIGlsIGNvbnRlbnV0byBkaSB1bmEgY2VsbGEgcmVsYXRpdmEgYSB1biBncnVwcG8gcmlnYSwgdGVuZW5kbyBjb250byBkZWwgZm9ybWF0byBkZWxsZSBldmVudHVhbGkgYWdncmVnYXppb25pXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtHcm91cH0gZ3JwIEdydXBwbyBkaSBjdWkgbW9zdHJhcmUgbGUgY2VsbGVcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjZWxsIENlbGxhIGF0dHVhbGUgZGkgY3VpIGNhbGNvbGFyZSBpbCB0ZXN0b1xyXG4gICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlfSBoZWFkZXIgSGVhZGVyIHJlbGF0aXZvIGFsbGEgY2VsbGEgYXR0dWFsZSwgdXRpbGl6emF0YSBwZXIgaWRlbnRpZmljYXJlIGxlIGluZm9ybWF6aW9uaSBkaSBhZ2dyZWdhemlvbmVcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUZXN0byBmaW5hbGUgY2FsY29sYXRvIHBlciBsYSAqKmNlbGwqKiBjb3JyZW50ZSwgaW4gYmFzZSBhbGxlIGFnZ3JlZ2F6aW9uaSBkaSAqKmhlYWRlcioqXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRHcm91cENlbGxEaXNwbGF5KGdycDogR3JvdXAsIGNlbGw6IHN0cmluZywgaGVhZGVyOiBFc1RoRGlyZWN0aXZlKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoKDxhbnk+Z3JwKS5fc2VwKVxyXG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcclxuICAgICAgICBsZXQgZGlzcGxheSA9IGhlYWRlci50aEFnZ3JlZ2F0aW9uO1xyXG4gICAgICAgIGlmIChncnAuY29sdW1uID09IGNlbGwpIHtcclxuICAgICAgICAgICAgbGV0IGdyb3Vwc1BhcnQgPSAoPGFueT5ncnApLl9ncm91cHNjb3VudCA/IFwiIC0gXCIgKyAoPGFueT5ncnApLl9ncm91cHNjb3VudCArIFwiIFwiICsgdGhpcy5lc3QubGMubG9jKFwiR3JvdXBzXCIpIDogXCJcIjtcclxuICAgICAgICAgICAgcmV0dXJuIGdycC52YWx1ZSArIFwiIChcIiArIGdycC5jb3VudCArIGdyb3Vwc1BhcnQgKyBcIilcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgYWdnID0gKDxNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+Pj4oPGFueT5ncnApLl9hZ2dyZWdhdGlvbnNDYWNoZSkuZ2V0KGNlbGwpO1xyXG4gICAgICAgICAgICBpZiAoIWFnZylcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5nZXRFc1RoRGlyZWN0aXZlTGlzdE9mQWdncmVnYXRpb25zKGhlYWRlcikuZm9yRWFjaCgoaXRtOiBUaEFnZ3JlZ2F0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBkaXNwbGF5ID0gZGlzcGxheS5yZXBsYWNlKGl0bS5tYXRjaCwgdGhpcy5mb3JtYXRBZ2dyZWdhdGlvblZhbHVlKGFnZy5nZXQoaXRtLmZ1bmMpLCBpdG0uZm9ybWF0KSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGRpc3BsYXk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuemlvbmUgY2hlIGRhdG8gdW4gdmFsb3JlIGxvIGZvcm1hdHRhIGluIGJhc2UgYWwgdGlwb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVmFsb3JlIGNoZSBnZW5lcmFsZW1udGUgcHXDsiBlc3NlcmUgdW5hIGRhdGEgbyB1biBudW1lcm9cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tYXQgRm9ybWF0byBzdSBjdWkgZm9ybWF0dGFyZSBpbCB2YWxvcmUuIFB1w7IgZXNzZXJlIGFkIGVzZW1waW8gXCJzbWFsbFwiLCBcImxvbmdcIiBcInZlcnlsb25nXCIgcGVyIGxlIGRhdGUgbyBGezAtOX0gcGVyIGkgbnVtZXJpIGRlY2ltYWxpXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFZhbG9yZSBkZWxsJ2FnZ3JlZ2F6aW9uZSBmb3JtYXR0YXRvIGNvbWUgc2kgZGV2ZVxyXG4gICAgICogXHJcbiAgICAgKiBAdG9kbyBST1dHUk9VUElOR1xyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGZvcm1hdEFnZ3JlZ2F0aW9uVmFsdWUodmFsdWU6IHN0cmluZywgZm9ybWF0Pzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoIWZvcm1hdClcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG5cclxuICAgICAgICBsZXQgaXNOdW1iZXIgPSAhTnVtYmVyLmlzTmFOKHZhbHVlKSAmJiAoIWZvcm1hdCB8fCBmb3JtYXQuc3RhcnRzV2l0aChcIkZcIikpO1xyXG5cclxuICAgICAgICBpZiAoaXNOdW1iZXIgJiYgZm9ybWF0LnN0YXJ0c1dpdGgoXCJGXCIpICYmICFOdW1iZXIuaXNOYU4oZm9ybWF0LnN1YnN0cigxKSkpXHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKS50b0ZpeGVkKHBhcnNlSW50KGZvcm1hdC5zdWJzdHIoMSkpKTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGUgPSBudWxsO1xyXG4gICAgICAgIC8vIEFsY3VuZSB2ZXJzaW9uZSBkaSBleHRlbnNpb25zIHJpc2NoaWFubyBkaSBjcmFzaGFyZSBjb24gY29zZSBub24gZGF0ZS4uLiDDqCBzdGF0byByaXNvbHRvIGRvcG8gcXVpbmRpIHF1ZXN0byB0cnkgLSBjYXRjaCBpbiByZWFsdMOgXHJcbiAgICAgICAgLy8gdG9ybmEgdXRpbGUgc29sbyBjb24gdmVyc2lvbmkgdmVjY2hpZS9kZXByZWNhdGUgZGVsbGEgbGlicmVyaWEgQGVzZmFlbnphL2V4dGVuc2lvbnNcclxuICAgICAgICB0cnkgeyBkYXRlID0gdGhpcy5kYXRlRXh0cy5nZXREYXRlQ29udmVydGlvbih2YWx1ZSk7IH0gY2F0Y2ggeyB9XHJcblxyXG4gICAgICAgIGlmIChkYXRlKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlRXh0cy5nZXRGb3JtYXR0ZWQoZGF0ZSwgZm9ybWF0ID09ICdzbWFsbCcsIGZvcm1hdCA9PSAndmVyeWxvbmcnKTtcclxuXHJcbiAgICAgICAgLy8gUXVpIGNpIGZpbmlzY28gc2lhIHBlciBpbnB1dCBjaGUgbm9uIHNvbm8gbsOpIGRhdGUgbsOpIG51bWVyaSwgc2lhIHBlciBmb3JtYXRpIG5vbiByaWNvbm9zY2l1dGlcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcbn0iXX0=
475
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm93R3JvdXBpbmdIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9jb3JlL2hhbmRsZXJzL2NsYXNzZXMvUm93R3JvdXBpbmdIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLFVBQVU7QUFDVixPQUFPLEVBQTBCLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFLckosaUVBQWlFO0FBQ2pFLE1BQU0sT0FBTyxrQkFBa0I7SUFTM0IsMEJBQTBCO0lBQzFCLFlBQW9CLEdBQXFCLEVBQVUsU0FBMkIsRUFBVSxRQUFxQjtRQUF6RixRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQVI3RyxxRkFBcUY7UUFDOUUsaUJBQVksR0FBdUIsSUFBSSxHQUFHLEVBQWlCLENBQUM7UUFDbkUsNkdBQTZHO1FBQ3RHLGdCQUFXLEdBQXVCLElBQUksR0FBRyxFQUFpQixDQUFDO1FBQ2xFLDZHQUE2RztRQUN0Ryx1QkFBa0IsR0FBeUIsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFHb0MsQ0FBQztJQUVsSDs7Ozs7Ozs7O09BU0c7SUFDSSwwQkFBMEIsQ0FBQyxJQUFvQixFQUFFLFlBQW9COztRQUN4RSx3SUFBd0k7UUFDeEksOEVBQThFO1FBQzlFLElBQUksQ0FBQyxPQUFBLElBQUksQ0FBQyxlQUFlLDBDQUFFLE1BQU0sS0FBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUM7WUFDL0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztZQUM3QyxJ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aEUsSUFBSSxJQUFJO1lBQ0osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLE9BQU8sRUFBRSxNQUFNLElBQUksVUFBVSxDQUFDLENBQUM7UUFFckYsZ0dBQWdHO1FBQ2hHLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8vIExpYnJlcmllXHJcbmltcG9ydCB7IERhdGVTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9leHRlbnNpb25zXCI7XHJcblxyXG4vLyBEaXJldHRpdmUgLyBDb21wb25lbnRpXHJcbmltcG9ydCB7IEVzVGggfSBmcm9tIFwiLi4vLi4vLi4vY29tcG9uZW50cy9lcy10aC9lc190aC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRXNUaERpcmVjdGl2ZSB9IGZyb20gXCIuLi8uLi8uLi9kaXJlY3RpdmVzL2VzX3RoLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQgeyBFc1RhYmxlQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uLy4uL2NvbXBvbmVudHMvZXMtdGFibGUvZXNfdGFibGUuY29tcG9uZW50XCJcclxuXHJcbi8vIE1vZGVsbGlcclxuaW1wb3J0IHsgQXBwT3JkZXJpbmcsIEFwcFNlYXJjaCwgR3JvdXAsIEdyb3VwQWdncmVnYXRpb24sIEdyb3VwT3JBZ2dyZWdhdGlvbiwgR3JvdXBQYWdlciwgR3JvdXBSb3V0ZUZyYWdtZW50LCBUaEFnZ3JlZ2F0aW9uIH0gZnJvbSBcIi4uLy4uLy4uL2RvbWFpblwiO1xyXG5cclxuLy8gVXRpbGl0aWVzXHJcbmltcG9ydCB7IFV0aWxpdGllc0hhbmRsZXIgfSBmcm9tIFwiLi9VdGlsaXRpZXNIYW5kbGVyXCI7XHJcblxyXG4vKiogQ2xhc3NlIGNoZSBnZXN0aXNjZSBsYSBtb2RhbGl0w6AgUm93IEdyb3VwaW5nIGRlbGwnZXMtdGFibGUgKi9cclxuZXhwb3J0IGNsYXNzIFJvd0dyb3VwaW5nSGFuZGxlciB7XHJcblxyXG4gICAgLyoqIENhY2hlIHBlciBzYWx2YXJlIHBlciBvZ25pIGNoaWF2ZSBkaSBvZ25pIGdydXBwbyBjaGkgw6ggaWwgZ3J1cHBvIHJhcHByZXNlbnRhdG8gKi9cclxuICAgIHB1YmxpYyByZ0dyb3VwQ2FjaGU6IE1hcDxzdHJpbmcsIEdyb3VwPiA9IG5ldyBNYXA8c3RyaW5nLCBHcm91cD4oKTtcclxuICAgIC8qKiBDYWNoZSBwZXIgc2FsdmFyZSBwZXIgb2duaSBjaGlhdmUgZGkgb2duaSBncnVwcG8gY2hpIHNvbm8gZ2xpIG9nZ2V0dGkgc290dG9zdGFudGksIG5vbiBkZWkgc290dG9ncnVwcGkgKi9cclxuICAgIHB1YmxpYyByZ0l0ZW1DYWNoZTogTWFwPHN0cmluZywgYW55W10+ID0gbmV3IE1hcDxzdHJpbmcsIGFueVtdPigpO1xyXG4gICAgLyoqIENhY2hlIHBlciBzYWx2YXJlIHBlciBvZ25pIGNoaWF2ZSBkaSBvZ25pIGdydXBwbyBjaGkgc29ubyBnbGkgb2dnZXR0aSBzb3R0b3N0YW50aSwgbm9uIGRlaSBzb3R0b2dydXBwaSAqL1xyXG4gICAgcHVibGljIHJnQ2hpbGRHcm91cHNDYWNoZTogTWFwPHN0cmluZywgR3JvdXBbXT4gPSBuZXcgTWFwPHN0cmluZywgR3JvdXBbXT4oKTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSBDb3N0cnV0dG9yZSAqL1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlc3Q6IEVzVGFibGVDb21wb25lbnQsIHByaXZhdGUgdXRpbGl0aWVzOiBVdGlsaXRpZXNIYW5kbGVyLCBwcml2YXRlIGRhdGVFeHRzOiBEYXRlU2VydmljZSkgeyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbiBtb2RhbGl0w6Agcm93Z3JvdXBpbmcgcXVhbmRvIG1pIGFycml2YSB1biBudW92byBibG9jY28gZGkgb2dnZXR0aSBkZXZvIGFnZ2l1bmdlcmxvIGFsbGEgdmlzdGEgYXR0dWFsZTpcclxuICAgICAqXHJcbiAgICAgKiAxKSBTZSBub24gdmllbmUgcmljaGllc3RvIGlsIGRldHRhZ2xpbyBkaSBhbGN1biBncnVwcG8gc2lnbmlmaWNhIGNoZSBkZXZvIGNvbnNpZGVyYXJlIG1pIHNpYW5vIGFycml2YXRpIHR1dHRpIGkgZ3J1cHBpIHByaW5jaXBhbGlcclxuICAgICAqIDIpIFNlIHZpZW5lIHJpY2hpZXN0byBpbCBkZXR0YWdsaW8gZGkgdW4gZ3J1cHBvIGRpdmVyc28gZGFsbCd1bHRpbW8gZGV2byBhZ2dpdW5nZXJlIGRvcG8gYWwgZ3J1cHBvIGNsaWNjYXRvIGxhIGxpc3RhIGRlaSBzb3R0b2dydXBwaVxyXG4gICAgICogMikgU2UgdmllbmUgcmljaGllc3RvIGlsIGRldHRhZ2xpbyBkZWxsJ3VsdGltbyBncnVwcG8gZGV2byBhZ2dpdW5nZXJlIGRvcG8gYWwgZ3J1cHBvIGNsaWNjYXRvIGxhIGxpc3RhIGRlZ2xpIG9nZ2V0dGlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gdmlldyBBcHBTZWFyY2g8VD4gZGEgY3VpIHNvbm8gYXJyaXZhdGkgZ2xpIG9nZ2V0dGlcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBncm91cGluZ0tleXMgTGl2ZWxsaSBkaSByYWdncnVwcGFtZW50byBkYSBhc3BldHRhcnNpIHN1aSBkYXRpXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYW5kbGVOZXdEYXRhT25Sb3dHcm91cGluZyh2aWV3OiBBcHBTZWFyY2g8YW55PiwgZ3JvdXBpbmdLZXlzOiBudW1iZXIpIHtcclxuICAgICAgICAvLyAxKSBTZSBub24gdmllbmUgcmljaGllc3RvIGlsIGRldHRhZ2xpbyBkaSBhbGN1biBncnVwcG8gc2lnbmlmaWNhIGNoZSBsYSBjaGlhbWF0YSByZXN0aXR1aXNjZSBsYSBsaXN0YSBwYWdpbmF0YSBkZWkgZ3J1cHBpIHByaW5jaXBhbGkuXHJcbiAgICAgICAgLy8gICAgTGkgdHJhdHRvIGNvbWUgc2UgZm9zc2UgdW5hIHF1YWxzaWFzaSBhbHRyYSBxdWVyeSBwYWdpbmF0YSBzdSBOIGVsZW1lbnRpXHJcbiAgICAgICAgaWYgKCh2aWV3LnJlcXVlc3RlZGdyb3Vwcz8ubGVuZ3RoIHx8IDApID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5lc3QuYm91bmRTb3VyY2UgPSB0aGlzLmVzdC5UTVBCb3VuZFNvdXJjZTtcclxuICAgICAgICAgICAgdGhpcy5yZ0dyb3VwQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgR3JvdXA+KCk7XHJcbiAgICAgICAgICAgIHRoaXMucmdJdGVtQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XHJcbiAgICAgICAgICAgIHRoaXMucmdDaGlsZEdyb3Vwc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEdyb3VwW10+KCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVzdC5UTVBCb3VuZFNvdXJjZS5mb3JFYWNoKGl0bSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpdG0uX3RoaXNSb3V0ZSA9IGl0bS5fZ3JvdXAgPyBbeyBjb2x1bW46ICg8R3JvdXA+aXRtKS5jb2x1bW4sIHZhbHVlOiAoPEdyb3VwPml0bSkudmFsdWUgfV0gOiBbXTtcclxuICAgICAgICAgICAgICAgIGl0bS5fdGhpc0tleSA9IGl0bS5fZ3JvdXAgPyAoPEdyb3VwPml0bSkudmFsdWUgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgaXRtLl9ncm91cGxldmVsID0gMDtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJnR3JvdXBDYWNoZS5zZXQoaXRtLl90aGlzS2V5LCBpdG0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlc2V0dG8gbGEgcmljZXJjYSBhbGxhIGNhY2hlIGRpIHF1ZXN0YSBcInNlc3Npb25lXCJcclxuICAgICAgICAgICAgbGV0IGZpcnN0SXRlbSA9IHRoaXMuZXN0LlRNUEJvdW5kU291cmNlWzBdO1xyXG4gICAgICAgICAgICB0aGlzLmVzdC5NYWluR3JvdXBWaWV3ID0gT2JqZWN0LmFzc2lnbih7fSwgdmlldyk7XHJcbiAgICAgICAgICAgIHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZSA9IFt7IHBhdGg6ICcnLCByb3V0ZTogW3sgY29sdW1uOiAoPEdyb3VwPmZpcnN0SXRlbSkuY29sdW1uLCB2YWx1ZTogKDxHcm91cD5maXJzdEl0ZW0pLnZhbHVlIH1dLCB2aWV3OiB0aGlzLmVzdC5NYWluR3JvdXBWaWV3LCBncm91cF9jb2x1bW46ICg8R3JvdXA+dGhpcy5lc3QuVE1QQm91bmRTb3VyY2VbMF0pLmNvbHVtbiB9XTtcclxuICAgICAgICAgICAgdGhpcy5lc3QuQmFzZUl0ZW1zQ291bnQgPSB2aWV3Lm9iamVjdGNvdW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gMikgU2UgdmllbmUgcmljaGllc3RvIGlsIGRldHRhZ2xpbyBkaSB1biBxdWFsc2lhc2kgZ3J1cHBvIGRpdmVyc28gZGFsbCd1bHRpbW8gdnVvbCBkaXJlIGNoZSBkZXZvIGFnZ2l1bmdlcmUgXHJcbiAgICAgICAgICAgIC8vICAgIGRvcG8gYWwgZ3J1cHBvIGNoZSBobyBjbGljY2F0byBsYSBsaXN0YSBkZWkgZ3J1cHBpIHRpcmF0YSBmdW9yaSBxdWVzdGEgdm9sdGEgKGludGVybWVkaWF0ZUdyb3VwID0gdHJ1ZSlcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgKiAgIEdydXBwb0EgICAgICAgICAgICAgICAgICAgICAgR3J1cHBvQVxyXG4gICAgICAgICAgICAqICAgR3J1cHBvQiAgICAgICAgICAgICAgICAgICAgICBHcnVwcG9CXHJcbiAgICAgICAgICAgICogICBHcnVwcG9DIDwtIENsaWNjbyBxdWkgICAgICAgIEdydXBwb0NcclxuICAgICAgICAgICAgKiAgIEdydXBwb0QgICAgICAgICAgICAgICAgICAgICAgICAgIEdydXBwb0MxXHJcbiAgICAgICAgICAgICogICBHcnVwcG9FICAgICAgICAgICAgICAgICAgICAgICAgICBHcnVwcG9DMlxyXG4gICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcnVwcG9EXHJcbiAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdydXBwb0VcclxuICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgLy8gMykgc2UgaSBncnVwcGkgcmljaGllc3RpIGRhbGxhIHZpZXcgc29ubyB1Z3VhbGkgYWkgZ3J1cHBpIHByZXNlbnRpIHZ1b2wgZGlyZSBjaGUgc3RvIHByZW5kZW5kbyBnbGkgb2dnZXR0aSB2ZXJpIGUgcHJvcHJpLCBzb25vIGluIFxyXG4gICAgICAgICAgICAvLyB2aWV3Lml0ZW1zIGUgcXVpbmRpIGluIFRNUEJvdW5kU291cmNlLCBobyBpbm9sdHJlIGxlIGluZm9ybWF6aW9uaSBkaSBwYWdpbmF6aW9uZSAqKnBlciBpbCBzaW5nb2xvIHNvdHRvZ3J1cHBvKiogKGludGVybWVkaWF0ZUdyb3VwID0gZmFsc2UpXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICogICBHcnVwcG9BICAgICAgICAgICAgICAgICAgICAgICAgIEdydXBwb0FcclxuICAgICAgICAgICAgKiAgICAgICBHcnVwcG9DMSAgICAgICAgICAgICAgICAgICAgICAgIEdydXBwb0MxXHJcbiAgICAgICAgICAgICogICBHcnVwcG9CICAgICAgICAgICAgICAgICAgICAgICAgIEdydXBwb0JcclxuICAgICAgICAgICAgKiAgIEdydXBwb0MgICAgICAgICAgICAgICAgICAgICAgICAgR3J1cHBvQ1xyXG4gICAgICAgICAgICAqICAgICAgIEdydXBwb0MxIDwtLSBDbGljY28gcXVpICAgICAgICAgR3J1cHBvQzFcclxuICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZ2dldHRvMVxyXG4gICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9nZ2V0dG8yXHJcbiAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2dnZXR0bzNcclxuICAgICAgICAgICAgKiAgICAgICBHcnVwcG9DMiAgICAgICAgICAgICAgICAgICAgICAgIEdydXBwb0MyXHJcbiAgICAgICAgICAgICogICBHcnVwcG9EICAgICAgICAgICAgICAgICAgICAgICAgIEdydXBwb0RcclxuICAgICAgICAgICAgKiAgIEdydXBwb0UgICAgICAgICAgICAgICAgICAgICAgICAgR3J1cHBvRVxyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBsZXQgaW50ZXJtZWRpYXRlR3JvdXAgPSB2aWV3LnJlcXVlc3RlZGdyb3Vwcy5sZW5ndGggIT0gZ3JvdXBpbmdLZXlzO1xyXG5cclxuICAgICAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5lc3QuYm91bmRTb3VyY2U7XHJcbiAgICAgICAgICAgIGxldCBpbnNlcnRJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBpbnNlcnRHcm91cCA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBncm91cEtleTogc3RyaW5nID0gXCJcIjtcclxuICAgICAgICAgICAgbGV0IGdyb3VwUm91dGU6IEdyb3VwUm91dGVGcmFnbWVudFtdID0gW107XHJcblxyXG4gICAgICAgICAgICAvLyBOYXZpZ28gbGEgc3R1dHR1cmEgZGVpIGdydXBwaSBpZ25vcmFuZG8gcmljb3JzaXZhbWVudGUgdHV0dGkgZ2xpIGluZGljaSBmaW5vIGFpIGdydXBwaSBjaGUgbWkgaW50ZXJlc3Nhbm8gaW4gbW9kbyBkYSBub24gYmVjY2FyZSBpbCBwcmltbyBcIkdydXBwb0MxXCIgZGVsIGNhc28gc29wcmFcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWV3LnJlcXVlc3RlZGdyb3Vwcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJnID0gdmlldy5yZXF1ZXN0ZWRncm91cHNbaV07XHJcbiAgICAgICAgICAgICAgICBncm91cEtleSArPSByZy52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGdyb3VwUm91dGUucHVzaCh7IGNvbHVtbjogcmcuY29sdW1uLCB2YWx1ZTogcmcudmFsdWUgfSk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gaW5zZXJ0SW5kZXg7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCB0ID0gaXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gaW5zZXJ0SW5kZXggJiYgdC5fZ3JvdXAgJiYgdC5jb2x1bW4gPT0gcmcuY29sdW1uICYmIHQudmFsdWUgPT0gcmcudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0SW5kZXggPSBpOyBpbnNlcnRHcm91cCA9IHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvIG1hcmNvIGV4cGFuZGVkIGRhdG8gY2hlIHF1ZXN0byBjbGljayBzdWwgZ3J1cHBvIHBvdHJlYmJlIG5vbiBlc3NlcmUgc3RhdG8gZmF0dG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0R3JvdXAuX2V4cGFuZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgaXRlbXNDYWNoZVJlZmVyZW5jZTtcclxuICAgICAgICAgICAgbGV0IGNoaWxkR3JvdXBzQ2FjaGVSZWZlcmVuY2U7XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBub24gw6ggdW4gZ3J1cHBvIGludGVybWVkaW8gZGV2byByaXB1bGlyZSBsYSBjYWNoZSBkZWwgZ3J1cHBvIHN1IGN1aSBobyBhdHR1YWxtZW50ZSBjbGljY2F0by4gR2xpIG9nZ2V0dGkgc2FyYW5ubyByaWFnZ2l1bnRpIGRvcG9cclxuICAgICAgICAgICAgaWYgKCFpbnRlcm1lZGlhdGVHcm91cCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZ0l0ZW1DYWNoZS5zZXQoZ3JvdXBLZXksIFtdKTtcclxuICAgICAgICAgICAgICAgIGl0ZW1zQ2FjaGVSZWZlcmVuY2UgPSB0aGlzLnJnSXRlbUNhY2hlLmdldChncm91cEtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTZSBpbnZlY2Ugw6ggdW4gZ3J1cHBvIGludGVybWVkaW8gZGV2byByaXB1bGlyZSBzaWEgdHV0dGkgaSBjaGlsZCBncm91cCByaWNvcnNpdmFtZW50ZSwgc2lhIHR1dHRpIGdsaSBpdGVtXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgb2YgdGhpcy5yZ0NoaWxkR3JvdXBzQ2FjaGUua2V5cygpKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChncm91cEtleSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmdDaGlsZEdyb3Vwc0NhY2hlLmRlbGV0ZShrZXkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiB0aGlzLnJnSXRlbUNhY2hlLmtleXMoKSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoZ3JvdXBLZXkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJnSXRlbUNhY2hlLmRlbGV0ZShrZXkpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmdDaGlsZEdyb3Vwc0NhY2hlLnNldChncm91cEtleSwgW10pO1xyXG4gICAgICAgICAgICAgICAgY2hpbGRHcm91cHNDYWNoZVJlZmVyZW5jZSA9IHRoaXMucmdDaGlsZEdyb3Vwc0NhY2hlLmdldChncm91cEtleSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEFzc2Vnbm8gdW4gbGl2ZWxsbyBhaSB2YWxvcmkgY2hlIGFycml2YW5vIGRhIHVzYXJlIHBlciBmb3JtYXR0YXJlIGxhIHBhcnRlIGdyYWZpY2EuIElsIHByaW1vIGdydXBwbyBjbGljY2F0byBzYXLDoCBhIGxpdmVsbG8gMSxcclxuICAgICAgICAgICAgLy8gaWwgc2Vjb25kbyBzYXLDoCBhIGxpdmVsbG8gMiBlIGNvc8OsIHZpYS4uLlxyXG4gICAgICAgICAgICAvLyBMaSBtYXJjbyBpbm9sdHJlIGNvbiBpbCBwYXJlbnQgaW4gbW9kbyBkYSBwb3RlciBlbGltaW5hcmUgaSB2ZWNjaGkgcXVhbG9yYSBzZXJ2aXNzZVxyXG4gICAgICAgICAgICB0aGlzLmVzdC5UTVBCb3VuZFNvdXJjZS5mb3JFYWNoKGl0bSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpdG0uX3BhcmVudCA9IGdyb3VwS2V5O1xyXG4gICAgICAgICAgICAgICAgaXRtLl9wYXJlbnRSb3V0ZSA9IGdyb3VwUm91dGU7XHJcbiAgICAgICAgICAgICAgICBpdG0uX3RoaXNSb3V0ZSA9IGl0bS5fZ3JvdXAgPyBbLi4uZ3JvdXBSb3V0ZSwgbmV3IEdyb3VwUm91dGVGcmFnbWVudCgoPEdyb3VwPml0bSkuY29sdW1uLCAoPEdyb3VwPml0bSkudmFsdWUpXSA6IFtdO1xyXG4gICAgICAgICAgICAgICAgaXRtLl90aGlzS2V5ID0gaXRtLl9ncm91cCA/IGdyb3VwS2V5ICsgKDxHcm91cD5pdG0pLnZhbHVlIDogZ3JvdXBLZXk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gUGVyIGxlIHJpY2VyY2EgaW50ZXJtZWRpZSBtZXR0byBpIGdydXBwaSBuZWxsYSBjYWNoZSBkZWkgZ3J1cHBpXHJcbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJtZWRpYXRlR3JvdXApIHtcclxuICAgICAgICAgICAgICAgICAgICBpdG0uX2dyb3VwbGV2ZWwgPSB2aWV3LnJlcXVlc3RlZGdyb3Vwcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZ0dyb3VwQ2FjaGUuc2V0KGl0bS5fdGhpc0tleSwgaXRtKTtcclxuICAgICAgICAgICAgICAgICAgICBjaGlsZEdyb3Vwc0NhY2hlUmVmZXJlbmNlLnB1c2goaXRtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIE1ldHRvIGFuY2hlIGdsaSBvZ2dldHRpIG5lbGxhIGNhY2hlIG5vbiByaWNvcnNpdmFcclxuICAgICAgICAgICAgICAgICAgICBpdGVtc0NhY2hlUmVmZXJlbmNlLnB1c2goaXRtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBFbGltaW5vIGdsaSBvZ2dldHRpIHZlY2NoaSBcclxuICAgICAgICAgICAgLy8gMSkgUmljZXJjYSBpbnRlcm1lZGlhLCBzdGF0byBzYWx2YXRvIC0gRWxpbWlubyB0dXR0aSBnbGkgaXRlbSBlIHR1dHRpIGkgZ3J1cHBpIGxhIGN1aSByb3V0ZSDDqCBwacO5IGx1bmdhIGRlbGxhIGNvcnJlbnRlLCB0dXR0aSBnbGkgaXRlbSByZWxhdGl2aSBhbGxhIHBhdGggY29ycmVudGUsIGUgdHV0dGVcclxuICAgICAgICAgICAgLy8gICAgbGUgY2FjaGUgZGkgcmljZXJjYSBlZmZldHR1YXRlIHN1IHVuYSBwYXRoIHBpw7kgcHJvZm9uZGEgZGVsbCdhdHR1YWxlXHJcbiAgICAgICAgICAgIC8vIDIpIFJpY2VyY2EgZmluYWxlIG8gcmljZXJjYSBpbnRlcm1lZGlhIHNlbnphIHN0YXRvIHNhbHZhdG8gLSBFbGltaW5vIHR1dHRpIGdsaSBpdGVtIHJlbGF0aXZpIGFsbGEgcGF0aCBjb3JyZW50ZVxyXG4gICAgICAgICAgICAvLyBQZXIgXCJzdGF0byBzYWx2YXRvXCIgc2kgaW50ZW5kb25vIHJpY2VyY2hlIHZlY2NoaWUgc2FsdmF0ZSBwZXIgcG90ZXIgZXNzZXJlIHJpZWZmZXR0dWF0ZSBpbiBjYXNvIGRpIG9yZGluYW1lbnRpIHN1IGNvbG9ubmUgZGkgaW50ZXJlc3NlIFxyXG4gICAgICAgICAgICBpZiAoaW50ZXJtZWRpYXRlR3JvdXAgJiYgdmlldy5zYXZlZHN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVzdC5ib3VuZFNvdXJjZSA9IHRoaXMuZXN0LmJvdW5kU291cmNlLmZpbHRlcih0ID0+ICEodC5faXRlbSB8fCB0Ll90aGlzUm91dGUubGVuZ3RoID4gZ3JvdXBSb3V0ZS5sZW5ndGgpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZSA9IHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZS5maWx0ZXIodCA9PiAhKHQucm91dGUubGVuZ3RoID4gZ3JvdXBSb3V0ZS5sZW5ndGgpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5lc3QuYm91bmRTb3VyY2UgPSB0aGlzLmVzdC5ib3VuZFNvdXJjZS5maWx0ZXIodCA9PiAhKHQuX3BhcmVudCA9PSBncm91cEtleSkpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHRoaXNHcm91cCA9IHRoaXMuZXN0LmJvdW5kU291cmNlW2luc2VydEluZGV4XTtcclxuICAgICAgICAgICAgaWYgKGludGVybWVkaWF0ZUdyb3VwKVxyXG4gICAgICAgICAgICAgICAgdGhpc0dyb3VwLl9ncm91cHNjb3VudCA9ICg8QXBwU2VhcmNoPGFueT4+dGhpcy5lc3QuVmlldyk/Lmdyb3VwY291bnQ7XHJcblxyXG4gICAgICAgICAgICAvLyBMaSBzb3N0aXR1aXNjbyBjb2kgbnVvdmkgZGkgcXVlc3RhIHJpY2VyY2FcclxuICAgICAgICAgICAgdGhpcy5lc3QuYm91bmRTb3VyY2Uuc3BsaWNlKGluc2VydEluZGV4ICsgMSwgMCwgLi4udGhpcy5lc3QuVE1QQm91bmRTb3VyY2UpO1xyXG5cclxuICAgICAgICAgICAgLy8gQWdnaXVuZ28gdW4gc2VwYXJhdG9yZSBhbGxhIGZpbmUgbyBhbGwnaW5pemlvIGRpIHF1ZXN0aSBncnVwcGkgY2hlIGRvdnLDoCBvY2N1cGFyc2kgZGkgY2FyaWNhcmUgQUxUUkkgZ3J1cHBpIG8gb2dnZXR0aSAoc2Ugc29ubyBhbGwndWx0aW1vIGdydXBwbylcclxuICAgICAgICAgICAgbGV0IGFkZExhc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5lc3QuYm91bmRTb3VyY2Uuc3BsaWNlKGluc2VydEluZGV4ICsgMSArIChhZGRMYXN0ID8gdGhpcy5lc3QuVE1QQm91bmRTb3VyY2UubGVuZ3RoIDogMCksIDAsIHRoaXMuZ2V0R3JvdXBTZXBhcmF0b3IodmlldywgZ3JvdXBLZXksIGdyb3VwUm91dGUsIHZpZXcucmVxdWVzdGVkZ3JvdXBzLmxlbmd0aCwgaW50ZXJtZWRpYXRlR3JvdXAgPyAnZ3JvdXBzJyA6ICdpdGVtcycpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEFnZ2l1bmdvIGxhIHJpY2VyY2EgYWxsYSBjYWNoZSBkaSBxdWVzdGEgXCJzZXNzaW9uZVwiXHJcbiAgICAgICAgICAgIGxldCB0b0FkZCA9IHsgcGF0aDogZ3JvdXBLZXksIHJvdXRlOiBncm91cFJvdXRlLCB2aWV3OiBPYmplY3QuYXNzaWduKHt9LCB2aWV3KSwgZ3JvdXBfY29sdW1uOiBpbnRlcm1lZGlhdGVHcm91cCA/ICg8R3JvdXA+dGhpcy5lc3QuVE1QQm91bmRTb3VyY2VbMF0pLmNvbHVtbiA6ICcnIH07XHJcbiAgICAgICAgICAgIGxldCBwcmV2ID0gdGhpcy5lc3QuZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlLmZpbmRJbmRleCh0ID0+IHQucGF0aCA9PSB0b0FkZC5wYXRoICYmIHQuZ3JvdXBfY29sdW1uID09IHRvQWRkLmdyb3VwX2NvbHVtbik7XHJcbiAgICAgICAgICAgIGlmIChwcmV2ID09IC0xKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lc3QuZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlLnB1c2godG9BZGQpO1xyXG5cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lc3QuZ3JvdXBTZWFyY2hSZXF1ZXN0c0NhY2hlLnNwbGljZShwcmV2LCAxLCB0b0FkZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2UgaW4gbW9kYWxpdMOgIGFycmF5IGFwcGxpY2EgaSByYWdncnVwcGFtZW50aSBkZWZpbml0aSBsYXRvIHJvdy1ncm91cGluZ1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7dGhzOiBFc1RoW10gfCBFc1RoRGlyZWN0aXZlW119IHRocyBIZWFkZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFycmF5TW9kZVJldmlld0dyb3VwaW5ncyh0aHM6IEVzVGhbXSB8IEVzVGhEaXJlY3RpdmVbXSkge1xyXG4gICAgICAgIGlmICh0aHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXRpbGl0aWVzLmlzRXNUaCh0aHNbMF0pKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBoZWFkZXJHcm91cHM6IEdyb3VwW10gPSBbXTtcclxuICAgICAgICBsZXQgaGVhZGVyQWdncmVnYXRpb25zOiBHcm91cE9yQWdncmVnYXRpb25bXSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNbaV0gYXMgRXNUaERpcmVjdGl2ZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aC50aEdyb3VwKVxyXG4gICAgICAgICAgICAgICAgaGVhZGVyR3JvdXBzLnB1c2gobmV3IEdyb3VwKHRoLnRoLCAwLCBcIlwiKSk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoLnRoQWdncmVnYXRpb24pXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJBZ2dyZWdhdGlvbnMgPSBbLi4uaGVhZGVyQWdncmVnYXRpb25zLCAuLi50aGlzLmdldEdyb3VwQWdncmVnYXRpb25zKHRoKV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaGVhZGVyR3JvdXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy8gUHVsaXppYSBkZWxsZSBjYWNoZVxyXG4gICAgICAgICAgICB0aGlzLnJnR3JvdXBDYWNoZS5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLnJnSXRlbUNhY2hlLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIHRoaXMucmdDaGlsZEdyb3Vwc0NhY2hlLmNsZWFyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVzdC5BcnJheUdyb3VwaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5lc3QuYm91bmRTb3VyY2UgPSB0aGlzLmdldEdyb3Vwc1JlY3Vyc2l2ZShoZWFkZXJHcm91cHMsIDAsIHRoaXMuZXN0LmJvdW5kU291cmNlLCBoZWFkZXJBZ2dyZWdhdGlvbnMsIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgdW5hIGRpcmV0dGl2YSBFc1RoIHJlc3RpdHVpc2NlIGxhIGxpc3RhIGRlbGxlIGFnZ3JlZ2F6aW9uaSByaWNoaWVzdGEgcGVyIHF1ZXN0YSBjb2xvbm5hIG8gaWwgZ3J1cHBvIGNoZSByYXBwcmVzZW50YVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXNUaERpcmVjdGl2ZX0gdGggRGlyZXR0aXZhXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge0dyb3VwT3JBZ2dyZWdhdGlvbltdfSBMaXN0YSBkZWkgZ3J1cHBpIG8gYWdncmVnYXppb25pIHJlbGF0aXZpIGFsbGEgRGlyZXR0aXZhIHBhc3NhdGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEdyb3VwQWdncmVnYXRpb25zKHRoOiBFc1RoRGlyZWN0aXZlKTogR3JvdXBPckFnZ3JlZ2F0aW9uW10ge1xyXG4gICAgICAgIGxldCByZXQgPSBbXTtcclxuICAgICAgICAvLyBFczogJ3ttaW46ZGQvTU0veXl5eX0gLSB7bWF4OmRkL01NL3l5eXl9J1xyXG4gICAgICAgIGlmICh0aC50aEFnZ3JlZ2F0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0RXNUaERpcmVjdGl2ZUxpc3RPZkFnZ3JlZ2F0aW9ucyh0aCkuZm9yRWFjaCgoYWdnOiBUaEFnZ3JlZ2F0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXNkYXRlID0gYWdnLmZvcm1hdCAmJiBbJ3NtYWxsJywgJ2xvbmcnLCAndmVyeWxvbmcnXS5pbmNsdWRlcyhhZ2cuZm9ybWF0KTtcclxuICAgICAgICAgICAgICAgIGxldCBpc251bWJlciA9IGFnZy5mb3JtYXQgJiYgYWdnLmZvcm1hdC5zdGFydHNXaXRoKFwiRlwiKSAmJiAhTnVtYmVyLmlzTmFOKGFnZy5mb3JtYXQuY2hhckF0KDEpKSAmJiBhZ2cuZm9ybWF0Lmxlbmd0aCA9PSAyO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghaXNkYXRlICYmICFpc251bWJlciAmJiBhZ2cuZm9ybWF0KVxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFwiTGUgYWdnZXJnYXppb25pIHN1cHBvcnRhdGUgZGFsbCdlcy10YWJsZSBzb25vIHNvbG8gJ3NtYWxsJywgJ2xvbmcnLCAndmVyeWxvbmcnIHBlciBsZSBkYXRlIGUgJ0YwLTknIHBlciBpIG51bWVyaVwiO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldC5wdXNoKG5ldyBHcm91cE9yQWdncmVnYXRpb24odGgudGgsIGFnZy5mdW5jLCBpc2RhdGUgPyAnZGF0ZScgOiBpc251bWJlciA/ICdudW1iZXInIDogJ3N0cmluZycpKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoLnRoR3JvdXApXHJcbiAgICAgICAgICAgIHJldC5wdXNoKG5ldyBHcm91cE9yQWdncmVnYXRpb24odGgudGgsIG51bGwpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAqIERhdGEgdW5hIGRpcmV0dGl2YSBjb24gdW4gZm9ybWF0byByZXN0aXR1aXNjZSB0dXR0ZSBsZSBjb3BwaWUgRnVuemlvbmUgZGkgQWdncmVnYXppb25lIC0gRm9ybWF0b1xyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge0VzVGhEaXJlY3RpdmV9IHRoIERpcmV0dGl2YSBFc1RoIGRpIGN1aSBjYWxjb2xhcmUgbGUgZnVuemlvbmkgZGkgYWdncmVnYXppb25lIHVzYXRlXHJcbiAgICAqXHJcbiAgICAqIEByZXR1cm5zIHt7IGZ1bmM6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcgfVtdfSBMaXN0YSBkZWxsZSBmdW56aW9uaSBkaSBhZ2dyZWdhemlvbmUgcmlsZXZhdGVcclxuICAgICovXHJcbiAgICBwcml2YXRlIGdldEVzVGhEaXJlY3RpdmVMaXN0T2ZBZ2dyZWdhdGlvbnModGg6IEVzVGhEaXJlY3RpdmUpOiBUaEFnZ3JlZ2F0aW9uW10ge1xyXG4gICAgICAgIGlmICghdGgudGhBZ2dyZWdhdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG5cclxuICAgICAgICAvLyBTZSBobyBnacOgIGVmZmV0dHVhdG8gcXVlc3RvIGNhbGNvbG8gcGVyIHF1ZXN0byB0aCByZXN0aXR1aXNjbyBsYSB2ZXJzaW9uZSBpbiBjYWNoZVxyXG4gICAgICAgIGlmICh0aC5fdGhBZ2dyZWdhdGlvbnMpXHJcbiAgICAgICAgICAgIHJldHVybiB0aC5fdGhBZ2dyZWdhdGlvbnM7XHJcblxyXG4gICAgICAgIGxldCByZXQgPSBbXTtcclxuICAgICAgICBsZXQgZGlzcGxheSA9IHRoLnRoQWdncmVnYXRpb247XHJcbiAgICAgICAgdmFyIG1hdGNoZXMgPSBkaXNwbGF5Lm1hdGNoKC97W2EtekEtWjAtOVxcLzpdKn0vZ2kpO1xyXG4gICAgICAgIGlmICghbWF0Y2hlcylcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIG1hdGNoZXMuZm9yRWFjaChtID0+IHtcclxuICAgICAgICAgICAgbGV0IHNwbGl0ID0gbS5zcGxpdChcIjpcIik7XHJcbiAgICAgICAgICAgIGxldCBmdW5jID0gbSwgZm9ybWF0ID0gXCJcIjtcclxuICAgICAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIEVzY2x1ZG8gcHJpbW8gZSB1bHRpbW8gY2FyYXR0ZXJlIChsZSBncmFmZmUpXHJcbiAgICAgICAgICAgICAgICBmdW5jID0gc3BsaXRbMF0uc3Vic3RyKDEpO1xyXG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gc3BsaXRbMV0uc3Vic3RyKDAsIHNwbGl0WzFdLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXQucHVzaCh7IGZ1bmM6IDwnbWluJyB8ICdtYXgnIHwgJ3N1bSc+ZnVuYywgZm9ybWF0OiBmb3JtYXQsIG1hdGNoOiBtIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aC5fdGhBZ2dyZWdhdGlvbnMgPSByZXQ7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgbGEgZGVmaW5pemlvbmUgZGVpIGdydXBwaSBkYSBnZW5lcmFyZSBkYSB1bmEgbGlzdGEgZGkgb2dnZXR0aSwgc3VkZGl2aWRlIGdsaSBvZ2dldHRpIHBhc3NhdGkgaW4gZ3J1cHBpIGUgc290dG9ncnVwcGlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0dyb3VwW119IGdycHMgRGVmaW5pemlvbmUgZGVpIGdydXBwaVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGN1cnJlbnRJbmRleCBJbmRpY2UgZGkgZWxhYm9yYXppb25lLiBBbCBsaXZlbGxvIDAgaG8gdHV0dGkgZ2xpIG9nZ2V0dGkgZSBkZXZvIGdlbmVyYXJlIGkgcHJpbWkgZ3J1cHBpLCBhIGxpdmVsbG8gMSBobyB0dXR0aSBpIGdydXBwaSBwcmluY2lwYWxpIGUgZGV2b1xyXG4gICAgICogZWxhYm9yYXJlIGkgc290dG9ncnVwcGksIGUgY29zw6wgdmlhIHJpY29yc2l2YW1lbnRlLi4uXHJcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBpdGVtcyBPZ2dldHRpIGRhIHJhZ2dydXBwYXJlXHJcbiAgICAgKiBAcGFyYW0ge0dyb3VwT3JBZ2dyZWdhdGlvbltdfSBhZ2dyZWdhdGlvbnMgSW5mbyBkaSBhZ2dyZWdhemlvbmVcclxuICAgICAqIEBwYXJhbSB7YW55fSBwYXJlbnQgUmlmZXJpbWVudG8gYWwgZ3J1cHBvIHBhZHJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0R3JvdXBzUmVjdXJzaXZlKGdycHM6IEdyb3VwW10sIGN1cnJlbnRJbmRleDogbnVtYmVyLCBpdGVtczogYW55W10sIGFnZ3JlZ2F0aW9uczogR3JvdXBPckFnZ3JlZ2F0aW9uW10sIHBhcmVudD86IGFueSk6IGFueVtdIHtcclxuICAgICAgICAvLyBTZSBsJ2luZGljZSDDqCAwIGRldm8gc2ljdXJhbWVudGUgbmFzY29uZGVyZSB0dXR0aSBnbGkgb2dnZXR0aS4gU29sbyBpIGdydXBwaSBzYXJhbm5vIHZpc3VhbGl6emF0aVxyXG4gICAgICAgIGlmIChjdXJyZW50SW5kZXggPT0gMClcclxuICAgICAgICAgICAgaXRlbXMuZm9yRWFjaChpID0+IGkuX3Zpc2libGUgPSBmYWxzZSk7XHJcblxyXG4gICAgICAgIGxldCBncnAgPSBncnBzW2N1cnJlbnRJbmRleF07XHJcbiAgICAgICAgbGV0IHJldDogYW55W10gPSBbXTtcclxuICAgICAgICBsZXQgbGFzdCA9IGdycHMubGVuZ3RoID09IGN1cnJlbnRJbmRleCArIDE7XHJcbiAgICAgICAgbGV0IGdyb3VwcyA9IHRoaXMudXRpbGl0aWVzLmdyb3VwQnkoaXRlbXMsIGdycC5jb2x1bW4pO1xyXG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gZ3JvdXBzKSB7XHJcbiAgICAgICAgICAgIGxldCBpdG1zID0gZ3JvdXBzW3Byb3BdO1xyXG4gICAgICAgICAgICBsZXQgZ3AgPSBuZXcgR3JvdXAoZ3JwLmNvbHVtbiwgaXRtcy5sZW5ndGgsIHByb3ApO1xyXG4gICAgICAgICAgICBncC5hZ2dyZWdhdGlvbnMgPSB0aGlzLmdlbmVyYXRlQWdncmVnYXRpb25zKGl0bXMsIGFnZ3JlZ2F0aW9ucyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgYW55Z3AgPSAoPGFueT5ncCk7XHJcbiAgICAgICAgICAgIGFueWdwLl9ncm91cCA9IHRydWU7XHJcbiAgICAgICAgICAgIGFueWdwLl9leHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIXBhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgYW55Z3AuX3RoaXNSb3V0ZSA9IFt7IGNvbHVtbjogZ3AuY29sdW1uLCB2YWx1ZTogZ3AudmFsdWUgfV07XHJcbiAgICAgICAgICAgICAgICBhbnlncC5fdGhpc0tleSA9IGdwLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgYW55Z3AuX2dyb3VwbGV2ZWwgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYW55Z3AuX3BhcmVudCA9IHBhcmVudC5fdGhpc0tleTtcclxuICAgICAgICAgICAgICAgIGFueWdwLl9wYXJlbnRSb3V0ZSA9IHBhcmVudC5fdGhpc1JvdXRlO1xyXG4gICAgICAgICAgICAgICAgYW55Z3AuX3RoaXNSb3V0ZSA9IFsuLi5wYXJlbnQuX3RoaXNSb3V0ZSwgeyBjb2x1bW46IGdwLmNvbHVtbiwgdmFsdWU6IGdwLnZhbHVlIH1dO1xyXG4gICAgICAgICAgICAgICAgYW55Z3AuX3RoaXNLZXkgPSBwYXJlbnQuX3RoaXNLZXkgKyBncC52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGFueWdwLl9ncm91cGxldmVsID0gcGFyZW50Ll9ncm91cGxldmVsICsgMTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gUHVzaG8gaWwgZ3J1cHBvLCB0dXR0aSBpIGdydXBwaSBkZWwgbGl2ZWxsbyBzb3R0bywgbyBnbGkgaXRlbSBzZSBpbyBzb25vIGwndWx0aW1vIGdydXBwby4gXHJcbiAgICAgICAgICAgIC8vIExhIHZpc2liaWxpdMOgIMOoIHNvbG8gcGVyIGlsIGdydXBwbyBhIGxpdmVsbG8gMCwgdHV0dGkgZ2xpIGFsdHJpIGdydXBwaSBzYXJhbm5vIG1vc3RyYXRpIG8gbmFzY29zdGkgZGkgY29uc2VndWVuemFcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgYW55Z3AuX3Zpc2libGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51dGlsaXRpZXMuY2FsY3VsYXRlSGFzaChbYW55Z3BdKTtcclxuICAgICAgICAgICAgdGhpcy51dGlsaXRpZXMuY2FjaGVBZ2dyZWdhdGlvbnMoYW55Z3ApO1xyXG5cclxuICAgICAgICAgICAgLy8gQWdnaXVuZ28gaWwgZ3J1cHBvIHBhZHJlXHJcbiAgICAgICAgICAgIHJldC5wdXNoKGFueWdwKTtcclxuICAgICAgICAgICAgdGhpcy5yZ0dyb3VwQ2FjaGUuc2V0KGFueWdwLl90aGlzS2V5LCBhbnlncCk7XHJcbiAgICAgICAgICAgIGlmICghbGFzdCkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vRGFsIGdydXBwbyBwYWRyZSwgc2Ugbm9uIMOoIGwndWx0aW1vIGdydXBwbyBkZWxsYSBjYXRlbmEsIGNhbGNvbG8gcmljb3JzaXZhbWVudGUgdHV0dGEgbGEgY2F0ZW5hIHNvdHRvXHJcbiAgICAgICAgICAgICAgICBsZXQgc3ViR3JvdXBzQW5kSXRlbXMgPSB0aGlzLmdldEdyb3Vwc1JlY3Vyc2l2ZShncnBzLCBjdXJyZW50SW5kZXggKyAxLCBpdG1zLCBhZ2dyZWdhdGlvbnMsIGFueWdwKTtcclxuICAgICAgICAgICAgICAgIGxldCBjaGlsZGdyb3VwcyA9IHN1Ykdyb3Vwc0FuZEl0ZW1zLmZpbHRlcih0ID0+IHQuX2dyb3VwICYmIHQuX3BhcmVudCA9PSBhbnlncC5fdGhpc0tleSk7XHJcbiAgICAgICAgICAgICAgICBhbnlncC5fZ3JvdXBzY291bnQgPSBjaGlsZGdyb3Vwcy5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQWdnaXVuZ28gbGEgY2F0ZW5hIGRlbCBncnVwcG8gc290dG8sIGFnZ2l1bmdlbmRvIGFsbGEgY2FjaGUgc29sbyBpIGdydXBwaSBwYWRyZVxyXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goLi4uc3ViR3JvdXBzQW5kSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZ0NoaWxkR3JvdXBzQ2FjaGUuc2V0KGFueWdwLl90aGlzS2V5LCBjaGlsZGdyb3Vwcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBbCBncnVwcG8gcGFkcmUsIHNlIMOoIGwndWx0aW1vIGFzc2Vnbm8gdHV0dGUgbGUgZm9nbGllIGFzc2VnbmFuZG9nbGkgYW5jaGUgbGEgY2hpYXZlIGRlbCBncnVwcG9cclxuICAgICAgICAgICAgICAgIGl0bXMuZm9yRWFjaChpID0+IGkuX3RoaXNLZXkgPSBhbnlncC5fdGhpc0tleSk7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goLi4uaXRtcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJnSXRlbUNhY2hlLnNldChhbnlncC5fdGhpc0tleSwgaXRtcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgdW5hIGxpc3RhIGRpIG9nZ2V0dGkgZ2VuZXJhIGxlIGFnZ3JlZ2F6aW9uaSBzcGVjaWZpY2F0ZS4gU2kgY29uc2lkZXJhIGRpIGF2ZXJlIHR1dHRpIGdsaSBvZ2dldHRpXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkaSBjdWkgY2FsY29sYXJlIGxlIGFnZ3JlZ2F6aW9uZVxyXG4gICAgICogQHBhcmFtIHtHcm91cE9yQWdncmVnYXRpb25bXX0gYWdncmVnYXRpb25zIEFnZ2VyZ2F6aW9uaSBkYSBnZW5lcmFyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlQWdncmVnYXRpb25zKGl0ZW1zOiBhbnlbXSwgYWdncmVnYXRpb25zOiBHcm91cE9yQWdncmVnYXRpb25bXSk6IEdyb3VwQWdncmVnYXRpb25bXSB7XHJcbiAgICAgICAgbGV0IHJldHM6IEdyb3VwQWdncmVnYXRpb25bXSA9IFtdO1xyXG4gICAgICAgIGxldCBhZ2dyZWdhdGlvblZhbHVlID0gXCJcIiwgZmVGaWVsZCA9IG51bGwsIHN0cmluZ0FnZyA9IG51bGwsIGRhdGVBZ2cgPSBudWxsLCBudW1iZXJBZ2cgPSBudWxsO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFnZ3JlZ2F0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgYWdnID0gYWdncmVnYXRpb25zW2ldO1xyXG4gICAgICAgICAgICBmZUZpZWxkID0gYWdnLmNvbHVtbjtcclxuICAgICAgICAgICAgaWYgKCFmZUZpZWxkKVxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGFnZy5kYXRhdHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzogc3RyaW5nQWdnID0gaXRlbXMubWFwKGkgPT4gaVtmZUZpZWxkXS50b1N0cmluZygpKTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdkYXRlJzogZGF0ZUFnZyA9IGl0ZW1zLm1hcChpID0+IG5ldyBEYXRlKGlbZmVGaWVsZF0pLmdldFRpbWUoKSk7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzogbnVtYmVyQWdnID0gaXRlbXMubWFwKGkgPT4gcGFyc2VGbG9hdChpW2ZlRmllbGRdKSk7IGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzd2l0Y2ggKGFnZy5hZ2dyZWdhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnbWF4JzpcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFnZy5kYXRhdHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOiBhZ2dyZWdhdGlvblZhbHVlID0gc3RyaW5nQWdnLnNvcnQoKS5yZXZlcnNlKClbMF07IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkYXRlJzogYWdncmVnYXRpb25WYWx1ZSA9IG5ldyBEYXRlKE1hdGgubWF4KC4uLmRhdGVBZ2cpKS50b1N0cmluZygpOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzogYWdncmVnYXRpb25WYWx1ZSA9IE1hdGgubWF4KC4uLm51bWJlckFnZykudG9TdHJpbmcoKTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnbWluJzpcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFnZy5kYXRhdHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOiBhZ2dyZWdhdGlvblZhbHVlID0gc3RyaW5nQWdnLnNvcnQoKVswXTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGUnOiBhZ2dyZWdhdGlvblZhbHVlID0gbmV3IERhdGUoTWF0aC5taW4oLi4uZGF0ZUFnZykpLnRvU3RyaW5nKCk7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdudW1iZXInOiBhZ2dyZWdhdGlvblZhbHVlID0gTWF0aC5taW4oLi4ubnVtYmVyQWdnKS50b1N0cmluZygpOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdzdW0nOlxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWdnLmRhdGF0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6IGFnZ3JlZ2F0aW9uVmFsdWUgPSBzdHJpbmdBZ2cuam9pbihcIiwgXCIpOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGF0ZSc6IGFnZ3JlZ2F0aW9uVmFsdWUgPSBcIlwiOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzogYWdncmVnYXRpb25WYWx1ZSA9IG51bWJlckFnZy5yZWR1Y2UoKHByZSwgY3VycikgPT4gcHJlICsgY3VyciwgMCkudG9TdHJpbmcoKTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHMucHVzaChuZXcgR3JvdXBBZ2dyZWdhdGlvbihhZ2cuY29sdW1uLCBhZ2cuYWdncmVnYXRpb24sIGFnZ3JlZ2F0aW9uVmFsdWUpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBPdHRpZW5lIHVuIGVsZW1lbnRvIGRpIHNlcGFyYXppb25lIGZyYSBHcnVwcGkgY2hlIHNlcnZlIHBlciBwYWdpbmFyZSBsZSByaWNlcmNoZSBhbGwnaW50ZXJubyBkaSBvZ25pIHNpbmdvbG8gZ3J1cHBvXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7QXBwU2VhcmNoPGFueT59IHZpZXcgVmlldyB1dGlsaXp6YXRhIHBlciBsYSByaWNlcmNhLiBNZSBuZSBzYWx2byBpIHBhcmFtZXRyaSBuZWwgc2VwYXJhdG9yZSBhdHR1YWxlIGRhdG8gY2hlIG5lIGhvIGJpc29nbm8gcGVyIGNhcmljYXJlIGFsdHJpIGVsZW1lbnRpXHJcbiAgICAqIGZhY2VudGkgcmlmZXJpbWVudG8gYWxsbyBzdGVzc28gY29udGVzdG9cclxuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmVudCBQYXJlbnQgcGF0aCBjaGUgcmFwcHJlc2VudGEgYSBxdWFsZSBncnVwcG8gw6ggYWZmaWJiaWF0byBxdWVzdG8gc2VwYXJhdG9yZVxyXG4gICAgKiBAcGFyYW0ge0dyb3VwUm91dGVGcmFnbWVudFtdfSByb3V0ZSBSb3V0ZSBwYXRoIGNoZSByYXBwcmVzZW50YSBhIHF1YWxlIGdydXBwbyDDqCBhZmZpYmJpYXRvIHF1ZXN0byBzZXBhcmF0b3JlXHJcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZXZlbCBMaXZlbGxvIGRlbCBncnVwcG8gZGkgY3VpIHF1ZXN0byBlbGVtZW50byDDqCBzZXBhcmF0b3JlLCB2aWVuZSB1c2F0byBwZXIgYXBwbGljYXJlIGxhIGNsYXNzZSBcImVzdC1sdmwte3tsZXZlbH19XCJcclxuICAgICpcclxuICAgICogQHJldHVybnMge2FueX0gRWxlbWVudG8gZGkgc2VwYXJhemlvbmUgY29udGVuZW50ZSB0dXR0aSBpIGJpbmQgcGVyIHByZXNlbnRhcmUgdW5hIHBhZ2luYXppb25lIHNvdHRvIHF1ZXN0byBncnVwcG8gbGF0byBpbnRlcmZhY2NpYVxyXG4gICAgKi9cclxuICAgIHB1YmxpYyBnZXRHcm91cFNlcGFyYXRvcih2aWV3OiBBcHBTZWFyY2g8YW55PiwgcGFyZW50OiBzdHJpbmcsIHJvdXRlOiBHcm91cFJvdXRlRnJhZ21lbnRbXSwgbGV2ZWw6IG51bWJlciwgc2VhcmNoZXM6ICdncm91cHMnIHwgJ2l0ZW1zJyk6IEdyb3VwUGFnZXIge1xyXG4gICAgICAgIGxldCBpdGVtID0gbmV3IEdyb3VwUGFnZXIobGV2ZWwsIHJvdXRlLCBwYXJlbnQsIE9iamVjdC5hc3NpZ24oe30sIHZpZXcpLCBzZWFyY2hlcyk7XHJcbiAgICAgICAgaXRlbS5idXR0b25zID0gdGhpcy51dGlsaXRpZXMuZ2V0UGFnZXNBcnJheSg2LCB2aWV3LnBhZ2UsIHZpZXcucGFnZXMpO1xyXG4gICAgICAgIHRoaXMudXRpbGl0aWVzLmNhbGN1bGF0ZUhhc2goW2l0ZW1dKTtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRhIHVuYSBjb2xvbm5hIGVmZmV0dHVhIGxhIHJpZW1pc3Npb25lIGRpIHR1dHRlIGxlIHJpY2VyY2hlIHJlbGF0aXZlLlxyXG4gICAgICpcclxuICAgICAqIEVzLiBIbyAyIGNhbXBpIGRpIGdydXBwbyBlIGhvIGVzcGFuc28gZmlubyBhIHZlZGVyZSBpIHZhbG9yaSBmaW5vIGFkIHVuIGxpdmVsbG8gcXVhbHNpYXNpLlxyXG4gICAgICogQ2xpY2NvIGwnb3JkaW5hbWVudG8gc3VsIHNlY29uZG8gZ3J1cHBvLlxyXG4gICAgICogVHV0dGUgbGUgcmljZXJjaGUgcmVsYXRpdmUgYWkgcHJpbWkgZ3J1cHBpIGRldm9ubyBlc3NlcmUgcmllc2VndWl0ZS4gUXVhbmRvIGkgcmlzdWx0YXRpIGFycml2ZXJhbm5vIGNpIHBlbnNlcsOgIGlsIG1ldG9kbyAqKmJpbmREaXNwbGF5VG9Mb2FkZWRJdGVtc09yR3JvdXBzKipcclxuICAgICAqIGEgdGFnbGlhcmUgdmlhIGdsaSBvZ2dldHRpIG5vbiBwacO5IHZpc3VhbGl6emF0aVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2x1bW4gQ29sb25uYSBzdSBjdWkgc2kgw6ggZWZmZXR0dWF0YSB1bidvcGVyYXppb25lIGRpIG9yZGluYW1lbnRvXHJcbiAgICAgKiBAcGFyYW0ge0FwcE9yZGVyaW5nW119IG9yZGVyaW5ncyBEaXJldHRpdmUgZGkgb3JkaW5hbWVudG8gZGEgYXBwbGljYXJlIGFsbGUgdmFyaWUgc290dG9yaWNlcmNoZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZW1pdFJvd0dyb3VwaW5nU2VhcmNoZXMoY29sdW1uOiBzdHJpbmcsIG9yZGVyaW5nczogQXBwT3JkZXJpbmdbXSkge1xyXG4gICAgICAgIC8vIFBlciB0dXR0ZSBsZSByaWNlcmNoZSBpbnRlcm1lZGllIGNoZSBkZXZvIHJpdmFsdXRhcmUgbGUgcmUtZW1pdHRvIGluIG1vZG8gZGEgYWdnaW9ybmFyZ2xpIGkgZGF0aVxyXG4gICAgICAgIHZhciBtZWFuaW5nZnVsQXBwU2VhcmNoZXMgPSB0aGlzLmVzdC5ncm91cFNlYXJjaFJlcXVlc3RzQ2FjaGUuZmlsdGVyKHQgPT4gdC5ncm91cF9jb2x1bW4gPT0gY29sdW1uKS5tYXAodCA9PiB0LnZpZXcpO1xyXG5cclxuICAgICAgICAvLyBTZSBub24gbmUgdHJvdm8gc2lnbmlmaWNhIGNoZSBobyBmYXR0byBsJ29yZGluYW1lbnRvIG8gc3VnbGkgaXRlbSwgbyBzdSBjb2xvbm5lIHJlbGF0aXZlIGEgdW4gc290dG9ncnVwcG8gbm9uIGNhcmljYXRvXHJcbiAgICAgICAgaWYgKCFtZWFuaW5nZnVsQXBwU2VhcmNoZXMgfHwgbWVhbmluZ2Z1bEFwcFNlYXJjaGVzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICBtZWFuaW5nZnVsQXBwU2VhcmNoZXMgPSB0aGlzLmVzdC5ncm91cFNlYXJjaFJlcXVlc3RzQ2FjaGUuZmlsdGVyKHQgPT4gIXQuZ3JvdXBfY29sdW1uKS5tYXAodCA9PiB0LnZpZXcpO1xyXG5cclxuICAgICAgICAvLyBTZSBub24gbmUgdHJvdm8gcXVpIHNpZ25pZmljYSBjaGUgc3RvIG9yZGluYW5kbyBzdSBjb2xvbm5lIHJlbGF0aXZlIGEgdW4gc290dG9ncnVwcG8gbm9uIGNhcmljYXRvXHJcbiAgICAgICAgaWYgKCFtZWFuaW5nZnVsQXBwU2VhcmNoZXMgfHwgbWVhbmluZ2Z1bEFwcFNlYXJjaGVzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIG1lYW5pbmdmdWxBcHBTZWFyY2hlcy5mb3JFYWNoKGFzID0+IHtcclxuICAgICAgICAgICAgLy8gT3Z2aWFtZW50ZSBnbGkgb3JpZG5hbWVudGkgZGV2b25vIGVzc2VyZSBxdWVsbGkgYXBwZW5hIGdlbmVyYXRpXHJcbiAgICAgICAgICAgIGFzLm9yZGVycyA9IG9yZGVyaW5ncztcclxuICAgICAgICAgICAgYXMuc2F2ZWRzdGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZXN0LmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlLCBhcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgY2hlIGNhbGNvbGEgaWwgY29udGVudXRvIGRpIHVuYSBjZWxsYSByZWxhdGl2YSBhIHVuIGdydXBwbyByaWdhLCB0ZW5lbmRvIGNvbnRvIGRlbCBmb3JtYXRvIGRlbGxlIGV2ZW50dWFsaSBhZ2dyZWdhemlvbmlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0dyb3VwfSBncnAgR3J1cHBvIGRpIGN1aSBtb3N0cmFyZSBsZSBjZWxsZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNlbGwgQ2VsbGEgYXR0dWFsZSBkaSBjdWkgY2FsY29sYXJlIGlsIHRlc3RvXHJcbiAgICAgKiBAcGFyYW0ge0VzVGhEaXJlY3RpdmV9IGhlYWRlciBIZWFkZXIgcmVsYXRpdm8gYWxsYSBjZWxsYSBhdHR1YWxlLCB1dGlsaXp6YXRhIHBlciBpZGVudGlmaWNhcmUgbGUgaW5mb3JtYXppb25pIGRpIGFnZ3JlZ2F6aW9uZVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRlc3RvIGZpbmFsZSBjYWxjb2xhdG8gcGVyIGxhICoqY2VsbCoqIGNvcnJlbnRlLCBpbiBiYXNlIGFsbGUgYWdncmVnYXppb25pIGRpICoqaGVhZGVyKipcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEdyb3VwQ2VsbERpc3BsYXkoZ3JwOiBHcm91cCwgY2VsbDogc3RyaW5nLCBoZWFkZXI6IEVzVGhEaXJlY3RpdmUpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICgoPGFueT5ncnApLl9zZXApXHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgIGxldCBkaXNwbGF5ID0gaGVhZGVyLnRoQWdncmVnYXRpb247XHJcbiAgICAgICAgaWYgKGdycC5jb2x1bW4gPT0gY2VsbCkge1xyXG4gICAgICAgICAgICBsZXQgZ3JvdXBzUGFydCA9ICg8YW55PmdycCkuX2dyb3Vwc2NvdW50ID8gXCIgLSBcIiArICg8YW55PmdycCkuX2dyb3Vwc2NvdW50ICsgXCIgXCIgKyB0aGlzLmVzdC5sYy5sb2MoXCJHcm91cHNcIikgOiBcIlwiO1xyXG4gICAgICAgICAgICByZXR1cm4gZ3JwLnZhbHVlICsgXCIgKFwiICsgZ3JwLmNvdW50ICsgZ3JvdXBzUGFydCArIFwiKVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBhZ2cgPSAoPE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+Pig8YW55PmdycCkuX2FnZ3JlZ2F0aW9uc0NhY2hlKS5nZXQoY2VsbCk7XHJcbiAgICAgICAgICAgIGlmICghYWdnKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdldEVzVGhEaXJlY3RpdmVMaXN0T2ZBZ2dyZWdhdGlvbnMoaGVhZGVyKS5mb3JFYWNoKChpdG06IFRoQWdncmVnYXRpb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGRpc3BsYXkgPSBkaXNwbGF5LnJlcGxhY2UoaXRtLm1hdGNoLCB0aGlzLmZvcm1hdEFnZ3JlZ2F0aW9uVmFsdWUoYWdnLmdldChpdG0uZnVuYyksIGl0bS5mb3JtYXQpKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZGlzcGxheTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW56aW9uZSBjaGUgZGF0byB1biB2YWxvcmUgbG8gZm9ybWF0dGEgaW4gYmFzZSBhbCB0aXBvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBWYWxvcmUgY2hlIGdlbmVyYWxlbW50ZSBwdcOyIGVzc2VyZSB1bmEgZGF0YSBvIHVuIG51bWVyb1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZyb21hdCBGb3JtYXRvIHN1IGN1aSBmb3JtYXR0YXJlIGlsIHZhbG9yZS4gUHXDsiBlc3NlcmUgYWQgZXNlbXBpbyBcInNtYWxsXCIsIFwibG9uZ1wiIFwidmVyeWxvbmdcIiBwZXIgbGUgZGF0ZSBvIEZ7MC05fSBwZXIgaSBudW1lcmkgZGVjaW1hbGlcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVmFsb3JlIGRlbGwnYWdncmVnYXppb25lIGZvcm1hdHRhdG8gY29tZSBzaSBkZXZlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZm9ybWF0QWdncmVnYXRpb25WYWx1ZSh2YWx1ZTogc3RyaW5nLCBmb3JtYXQ/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghZm9ybWF0KVxyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcblxyXG4gICAgICAgIGxldCBpc051bWJlciA9ICFOdW1iZXIuaXNOYU4odmFsdWUpICYmICghZm9ybWF0IHx8IGZvcm1hdC5zdGFydHNXaXRoKFwiRlwiKSk7XHJcblxyXG4gICAgICAgIGlmIChpc051bWJlciAmJiBmb3JtYXQuc3RhcnRzV2l0aChcIkZcIikgJiYgIU51bWJlci5pc05hTihmb3JtYXQuc3Vic3RyKDEpKSlcclxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpLnRvRml4ZWQocGFyc2VJbnQoZm9ybWF0LnN1YnN0cigxKSkpO1xyXG5cclxuICAgICAgICBsZXQgZGF0ZSA9IG51bGw7XHJcbiAgICAgICAgLy8gQWxjdW5lIHZlcnNpb25lIGRpIGV4dGVuc2lvbnMgcmlzY2hpYW5vIGRpIGNyYXNoYXJlIGNvbiBjb3NlIG5vbiBkYXRlLi4uIMOoIHN0YXRvIHJpc29sdG8gZG9wbyBxdWluZGkgcXVlc3RvIHRyeSAtIGNhdGNoIGluIHJlYWx0w6BcclxuICAgICAgICAvLyB0b3JuYSB1dGlsZSBzb2xvIGNvbiB2ZXJzaW9uaSB2ZWNjaGllL2RlcHJlY2F0ZSBkZWxsYSBsaWJyZXJpYSBAZXNmYWVuemEvZXh0ZW5zaW9uc1xyXG4gICAgICAgIHRyeSB7IGRhdGUgPSB0aGlzLmRhdGVFeHRzLmdldERhdGVDb252ZXJ0aW9uKHZhbHVlKTsgfSBjYXRjaCB7IH1cclxuXHJcbiAgICAgICAgaWYgKGRhdGUpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVFeHRzLmdldEZvcm1hdHRlZChkYXRlLCBmb3JtYXQgPT0gJ3NtYWxsJywgZm9ybWF0ID09ICd2ZXJ5bG9uZycpO1xyXG5cclxuICAgICAgICAvLyBRdWkgY2kgZmluaXNjbyBzaWEgcGVyIGlucHV0IGNoZSBub24gc29ubyBuw6kgZGF0ZSBuw6kgbnVtZXJpLCBzaWEgcGVyIGZvcm1hdGkgbm9uIHJpY29ub3NjaXV0aVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxufSJdfQ==