ontimize-web-ngx 15.6.0-next.5 → 15.6.0-next.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/esm2020/lib/components/form/navigation/o-form-navigation.component.mjs +14 -8
  2. package/esm2020/lib/components/form/o-form.component.mjs +3 -5
  3. package/esm2020/lib/components/form/services/o-form-message.service.mjs +2 -2
  4. package/esm2020/lib/components/input/o-boolean-form-data-component.class.mjs +9 -1
  5. package/esm2020/lib/components/o-form-data-component.class.mjs +2 -2
  6. package/esm2020/lib/components/table/column/cell-editor/o-base-table-cell-editor.class.mjs +2 -2
  7. package/esm2020/lib/components/table/column/cell-renderer/o-base-table-cell-renderer.class.mjs +1 -1
  8. package/esm2020/lib/components/table/column/o-column.class.mjs +2 -1
  9. package/esm2020/lib/components/table/column/o-table-column.component.mjs +9 -4
  10. package/esm2020/lib/components/table/extensions/contextmenu/o-table-context-menu.component.mjs +24 -6
  11. package/esm2020/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column-data-dialog.component.mjs +75 -87
  12. package/esm2020/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column.service.mjs +52 -0
  13. package/esm2020/lib/components/table/extensions/header/table-columns-filter/o-table-columns-filter.component.mjs +12 -4
  14. package/esm2020/lib/components/table/o-table-base.class.mjs +1 -1
  15. package/esm2020/lib/components/table/o-table.component.mjs +89 -8
  16. package/esm2020/lib/components/table/o-table.module.mjs +4 -1
  17. package/esm2020/lib/config/o-providers.mjs +4 -3
  18. package/esm2020/lib/i18n/i18n.mjs +6 -3
  19. package/esm2020/lib/injection-tokens/index.mjs +2 -1
  20. package/esm2020/lib/interfaces/index.mjs +2 -1
  21. package/esm2020/lib/interfaces/jsonapi-config.interface.mjs +3 -0
  22. package/esm2020/lib/interfaces/o-table-column.interface.mjs +1 -1
  23. package/esm2020/lib/services/jsonapi/jsonapi.service.mjs +44 -7
  24. package/esm2020/lib/services/state/o-table-component-state.class.mjs +7 -1
  25. package/esm2020/lib/services/state/o-table-component-state.service.mjs +8 -2
  26. package/esm2020/lib/types/config.type.mjs +1 -1
  27. package/esm2020/lib/types/service-configuration.type.mjs +1 -1
  28. package/esm2020/lib/types/table/index.mjs +2 -1
  29. package/esm2020/lib/types/table/o-column-value-filter.type.mjs +1 -1
  30. package/esm2020/lib/types/table/o-table-expandable-row-state.type.mjs +2 -0
  31. package/esm2020/lib/util/util.mjs +11 -1
  32. package/fesm2015/ontimize-web-ngx.mjs +360 -122
  33. package/fesm2015/ontimize-web-ngx.mjs.map +1 -1
  34. package/fesm2020/ontimize-web-ngx.mjs +342 -120
  35. package/fesm2020/ontimize-web-ngx.mjs.map +1 -1
  36. package/lib/components/form/navigation/o-form-navigation.component.d.ts +1 -0
  37. package/lib/components/input/o-boolean-form-data-component.class.d.ts +1 -0
  38. package/lib/components/table/column/cell-renderer/o-base-table-cell-renderer.class.d.ts +1 -1
  39. package/lib/components/table/column/o-column.class.d.ts +2 -1
  40. package/lib/components/table/column/o-table-column.component.d.ts +2 -2
  41. package/lib/components/table/extensions/contextmenu/o-table-context-menu.component.d.ts +2 -0
  42. package/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column-data-dialog.component.d.ts +9 -6
  43. package/lib/components/table/extensions/dialog/filter-by-column/o-table-filter-by-column.service.d.ts +12 -0
  44. package/lib/components/table/extensions/header/table-columns-filter/o-table-columns-filter.component.d.ts +1 -1
  45. package/lib/components/table/o-table-base.class.d.ts +2 -0
  46. package/lib/components/table/o-table.component.d.ts +11 -2
  47. package/lib/i18n/i18n.d.ts +3 -0
  48. package/lib/injection-tokens/index.d.ts +2 -0
  49. package/lib/interfaces/index.d.ts +1 -0
  50. package/lib/interfaces/jsonapi-config.interface.d.ts +3 -0
  51. package/lib/interfaces/o-table-column.interface.d.ts +2 -1
  52. package/lib/services/jsonapi/jsonapi.service.d.ts +6 -2
  53. package/lib/services/state/o-table-component-state.class.d.ts +3 -0
  54. package/lib/types/config.type.d.ts +2 -2
  55. package/lib/types/service-configuration.type.d.ts +6 -1
  56. package/lib/types/table/index.d.ts +1 -0
  57. package/lib/types/table/o-column-value-filter.type.d.ts +3 -0
  58. package/lib/types/table/o-table-expandable-row-state.type.d.ts +5 -0
  59. package/lib/util/util.d.ts +1 -0
  60. package/package.json +1 -1
  61. package/theme.scss +69 -69
@@ -511,6 +511,16 @@ export class Util {
511
511
  }
512
512
  return child;
513
513
  }
514
+ static getValueFromPath(obj, path) {
515
+ if (!obj || !path)
516
+ return undefined;
517
+ return path.split('.').reduce((acc, key) => {
518
+ if (acc && typeof acc === 'object') {
519
+ return acc[key];
520
+ }
521
+ return undefined;
522
+ }, obj);
523
+ }
514
524
  }
515
525
  Util.columnAggregates = ['sum', 'count', 'avg', 'min', 'max'];
516
526
  Util.objectToQueryString = (initialObj) => {
@@ -554,4 +564,4 @@ Util.mapKeys = (obj, fn) => Object.keys(obj).reduce((acc, k) => {
554
564
  return acc;
555
565
  }, {});
556
566
  Util.mapValues = (obj, fn) => Object.keys(obj).reduce((acc, k) => ({ ...acc, [k]: fn(obj[k]) }), {});
557
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi91dGlsL3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQVExRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXhFLE1BQU0sT0FBTyxJQUFJO0lBSWYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFRO1FBQ3RCLE1BQU0sT0FBTyxHQUFHLE9BQU8sR0FBRyxDQUFDO1FBQzNCLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFRO1FBQ3JCLE9BQU8sR0FBRyxZQUFZLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFhLEVBQUUsWUFBc0I7UUFDdkQsSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUU7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LENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRSxDQUFDLENBQUM7QUFNYyxZQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDakMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRU8sY0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQ3RDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBmcm9tLCBpc09ic2VydmFibGUsIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElEYXRhU2VydmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGF0YS1zZXJ2aWNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRm9ybURhdGFDb21wb25lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Zvcm0tZGF0YS1jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElQZXJtaXNzaW9uc1NlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Blcm1pc3Npb25zLXNlcnZpY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IE9Db25maWd1cmVNZXNzYWdlU2VydmljZUFyZ3MgfSBmcm9tICcuLi90eXBlcy9jb25maWd1cmUtbWVzc2FnZS1zZXJ2aWNlLWFyZ3MudHlwZSc7XG5pbXBvcnQgeyBPQ29uZmlndXJlU2VydmljZUFyZ3MgfSBmcm9tICcuLi90eXBlcy9jb25maWd1cmUtc2VydmljZS1hcmdzLnR5cGUnO1xuaW1wb3J0IHsgT0RhdGVWYWx1ZVR5cGUgfSBmcm9tICcuLi90eXBlcy9vLWRhdGUtdmFsdWUudHlwZSc7XG5pbXBvcnQgeyBCYXNlNjQgfSBmcm9tICcuL2Jhc2U2NCc7XG5pbXBvcnQgeyBDb2RlcyB9IGZyb20gJy4vY29kZXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBBcHBDb25maWcgfSBmcm9tICcuLi9jb25maWcvYXBwLWNvbmZpZyc7XG5pbXBvcnQgeyBTZXJ2aWNlVHlwZSB9IGZyb20gJy4uL3R5cGVzL3NlcnZpY2UtdHlwZS50eXBlJztcbmltcG9ydCB7IEpTT05BUElTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvanNvbmFwaS9qc29uYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgT250aW1pemVFRVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbnRpbWl6ZS9vbnRpbWl6ZS1lZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9udGltaXplU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL29udGltaXplL29udGltaXplLnNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgVXRpbCB7XG5cbiAgc3RhdGljIHJlYWRvbmx5IGNvbHVtbkFnZ3JlZ2F0ZXMgPSBbJ3N1bScsICdjb3VudCcsICdhdmcnLCAnbWluJywgJ21heCddO1xuXG4gIHN0YXRpYyBpc09iamVjdCh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbFR5cGUgPSB0eXBlb2YgdmFsO1xuICAgIHJldHVybiB2YWxUeXBlID09PSAnb2JqZWN0JztcbiAgfVxuXG4gIHN0YXRpYyBpc0FycmF5KHZhbDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHZhbCBpbnN0YW5jZW9mIEFycmF5O1xuICB9XG5cbiAgc3RhdGljIHBhcnNlQm9vbGVhbih2YWx1ZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKCh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSAmJiAodmFsdWUudG9VcHBlckNhc2UoKSA9PT0gJ1RSVUUnIHx8IHZhbHVlLnRvVXBwZXJDYXNlKCkgPT09ICdZRVMnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICgodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgJiYgKHZhbHVlLnRvVXBwZXJDYXNlKCkgPT09ICdGQUxTRScgfHwgdmFsdWUudG9VcHBlckNhc2UoKSA9PT0gJ05PJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKFV0aWwuaXNEZWZpbmVkKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUFycmF5KHZhbHVlOiBzdHJpbmcsIGV4Y2x1ZGVSZXBlYXRlZDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nW10ge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlLnNwbGl0KENvZGVzLkFSUkFZX0lOUFVUX1NFUEFSQVRPUik7XG4gICAgfVxuICAgIGlmIChleGNsdWRlUmVwZWF0ZWQgJiYgcmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdCA9IEFycmF5LmZyb20obmV3IFNldChyZXN1bHQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHBhcmVudCBrZXlzIGVxdWl2YWxlbmNlcy5cbiAgICogQHBhcmFtICBwS2V5c0FycmF5IEFycmF5IG9mIHN0cmluZ3MuIEFjY2VwdGVkIGZvcm1hdDoga2V5IHwga2V5OmFsaWFzXG4gICAqIEByZXR1cm5zIE9iamVjdFxuICAgKi9cbiAgc3RhdGljIHBhcnNlUGFyZW50S2V5c0VxdWl2YWxlbmNlcyhwS2V5c0FycmF5OiBBcnJheTxzdHJpbmc+LCBzZXBhcmF0b3I6IHN0cmluZyA9ICc6Jyk6IG9iamVjdCB7XG4gICAgY29uc3QgZXF1aXZhbGVuY2VzID0ge307XG4gICAgaWYgKHBLZXlzQXJyYXkgJiYgcEtleXNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBwS2V5c0FycmF5LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGNvbnN0IGF1eCA9IGl0ZW0uc3BsaXQoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGF1eCAmJiBhdXgubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgaWYgKC8uK1xcWy4rXFxdLy50ZXN0KGF1eFsxXSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVxdWl2S2V5ID0gYXV4WzFdLnN1YnN0cmluZygwLCBhdXhbMV0uaW5kZXhPZignWycpKTtcbiAgICAgICAgICAgIGNvbnN0IGVxdWl2VmFsdWUgPSBhdXhbMV0uc3Vic3RyaW5nKGF1eFsxXS5pbmRleE9mKCdbJykgKyAxLCBhdXhbMV0uaW5kZXhPZignXScpKTtcbiAgICAgICAgICAgIGNvbnN0IGVxdWl2ID0ge307XG4gICAgICAgICAgICBlcXVpdltlcXVpdktleV0gPSBlcXVpdlZhbHVlO1xuICAgICAgICAgICAgZXF1aXZhbGVuY2VzW2F1eFswXV0gPSBlcXVpdjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXF1aXZhbGVuY2VzW2F1eFswXV0gPSBhdXhbMV07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGF1eCAmJiBhdXgubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgZXF1aXZhbGVuY2VzW2l0ZW1dID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBlcXVpdmFsZW5jZXM7XG4gIH1cblxuICBzdGF0aWMgZW5jb2RlUGFyZW50S2V5cyhwYXJlbnRLZXlzOiBvYmplY3QpOiBzdHJpbmcge1xuICAgIGxldCBlbmNvZGVkOiBzdHJpbmcgPSAnJztcbiAgICBpZiAocGFyZW50S2V5cykge1xuICAgICAgZW5jb2RlZCA9IEJhc2U2NC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkocGFyZW50S2V5cykpO1xuICAgIH1cbiAgICByZXR1cm4gZW5jb2RlZDtcbiAgfVxuXG4gIHN0YXRpYyBkZWNvZGVQYXJlbnRLZXlzKHBhcmVudEtleXM6IHN0cmluZyk6IG9iamVjdCB7XG4gICAgbGV0IGRlY29kZWQgPSB7fTtcbiAgICBpZiAocGFyZW50S2V5cyAmJiBwYXJlbnRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGQgPSBCYXNlNjQuZGVjb2RlKHBhcmVudEtleXMpO1xuICAgICAgZGVjb2RlZCA9IEpTT04ucGFyc2UoZCk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVkO1xuICB9XG5cbiAgc3RhdGljIGlzQXJyYXlFbXB0eShhcnJheTogYW55W10pOiBib29sZWFuIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKGFycmF5KSB8fCBhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgaXNPYmplY3RFbXB0eShvYmo6IG9iamVjdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2V0aGVyIHNwZWNpZmllZCBzZXJ2aWNlIGFzIGFyZ3VtZW50IGltcGxlbWVudHMgJ0lEYXRhU2VydmljZScgaW50ZXJmYWNlXG4gICAqIEBwYXJhbSBhcmcgVGhlIHNlcnZpY2UgaW5zdGFuY2UgZm9yIGNoZWNraW5nLlxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBzdGF0aWMgaXNEYXRhU2VydmljZShhcmc6IGFueSk6IGFyZyBpcyBJRGF0YVNlcnZpY2Uge1xuICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZCB8fCBhcmcgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICgoYXJnIGFzIElEYXRhU2VydmljZSkuZ2V0RGVmYXVsdFNlcnZpY2VDb25maWd1cmF0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIChhcmcgYXMgSURhdGFTZXJ2aWNlKS5jb25maWd1cmVTZXJ2aWNlICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3ZXRoZXIgc3BlY2lmaWVkIHNlcnZpY2UgYXMgYXJndW1lbnQgaW1wbGVtZW50cyAnSURhdGFTZXJ2aWNlJyBpbnRlcmZhY2VcbiAgICogQHBhcmFtIGFyZyBUaGUgc2VydmljZSBpbnN0YW5jZSBmb3IgY2hlY2tpbmcuXG4gICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICovXG4gIHN0YXRpYyBpc1Blcm1pc3Npb25zU2VydmljZShhcmc6IGFueSk6IGFyZyBpcyBJUGVybWlzc2lvbnNTZXJ2aWNlIHtcbiAgICBpZiAoYXJnID09PSB1bmRlZmluZWQgfHwgYXJnID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoKGFyZyBhcyBJUGVybWlzc2lvbnNTZXJ2aWNlKS5sb2FkUGVybWlzc2lvbnMgIT09IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdldGhlciBzcGVjaWZpZWQgY29tcG9uZW50IGFzIGFyZ3VtZW50IGltcGxlbWVudHMgJ0lGb3JtRGF0YUNvbXBvbmVudCcgaW50ZXJmYWNlXG4gICAqIEBwYXJhbSBhcmcgVGhlIGNvbXBvbmVudCBpbnN0YW5jZSBmb3IgY2hlY2tpbmcuXG4gICAqIEByZXR1cm5zIGJvb2xlYW5cbiAgICovXG4gIHN0YXRpYyBpc0Zvcm1EYXRhQ29tcG9uZW50KGFyZzogYW55KTogYXJnIGlzIElGb3JtRGF0YUNvbXBvbmVudCB7XG4gICAgaWYgKGFyZyA9PT0gdW5kZWZpbmVkIHx8IGFyZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKChhcmcgYXMgSUZvcm1EYXRhQ29tcG9uZW50KS5pc0F1dG9tYXRpY0JpbmRpbmcgIT09IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZSBpcyBlcXVhbCB0d28gb2JqZWN0c1xuICAgKiBAcGFyYW0gYSBPYmplY3QgMVxuICAgKiBAcGFyYW0gYiBPYmplY3QgMlxuICAgKlxuICAgKi9cbiAgc3RhdGljIGlzRXF1aXZhbGVudChhLCBiKSB7XG4gICAgLy8gQ3JlYXRlIGFycmF5cyBvZiBwcm9wZXJ0eSBuYW1lc1xuICAgIGNvbnN0IGFQcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGEpO1xuICAgIGNvbnN0IGJQcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpO1xuXG4gICAgLy8gSWYgbnVtYmVyIG9mIHByb3BlcnRpZXMgaXMgZGlmZmVyZW50LCBvYmplY3RzIGFyZSBub3QgZXF1aXZhbGVudFxuICAgIGlmIChhUHJvcHMubGVuZ3RoICE9PSBiUHJvcHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhUHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHByb3BOYW1lID0gYVByb3BzW2ldO1xuICAgICAgLy8gSWYgdmFsdWVzIG9mIHNhbWUgcHJvcGVydHkgYXJlIG5vdCBlcXVhbCwgb2JqZWN0cyBhcmUgbm90IGVxdWl2YWxlbnRcbiAgICAgIGxldCBiVmFsdWUgPSBiW3Byb3BOYW1lXTtcbiAgICAgIGlmICh0eXBlb2YgYVtwcm9wTmFtZV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IGludEIgPSBwYXJzZUludChiVmFsdWUsIDEwKTtcbiAgICAgICAgYlZhbHVlID0gaXNOYU4oaW50QikgPyBiVmFsdWUgOiBpbnRCO1xuICAgICAgfVxuICAgICAgaWYgKGFbcHJvcE5hbWVdICE9PSBiVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIG1hZGUgaXQgdGhpcyBmYXIsIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGljIGVxdWFscyhvMTogYW55LCBvMjogYW55KTogYm9vbGVhbiB7XG4gICAgaWYgKG8xID09PSBvMikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChvMSA9PT0gbnVsbCB8fCBvMiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobzEgIT09IG8xICYmIG8yICE9PSBvMikge1xuICAgICAgLy8gTmFOID09PSBOYU5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB0MSA9IHR5cGVvZiBvMTtcbiAgICBjb25zdCB0MiA9IHR5cGVvZiBvMjtcbiAgICBsZXQgbGVuZ3RoOiBudW1iZXI7XG4gICAgbGV0IGtleTogYW55O1xuICAgIGxldCBrZXlTZXQ6IGFueTtcbiAgICBpZiAodDEgPT09IHQyICYmIHQxID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobzEpKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvMikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgbGVuZ3RoID0gbzEubGVuZ3RoO1xuICAgICAgICBpZiAobGVuZ3RoID09PSBvMi5sZW5ndGgpIHtcbiAgICAgICAgICBmb3IgKGtleSA9IDA7IGtleSA8IGxlbmd0aDsga2V5KyspIHtcbiAgICAgICAgICAgIGlmICghVXRpbC5lcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobzIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGtleVNldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGZvciAoa2V5IGluIG8xKSB7XG4gICAgICAgICAgaWYgKCFVdGlsLmVxdWFscyhvMVtrZXldLCBvMltrZXldKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZXlTZXRba2V5XSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChrZXkgaW4gbzIpIHtcbiAgICAgICAgICBpZiAoIShrZXkgaW4ga2V5U2V0KSAmJiB0eXBlb2YgbzJba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBpc0RlZmluZWQodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGEgcmFuZG9tIG51bWJlclxuICAqL1xuICBzdGF0aWMgcmFuZG9tTnVtYmVyKCkge1xuICAgIGNvbnN0IHJhbmRvbUFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDEpO1xuICAgIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhbmRvbUFycmF5KTtcbiAgICByZXR1cm4gcmFuZG9tQXJyYXlbMF07XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm92aWRlZCBzdHJpbmcgaW4gbG93ZXJjYXNlIGFuZCB3aXRob3V0IGFjY2VudCBtYXJrcy5cbiAgICogQHBhcmFtIHZhbHVlIHRoZSB0ZXh0IHRvIG5vcm1hbGl6ZVxuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZVN0cmluZyh2YWx1ZTogc3RyaW5nLCB0b0xvd2VyQ2FzZTogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB2YWx1ZS5ub3JtYWxpemUoJ05GRCcpLnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csICcnKTtcbiAgICAgICAgaWYgKHRvTG93ZXJDYXNlKSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHByb3ZpZGVkIGFycmF5IGZsYXR0ZW5kLlxuICAgKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IHRvIGZsYXRcbiAgICovXG4gIHN0YXRpYyBmbGF0dGVuKGFycmF5OiBBcnJheTxhbnk+KTogQXJyYXk8YW55PiB7XG4gICAgbGV0IGZsYXR0ZW5lZCA9IFtdO1xuICAgIGZvciAoY29uc3QgY3VycmVudCBvZiBhcnJheSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKGN1cnJlbnQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2hpbGRDdXJyZW50IG9mIGN1cnJlbnQpIHtcbiAgICAgICAgZmxhdHRlbmVkLnB1c2goY2hpbGRDdXJyZW50KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmxhdHRlbmVkXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgd2l0aCBhbGwgdGhlIHZhbHVlcyBmcm9tIHRoZSBwcm92aWRlZCBvYmplY3QuXG4gICAqIEBwYXJhbSBvYmogdGhlIG9iamVjdFxuICAgKi9cbiAgc3RhdGljIGdldFZhbHVlc0Zyb21PYmplY3Qob2JqOiBvYmplY3QgPSB7fSk6IEFycmF5PGFueT4ge1xuICAgIGNvbnN0IGFycmF5OiBBcnJheTxhbnk+ID0gW107XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0Jykge1xuICAgICAgICBhcnJheS5wdXNoKFV0aWwuZ2V0VmFsdWVzRnJvbU9iamVjdChvYmpba2V5XSkpO1xuICAgICAgfVxuICAgICAgYXJyYXkucHVzaChvYmpba2V5XSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIFV0aWwuZmxhdHRlbihhcnJheSk7XG4gIH1cblxuICBzdGF0aWMgcGFyc2VJY29uUG9zaXRpb24odmFsdWU6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gZGVmYXVsdFZhbHVlIHx8IENvZGVzLklDT05fUE9TSVRJT05fTEVGVDtcbiAgICBjb25zdCBhdmFpbGFibGVQb3NpdGlvbnMgPSBbQ29kZXMuSUNPTl9QT1NJVElPTl9MRUZULCBDb2Rlcy5JQ09OX1BPU0lUSU9OX1JJR0hUXTtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBpZiAoYXZhaWxhYmxlUG9zaXRpb25zLmluZGV4T2YocmVzdWx0KSA9PT0gLTEpIHtcbiAgICAgIHJlc3VsdCA9IGRlZmF1bHRWYWx1ZSB8fCBDb2Rlcy5JQ09OX1BPU0lUSU9OX0xFRlQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgY29weVRvQ2xpcGJvYXJkKGRhdGE6IHN0cmluZykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvcHknLCAoZTogQ2xpcGJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGUuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCd0ZXh0L3BsYWluJywgZGF0YSk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjb3B5JywgbnVsbCk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgfVxuXG4gIHN0YXRpYyBjaGVja1BpeGVsc1ZhbHVlU3RyaW5nKHZhbHVlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJ3B4JykgOiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBleHRyYWN0UGl4ZWxzVmFsdWUodmFsdWU6IGFueSwgZGVmYXVsdFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzdWx0OiBudW1iZXIgPSB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiB1bmRlZmluZWQ7XG4gICAgaWYgKFV0aWwuY2hlY2tQaXhlbHNWYWx1ZVN0cmluZyh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWUuc3Vic3RyKDAsIHZhbHVlLmxlbmd0aCAtICdweCcubGVuZ3RoKSk7XG4gICAgICByZXN1bHQgPSBpc05hTihwYXJzZWQpID8gZGVmYXVsdFZhbHVlIDogcGFyc2VkO1xuICAgIH1cbiAgICByZXR1cm4gVXRpbC5pc0RlZmluZWQocmVzdWx0KSA/IHJlc3VsdCA6IGRlZmF1bHRWYWx1ZTtcbiAgfVxuICAvKipcbiAgICogQWRkZWQgY2xhc3MgJ2FjY2VudCcgaW4gPG1hdC1mb3JtLWZpZWxkPiBhbmQgc2V0IHRoZSBjb2xvciAgYWNjZW50IGluIHRoZSBpY29uc1xuICAgKiBAcGFyYW0gZWxSZWZcbiAgICogQHBhcmFtIG9JbnB1dHNPcHRpb25zXG4gICAqL1xuXG4gIHN0YXRpYyBwYXJzZU9JbnB1dHNPcHRpb25zKGVsUmVmLCBvSW5wdXRzT3B0aW9ucykge1xuXG4gICAgaWYgKG9JbnB1dHNPcHRpb25zLmljb25Db2xvciA9PT0gQ29kZXMuT19JTlBVVFNfT1BUSU9OU19DT0xPUl9BQ0NFTlQpIHtcbiAgICAgIGNvbnN0IG1hdEZvcm1GaWVsZEVMID0gZWxSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbWF0LWZvcm0tZmllbGQnKVswXTtcbiAgICAgIGlmIChVdGlsLmlzRGVmaW5lZChtYXRGb3JtRmllbGRFTCkpIHtcbiAgICAgICAgbWF0Rm9ybUZpZWxkRUwuY2xhc3NMaXN0LmFkZCgnYWNjZW50Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogIFJldHVybiBzdHJpbmcgd2l0aCBlc2NhcGVkIHNwZWNpYWwgY2hhcmFjdGVyXG4gICAqL1xuICBzdGF0aWMgZXNjYXBlU3BlY2lhbENoYXJhY3RlcihTOiBzdHJpbmcpOiBzdHJpbmcge1xuXG4gICAgY29uc3Qgc3RyID0gU3RyaW5nKFMpO1xuXG4gICAgY29uc3QgY3BMaXN0ID0gQXJyYXkuZnJvbShzdHJbU3ltYm9sLml0ZXJhdG9yXSgpKTtcblxuICAgIGNvbnN0IGN1TGlzdCA9IFtdO1xuICAgIGZvciAoY29uc3QgYyBvZiBjcExpc3QpIHtcbiAgICAgIC8vIGkuIElmIGMgaXMgYSBTcGVjaWFsQ2hhcmFjdGVyIHRoZW4gZG86XG4gICAgICBpZiAoJ14kXFxcXC4qKz8oKVtde318Jy5pbmRleE9mKGMpICE9PSAtMSkge1xuICAgICAgICAvLyBhLiBBcHBlbmQgXCJcXFwiIHRvIGN1TGlzdC5cbiAgICAgICAgY3VMaXN0LnB1c2goJ1xcXFwnKTtcbiAgICAgIH1cbiAgICAgIC8vIEFwcGVuZCBjIHRvIGNwTGlzdC5cbiAgICAgIGN1TGlzdC5wdXNoKGMpO1xuICAgIH1cbiAgICBjb25zdCBMID0gY3VMaXN0LmpvaW4oJycpO1xuICAgIHJldHVybiBMO1xuXG4gIH1cblxuICBzdGF0aWMgaXNBcnJheUVxdWFsKGFycmF5MTogQXJyYXk8YW55PiwgYXJyYXkyOiBBcnJheTxhbnk+KSB7XG4gICAgcmV0dXJuIGFycmF5MS5sZW5ndGggPT09IGFycmF5Mi5sZW5ndGggJiYgYXJyYXkxLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSBhcnJheTJbaV0pXG4gIH07XG5cbiAgc3RhdGljIGRpZmZlcmVuY2VBcnJheXMoYXJyYXkxOiBBcnJheTxhbnk+LCBhcnJheTI6IEFycmF5PGFueT4pOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCBkaWZmZXJlbmNlID0gYXJyYXkxLmZpbHRlcihvYmogPT4ge1xuICAgICAgcmV0dXJuICFhcnJheTIuc29tZShvYmoyID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKG9iaiwgb2JqMik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGlmZmVyZW5jZTtcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0VG9PRGF0ZVZhbHVlVHlwZSh2YWw6IGFueSk6IE9EYXRlVmFsdWVUeXBlIHtcbiAgICBsZXQgcmVzdWx0OiBPRGF0ZVZhbHVlVHlwZSA9ICd0aW1lc3RhbXAnO1xuICAgIGNvbnN0IGxvd2VyVmFsID0gKHZhbCB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobG93ZXJWYWwgPT09ICdzdHJpbmcnIHx8IGxvd2VyVmFsID09PSAnZGF0ZScgfHwgbG93ZXJWYWwgPT09ICd0aW1lc3RhbXAnIHx8IGxvd2VyVmFsID09PSAnaXNvLTg2MDEnKSB7XG4gICAgICByZXN1bHQgPSBsb3dlclZhbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG5cbiAgc3RhdGljIHVuaXF1ZUJ5KGE6IEFycmF5PGFueT4sIGtleSkge1xuICAgIGNvbnN0IHNlZW4gPSB7fTtcbiAgICByZXR1cm4gYS5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGsgPSBrZXkoaXRlbSk7XG4gICAgICByZXR1cm4gc2Vlbi5oYXNPd25Qcm9wZXJ0eShrKSA/IGZhbHNlIDogKHNlZW5ba10gPSB0cnVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlcyB0d28gc3RyaW5ncyBhbmQgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGlmIGZpcnN0IGFyZ3VtZW50IGlzIGxlc3MgdGhhbiBzZWNvbmQgYXJndW1lbnQsIHplcm8gaWYgdGhleSdyZSBlcXVhbCBhbmQgYSBwb3NpdGl2ZSB2YWx1ZSBvdGhlcndpc2UuXG4gICAqL1xuICBzdGF0aWMgY29tcGFyZShhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKGEgPCBiKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGlmIChhID4gYikge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgc3RhdGljIHBhcnNlQnlWYWx1ZVR5cGUodmFsdWU6IGFueSwgdmFsdWVUeXBlOiBPRGF0ZVZhbHVlVHlwZSwgZm9ybWF0OiBzdHJpbmcpIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gdmFsdWU7XG4gICAgY29uc3QgbSA9IG1vbWVudCh2YWx1ZSk7XG4gICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG4gICAgc3dpdGNoICh2YWx1ZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJlc3VsdCA9IG0uZm9ybWF0KGZvcm1hdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIHJlc3VsdCA9IG0udG9EYXRlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaXNvLTg2MDEnOlxuICAgICAgICByZXN1bHQgPSBtLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGltZXN0YW1wJzpcbiAgICAgICAgcmVzdWx0ID0gbS52YWx1ZU9mKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmVzdWx0ID0gdm9pZCAwO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHN0YXRpYyB3cmFwSW50b09ic2VydmFibGU8VD4odmFsdWU6IFQgfCBQcm9taXNlPFQ+IHwgT2JzZXJ2YWJsZTxUPik6IE9ic2VydmFibGU8VD4ge1xuICAgIGlmIChpc09ic2VydmFibGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKFV0aWwuaXNQcm9taXNlKHZhbHVlKSkge1xuICAgICAgLy8gVXNlIGBQcm9taXNlLnJlc29sdmUoKWAgdG8gd3JhcCBwcm9taXNlLWxpa2UgaW5zdGFuY2VzLlxuICAgICAgcmV0dXJuIGZyb20oUHJvbWlzZS5yZXNvbHZlKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mKHZhbHVlKTtcbiAgfVxuXG4gIHN0YXRpYyBpc1Byb21pc2U8VCA9IGFueT4ob2JqOiBhbnkpOiBvYmogaXMgUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuICEhb2JqICYmIHR5cGVvZiBvYmoudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG5cbiAgc3RhdGljIGlzSnNvbkFwaVNlcnZpY2UoaW5qZWN0b3I6IEluamVjdG9yKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29uZmlnID0gaW5qZWN0b3IuZ2V0KEFwcENvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuc2VydmljZVR5cGUgPT09ICdKU09OQVBJJyB8fFxuICAgICAgY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5zZXJ2aWNlVHlwZSBpbnN0YW5jZW9mIEpTT05BUElTZXJ2aWNlO1xuICB9XG5cbiAgc3RhdGljIGlzT250aW1pemVFRVNlcnZpY2UoaW5qZWN0b3I6IEluamVjdG9yKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29uZmlnID0gaW5qZWN0b3IuZ2V0KEFwcENvbmZpZyk7XG4gICAgcmV0dXJuIChjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLnNlcnZpY2VUeXBlID09PSAnT250aW1pemVFRScgfHxcbiAgICAgIGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuc2VydmljZVR5cGUgaW5zdGFuY2VvZiBPbnRpbWl6ZUVFU2VydmljZSkgfHxcbiAgICAgIChjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLnNlcnZpY2VUeXBlID09PSAnT250aW1pemUnIHx8XG4gICAgICAgIGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuc2VydmljZVR5cGUgaW5zdGFuY2VvZiBPbnRpbWl6ZVNlcnZpY2UpO1xuICB9XG5cbiAgc3RhdGljIGNvbmZpZ3VyZVNlcnZpY2UoY29uZmlndXJlU2VydmljZUFyZ3M6IE9Db25maWd1cmVTZXJ2aWNlQXJncyk6IGFueSB7XG4gICAgY29uc3QgYmFzZVNlcnZpY2UgPSBjb25maWd1cmVTZXJ2aWNlQXJncy5iYXNlU2VydmljZTtcbiAgICBjb25zdCBlbnRpdHkgPSBjb25maWd1cmVTZXJ2aWNlQXJncy5lbnRpdHk7XG4gICAgY29uc3Qgc2VydmljZSA9IGNvbmZpZ3VyZVNlcnZpY2VBcmdzLnNlcnZpY2U7XG4gICAgY29uc3QgaW5qZWN0b3IgPSBjb25maWd1cmVTZXJ2aWNlQXJncy5pbmplY3RvcjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IGluamVjdG9yLmdldChBcHBDb25maWcpO1xuICAgIGNvbnN0IHNlcnZpY2VDb25maWd1cmF0aW9uID0gY29uZmlnLmdldFNlcnZpY2VDb25maWd1cmF0aW9uKCk7XG4gICAgY29uc3Qgc2VydmljZUNvbmZpZ3VyYXRpb25UeXBlID0gc2VydmljZUNvbmZpZ3VyYXRpb25bc2VydmljZV0/LnNlcnZpY2VUeXBlO1xuICAgIGNvbnN0IHNlcnZpY2VUeXBlID0gY29uZmlndXJlU2VydmljZUFyZ3Muc2VydmljZVR5cGUgfHwgc2VydmljZUNvbmZpZ3VyYXRpb25UeXBlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBkYXRhU2VydmljZSA9IHRoaXMuZ2V0RGF0YVNlcnZpY2VJbnN0YW5jZShzZXJ2aWNlVHlwZSwgYmFzZVNlcnZpY2UsIGluamVjdG9yKTtcblxuICAgICAgaWYgKFV0aWwuaXNEYXRhU2VydmljZShkYXRhU2VydmljZSkpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZUNmZyA9IGRhdGFTZXJ2aWNlLmdldERlZmF1bHRTZXJ2aWNlQ29uZmlndXJhdGlvbihzZXJ2aWNlKTtcbiAgICAgICAgaWYgKGVudGl0eSkge1xuICAgICAgICAgIHNlcnZpY2VDZmcuZW50aXR5ID0gZW50aXR5O1xuICAgICAgICB9XG4gICAgICAgIGRhdGFTZXJ2aWNlLmNvbmZpZ3VyZVNlcnZpY2Uoc2VydmljZUNmZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVNlcnZpY2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0RGF0YVNlcnZpY2VJbnN0YW5jZShzZXJ2aWNlVHlwZTogYW55LCBiYXNlU2VydmljZTogYW55LCBpbmplY3RvcjogSW5qZWN0b3IpOiBhbnkge1xuICAgIGlmICghc2VydmljZVR5cGUpIHtcbiAgICAgIHJldHVybiBpbmplY3Rvci5nZXQ8YW55PihiYXNlU2VydmljZSk7XG4gICAgfVxuXG4gICAgaWYgKCFbU2VydmljZVR5cGUuT250aW1pemUsIFNlcnZpY2VUeXBlLk9udGltaXplRUUsIFNlcnZpY2VUeXBlLkpTT05BUEldLmluY2x1ZGVzKHNlcnZpY2VUeXBlKSkge1xuICAgICAgcmV0dXJuIFV0aWwuY3JlYXRlU2VydmljZUluc3RhbmNlQnlUeXBlKGluamVjdG9yLmdldDxhbnk+KHNlcnZpY2VUeXBlKSwgaW5qZWN0b3IpO1xuICAgIH1cblxuICAgIHJldHVybiBVdGlsLmNyZWF0ZVNlcnZpY2VJbnN0YW5jZUJ5VHlwZShzZXJ2aWNlVHlwZSwgaW5qZWN0b3IpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZUJ5VHlwZShzZXJ2aWNlVHlwZTogU2VydmljZVR5cGUsIGluamVjdG9yOiBJbmplY3Rvcik6IGFueSB7XG4gICAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKHNlcnZpY2VUeXBlKSB8fCBTZXJ2aWNlVHlwZS5PbnRpbWl6ZUVFID09PSBzZXJ2aWNlVHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IE9udGltaXplRUVTZXJ2aWNlKGluamVjdG9yKTtcbiAgICAgIH1cbiAgICAgIGlmIChTZXJ2aWNlVHlwZS5PbnRpbWl6ZSA9PT0gc2VydmljZVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbnRpbWl6ZVNlcnZpY2UoaW5qZWN0b3IpO1xuICAgICAgfVxuICAgICAgaWYgKFNlcnZpY2VUeXBlLkpTT05BUEkgPT09IHNlcnZpY2VUeXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgSlNPTkFQSVNlcnZpY2UoaW5qZWN0b3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFV0aWwuY3JlYXRlU2VydmljZUluc3RhbmNlKHNlcnZpY2VUeXBlLCBpbmplY3Rvcik7XG5cbiAgfVxuICAvKipcbiAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVkIHNlcnZpY2UgY2xhc3NcbiAqIEBwYXJhbSBjbGF6eiB0aGUgY2xhc3MgcmVmZXJlbmNlXG4gKiBAcGFyYW0gaW5qZWN0b3IgdGhlIGluamVjdG9yXG4gKi9cbiAgc3RhdGljIGNyZWF0ZVNlcnZpY2VJbnN0YW5jZShjbGF6ejogYW55LCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICBpZiAoIVV0aWwuaXNEZWZpbmVkKGNsYXp6KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IGNsYXp6KGluamVjdG9yKTtcbiAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gIH1cblxuICBzdGF0aWMgY29uZmlndXJlTWVzc2FnZVNlcnZpY2UoY29uZmlndXJlU2VydmljZUFyZ3M6IE9Db25maWd1cmVNZXNzYWdlU2VydmljZUFyZ3MpOiBhbnkge1xuICAgIGxldCBtZXNzYWdlU2VydmljZSA9IGNvbmZpZ3VyZVNlcnZpY2VBcmdzLmJhc2VTZXJ2aWNlO1xuICAgIGNvbnN0IHNlcnZpY2VUeXBlID0gY29uZmlndXJlU2VydmljZUFyZ3Muc2VydmljZVR5cGU7XG4gICAgY29uc3QgaW5qZWN0b3IgPSBjb25maWd1cmVTZXJ2aWNlQXJncy5pbmplY3RvcjtcblxuICAgIGlmIChzZXJ2aWNlVHlwZSkge1xuICAgICAgbWVzc2FnZVNlcnZpY2UgPSBzZXJ2aWNlVHlwZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIG1lc3NhZ2VTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0PGFueT4obWVzc2FnZVNlcnZpY2UpO1xuICAgICAgaWYgKHNlcnZpY2VUeXBlKSB7XG4gICAgICAgIG1lc3NhZ2VTZXJ2aWNlID0gVXRpbC5jcmVhdGVTZXJ2aWNlSW5zdGFuY2UobWVzc2FnZVNlcnZpY2UsIGluamVjdG9yKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlU2VydmljZTtcbiAgfVxuXG4gIHN0YXRpYyBpc0Jhc2U2NChmaWxlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cCgvXihbQS1aYS16MC05K1xcL117NH0pKihbQS1aYS16MC05K1xcL117NH18W0EtWmEtejAtOStcXC9dezN9PXxbQS1aYS16MC05K1xcL117Mn09PSkkL2cpXG5cbiAgICBpZiAoZmlsZS5zdWJzdHJpbmcoMCwgNCkgPT09ICdkYXRhJykge1xuICAgICAgZmlsZSA9IGZpbGUuc3Vic3RyaW5nKGZpbGUuaW5kZXhPZignYmFzZTY0JykgKyA3KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdHRlcm4udGVzdChmaWxlLnJlcGxhY2UoL1xccysvZywgJycpKTtcblxuICB9XG4gIC8qKlxuICogQ29udmVydHMgYW4gb2JqZWN0IHRvIGEgSlNPTiBzdHJpbmcsIGF2b2lkaW5nIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4gKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gY29udmVydCB0byBKU09OLlxuICogQHJldHVybnMgQSBKU09OIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG9iamVjdC5cbiAqL1xuICBzdGF0aWMgc3RyaW5naWZ5KG9iajogb2JqZWN0KSB7XG4gICAgbGV0IGNhY2hlID0gW107XG4gICAgbGV0IHN0ciA9IEpTT04uc3RyaW5naWZ5KG9iaiwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGNhY2hlLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgICAgIHJldHVybjsgLy8gQXZvaWQgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICAgICAgICB9XG4gICAgICAgIGNhY2hlLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICAgIGNhY2hlID0gbnVsbDtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgc3RhdGljIHJlYWRvbmx5IG9iamVjdFRvUXVlcnlTdHJpbmcgPSAoaW5pdGlhbE9iaikgPT4ge1xuICAgIGNvbnN0IHJlZHVjZXIgPSAob2JqLCBwYXJlbnRQcmVmaXggPSBudWxsKSA9PiAocHJldiwga2V5KSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSBvYmpba2V5XTtcbiAgICAgIGtleSA9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpO1xuICAgICAgbGV0IHByZWZpeDogc3RyaW5nO1xuICAgICAgaWYgKGtleSA9PT0gJ2ZpbHRlclBhcmVudEtleXMnKSB7XG4gICAgICAgIHByZWZpeCA9IHBhcmVudFByZWZpeDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByZWZpeCA9IHBhcmVudFByZWZpeCA/IGAke3BhcmVudFByZWZpeH1bJHtrZXl9XWAgOiBrZXk7XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT09ICdmaWx0ZXInICYmICFVdGlsLmlzT2JqZWN0RW1wdHkob2JqW2tleV0pKSB7XG4gICAgICAgIHByZXYucHVzaChPYmplY3Qua2V5cyh2YWwpLm1hcChpdGVtZmlsdGVyID0+IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJLZXkgPSBgZmlsdGVyWyR7aXRlbWZpbHRlcn1dYDtcbiAgICAgICAgICBpZiAoVXRpbC5pc09iamVjdCh2YWxbaXRlbWZpbHRlcl0pKSB7XG4gICAgICAgICAgICAvKiogSW4gY2FzZSBmaWx0ZXIgYW5kIGJhc2ljIGV4cHJlc2lvbiovXG4gICAgICAgICAgICByZXR1cm4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbHRlcktleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHZhbFtpdGVtZmlsdGVyXSkpfWA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qKiBJbiBjYXNlIHRoZSBzaW1wbGUgZmlsdGVyIHRvIGVzcGFwZSBxdW90ZXMqL1xuICAgICAgICAgICAgcmV0dXJuIGAke2VuY29kZVVSSUNvbXBvbmVudChmaWx0ZXJLZXkpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWxbaXRlbWZpbHRlcl0pfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9KS5qb2luKCcmJykpO1xuXG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfVxuXG5cbiAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByZXYucHVzaChgJHtlbmNvZGVVUklDb21wb25lbnQocHJlZml4KX09YCk7XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfVxuXG4gICAgICBpZiAoWydudW1iZXInLCAnYm9vbGVhbicsICdzdHJpbmcnXS5pbmNsdWRlcyh0eXBlb2YgdmFsKSkge1xuICAgICAgICBwcmV2LnB1c2goYCR7ZW5jb2RlVVJJQ29tcG9uZW50KHByZWZpeCl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbCl9YCk7XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfVxuXG4gICAgICBwcmV2LnB1c2goT2JqZWN0LmtleXModmFsKS5yZWR1Y2UocmVkdWNlcih2YWwsIHByZWZpeCksIFtdKS5qb2luKCcmJykpO1xuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhpbml0aWFsT2JqKS5yZWR1Y2UocmVkdWNlcihpbml0aWFsT2JqKSwgW10pLmpvaW4oJyYnKTtcbiAgfTtcblxuICAvKipcbiAgICogTWFwIGtleXMgb2Ygb2JqZWN0XG4gICAqIEZvciBleGFtcGxlOiBjb252ZXJ0aW5nIHRoZSBrZXlzIG9mIGFuIG9iamVjdCB0byB1cHBlcmNhc2VcbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBtYXBLZXlzID0gKG9iaiwgZm4pID0+XG4gICAgT2JqZWN0LmtleXMob2JqKS5yZWR1Y2UoKGFjYywgaykgPT4ge1xuICAgICAgYWNjW2ZuKG9ialtrXSwgaywgb2JqKV0gPSBvYmpba107XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICBzdGF0aWMgcmVhZG9ubHkgbWFwVmFsdWVzID0gKG9iaiwgZm4pID0+XG4gICAgT2JqZWN0LmtleXMob2JqKS5yZWR1Y2UoKGFjYywgaykgPT4gKHsgLi4uYWNjLCBba106IGZuKG9ialtrXSkgfSksIHt9KTtcblxuXG4gIHN0YXRpYyB0b0xvd2VyQ2FzZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHRvVXBwZXJDYXNlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuXG4gIHN0YXRpYyBwYXJzZVRvTG93ZXJDYXNlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoVXRpbC5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLm1hcCgoeDogc3RyaW5nKSA9PiB4LnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gVXRpbC5tYXBLZXlzKHZhbHVlLCBVdGlsLnRvTG93ZXJDYXNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc3RhdGljIHBhcnNlVG9VcHBlckNhc2UodmFsdWU6IGFueSkge1xuICAgIGlmIChVdGlsLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKCh4OiBzdHJpbmcpID0+IHgudG9Mb2NhbGVVcHBlckNhc2UoKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWUudG9Mb2NhbGVVcHBlckNhc2UoKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBVdGlsLm1hcEtleXModmFsdWUsIFV0aWwudG9VcHBlckNhc2UpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzdGF0aWMgc29ydEZ1bmN0aW9uKHByb3BlcnR5QTogc3RyaW5nIHwgbnVtYmVyLCBwcm9wZXJ0eUI6IHN0cmluZyB8IG51bWJlciwgYWN0aXZlU29ydERpcmVjdGlvbjogc3RyaW5nKSB7XG5cbiAgICBsZXQgdmFsdWVBOiBzdHJpbmcgfCBudW1iZXIgPSAnJztcbiAgICBsZXQgdmFsdWVCOiBzdHJpbmcgfCBudW1iZXIgPSAnJztcblxuICAgIGlmIChVdGlsLmlzRGVmaW5lZChwcm9wZXJ0eUEpKSB7XG4gICAgICB2YWx1ZUEgPSBpc05hTigrcHJvcGVydHlBKSA/IHByb3BlcnR5QS50b1N0cmluZygpLnRyaW0oKS50b0xvd2VyQ2FzZSgpIDogK3Byb3BlcnR5QTtcbiAgICB9XG5cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQocHJvcGVydHlCKSkge1xuICAgICAgdmFsdWVCID0gaXNOYU4oK3Byb3BlcnR5QikgPyBwcm9wZXJ0eUIudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKSA6ICtwcm9wZXJ0eUI7XG4gICAgfVxuICAgIHJldHVybiAodmFsdWVBIDw9IHZhbHVlQiA/IC0xIDogMSkgKiAoYWN0aXZlU29ydERpcmVjdGlvbiA9PT0gJ2FzYycgPyAxIDogLTEpO1xuICB9XG5cbiAgc3RhdGljIGNsb25lQXJyYXk8VD4oYXJyOiBUW10pOiBUW10ge1xuICAgIGNvbnN0IGNsb25lZEFycmF5ID0gYXJyLm1hcCgoeCkgPT4gT2JqZWN0LmFzc2lnbih7fSwgeCkpXG4gICAgcmV0dXJuIGNsb25lZEFycmF5O1xuICB9XG5cbiAgc3RhdGljIGdldExhc3RBY3RpdmF0ZVJvdXRlKHJvdXRlU25hcHNob3Q6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHtcbiAgICBsZXQgY2hpbGQgPSByb3V0ZVNuYXBzaG90O1xuICAgIHdoaWxlIChjaGlsZC5maXJzdENoaWxkKSB7XG4gICAgICBjaGlsZCA9IGNoaWxkLmZpcnN0Q2hpbGQ7XG4gICAgfVxuICAgIHJldHVybiBjaGlsZDtcbiAgfVxufVxuIl19
567
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi91dGlsL3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQVExRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXhFLE1BQU0sT0FBTyxJQUFJO0lBSWYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFRO1FBQ3RCLE1BQU0sT0FBTyxHQUFHLE9BQU8sR0FBRyxDQUFDO1FBQzNCLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFRO1FBQ3JCLE9BQU8sR0FBRyxZQUFZLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFhLEVBQUUsWUFBc0I7UUFDdkQsSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUU7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RUFBRSxFQUFFLEVBQUUsRUFBRSxDQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgZnJvbSwgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJRGF0YVNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2RhdGEtc2VydmljZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUZvcm1EYXRhQ29tcG9uZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9mb3JtLWRhdGEtY29tcG9uZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJUGVybWlzc2lvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9wZXJtaXNzaW9ucy1zZXJ2aWNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBPQ29uZmlndXJlTWVzc2FnZVNlcnZpY2VBcmdzIH0gZnJvbSAnLi4vdHlwZXMvY29uZmlndXJlLW1lc3NhZ2Utc2VydmljZS1hcmdzLnR5cGUnO1xuaW1wb3J0IHsgT0NvbmZpZ3VyZVNlcnZpY2VBcmdzIH0gZnJvbSAnLi4vdHlwZXMvY29uZmlndXJlLXNlcnZpY2UtYXJncy50eXBlJztcbmltcG9ydCB7IE9EYXRlVmFsdWVUeXBlIH0gZnJvbSAnLi4vdHlwZXMvby1kYXRlLXZhbHVlLnR5cGUnO1xuaW1wb3J0IHsgQmFzZTY0IH0gZnJvbSAnLi9iYXNlNjQnO1xuaW1wb3J0IHsgQ29kZXMgfSBmcm9tICcuL2NvZGVzJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQXBwQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2FwcC1jb25maWcnO1xuaW1wb3J0IHsgU2VydmljZVR5cGUgfSBmcm9tICcuLi90eXBlcy9zZXJ2aWNlLXR5cGUudHlwZSc7XG5pbXBvcnQgeyBKU09OQVBJU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2pzb25hcGkvanNvbmFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IE9udGltaXplRUVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvb250aW1pemUvb250aW1pemUtZWUuc2VydmljZSc7XG5pbXBvcnQgeyBPbnRpbWl6ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9vbnRpbWl6ZS9vbnRpbWl6ZS5zZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFV0aWwge1xuXG4gIHN0YXRpYyByZWFkb25seSBjb2x1bW5BZ2dyZWdhdGVzID0gWydzdW0nLCAnY291bnQnLCAnYXZnJywgJ21pbicsICdtYXgnXTtcblxuICBzdGF0aWMgaXNPYmplY3QodmFsOiBhbnkpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWxUeXBlID0gdHlwZW9mIHZhbDtcbiAgICByZXR1cm4gdmFsVHlwZSA9PT0gJ29iamVjdCc7XG4gIH1cblxuICBzdGF0aWMgaXNBcnJheSh2YWw6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWwgaW5zdGFuY2VvZiBBcnJheTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUJvb2xlYW4odmFsdWU6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICgodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgJiYgKHZhbHVlLnRvVXBwZXJDYXNlKCkgPT09ICdUUlVFJyB8fCB2YWx1ZS50b1VwcGVyQ2FzZSgpID09PSAnWUVTJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpICYmICh2YWx1ZS50b1VwcGVyQ2FzZSgpID09PSAnRkFMU0UnIHx8IHZhbHVlLnRvVXBwZXJDYXNlKCkgPT09ICdOTycpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChVdGlsLmlzRGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgcGFyc2VBcnJheSh2YWx1ZTogc3RyaW5nLCBleGNsdWRlUmVwZWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZ1tdIHtcbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZS5zcGxpdChDb2Rlcy5BUlJBWV9JTlBVVF9TRVBBUkFUT1IpO1xuICAgIH1cbiAgICBpZiAoZXhjbHVkZVJlcGVhdGVkICYmIHJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICByZXN1bHQgPSBBcnJheS5mcm9tKG5ldyBTZXQocmVzdWx0KSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBwYXJlbnQga2V5cyBlcXVpdmFsZW5jZXMuXG4gICAqIEBwYXJhbSAgcEtleXNBcnJheSBBcnJheSBvZiBzdHJpbmdzLiBBY2NlcHRlZCBmb3JtYXQ6IGtleSB8IGtleTphbGlhc1xuICAgKiBAcmV0dXJucyBPYmplY3RcbiAgICovXG4gIHN0YXRpYyBwYXJzZVBhcmVudEtleXNFcXVpdmFsZW5jZXMocEtleXNBcnJheTogQXJyYXk8c3RyaW5nPiwgc2VwYXJhdG9yOiBzdHJpbmcgPSAnOicpOiBvYmplY3Qge1xuICAgIGNvbnN0IGVxdWl2YWxlbmNlcyA9IHt9O1xuICAgIGlmIChwS2V5c0FycmF5ICYmIHBLZXlzQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgcEtleXNBcnJheS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBhdXggPSBpdGVtLnNwbGl0KHNlcGFyYXRvcik7XG4gICAgICAgIGlmIChhdXggJiYgYXV4Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGlmICgvLitcXFsuK1xcXS8udGVzdChhdXhbMV0pKSB7XG4gICAgICAgICAgICBjb25zdCBlcXVpdktleSA9IGF1eFsxXS5zdWJzdHJpbmcoMCwgYXV4WzFdLmluZGV4T2YoJ1snKSk7XG4gICAgICAgICAgICBjb25zdCBlcXVpdlZhbHVlID0gYXV4WzFdLnN1YnN0cmluZyhhdXhbMV0uaW5kZXhPZignWycpICsgMSwgYXV4WzFdLmluZGV4T2YoJ10nKSk7XG4gICAgICAgICAgICBjb25zdCBlcXVpdiA9IHt9O1xuICAgICAgICAgICAgZXF1aXZbZXF1aXZLZXldID0gZXF1aXZWYWx1ZTtcbiAgICAgICAgICAgIGVxdWl2YWxlbmNlc1thdXhbMF1dID0gZXF1aXY7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVxdWl2YWxlbmNlc1thdXhbMF1dID0gYXV4WzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhdXggJiYgYXV4Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGVxdWl2YWxlbmNlc1tpdGVtXSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZXF1aXZhbGVuY2VzO1xuICB9XG5cbiAgc3RhdGljIGVuY29kZVBhcmVudEtleXMocGFyZW50S2V5czogb2JqZWN0KTogc3RyaW5nIHtcbiAgICBsZXQgZW5jb2RlZDogc3RyaW5nID0gJyc7XG4gICAgaWYgKHBhcmVudEtleXMpIHtcbiAgICAgIGVuY29kZWQgPSBCYXNlNjQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHBhcmVudEtleXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuY29kZWQ7XG4gIH1cblxuICBzdGF0aWMgZGVjb2RlUGFyZW50S2V5cyhwYXJlbnRLZXlzOiBzdHJpbmcpOiBvYmplY3Qge1xuICAgIGxldCBkZWNvZGVkID0ge307XG4gICAgaWYgKHBhcmVudEtleXMgJiYgcGFyZW50S2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkID0gQmFzZTY0LmRlY29kZShwYXJlbnRLZXlzKTtcbiAgICAgIGRlY29kZWQgPSBKU09OLnBhcnNlKGQpO1xuICAgIH1cbiAgICByZXR1cm4gZGVjb2RlZDtcbiAgfVxuXG4gIHN0YXRpYyBpc0FycmF5RW1wdHkoYXJyYXk6IGFueVtdKTogYm9vbGVhbiB7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChhcnJheSkgfHwgYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGlzT2JqZWN0RW1wdHkob2JqOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDA7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdldGhlciBzcGVjaWZpZWQgc2VydmljZSBhcyBhcmd1bWVudCBpbXBsZW1lbnRzICdJRGF0YVNlcnZpY2UnIGludGVyZmFjZVxuICAgKiBAcGFyYW0gYXJnIFRoZSBzZXJ2aWNlIGluc3RhbmNlIGZvciBjaGVja2luZy5cbiAgICogQHJldHVybnMgYm9vbGVhblxuICAgKi9cbiAgc3RhdGljIGlzRGF0YVNlcnZpY2UoYXJnOiBhbnkpOiBhcmcgaXMgSURhdGFTZXJ2aWNlIHtcbiAgICBpZiAoYXJnID09PSB1bmRlZmluZWQgfHwgYXJnID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoKGFyZyBhcyBJRGF0YVNlcnZpY2UpLmdldERlZmF1bHRTZXJ2aWNlQ29uZmlndXJhdGlvbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoYXJnIGFzIElEYXRhU2VydmljZSkuY29uZmlndXJlU2VydmljZSAhPT0gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2V0aGVyIHNwZWNpZmllZCBzZXJ2aWNlIGFzIGFyZ3VtZW50IGltcGxlbWVudHMgJ0lEYXRhU2VydmljZScgaW50ZXJmYWNlXG4gICAqIEBwYXJhbSBhcmcgVGhlIHNlcnZpY2UgaW5zdGFuY2UgZm9yIGNoZWNraW5nLlxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBzdGF0aWMgaXNQZXJtaXNzaW9uc1NlcnZpY2UoYXJnOiBhbnkpOiBhcmcgaXMgSVBlcm1pc3Npb25zU2VydmljZSB7XG4gICAgaWYgKGFyZyA9PT0gdW5kZWZpbmVkIHx8IGFyZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gKChhcmcgYXMgSVBlcm1pc3Npb25zU2VydmljZSkubG9hZFBlcm1pc3Npb25zICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3ZXRoZXIgc3BlY2lmaWVkIGNvbXBvbmVudCBhcyBhcmd1bWVudCBpbXBsZW1lbnRzICdJRm9ybURhdGFDb21wb25lbnQnIGludGVyZmFjZVxuICAgKiBAcGFyYW0gYXJnIFRoZSBjb21wb25lbnQgaW5zdGFuY2UgZm9yIGNoZWNraW5nLlxuICAgKiBAcmV0dXJucyBib29sZWFuXG4gICAqL1xuICBzdGF0aWMgaXNGb3JtRGF0YUNvbXBvbmVudChhcmc6IGFueSk6IGFyZyBpcyBJRm9ybURhdGFDb21wb25lbnQge1xuICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZCB8fCBhcmcgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICgoYXJnIGFzIElGb3JtRGF0YUNvbXBvbmVudCkuaXNBdXRvbWF0aWNCaW5kaW5nICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmUgaXMgZXF1YWwgdHdvIG9iamVjdHNcbiAgICogQHBhcmFtIGEgT2JqZWN0IDFcbiAgICogQHBhcmFtIGIgT2JqZWN0IDJcbiAgICpcbiAgICovXG4gIHN0YXRpYyBpc0VxdWl2YWxlbnQoYSwgYikge1xuICAgIC8vIENyZWF0ZSBhcnJheXMgb2YgcHJvcGVydHkgbmFtZXNcbiAgICBjb25zdCBhUHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKTtcbiAgICBjb25zdCBiUHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhiKTtcblxuICAgIC8vIElmIG51bWJlciBvZiBwcm9wZXJ0aWVzIGlzIGRpZmZlcmVudCwgb2JqZWN0cyBhcmUgbm90IGVxdWl2YWxlbnRcbiAgICBpZiAoYVByb3BzLmxlbmd0aCAhPT0gYlByb3BzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYVByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwcm9wTmFtZSA9IGFQcm9wc1tpXTtcbiAgICAgIC8vIElmIHZhbHVlcyBvZiBzYW1lIHByb3BlcnR5IGFyZSBub3QgZXF1YWwsIG9iamVjdHMgYXJlIG5vdCBlcXVpdmFsZW50XG4gICAgICBsZXQgYlZhbHVlID0gYltwcm9wTmFtZV07XG4gICAgICBpZiAodHlwZW9mIGFbcHJvcE5hbWVdID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25zdCBpbnRCID0gcGFyc2VJbnQoYlZhbHVlLCAxMCk7XG4gICAgICAgIGJWYWx1ZSA9IGlzTmFOKGludEIpID8gYlZhbHVlIDogaW50QjtcbiAgICAgIH1cbiAgICAgIGlmIChhW3Byb3BOYW1lXSAhPT0gYlZhbHVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBtYWRlIGl0IHRoaXMgZmFyLCBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnRcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHN0YXRpYyBlcXVhbHMobzE6IGFueSwgbzI6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmIChvMSA9PT0gbzIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobzEgPT09IG51bGwgfHwgbzIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG8xICE9PSBvMSAmJiBvMiAhPT0gbzIpIHtcbiAgICAgIC8vIE5hTiA9PT0gTmFOXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdDEgPSB0eXBlb2YgbzE7XG4gICAgY29uc3QgdDIgPSB0eXBlb2YgbzI7XG4gICAgbGV0IGxlbmd0aDogbnVtYmVyO1xuICAgIGxldCBrZXk6IGFueTtcbiAgICBsZXQga2V5U2V0OiBhbnk7XG4gICAgaWYgKHQxID09PSB0MiAmJiB0MSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG8xKSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobzIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxlbmd0aCA9IG8xLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gbzIubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBsZW5ndGg7IGtleSsrKSB7XG4gICAgICAgICAgICBpZiAoIVV0aWwuZXF1YWxzKG8xW2tleV0sIG8yW2tleV0pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG8yKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBrZXlTZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBmb3IgKGtleSBpbiBvMSkge1xuICAgICAgICAgIGlmICghVXRpbC5lcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAga2V5U2V0W2tleV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoa2V5IGluIG8yKSB7XG4gICAgICAgICAgaWYgKCEoa2V5IGluIGtleVNldCkgJiYgdHlwZW9mIG8yW2tleV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgaXNEZWZpbmVkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhIHJhbmRvbSBudW1iZXJcbiAgKi9cbiAgc3RhdGljIHJhbmRvbU51bWJlcigpIHtcbiAgICBjb25zdCByYW5kb21BcnJheSA9IG5ldyBVaW50MzJBcnJheSgxKTtcbiAgICB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21BcnJheSk7XG4gICAgcmV0dXJuIHJhbmRvbUFycmF5WzBdO1xuICB9XG5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcHJvdmlkZWQgc3RyaW5nIGluIGxvd2VyY2FzZSBhbmQgd2l0aG91dCBhY2NlbnQgbWFya3MuXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdGV4dCB0byBub3JtYWxpemVcbiAgICovXG4gIHN0YXRpYyBub3JtYWxpemVTdHJpbmcodmFsdWU6IHN0cmluZywgdG9Mb3dlckNhc2U6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdmFsdWUubm9ybWFsaXplKCdORkQnKS5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJyk7XG4gICAgICAgIGlmICh0b0xvd2VyQ2FzZSkge1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcm92aWRlZCBhcnJheSBmbGF0dGVuZC5cbiAgICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSB0byBmbGF0XG4gICAqL1xuICBzdGF0aWMgZmxhdHRlbihhcnJheTogQXJyYXk8YW55Pik6IEFycmF5PGFueT4ge1xuICAgIGxldCBmbGF0dGVuZWQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGN1cnJlbnQgb2YgYXJyYXkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgICAgICBmbGF0dGVuZWQucHVzaChjdXJyZW50KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkQ3VycmVudCBvZiBjdXJyZW50KSB7XG4gICAgICAgIGZsYXR0ZW5lZC5wdXNoKGNoaWxkQ3VycmVudClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZsYXR0ZW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IHdpdGggYWxsIHRoZSB2YWx1ZXMgZnJvbSB0aGUgcHJvdmlkZWQgb2JqZWN0LlxuICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3RcbiAgICovXG4gIHN0YXRpYyBnZXRWYWx1ZXNGcm9tT2JqZWN0KG9iajogb2JqZWN0ID0ge30pOiBBcnJheTxhbnk+IHtcbiAgICBjb25zdCBhcnJheTogQXJyYXk8YW55PiA9IFtdO1xuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYXJyYXkucHVzaChVdGlsLmdldFZhbHVlc0Zyb21PYmplY3Qob2JqW2tleV0pKTtcbiAgICAgIH1cbiAgICAgIGFycmF5LnB1c2gob2JqW2tleV0pO1xuICAgIH0pO1xuICAgIHJldHVybiBVdGlsLmZsYXR0ZW4oYXJyYXkpO1xuICB9XG5cbiAgc3RhdGljIHBhcnNlSWNvblBvc2l0aW9uKHZhbHVlOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdCA9IGRlZmF1bHRWYWx1ZSB8fCBDb2Rlcy5JQ09OX1BPU0lUSU9OX0xFRlQ7XG4gICAgY29uc3QgYXZhaWxhYmxlUG9zaXRpb25zID0gW0NvZGVzLklDT05fUE9TSVRJT05fTEVGVCwgQ29kZXMuSUNPTl9QT1NJVElPTl9SSUdIVF07XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCkge1xuICAgICAgcmVzdWx0ID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgaWYgKGF2YWlsYWJsZVBvc2l0aW9ucy5pbmRleE9mKHJlc3VsdCkgPT09IC0xKSB7XG4gICAgICByZXN1bHQgPSBkZWZhdWx0VmFsdWUgfHwgQ29kZXMuSUNPTl9QT1NJVElPTl9MRUZUO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIGNvcHlUb0NsaXBib2FyZChkYXRhOiBzdHJpbmcpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjb3B5JywgKGU6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgICBlLmNsaXBib2FyZERhdGEuc2V0RGF0YSgndGV4dC9wbGFpbicsIGRhdGEpO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29weScsIG51bGwpO1xuICAgIH0pO1xuICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gIH1cblxuICBzdGF0aWMgY2hlY2tQaXhlbHNWYWx1ZVN0cmluZyh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCdweCcpIDogZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgZXh0cmFjdFBpeGVsc1ZhbHVlKHZhbHVlOiBhbnksIGRlZmF1bHRWYWx1ZT86IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IHJlc3VsdDogbnVtYmVyID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICAgIGlmIChVdGlsLmNoZWNrUGl4ZWxzVmFsdWVTdHJpbmcodmFsdWUpKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHZhbHVlLnN1YnN0cigwLCB2YWx1ZS5sZW5ndGggLSAncHgnLmxlbmd0aCkpO1xuICAgICAgcmVzdWx0ID0gaXNOYU4ocGFyc2VkKSA/IGRlZmF1bHRWYWx1ZSA6IHBhcnNlZDtcbiAgICB9XG4gICAgcmV0dXJuIFV0aWwuaXNEZWZpbmVkKHJlc3VsdCkgPyByZXN1bHQgOiBkZWZhdWx0VmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIEFkZGVkIGNsYXNzICdhY2NlbnQnIGluIDxtYXQtZm9ybS1maWVsZD4gYW5kIHNldCB0aGUgY29sb3IgIGFjY2VudCBpbiB0aGUgaWNvbnNcbiAgICogQHBhcmFtIGVsUmVmXG4gICAqIEBwYXJhbSBvSW5wdXRzT3B0aW9uc1xuICAgKi9cblxuICBzdGF0aWMgcGFyc2VPSW5wdXRzT3B0aW9ucyhlbFJlZiwgb0lucHV0c09wdGlvbnMpIHtcblxuICAgIGlmIChvSW5wdXRzT3B0aW9ucy5pY29uQ29sb3IgPT09IENvZGVzLk9fSU5QVVRTX09QVElPTlNfQ09MT1JfQUNDRU5UKSB7XG4gICAgICBjb25zdCBtYXRGb3JtRmllbGRFTCA9IGVsUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ21hdC1mb3JtLWZpZWxkJylbMF07XG4gICAgICBpZiAoVXRpbC5pc0RlZmluZWQobWF0Rm9ybUZpZWxkRUwpKSB7XG4gICAgICAgIG1hdEZvcm1GaWVsZEVMLmNsYXNzTGlzdC5hZGQoJ2FjY2VudCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqICBSZXR1cm4gc3RyaW5nIHdpdGggZXNjYXBlZCBzcGVjaWFsIGNoYXJhY3RlclxuICAgKi9cbiAgc3RhdGljIGVzY2FwZVNwZWNpYWxDaGFyYWN0ZXIoUzogc3RyaW5nKTogc3RyaW5nIHtcblxuICAgIGNvbnN0IHN0ciA9IFN0cmluZyhTKTtcblxuICAgIGNvbnN0IGNwTGlzdCA9IEFycmF5LmZyb20oc3RyW1N5bWJvbC5pdGVyYXRvcl0oKSk7XG5cbiAgICBjb25zdCBjdUxpc3QgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgY3BMaXN0KSB7XG4gICAgICAvLyBpLiBJZiBjIGlzIGEgU3BlY2lhbENoYXJhY3RlciB0aGVuIGRvOlxuICAgICAgaWYgKCdeJFxcXFwuKis/KClbXXt9fCcuaW5kZXhPZihjKSAhPT0gLTEpIHtcbiAgICAgICAgLy8gYS4gQXBwZW5kIFwiXFxcIiB0byBjdUxpc3QuXG4gICAgICAgIGN1TGlzdC5wdXNoKCdcXFxcJyk7XG4gICAgICB9XG4gICAgICAvLyBBcHBlbmQgYyB0byBjcExpc3QuXG4gICAgICBjdUxpc3QucHVzaChjKTtcbiAgICB9XG4gICAgY29uc3QgTCA9IGN1TGlzdC5qb2luKCcnKTtcbiAgICByZXR1cm4gTDtcblxuICB9XG5cbiAgc3RhdGljIGlzQXJyYXlFcXVhbChhcnJheTE6IEFycmF5PGFueT4sIGFycmF5MjogQXJyYXk8YW55Pikge1xuICAgIHJldHVybiBhcnJheTEubGVuZ3RoID09PSBhcnJheTIubGVuZ3RoICYmIGFycmF5MS5ldmVyeSgodiwgaSkgPT4gdiA9PT0gYXJyYXkyW2ldKVxuICB9O1xuXG4gIHN0YXRpYyBkaWZmZXJlbmNlQXJyYXlzKGFycmF5MTogQXJyYXk8YW55PiwgYXJyYXkyOiBBcnJheTxhbnk+KTogQXJyYXk8YW55PiB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IGFycmF5MS5maWx0ZXIob2JqID0+IHtcbiAgICAgIHJldHVybiAhYXJyYXkyLnNvbWUob2JqMiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVxdWFscyhvYmosIG9iajIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRpZmZlcmVuY2U7XG4gIH1cblxuICBzdGF0aWMgY29udmVydFRvT0RhdGVWYWx1ZVR5cGUodmFsOiBhbnkpOiBPRGF0ZVZhbHVlVHlwZSB7XG4gICAgbGV0IHJlc3VsdDogT0RhdGVWYWx1ZVR5cGUgPSAndGltZXN0YW1wJztcbiAgICBjb25zdCBsb3dlclZhbCA9ICh2YWwgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGxvd2VyVmFsID09PSAnc3RyaW5nJyB8fCBsb3dlclZhbCA9PT0gJ2RhdGUnIHx8IGxvd2VyVmFsID09PSAndGltZXN0YW1wJyB8fCBsb3dlclZhbCA9PT0gJ2lzby04NjAxJykge1xuICAgICAgcmVzdWx0ID0gbG93ZXJWYWw7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuXG4gIHN0YXRpYyB1bmlxdWVCeShhOiBBcnJheTxhbnk+LCBrZXkpIHtcbiAgICBjb25zdCBzZWVuID0ge307XG4gICAgcmV0dXJuIGEuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBrID0ga2V5KGl0ZW0pO1xuICAgICAgcmV0dXJuIHNlZW4uaGFzT3duUHJvcGVydHkoaykgPyBmYWxzZSA6IChzZWVuW2tdID0gdHJ1ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZXMgdHdvIHN0cmluZ3MgYW5kIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZSBpZiBmaXJzdCBhcmd1bWVudCBpcyBsZXNzIHRoYW4gc2Vjb25kIGFyZ3VtZW50LCB6ZXJvIGlmIHRoZXkncmUgZXF1YWwgYW5kIGEgcG9zaXRpdmUgdmFsdWUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgc3RhdGljIGNvbXBhcmUoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGlmIChhIDwgYikge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBpZiAoYSA+IGIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUJ5VmFsdWVUeXBlKHZhbHVlOiBhbnksIHZhbHVlVHlwZTogT0RhdGVWYWx1ZVR5cGUsIGZvcm1hdDogc3RyaW5nKSB7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IHZhbHVlO1xuICAgIGNvbnN0IG0gPSBtb21lbnQodmFsdWUpO1xuICAgIGlmICghbS5pc1ZhbGlkKCkpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIHN3aXRjaCAodmFsdWVUeXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXN1bHQgPSBtLmZvcm1hdChmb3JtYXQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICByZXN1bHQgPSBtLnRvRGF0ZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2lzby04NjAxJzpcbiAgICAgICAgcmVzdWx0ID0gbS50b0lTT1N0cmluZygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RpbWVzdGFtcCc6XG4gICAgICAgIHJlc3VsdCA9IG0udmFsdWVPZigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgd3JhcEludG9PYnNlcnZhYmxlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZTxUPiB8IE9ic2VydmFibGU8VD4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBpZiAoaXNPYnNlcnZhYmxlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmIChVdGlsLmlzUHJvbWlzZSh2YWx1ZSkpIHtcbiAgICAgIC8vIFVzZSBgUHJvbWlzZS5yZXNvbHZlKClgIHRvIHdyYXAgcHJvbWlzZS1saWtlIGluc3RhbmNlcy5cbiAgICAgIHJldHVybiBmcm9tKFByb21pc2UucmVzb2x2ZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiBvZih2YWx1ZSk7XG4gIH1cblxuICBzdGF0aWMgaXNQcm9taXNlPFQgPSBhbnk+KG9iajogYW55KTogb2JqIGlzIFByb21pc2U8VD4ge1xuICAgIHJldHVybiAhIW9iaiAmJiB0eXBlb2Ygb2JqLnRoZW4gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuXG4gIHN0YXRpYyBpc0pzb25BcGlTZXJ2aWNlKGluamVjdG9yOiBJbmplY3Rvcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGluamVjdG9yLmdldChBcHBDb25maWcpO1xuICAgIHJldHVybiBjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLnNlcnZpY2VUeXBlID09PSAnSlNPTkFQSScgfHxcbiAgICAgIGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuc2VydmljZVR5cGUgaW5zdGFuY2VvZiBKU09OQVBJU2VydmljZTtcbiAgfVxuXG4gIHN0YXRpYyBpc09udGltaXplRUVTZXJ2aWNlKGluamVjdG9yOiBJbmplY3Rvcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGluamVjdG9yLmdldChBcHBDb25maWcpO1xuICAgIHJldHVybiAoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5zZXJ2aWNlVHlwZSA9PT0gJ09udGltaXplRUUnIHx8XG4gICAgICBjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLnNlcnZpY2VUeXBlIGluc3RhbmNlb2YgT250aW1pemVFRVNlcnZpY2UpIHx8XG4gICAgICAoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5zZXJ2aWNlVHlwZSA9PT0gJ09udGltaXplJyB8fFxuICAgICAgICBjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLnNlcnZpY2VUeXBlIGluc3RhbmNlb2YgT250aW1pemVTZXJ2aWNlKTtcbiAgfVxuXG4gIHN0YXRpYyBjb25maWd1cmVTZXJ2aWNlKGNvbmZpZ3VyZVNlcnZpY2VBcmdzOiBPQ29uZmlndXJlU2VydmljZUFyZ3MpOiBhbnkge1xuICAgIGNvbnN0IGJhc2VTZXJ2aWNlID0gY29uZmlndXJlU2VydmljZUFyZ3MuYmFzZVNlcnZpY2U7XG4gICAgY29uc3QgZW50aXR5ID0gY29uZmlndXJlU2VydmljZUFyZ3MuZW50aXR5O1xuICAgIGNvbnN0IHNlcnZpY2UgPSBjb25maWd1cmVTZXJ2aWNlQXJncy5zZXJ2aWNlO1xuICAgIGNvbnN0IGluamVjdG9yID0gY29uZmlndXJlU2VydmljZUFyZ3MuaW5qZWN0b3I7XG5cbiAgICBjb25zdCBjb25maWcgPSBpbmplY3Rvci5nZXQoQXBwQ29uZmlnKTtcbiAgICBjb25zdCBzZXJ2aWNlQ29uZmlndXJhdGlvbiA9IGNvbmZpZy5nZXRTZXJ2aWNlQ29uZmlndXJhdGlvbigpO1xuICAgIGNvbnN0IHNlcnZpY2VDb25maWd1cmF0aW9uVHlwZSA9IHNlcnZpY2VDb25maWd1cmF0aW9uW3NlcnZpY2VdPy5zZXJ2aWNlVHlwZTtcbiAgICBjb25zdCBzZXJ2aWNlVHlwZSA9IGNvbmZpZ3VyZVNlcnZpY2VBcmdzLnNlcnZpY2VUeXBlIHx8IHNlcnZpY2VDb25maWd1cmF0aW9uVHlwZTtcblxuICAgIHRyeSB7XG4gICAgICBsZXQgZGF0YVNlcnZpY2UgPSB0aGlzLmdldERhdGFTZXJ2aWNlSW5zdGFuY2Uoc2VydmljZVR5cGUsIGJhc2VTZXJ2aWNlLCBpbmplY3Rvcik7XG5cbiAgICAgIGlmIChVdGlsLmlzRGF0YVNlcnZpY2UoZGF0YVNlcnZpY2UpKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VDZmcgPSBkYXRhU2VydmljZS5nZXREZWZhdWx0U2VydmljZUNvbmZpZ3VyYXRpb24oc2VydmljZSk7XG4gICAgICAgIGlmIChlbnRpdHkpIHtcbiAgICAgICAgICBzZXJ2aWNlQ2ZnLmVudGl0eSA9IGVudGl0eTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhU2VydmljZS5jb25maWd1cmVTZXJ2aWNlKHNlcnZpY2VDZmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFTZXJ2aWNlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldERhdGFTZXJ2aWNlSW5zdGFuY2Uoc2VydmljZVR5cGU6IGFueSwgYmFzZVNlcnZpY2U6IGFueSwgaW5qZWN0b3I6IEluamVjdG9yKTogYW55IHtcbiAgICBpZiAoIXNlcnZpY2VUeXBlKSB7XG4gICAgICByZXR1cm4gaW5qZWN0b3IuZ2V0PGFueT4oYmFzZVNlcnZpY2UpO1xuICAgIH1cblxuICAgIGlmICghW1NlcnZpY2VUeXBlLk9udGltaXplLCBTZXJ2aWNlVHlwZS5PbnRpbWl6ZUVFLCBTZXJ2aWNlVHlwZS5KU09OQVBJXS5pbmNsdWRlcyhzZXJ2aWNlVHlwZSkpIHtcbiAgICAgIHJldHVybiBVdGlsLmNyZWF0ZVNlcnZpY2VJbnN0YW5jZUJ5VHlwZShpbmplY3Rvci5nZXQ8YW55PihzZXJ2aWNlVHlwZSksIGluamVjdG9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gVXRpbC5jcmVhdGVTZXJ2aWNlSW5zdGFuY2VCeVR5cGUoc2VydmljZVR5cGUsIGluamVjdG9yKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVTZXJ2aWNlSW5zdGFuY2VCeVR5cGUoc2VydmljZVR5cGU6IFNlcnZpY2VUeXBlLCBpbmplY3RvcjogSW5qZWN0b3IpOiBhbnkge1xuICAgICAgaWYgKCFVdGlsLmlzRGVmaW5lZChzZXJ2aWNlVHlwZSkgfHwgU2VydmljZVR5cGUuT250aW1pemVFRSA9PT0gc2VydmljZVR5cGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBPbnRpbWl6ZUVFU2VydmljZShpbmplY3Rvcik7XG4gICAgICB9XG4gICAgICBpZiAoU2VydmljZVR5cGUuT250aW1pemUgPT09IHNlcnZpY2VUeXBlKSB7XG4gICAgICAgIHJldHVybiBuZXcgT250aW1pemVTZXJ2aWNlKGluamVjdG9yKTtcbiAgICAgIH1cbiAgICAgIGlmIChTZXJ2aWNlVHlwZS5KU09OQVBJID09PSBzZXJ2aWNlVHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IEpTT05BUElTZXJ2aWNlKGluamVjdG9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBVdGlsLmNyZWF0ZVNlcnZpY2VJbnN0YW5jZShzZXJ2aWNlVHlwZSwgaW5qZWN0b3IpO1xuXG4gIH1cbiAgLyoqXG4gKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlZCBzZXJ2aWNlIGNsYXNzXG4gKiBAcGFyYW0gY2xhenogdGhlIGNsYXNzIHJlZmVyZW5jZVxuICogQHBhcmFtIGluamVjdG9yIHRoZSBpbmplY3RvclxuICovXG4gIHN0YXRpYyBjcmVhdGVTZXJ2aWNlSW5zdGFuY2UoY2xheno6IGFueSwgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgaWYgKCFVdGlsLmlzRGVmaW5lZChjbGF6eikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdJbnN0YW5jZSA9IG5ldyBjbGF6eihpbmplY3Rvcik7XG4gICAgcmV0dXJuIG5ld0luc3RhbmNlO1xuICB9XG5cbiAgc3RhdGljIGNvbmZpZ3VyZU1lc3NhZ2VTZXJ2aWNlKGNvbmZpZ3VyZVNlcnZpY2VBcmdzOiBPQ29uZmlndXJlTWVzc2FnZVNlcnZpY2VBcmdzKTogYW55IHtcbiAgICBsZXQgbWVzc2FnZVNlcnZpY2UgPSBjb25maWd1cmVTZXJ2aWNlQXJncy5iYXNlU2VydmljZTtcbiAgICBjb25zdCBzZXJ2aWNlVHlwZSA9IGNvbmZpZ3VyZVNlcnZpY2VBcmdzLnNlcnZpY2VUeXBlO1xuICAgIGNvbnN0IGluamVjdG9yID0gY29uZmlndXJlU2VydmljZUFyZ3MuaW5qZWN0b3I7XG5cbiAgICBpZiAoc2VydmljZVR5cGUpIHtcbiAgICAgIG1lc3NhZ2VTZXJ2aWNlID0gc2VydmljZVR5cGU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBtZXNzYWdlU2VydmljZSA9IGluamVjdG9yLmdldDxhbnk+KG1lc3NhZ2VTZXJ2aWNlKTtcbiAgICAgIGlmIChzZXJ2aWNlVHlwZSkge1xuICAgICAgICBtZXNzYWdlU2VydmljZSA9IFV0aWwuY3JlYXRlU2VydmljZUluc3RhbmNlKG1lc3NhZ2VTZXJ2aWNlLCBpbmplY3RvcilcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZVNlcnZpY2U7XG4gIH1cblxuICBzdGF0aWMgaXNCYXNlNjQoZmlsZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoL14oW0EtWmEtejAtOStcXC9dezR9KSooW0EtWmEtejAtOStcXC9dezR9fFtBLVphLXowLTkrXFwvXXszfT18W0EtWmEtejAtOStcXC9dezJ9PT0pJC9nKVxuXG4gICAgaWYgKGZpbGUuc3Vic3RyaW5nKDAsIDQpID09PSAnZGF0YScpIHtcbiAgICAgIGZpbGUgPSBmaWxlLnN1YnN0cmluZyhmaWxlLmluZGV4T2YoJ2Jhc2U2NCcpICsgNyk7XG4gICAgfVxuICAgIHJldHVybiBwYXR0ZXJuLnRlc3QoZmlsZS5yZXBsYWNlKC9cXHMrL2csICcnKSk7XG5cbiAgfVxuICAvKipcbiAqIENvbnZlcnRzIGFuIG9iamVjdCB0byBhIEpTT04gc3RyaW5nLCBhdm9pZGluZyBjaXJjdWxhciByZWZlcmVuY2VzLlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNvbnZlcnQgdG8gSlNPTi5cbiAqIEByZXR1cm5zIEEgSlNPTiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBvYmplY3QuXG4gKi9cbiAgc3RhdGljIHN0cmluZ2lmeShvYmo6IG9iamVjdCkge1xuICAgIGxldCBjYWNoZSA9IFtdO1xuICAgIGxldCBzdHIgPSBKU09OLnN0cmluZ2lmeShvYmosIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChjYWNoZS5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgICByZXR1cm47IC8vIEF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXNcbiAgICAgICAgfVxuICAgICAgICBjYWNoZS5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgICBjYWNoZSA9IG51bGw7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHN0YXRpYyByZWFkb25seSBvYmplY3RUb1F1ZXJ5U3RyaW5nID0gKGluaXRpYWxPYmopID0+IHtcbiAgICBjb25zdCByZWR1Y2VyID0gKG9iaiwgcGFyZW50UHJlZml4ID0gbnVsbCkgPT4gKHByZXYsIGtleSkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gb2JqW2tleV07XG4gICAgICBrZXkgPSBlbmNvZGVVUklDb21wb25lbnQoa2V5KTtcbiAgICAgIGxldCBwcmVmaXg6IHN0cmluZztcbiAgICAgIGlmIChrZXkgPT09ICdmaWx0ZXJQYXJlbnRLZXlzJykge1xuICAgICAgICBwcmVmaXggPSBwYXJlbnRQcmVmaXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmVmaXggPSBwYXJlbnRQcmVmaXggPyBgJHtwYXJlbnRQcmVmaXh9WyR7a2V5fV1gIDoga2V5O1xuICAgICAgfVxuXG4gICAgICBpZiAoa2V5ID09PSAnZmlsdGVyJyAmJiAhVXRpbC5pc09iamVjdEVtcHR5KG9ialtrZXldKSkge1xuICAgICAgICBwcmV2LnB1c2goT2JqZWN0LmtleXModmFsKS5tYXAoaXRlbWZpbHRlciA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyS2V5ID0gYGZpbHRlclske2l0ZW1maWx0ZXJ9XWA7XG4gICAgICAgICAgaWYgKFV0aWwuaXNPYmplY3QodmFsW2l0ZW1maWx0ZXJdKSkge1xuICAgICAgICAgICAgLyoqIEluIGNhc2UgZmlsdGVyIGFuZCBiYXNpYyBleHByZXNpb24qL1xuICAgICAgICAgICAgcmV0dXJuIGAke2VuY29kZVVSSUNvbXBvbmVudChmaWx0ZXJLZXkpfT0ke2VuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh2YWxbaXRlbWZpbHRlcl0pKX1gO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvKiogSW4gY2FzZSB0aGUgc2ltcGxlIGZpbHRlciB0byBlc3BhcGUgcXVvdGVzKi9cbiAgICAgICAgICAgIHJldHVybiBgJHtlbmNvZGVVUklDb21wb25lbnQoZmlsdGVyS2V5KX09JHtlbmNvZGVVUklDb21wb25lbnQodmFsW2l0ZW1maWx0ZXJdKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuam9pbignJicpKTtcblxuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH1cblxuXG4gICAgICBpZiAodmFsID09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcmV2LnB1c2goYCR7ZW5jb2RlVVJJQ29tcG9uZW50KHByZWZpeCl9PWApO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH1cblxuICAgICAgaWYgKFsnbnVtYmVyJywgJ2Jvb2xlYW4nLCAnc3RyaW5nJ10uaW5jbHVkZXModHlwZW9mIHZhbCkpIHtcbiAgICAgICAgcHJldi5wdXNoKGAke2VuY29kZVVSSUNvbXBvbmVudChwcmVmaXgpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWwpfWApO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH1cblxuICAgICAgcHJldi5wdXNoKE9iamVjdC5rZXlzKHZhbCkucmVkdWNlKHJlZHVjZXIodmFsLCBwcmVmaXgpLCBbXSkuam9pbignJicpKTtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH07XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoaW5pdGlhbE9iaikucmVkdWNlKHJlZHVjZXIoaW5pdGlhbE9iaiksIFtdKS5qb2luKCcmJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIE1hcCBrZXlzIG9mIG9iamVjdFxuICAgKiBGb3IgZXhhbXBsZTogY29udmVydGluZyB0aGUga2V5cyBvZiBhbiBvYmplY3QgdG8gdXBwZXJjYXNlXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgbWFwS2V5cyA9IChvYmosIGZuKSA9PlxuICAgIE9iamVjdC5rZXlzKG9iaikucmVkdWNlKChhY2MsIGspID0+IHtcbiAgICAgIGFjY1tmbihvYmpba10sIGssIG9iaildID0gb2JqW2tdO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgc3RhdGljIHJlYWRvbmx5IG1hcFZhbHVlcyA9IChvYmosIGZuKSA9PlxuICAgIE9iamVjdC5rZXlzKG9iaikucmVkdWNlKChhY2MsIGspID0+ICh7IC4uLmFjYywgW2tdOiBmbihvYmpba10pIH0pLCB7fSk7XG5cblxuICBzdGF0aWMgdG9Mb3dlckNhc2UodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB0b1VwcGVyQ2FzZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cblxuICBzdGF0aWMgcGFyc2VUb0xvd2VyQ2FzZSh2YWx1ZTogYW55KSB7XG4gICAgaWYgKFV0aWwuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKHg6IHN0cmluZykgPT4geC50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFV0aWwubWFwS2V5cyh2YWx1ZSwgVXRpbC50b0xvd2VyQ2FzZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZVRvVXBwZXJDYXNlKHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoVXRpbC5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLm1hcCgoeDogc3RyaW5nKSA9PiB4LnRvTG9jYWxlVXBwZXJDYXNlKCkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvTG9jYWxlVXBwZXJDYXNlKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gVXRpbC5tYXBLZXlzKHZhbHVlLCBVdGlsLnRvVXBwZXJDYXNlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgc3RhdGljIHNvcnRGdW5jdGlvbihwcm9wZXJ0eUE6IHN0cmluZyB8IG51bWJlciwgcHJvcGVydHlCOiBzdHJpbmcgfCBudW1iZXIsIGFjdGl2ZVNvcnREaXJlY3Rpb246IHN0cmluZykge1xuXG4gICAgbGV0IHZhbHVlQTogc3RyaW5nIHwgbnVtYmVyID0gJyc7XG4gICAgbGV0IHZhbHVlQjogc3RyaW5nIHwgbnVtYmVyID0gJyc7XG5cbiAgICBpZiAoVXRpbC5pc0RlZmluZWQocHJvcGVydHlBKSkge1xuICAgICAgdmFsdWVBID0gaXNOYU4oK3Byb3BlcnR5QSkgPyBwcm9wZXJ0eUEudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKSA6ICtwcm9wZXJ0eUE7XG4gICAgfVxuXG4gICAgaWYgKFV0aWwuaXNEZWZpbmVkKHByb3BlcnR5QikpIHtcbiAgICAgIHZhbHVlQiA9IGlzTmFOKCtwcm9wZXJ0eUIpID8gcHJvcGVydHlCLnRvU3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiArcHJvcGVydHlCO1xuICAgIH1cbiAgICByZXR1cm4gKHZhbHVlQSA8PSB2YWx1ZUIgPyAtMSA6IDEpICogKGFjdGl2ZVNvcnREaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xKTtcbiAgfVxuXG4gIHN0YXRpYyBjbG9uZUFycmF5PFQ+KGFycjogVFtdKTogVFtdIHtcbiAgICBjb25zdCBjbG9uZWRBcnJheSA9IGFyci5tYXAoKHgpID0+IE9iamVjdC5hc3NpZ24oe30sIHgpKVxuICAgIHJldHVybiBjbG9uZWRBcnJheTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRMYXN0QWN0aXZhdGVSb3V0ZShyb3V0ZVNuYXBzaG90OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB7XG4gICAgbGV0IGNoaWxkID0gcm91dGVTbmFwc2hvdDtcbiAgICB3aGlsZSAoY2hpbGQuZmlyc3RDaGlsZCkge1xuICAgICAgY2hpbGQgPSBjaGlsZC5maXJzdENoaWxkO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICBzdGF0aWMgZ2V0VmFsdWVGcm9tUGF0aChvYmo6IGFueSwgcGF0aDogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIW9iaiB8fCAhcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICAgIGlmIChhY2MgJiYgdHlwZW9mIGFjYyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGFjY1trZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LCBvYmopO1xuICB9XG59XG4iXX0=