@sumaris-net/ngx-components 1.23.15 → 1.23.17

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 (44) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +486 -225
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +1 -1
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
  5. package/esm2015/public_api.js +3 -2
  6. package/esm2015/src/app/core/services/network.service.js +17 -25
  7. package/esm2015/src/app/core/table/entities-table-datasource.class.js +24 -10
  8. package/esm2015/src/app/core/table/table.class.js +2 -5
  9. package/esm2015/src/app/core/table/testing/table.testing.js +2 -2
  10. package/esm2015/src/app/shared/services/memory-entity-service.class.js +54 -26
  11. package/esm2015/src/app/shared/services/startable-observable-service.class.js +122 -0
  12. package/esm2015/src/app/shared/services/startable-service.class.js +23 -21
  13. package/esm2015/src/app/social/job/job.module.js +4 -4
  14. package/esm2015/src/app/social/job/job.service.js +24 -12
  15. package/esm2015/src/app/social/job/progression/job-progression.icon.js +208 -0
  16. package/esm2015/src/app/social/job/testing/job-progression.testing.js +27 -26
  17. package/esm2015/src/app/social/job/testing/job-progression.testing.service.js +24 -2
  18. package/esm2015/src/app/social/social.module.js +1 -1
  19. package/esm2015/src/app/social/user-event/notification/user-event-notification.icon.js +26 -15
  20. package/esm2015/src/app/social/user-event/notification/user-event-notification.list.js +3 -3
  21. package/esm2015/src/app/social/user-event/testing/user-event.testing.js +3 -3
  22. package/esm2015/src/app/social/user-event/user-event.module.js +4 -4
  23. package/esm2015/src/app/social/user-event/user-event.service.js +2 -2
  24. package/esm2015/sumaris-net.ngx-components.js +10 -10
  25. package/fesm2015/sumaris-net.ngx-components.js +372 -168
  26. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  27. package/package.json +1 -1
  28. package/public_api.d.ts +2 -1
  29. package/src/app/core/services/network.service.d.ts +5 -7
  30. package/src/app/core/table/entities-table-datasource.class.d.ts +9 -1
  31. package/src/app/shared/services/memory-entity-service.class.d.ts +5 -5
  32. package/src/app/shared/services/startable-observable-service.class.d.ts +33 -0
  33. package/src/app/shared/services/startable-service.class.d.ts +9 -8
  34. package/src/app/social/job/job.service.d.ts +10 -2
  35. package/src/app/social/job/progression/{job-progression.component.d.ts → job-progression.icon.d.ts} +3 -3
  36. package/src/app/social/job/testing/job-progression.testing.d.ts +7 -4
  37. package/src/app/social/job/testing/job-progression.testing.service.d.ts +4 -0
  38. package/src/app/social/social.module.d.ts +1 -1
  39. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +6 -3
  40. package/src/app/social/user-event/testing/user-event.testing.d.ts +2 -2
  41. package/src/app/social/user-event/user-event.service.d.ts +1 -1
  42. package/sumaris-net.ngx-components.d.ts +9 -9
  43. package/sumaris-net.ngx-components.metadata.json +1 -1
  44. package/esm2015/src/app/social/job/progression/job-progression.component.js +0 -200
@@ -102,7 +102,7 @@ export class TableTestPage extends AppTable {
102
102
  console.debug('[test-table] Destroying table...');
103
103
  super.ngOnDestroy();
104
104
  this.stopTimer();
105
- this.dataService.stop();
105
+ //this.dataService.stop();
106
106
  }
107
107
  restoreFilter() {
108
108
  const json = this.settings.getPageSettings(this.settingsId, 'filter');
@@ -239,4 +239,4 @@ TableTestPage.propDecorators = {
239
239
  filterExpansionPanel: [{ type: ViewChild, args: [MatExpansionPanel, { static: true },] }],
240
240
  infiniteScroll: [{ type: ViewChild, args: [IonInfiniteScroll,] }]
241
241
  };
242
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUudGVzdGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS90ZXN0aW5nL3RhYmxlLnRlc3RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQXFCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvSSxPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLHNCQUFzQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekcsT0FBTyxFQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFDM0YsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sc0RBQXNELENBQUM7QUFDN0YsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDbEYsT0FBTyxFQUFrQixXQUFXLEVBQVksTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RSxPQUFPLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ2xGLE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBQywyQkFB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Q3BCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQzs7QUFoUE0seUJBQVcsR0FBRyxHQUFHLENBQUM7O1lBbEIxQixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtnQkFFN0IsK3hnQkFBaUM7Z0JBQ2pDLFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsbUJBQW1CO3dCQUM1QixRQUFRLEVBQUUsMkJBQTJCO3FCQUN0QztvQkFDRDt3QkFDRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO3FCQUNoRTtpQkFDRjtnQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDaEQ7OztZQS9CMEUsUUFBUTtZQU0zRSxtQkFBbUI7WUFDRixXQUFXO1lBUEgsaUJBQWlCOzs7bUNBK0MvQyxLQUFLO3dCQUNMLEtBQUs7bUNBTUwsU0FBUyxTQUFDLGlCQUFpQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQzs2QkFDM0MsU0FBUyxTQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIGZvcndhcmRSZWYsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FwcFRhYmxlLCBERUZBVUxUX1BBR0VfU0laRSwgUkVTRVJWRURfRU5EX0NPTFVNTlMsIFJFU0VSVkVEX1NUQVJUX0NPTFVNTlN9IGZyb20gJy4uL3RhYmxlLmNsYXNzJztcbmltcG9ydCB7UmVmZXJlbnRpYWwsIFN0YXR1c0J5SWQsIFN0YXR1c0xpc3R9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZGVsL3JlZmVyZW50aWFsLm1vZGVsJztcbmltcG9ydCB7SW9uSW5maW5pdGVTY3JvbGx9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7RW50aXRpZXNUYWJsZURhdGFTb3VyY2V9IGZyb20gJy4uL2VudGl0aWVzLXRhYmxlLWRhdGFzb3VyY2UuY2xhc3MnO1xuaW1wb3J0IHtJbk1lbW9yeUVudGl0aWVzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL21lbW9yeS1lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge0FwcFZhbGlkYXRvclNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRvci9iYXNlLnZhbGlkYXRvci5jbGFzcyc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtpc05pbCwgaXNOb3ROaWx9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtmcm9tVW5peE1zVGltZXN0YW1wfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZGF0ZXMnO1xuaW1wb3J0IHtSZWZlcmVudGlhbEZpbHRlcn0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGVzdGluZy9yZWZlcmVudGlhbC1maWx0ZXIubW9kZWwnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGZpbHRlciwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge01hdEV4cGFuc2lvblBhbmVsfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xuaW1wb3J0IHtSZWZlcmVudGlhbFZhbGlkYXRvclNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Rlc3RpbmcvcmVmZXJlbnRpYWwudmFsaWRhdG9yJztcbmltcG9ydCB7U3RhdHVzSWRzfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2RlbC9tb2RlbC5lbnVtJztcbmltcG9ydCBUaW1lb3V0ID0gTm9kZUpTLlRpbWVvdXQ7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC10YWJsZS10ZXN0aW5nJyxcbiAgc3R5bGVVcmxzOiBbJ3RhYmxlLnRlc3Rpbmcuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJ3RhYmxlLnRlc3RpbmcuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IEFwcFZhbGlkYXRvclNlcnZpY2UsXG4gICAgICB1c2VDbGFzczogUmVmZXJlbnRpYWxWYWxpZGF0b3JTZXJ2aWNlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBBcHBUYWJsZSwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGFibGVUZXN0UGFnZSksXG4gICAgfVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVRlc3RQYWdlIGV4dGVuZHMgQXBwVGFibGU8UmVmZXJlbnRpYWwsIFJlZmVyZW50aWFsRmlsdGVyPlxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBzdGF0aWMgbWF4Um93Q291bnQgPSAxMDA7XG5cbiAgdGltZXI6IFRpbWVvdXQ7XG4gIGNhbkVkaXQgPSB0cnVlO1xuICBkYXRhOiBSZWZlcmVudGlhbFtdO1xuICBmaWx0ZXJGb3JtOiBGb3JtR3JvdXA7XG4gIGZpbHRlckNyaXRlcmlhQ291bnQgPSAwO1xuICBncm91cENvbHVtbnMgPSBbJ3RvcC1zdGFydCcsICdncm91cC0xJywgJ2dyb3VwLTInLCAndG9wLWVuZCddO1xuXG4gIHJlYWRvbmx5IHN0YXR1c0xpc3QgPSBTdGF0dXNMaXN0O1xuICByZWFkb25seSBzdGF0dXNCeUlkID0gU3RhdHVzQnlJZDtcblxuICBASW5wdXQoKSBlbmFibGVJbmZpbml0ZVNjcm9sbDogYm9vbGVhbjtcbiAgQElucHV0KCkgdXNlU3RpY2t5ID0gdHJ1ZTtcblxuICBnZXQgaGFzTW9yZURhdGEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5sZW5ndGggPCAxMDA7XG4gIH1cblxuICBAVmlld0NoaWxkKE1hdEV4cGFuc2lvblBhbmVsLCB7c3RhdGljOiB0cnVlfSkgZmlsdGVyRXhwYW5zaW9uUGFuZWw6IE1hdEV4cGFuc2lvblBhbmVsO1xuICBAVmlld0NoaWxkKElvbkluZmluaXRlU2Nyb2xsKSBpbmZpbml0ZVNjcm9sbDogSW9uSW5maW5pdGVTY3JvbGw7XG5cbiAgZ2V0IGRhdGFTZXJ2aWNlKCk6IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlPFJlZmVyZW50aWFsPntcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZS5kYXRhU2VydmljZSBhcyBJbk1lbW9yeUVudGl0aWVzU2VydmljZTxSZWZlcmVudGlhbD5cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHZhbGlkYXRvclNlcnZpY2U6IEFwcFZhbGlkYXRvclNlcnZpY2UsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBmb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICAgICAgICAgICAgKSB7XG4gICAgc3VwZXIoaW5qZWN0b3IsIFtcbiAgICAgIC4uLlJFU0VSVkVEX1NUQVJUX0NPTFVNTlMsXG4gICAgICAnbGFiZWwnLFxuICAgICAgJ25hbWUnLFxuICAgICAgJ2xldmVsSWQnLFxuICAgICAgJ3N0YXR1c0lkJyxcbiAgICAgICd1cGRhdGVEYXRlJyxcbiAgICAgICdjb21tZW50cycsXG4gICAgICAuLi5SRVNFUlZFRF9FTkRfQ09MVU1OU1xuICAgIF0sXG4gICAgICBuZXcgRW50aXRpZXNUYWJsZURhdGFTb3VyY2UoUmVmZXJlbnRpYWwsIG5ldyBJbk1lbW9yeUVudGl0aWVzU2VydmljZShSZWZlcmVudGlhbCwgUmVmZXJlbnRpYWxGaWx0ZXIsIHtcbiAgICAgICAgc29ydEJ5UmVwbGFjZW1lbnQ6IHtpZDogJ2lkJ31cbiAgICAgIH0pLCB2YWxpZGF0b3JTZXJ2aWNlLCB7XG4gICAgICAgIHN1cHByZXNzRXJyb3JzOiBmYWxzZVxuICAgICAgfSksXG4gICAgICBudWxsKTtcblxuICAgIC8vIFdvcmtzIHdpdGggdHJ1ZSBhbmQgZmFsc2VcbiAgICB0aGlzLmVuYWJsZUluZmluaXRlU2Nyb2xsID0gdGhpcy5tb2JpbGU7XG5cbiAgICB0aGlzLmF1dG9Mb2FkID0gZmFsc2U7XG4gICAgdGhpcy5pbmxpbmVFZGl0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLmkxOG5Db2x1bW5QcmVmaXggPSAnVEFCTEUuVEVTVElORy4nO1xuXG4gICAgdGhpcy5jb25maXJtQmVmb3JlRGVsZXRlID0gdHJ1ZTtcbiAgICB0aGlzLmNvbmZpcm1CZWZvcmVDYW5jZWwgPSBmYWxzZTtcbiAgICB0aGlzLnVuZG9hYmxlRGVsZXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLnNhdmVCZWZvcmVEZWxldGUgPSBmYWxzZTtcblxuICAgIHRoaXMuc2F2ZUJlZm9yZVNvcnQgPSB0cnVlO1xuICAgIHRoaXMuc2F2ZUJlZm9yZUZpbHRlciA9IHRydWU7XG4gICAgdGhpcy5wcm9wYWdhdGVSb3dFcnJvciA9IHRydWU7XG5cbiAgICB0aGlzLmZpbHRlckZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBzZWFyY2hUZXh0OiBbbnVsbF1cbiAgICB9KTtcblxuICAgIHRoaXMub25TdGFydEVkaXRpbmdSb3cuc3Vic2NyaWJlKHJvdyA9PiB7XG4gICAgICByb3cudmFsaWRhdG9yLnBhdGNoVmFsdWUoe2VudGl0eU5hbWU6ICdUZXN0Vk8nfSwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAvLyBVcGRhdGUgZmlsdGVyIHdoZW4gY2hhbmdlc1xuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLmZpbHRlckZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmZpbHRlckZvcm0udmFsaWQpLFxuICAgICAgICAgIHRhcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBSZWZlcmVudGlhbEZpbHRlci5mcm9tT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyQ3JpdGVyaWFDb3VudCA9IGZpbHRlci5jb3VudE5vdEVtcHR5Q3JpdGVyaWEoKTtcbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAvLyBBcHBseWluZyB0aGUgZmlsdGVyXG4gICAgICAgICAgICB0aGlzLnNldEZpbHRlcihmaWx0ZXIsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgLy8gU2F2ZSBmaWx0ZXIgaW4gc2V0dGluZ3MgKGFmdGVyIGEgZGVib3VuY2UgdGltZSlcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKSxcbiAgICAgICAgICB0YXAoanNvbiA9PiB0aGlzLnNldHRpbmdzLnNhdmVQYWdlU2V0dGluZyh0aGlzLnNldHRpbmdzSWQsIGpzb24sICdmaWx0ZXInKSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKClcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlckF1dG9jb21wbGV0ZUZpZWxkKCdsZXZlbCcsIHtcbiAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICB7aWQ6IDEsIGxhYmVsOiAnQScsIG5hbWU6ICdpdGVtIEEnfSxcbiAgICAgICAgICB7aWQ6IDEsIGxhYmVsOiAnQicsIG5hbWU6ICdpdGVtIEInfVxuICAgICAgICBdLFxuICAgICAgICBtb2JpbGU6IHRoaXMubW9iaWxlXG4gICAgICB9KTtcblxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLm9uUmVmcmVzaC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmZpbHRlckZvcm0ubWFya0FzVW50b3VjaGVkKCk7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgfSkpO1xuXG4gICAgdGhpcy5tYXJrQXNSZWFkeSgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuXG4gICAgLy8gUmVzdG9yZSBmaWx0ZXIgZnJvbSBzZXR0aW5nc1xuICAgIHRoaXMucmVzdG9yZUZpbHRlcigpO1xuXG4gICAgLy8gTG9hZCBkYXRhXG4gICAgdGhpcy5sb2FkKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbdGVzdC10YWJsZV0gRGVzdHJveWluZyB0YWJsZS4uLicpO1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlLnN0b3AoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXN0b3JlRmlsdGVyKCkge1xuICAgIGNvbnN0IGpzb24gPSB0aGlzLnNldHRpbmdzLmdldFBhZ2VTZXR0aW5ncyh0aGlzLnNldHRpbmdzSWQsICdmaWx0ZXInKTtcbiAgICBjb25zb2xlLmRlYnVnKCdbdGFibGUtdGVzdF0gUmVzdG9yaW5nIGZpbHRlciBmcm9tIHNldHRpbmdzLi4uJywganNvbik7XG5cbiAgICBpZiAoanNvbikge1xuICAgICAgY29uc3QgZmlsdGVyID0gUmVmZXJlbnRpYWxGaWx0ZXIuZnJvbU9iamVjdChqc29uKTtcbiAgICAgIHRoaXMuZmlsdGVyRm9ybS5wYXRjaFZhbHVlKGpzb24sIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB0aGlzLmZpbHRlckNyaXRlcmlhQ291bnQgPSBmaWx0ZXIuY291bnROb3RFbXB0eUNyaXRlcmlhKCk7XG4gICAgICB0aGlzLnNldEZpbHRlcihmaWx0ZXIsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZVRpbWVyKCkge1xuICAgIGlmIChpc05vdE5pbCh0aGlzLnRpbWVyKSkgdGhpcy5zdG9wVGltZXIoKTtcbiAgICBlbHNlIHRoaXMuc3RhcnRUaW1lcigpO1xuICB9XG5cbiAgbG9hZCgpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbdGVzdC10YWJsZV0gVXBkYXRpbmcgZGF0YS4uLicpO1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuXG4gICAgaWYgKGlzTmlsKHRoaXMuZGF0YSkpIHtcbiAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZ2VuZXJhdGVEYXRhKDAsIFRhYmxlVGVzdFBhZ2UubWF4Um93Q291bnQpO1xuICAgIH1cbiAgICB0aGlzLmRhdGFTZXJ2aWNlLnZhbHVlID0gdGhpcy5kYXRhO1xuXG4gICAgdGhpcy5vblJlZnJlc2guZW1pdCgpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hNb3JlKGV2ZW50PzogQ3VzdG9tRXZlbnQgJiB7IHRhcmdldD86IEV2ZW50VGFyZ2V0ICYgeyBjb21wbGV0ZT86ICgpID0+IHZvaWQgfX0pIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbdGFibGUtdGVzdF0gTG9hZGluZyBtb3JlLi4uJywgZXZlbnQpO1xuICAgIGNvbnN0IGZldGNoZWQgPSBhd2FpdCB0aGlzLl9kYXRhU291cmNlLmZldGNoTW9yZSgpO1xuXG4gICAgaWYgKGZldGNoZWQgJiYgZXZlbnQ/LnRhcmdldCAmJiBldmVudC50YXJnZXQuY29tcGxldGUpIHtcbiAgICAgIC8vIFdhaXQgZW5kIG9mIGxvYWRcbiAgICAgIGF3YWl0IHRoaXMud2FpdElkbGUoKTtcbiAgICAgIC8vIE1hcmsgdGFyZ2V0IGV2ZW50IGFzIGNvbXBsZXRlZCAoZS5nLiBJb25SZWZyZXNoZXIpXG4gICAgICBldmVudC50YXJnZXQuY29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKG9wdHM/OiB7IGtlZXBFZGl0aW5nPzogYm9vbGVhbiB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2F2ZWQgPSBhd2FpdCBzdXBlci5zYXZlKG9wdHMpO1xuICAgIGlmIChzYXZlZCkge1xuICAgICAgLy8gVXBkYXRlIHNvdXJjZSBkYXRhXG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGFTZXJ2aWNlLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gc2F2ZWQ7XG4gIH1cblxuICBjbGVhckNvbnRyb2xWYWx1ZShldmVudDogVUlFdmVudCwgZm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIEF2b2lkIHRvIGVudGVyIGlucHV0IHRoZSBmaWVsZFxuICAgIGZvcm1Db250cm9sLnNldFZhbHVlKG51bGwpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVyQW5kQ2xvc2VQYW5lbChldmVudD86IFVJRXZlbnQpIHtcbiAgICB0aGlzLmRlZmF1bHRQYWdlU2l6ZSA9IERFRkFVTFRfUEFHRV9TSVpFO1xuICAgIHRoaXMub25SZWZyZXNoLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMuZmlsdGVyRXhwYW5zaW9uUGFuZWwuY2xvc2UoKTtcbiAgfVxuXG4gIHJlc2V0RmlsdGVyKGV2ZW50PzogVUlFdmVudCkge1xuICAgIHRoaXMuZmlsdGVyRm9ybS5yZXNldCh7fSwge2VtaXRFdmVudDogdHJ1ZX0pO1xuICAgIHRoaXMuc2V0RmlsdGVyKFJlZmVyZW50aWFsRmlsdGVyLmZyb21PYmplY3Qoe30pLCB7ZW1pdEV2ZW50OiB0cnVlfSk7XG4gICAgdGhpcy5maWx0ZXJFeHBhbnNpb25QYW5lbC5jbG9zZSgpO1xuICB9XG5cbiAgc3RhcnRUaW1lcigpIHtcbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLmRhdGEgPSBudWxsOyAvLyBSZXNldFxuICAgICAgdGhpcy5sb2FkKCk7XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIHN0b3BUaW1lcigpIHtcbiAgICBpZiAoaXNOb3ROaWwodGhpcy50aW1lcikpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lcik7XG4gICAgICB0aGlzLnRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVEYXRhKG9mZnNldD86IG51bWJlciwgc2l6ZT86IG51bWJlciwgKTogUmVmZXJlbnRpYWxbXSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gICAgc2l6ZSA9IHNpemUgfHwgMTAwO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlZmVyZW50aWFsPigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICBjb25zdCBpZCA9IGkgKyAxICsgb2Zmc2V0O1xuICAgICAgY29uc3QgaXRlbSA9IFJlZmVyZW50aWFsLmZyb21PYmplY3Qoe1xuICAgICAgICBpZCxcbiAgICAgICAgbGFiZWw6ICdDT0RFLScgKyBpZCxcbiAgICAgICAgbmFtZTogJ05hbWUgIycgKyBpZCxcbiAgICAgICAgbGV2ZWxJZDoge2lkOiAxLCBsYWJlbDogJ0EnLCBuYW1lOiAnSXRlbSBBJ30sXG4gICAgICAgIHN0YXR1c0lkOiBTdGF0dXNJZHMuRU5BQkxFLFxuICAgICAgICBjb21tZW50czogJ015IGNvbW1lbnQgIycgKyBpZCxcbiAgICAgICAgY3JlYXRpb25EYXRlOiBmcm9tVW5peE1zVGltZXN0YW1wKERhdGUubm93KCkgLSBpICogNjAgKiAxMDAwKSxcbiAgICAgICAgdXBkYXRlRGF0ZTogZnJvbVVuaXhNc1RpbWVzdGFtcChEYXRlLm5vdygpIC0gaSAqIDYwICogMTAwMCksXG4gICAgICAgIGVudGl0eU5hbWU6ICdUZXN0Vk8nXG4gICAgICB9KTtcbiAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiJdfQ==
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUudGVzdGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS90ZXN0aW5nL3RhYmxlLnRlc3RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQXFCLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvSSxPQUFPLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFFLG9CQUFvQixFQUFFLHNCQUFzQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekcsT0FBTyxFQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFDM0YsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sc0RBQXNELENBQUM7QUFDN0YsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDbEYsT0FBTyxFQUFrQixXQUFXLEVBQVksTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RSxPQUFPLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQ2xGLE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLDhDQUE4QyxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQWtCMUQsTUFBTSxPQUFPLGFBQWMsU0FBUSxRQUF3QztJQTZCekUsWUFBWSxRQUFrQixFQUNSLGdCQUFxQyxFQUNyQyxXQUF3QixFQUN4QixFQUFxQjtRQUV6QyxLQUFLLENBQUMsUUFBUSxFQUFFO1lBQ2QsR0FBRyxzQkFBc0I7WUFDekIsT0FBTztZQUNQLE1BQU07WUFDTixTQUFTO1lBQ1QsVUFBVTtZQUNWLFlBQVk7WUFDWixVQUFVO1lBQ1YsR0FBRyxvQkFBb0I7U0FDeEIsRUFDQyxJQUFJLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxJQUFJLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxpQkFBaUIsRUFBRTtZQUNuRyxpQkFBaUIsRUFBRSxFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUM7U0FDOUIsQ0FBQyxFQUFFLGdCQUFnQixFQUFFO1lBQ3BCLGNBQWMsRUFBRSxLQUFLO1NBQ3RCLENBQUMsRUFDRixJQUFJLENBQUMsQ0FBQztRQW5CWSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXFCO1FBQ3JDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBMUIzQyxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBR2Ysd0JBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLGlCQUFZLEdBQUcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVyRCxlQUFVLEdBQUcsVUFBVSxDQUFDO1FBQ3hCLGVBQVUsR0FBRyxVQUFVLENBQUM7UUFHeEIsY0FBUyxHQUFHLElBQUksQ0FBQztRQW1DeEIsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRXhDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUV6QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRTlCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUU5QixJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDbEMsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDO1NBQ25CLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDckMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBQyxVQUFVLEVBQUUsUUFBUSxFQUFDLEVBQUUsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUF4REQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFDaEMsQ0FBQztJQUtELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFtRCxDQUFBO0lBQzdFLENBQUM7SUFpREQsUUFBUTtRQUNOLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVqQiw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixDQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVk7YUFDekIsSUFBSSxDQUNILFlBQVksQ0FBQyxHQUFHLENBQUMsRUFDakIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQ25DLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNWLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLHNCQUFzQjtZQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztRQUNGLGtEQUFrRDtRQUNsRCxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQ2pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQzVFO2FBQ0EsU0FBUyxFQUFFLENBQ2YsQ0FBQztRQUVGLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLEVBQUU7WUFDcEMsS0FBSyxFQUFFO2dCQUNMLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUM7Z0JBQ25DLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUM7YUFDcEM7WUFDRCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDcEIsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLG9CQUFvQixDQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFTixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGVBQWU7UUFDYixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQixZQUFZO1FBQ1osSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDbEQsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQiwwQkFBMEI7SUFDNUIsQ0FBQztJQUVTLGFBQWE7UUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0RSxPQUFPLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXRFLElBQUksSUFBSSxFQUFFO1lBQ1IsTUFBTSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7WUFDdEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJO1FBQ0YsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDN0Q7UUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRW5DLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVLLFNBQVMsQ0FBQyxLQUF5RTs7WUFDdkYsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFbkQsSUFBSSxPQUFPLEtBQUksS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLE1BQU0sQ0FBQSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO2dCQUNyRCxtQkFBbUI7Z0JBQ25CLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN0QixxREFBcUQ7Z0JBQ3JELEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDekI7UUFDSCxDQUFDO0tBQUE7SUFFSyxJQUFJLENBQUMsSUFBZ0M7Ozs7O1lBQ3pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sT0FBTSxJQUFJLFlBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QscUJBQXFCO2dCQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO2FBQ3BDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0tBQUE7SUFFRCxpQkFBaUIsQ0FBQyxLQUFjLEVBQUUsV0FBNEI7UUFDNUQsSUFBSSxLQUFLO1lBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsaUNBQWlDO1FBQ3JFLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsd0JBQXdCLENBQUMsS0FBZTtRQUN0QyxJQUFJLENBQUMsZUFBZSxHQUFHLGlCQUFpQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWU7UUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQzVCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsUUFBUTtZQUMxQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4QixhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQUVTLFlBQVksQ0FBQyxNQUFlLEVBQUUsSUFBYTtRQUNuRCxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNyQixJQUFJLEdBQUcsSUFBSSxJQUFJLEdBQUcsQ0FBQztRQUVuQixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBZSxDQUFDO1FBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7WUFDMUIsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztnQkFDbEMsRUFBRTtnQkFDRixLQUFLLEVBQUUsT0FBTyxHQUFHLEVBQUU7Z0JBQ25CLElBQUksRUFBRSxRQUFRLEdBQUcsRUFBRTtnQkFDbkIsT0FBTyxFQUFFLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUM7Z0JBQzVDLFFBQVEsRUFBRSxTQUFTLENBQUMsTUFBTTtnQkFDMUIsUUFBUSxFQUFFLGNBQWMsR0FBRyxFQUFFO2dCQUM3QixZQUFZLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO2dCQUM3RCxVQUFVLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO2dCQUMzRCxVQUFVLEVBQUUsUUFBUTthQUNyQixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25CO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVTLFlBQVk7UUFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN6QixDQUFDOztBQWhQTSx5QkFBVyxHQUFHLEdBQUcsQ0FBQzs7WUFsQjFCLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsbUJBQW1CO2dCQUU3QiwreGdCQUFpQztnQkFDakMsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxtQkFBbUI7d0JBQzVCLFFBQVEsRUFBRSwyQkFBMkI7cUJBQ3RDO29CQUNEO3dCQUNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7cUJBQ2hFO2lCQUNGO2dCQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOzthQUNoRDs7O1lBL0IwRSxRQUFRO1lBTTNFLG1CQUFtQjtZQUNGLFdBQVc7WUFQSCxpQkFBaUI7OzttQ0ErQy9DLEtBQUs7d0JBQ0wsS0FBSzttQ0FNTCxTQUFTLFNBQUMsaUJBQWlCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDOzZCQUMzQyxTQUFTLFNBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QXBwVGFibGUsIERFRkFVTFRfUEFHRV9TSVpFLCBSRVNFUlZFRF9FTkRfQ09MVU1OUywgUkVTRVJWRURfU1RBUlRfQ09MVU1OU30gZnJvbSAnLi4vdGFibGUuY2xhc3MnO1xuaW1wb3J0IHtSZWZlcmVudGlhbCwgU3RhdHVzQnlJZCwgU3RhdHVzTGlzdH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kZWwvcmVmZXJlbnRpYWwubW9kZWwnO1xuaW1wb3J0IHtJb25JbmZpbml0ZVNjcm9sbH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtFbnRpdGllc1RhYmxlRGF0YVNvdXJjZX0gZnJvbSAnLi4vZW50aXRpZXMtdGFibGUtZGF0YXNvdXJjZS5jbGFzcyc7XG5pbXBvcnQge0luTWVtb3J5RW50aXRpZXNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7QXBwVmFsaWRhdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdG9yL2Jhc2UudmFsaWRhdG9yLmNsYXNzJztcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge2lzTmlsLCBpc05vdE5pbH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge2Zyb21Vbml4TXNUaW1lc3RhbXB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9kYXRlcyc7XG5pbXBvcnQge1JlZmVyZW50aWFsRmlsdGVyfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90ZXN0aW5nL3JlZmVyZW50aWFsLWZpbHRlci5tb2RlbCc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZmlsdGVyLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TWF0RXhwYW5zaW9uUGFuZWx9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2V4cGFuc2lvbic7XG5pbXBvcnQge1JlZmVyZW50aWFsVmFsaWRhdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGVzdGluZy9yZWZlcmVudGlhbC52YWxpZGF0b3InO1xuaW1wb3J0IHtTdGF0dXNJZHN9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZGVsL21vZGVsLmVudW0nO1xuaW1wb3J0IFRpbWVvdXQgPSBOb2RlSlMuVGltZW91dDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXRhYmxlLXRlc3RpbmcnLFxuICBzdHlsZVVybHM6IFsndGFibGUudGVzdGluZy5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAndGFibGUudGVzdGluZy5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogQXBwVmFsaWRhdG9yU2VydmljZSxcbiAgICAgIHVzZUNsYXNzOiBSZWZlcmVudGlhbFZhbGlkYXRvclNlcnZpY2VcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEFwcFRhYmxlLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUYWJsZVRlc3RQYWdlKSxcbiAgICB9XG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlVGVzdFBhZ2UgZXh0ZW5kcyBBcHBUYWJsZTxSZWZlcmVudGlhbCwgUmVmZXJlbnRpYWxGaWx0ZXI+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIHN0YXRpYyBtYXhSb3dDb3VudCA9IDEwMDtcblxuICB0aW1lcjogVGltZW91dDtcbiAgY2FuRWRpdCA9IHRydWU7XG4gIGRhdGE6IFJlZmVyZW50aWFsW107XG4gIGZpbHRlckZvcm06IEZvcm1Hcm91cDtcbiAgZmlsdGVyQ3JpdGVyaWFDb3VudCA9IDA7XG4gIGdyb3VwQ29sdW1ucyA9IFsndG9wLXN0YXJ0JywgJ2dyb3VwLTEnLCAnZ3JvdXAtMicsICd0b3AtZW5kJ107XG5cbiAgcmVhZG9ubHkgc3RhdHVzTGlzdCA9IFN0YXR1c0xpc3Q7XG4gIHJlYWRvbmx5IHN0YXR1c0J5SWQgPSBTdGF0dXNCeUlkO1xuXG4gIEBJbnB1dCgpIGVuYWJsZUluZmluaXRlU2Nyb2xsOiBib29sZWFuO1xuICBASW5wdXQoKSB1c2VTdGlja3kgPSB0cnVlO1xuXG4gIGdldCBoYXNNb3JlRGF0YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCA8IDEwMDtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoTWF0RXhwYW5zaW9uUGFuZWwsIHtzdGF0aWM6IHRydWV9KSBmaWx0ZXJFeHBhbnNpb25QYW5lbDogTWF0RXhwYW5zaW9uUGFuZWw7XG4gIEBWaWV3Q2hpbGQoSW9uSW5maW5pdGVTY3JvbGwpIGluZmluaXRlU2Nyb2xsOiBJb25JbmZpbml0ZVNjcm9sbDtcblxuICBnZXQgZGF0YVNlcnZpY2UoKTogSW5NZW1vcnlFbnRpdGllc1NlcnZpY2U8UmVmZXJlbnRpYWw+e1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlLmRhdGFTZXJ2aWNlIGFzIEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlPFJlZmVyZW50aWFsPlxuICB9XG5cbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgdmFsaWRhdG9yU2VydmljZTogQXBwVmFsaWRhdG9yU2VydmljZSxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICAgICAgICAgICAgICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgW1xuICAgICAgLi4uUkVTRVJWRURfU1RBUlRfQ09MVU1OUyxcbiAgICAgICdsYWJlbCcsXG4gICAgICAnbmFtZScsXG4gICAgICAnbGV2ZWxJZCcsXG4gICAgICAnc3RhdHVzSWQnLFxuICAgICAgJ3VwZGF0ZURhdGUnLFxuICAgICAgJ2NvbW1lbnRzJyxcbiAgICAgIC4uLlJFU0VSVkVEX0VORF9DT0xVTU5TXG4gICAgXSxcbiAgICAgIG5ldyBFbnRpdGllc1RhYmxlRGF0YVNvdXJjZShSZWZlcmVudGlhbCwgbmV3IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlKFJlZmVyZW50aWFsLCBSZWZlcmVudGlhbEZpbHRlciwge1xuICAgICAgICBzb3J0QnlSZXBsYWNlbWVudDoge2lkOiAnaWQnfVxuICAgICAgfSksIHZhbGlkYXRvclNlcnZpY2UsIHtcbiAgICAgICAgc3VwcHJlc3NFcnJvcnM6IGZhbHNlXG4gICAgICB9KSxcbiAgICAgIG51bGwpO1xuXG4gICAgLy8gV29ya3Mgd2l0aCB0cnVlIGFuZCBmYWxzZVxuICAgIHRoaXMuZW5hYmxlSW5maW5pdGVTY3JvbGwgPSB0aGlzLm1vYmlsZTtcblxuICAgIHRoaXMuYXV0b0xvYWQgPSBmYWxzZTtcbiAgICB0aGlzLmlubGluZUVkaXRpb24gPSB0cnVlO1xuICAgIHRoaXMuaTE4bkNvbHVtblByZWZpeCA9ICdUQUJMRS5URVNUSU5HLic7XG5cbiAgICB0aGlzLmNvbmZpcm1CZWZvcmVEZWxldGUgPSB0cnVlO1xuICAgIHRoaXMuY29uZmlybUJlZm9yZUNhbmNlbCA9IGZhbHNlO1xuICAgIHRoaXMudW5kb2FibGVEZWxldGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuc2F2ZUJlZm9yZURlbGV0ZSA9IGZhbHNlO1xuXG4gICAgdGhpcy5zYXZlQmVmb3JlU29ydCA9IHRydWU7XG4gICAgdGhpcy5zYXZlQmVmb3JlRmlsdGVyID0gdHJ1ZTtcbiAgICB0aGlzLnByb3BhZ2F0ZVJvd0Vycm9yID0gdHJ1ZTtcblxuICAgIHRoaXMuZmlsdGVyRm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgIHNlYXJjaFRleHQ6IFtudWxsXVxuICAgIH0pO1xuXG4gICAgdGhpcy5vblN0YXJ0RWRpdGluZ1Jvdy5zdWJzY3JpYmUocm93ID0+IHtcbiAgICAgIHJvdy52YWxpZGF0b3IucGF0Y2hWYWx1ZSh7ZW50aXR5TmFtZTogJ1Rlc3RWTyd9LCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIC8vIFVwZGF0ZSBmaWx0ZXIgd2hlbiBjaGFuZ2VzXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuZmlsdGVyRm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDI1MCksXG4gICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuZmlsdGVyRm9ybS52YWxpZCksXG4gICAgICAgICAgdGFwKHZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlciA9IFJlZmVyZW50aWFsRmlsdGVyLmZyb21PYmplY3QodmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYUNvdW50ID0gZmlsdGVyLmNvdW50Tm90RW1wdHlDcml0ZXJpYSgpO1xuICAgICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIC8vIEFwcGx5aW5nIHRoZSBmaWx0ZXJcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyKGZpbHRlciwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyBTYXZlIGZpbHRlciBpbiBzZXR0aW5ncyAoYWZ0ZXIgYSBkZWJvdW5jZSB0aW1lKVxuICAgICAgICAgIGRlYm91bmNlVGltZSg1MDApLFxuICAgICAgICAgIHRhcChqc29uID0+IHRoaXMuc2V0dGluZ3Muc2F2ZVBhZ2VTZXR0aW5nKHRoaXMuc2V0dGluZ3NJZCwganNvbiwgJ2ZpbHRlcicpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyQXV0b2NvbXBsZXRlRmllbGQoJ2xldmVsJywge1xuICAgICAgICBpdGVtczogW1xuICAgICAgICAgIHtpZDogMSwgbGFiZWw6ICdBJywgbmFtZTogJ2l0ZW0gQSd9LFxuICAgICAgICAgIHtpZDogMSwgbGFiZWw6ICdCJywgbmFtZTogJ2l0ZW0gQid9XG4gICAgICAgIF0sXG4gICAgICAgIG1vYmlsZTogdGhpcy5tb2JpbGVcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMub25SZWZyZXNoLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLm1hcmtBc1JlYWR5KCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG5cbiAgICAvLyBSZXN0b3JlIGZpbHRlciBmcm9tIHNldHRpbmdzXG4gICAgdGhpcy5yZXN0b3JlRmlsdGVyKCk7XG5cbiAgICAvLyBMb2FkIGRhdGFcbiAgICB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGNvbnNvbGUuZGVidWcoJ1t0ZXN0LXRhYmxlXSBEZXN0cm95aW5nIHRhYmxlLi4uJyk7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIC8vdGhpcy5kYXRhU2VydmljZS5zdG9wKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzdG9yZUZpbHRlcigpIHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5zZXR0aW5ncy5nZXRQYWdlU2V0dGluZ3ModGhpcy5zZXR0aW5nc0lkLCAnZmlsdGVyJyk7XG4gICAgY29uc29sZS5kZWJ1ZygnW3RhYmxlLXRlc3RdIFJlc3RvcmluZyBmaWx0ZXIgZnJvbSBzZXR0aW5ncy4uLicsIGpzb24pO1xuXG4gICAgaWYgKGpzb24pIHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IFJlZmVyZW50aWFsRmlsdGVyLmZyb21PYmplY3QoanNvbik7XG4gICAgICB0aGlzLmZpbHRlckZvcm0ucGF0Y2hWYWx1ZShqc29uLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgdGhpcy5maWx0ZXJDcml0ZXJpYUNvdW50ID0gZmlsdGVyLmNvdW50Tm90RW1wdHlDcml0ZXJpYSgpO1xuICAgICAgdGhpcy5zZXRGaWx0ZXIoZmlsdGVyLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVUaW1lcigpIHtcbiAgICBpZiAoaXNOb3ROaWwodGhpcy50aW1lcikpIHRoaXMuc3RvcFRpbWVyKCk7XG4gICAgZWxzZSB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgfVxuXG4gIGxvYWQoKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW3Rlc3QtdGFibGVdIFVwZGF0aW5nIGRhdGEuLi4nKTtcbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcblxuICAgIGlmIChpc05pbCh0aGlzLmRhdGEpKSB7XG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLmdlbmVyYXRlRGF0YSgwLCBUYWJsZVRlc3RQYWdlLm1heFJvd0NvdW50KTtcbiAgICB9XG4gICAgdGhpcy5kYXRhU2VydmljZS52YWx1ZSA9IHRoaXMuZGF0YTtcblxuICAgIHRoaXMub25SZWZyZXNoLmVtaXQoKTtcbiAgfVxuXG4gIGFzeW5jIGZldGNoTW9yZShldmVudD86IEN1c3RvbUV2ZW50ICYgeyB0YXJnZXQ/OiBFdmVudFRhcmdldCAmIHsgY29tcGxldGU/OiAoKSA9PiB2b2lkIH19KSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW3RhYmxlLXRlc3RdIExvYWRpbmcgbW9yZS4uLicsIGV2ZW50KTtcbiAgICBjb25zdCBmZXRjaGVkID0gYXdhaXQgdGhpcy5fZGF0YVNvdXJjZS5mZXRjaE1vcmUoKTtcblxuICAgIGlmIChmZXRjaGVkICYmIGV2ZW50Py50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LmNvbXBsZXRlKSB7XG4gICAgICAvLyBXYWl0IGVuZCBvZiBsb2FkXG4gICAgICBhd2FpdCB0aGlzLndhaXRJZGxlKCk7XG4gICAgICAvLyBNYXJrIHRhcmdldCBldmVudCBhcyBjb21wbGV0ZWQgKGUuZy4gSW9uUmVmcmVzaGVyKVxuICAgICAgZXZlbnQudGFyZ2V0LmNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2F2ZShvcHRzPzogeyBrZWVwRWRpdGluZz86IGJvb2xlYW4gfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHNhdmVkID0gYXdhaXQgc3VwZXIuc2F2ZShvcHRzKTtcbiAgICBpZiAoc2F2ZWQpIHtcbiAgICAgIC8vIFVwZGF0ZSBzb3VyY2UgZGF0YVxuICAgICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhU2VydmljZS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHNhdmVkO1xuICB9XG5cbiAgY2xlYXJDb250cm9sVmFsdWUoZXZlbnQ6IFVJRXZlbnQsIGZvcm1Db250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQpIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBBdm9pZCB0byBlbnRlciBpbnB1dCB0aGUgZmllbGRcbiAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhcHBseUZpbHRlckFuZENsb3NlUGFuZWwoZXZlbnQ/OiBVSUV2ZW50KSB7XG4gICAgdGhpcy5kZWZhdWx0UGFnZVNpemUgPSBERUZBVUxUX1BBR0VfU0laRTtcbiAgICB0aGlzLm9uUmVmcmVzaC5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLmZpbHRlckV4cGFuc2lvblBhbmVsLmNsb3NlKCk7XG4gIH1cblxuICByZXNldEZpbHRlcihldmVudD86IFVJRXZlbnQpIHtcbiAgICB0aGlzLmZpbHRlckZvcm0ucmVzZXQoe30sIHtlbWl0RXZlbnQ6IHRydWV9KTtcbiAgICB0aGlzLnNldEZpbHRlcihSZWZlcmVudGlhbEZpbHRlci5mcm9tT2JqZWN0KHt9KSwge2VtaXRFdmVudDogdHJ1ZX0pO1xuICAgIHRoaXMuZmlsdGVyRXhwYW5zaW9uUGFuZWwuY2xvc2UoKTtcbiAgfVxuXG4gIHN0YXJ0VGltZXIoKSB7XG4gICAgdGhpcy5zdG9wVGltZXIoKTtcbiAgICB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhID0gbnVsbDsgLy8gUmVzZXRcbiAgICAgIHRoaXMubG9hZCgpO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuICBzdG9wVGltZXIoKSB7XG4gICAgaWYgKGlzTm90TmlsKHRoaXMudGltZXIpKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdlbmVyYXRlRGF0YShvZmZzZXQ/OiBudW1iZXIsIHNpemU/OiBudW1iZXIsICk6IFJlZmVyZW50aWFsW10ge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuICAgIHNpemUgPSBzaXplIHx8IDEwMDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZWZlcmVudGlhbD4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgY29uc3QgaWQgPSBpICsgMSArIG9mZnNldDtcbiAgICAgIGNvbnN0IGl0ZW0gPSBSZWZlcmVudGlhbC5mcm9tT2JqZWN0KHtcbiAgICAgICAgaWQsXG4gICAgICAgIGxhYmVsOiAnQ09ERS0nICsgaWQsXG4gICAgICAgIG5hbWU6ICdOYW1lICMnICsgaWQsXG4gICAgICAgIGxldmVsSWQ6IHtpZDogMSwgbGFiZWw6ICdBJywgbmFtZTogJ0l0ZW0gQSd9LFxuICAgICAgICBzdGF0dXNJZDogU3RhdHVzSWRzLkVOQUJMRSxcbiAgICAgICAgY29tbWVudHM6ICdNeSBjb21tZW50ICMnICsgaWQsXG4gICAgICAgIGNyZWF0aW9uRGF0ZTogZnJvbVVuaXhNc1RpbWVzdGFtcChEYXRlLm5vdygpIC0gaSAqIDYwICogMTAwMCksXG4gICAgICAgIHVwZGF0ZURhdGU6IGZyb21Vbml4TXNUaW1lc3RhbXAoRGF0ZS5ub3coKSAtIGkgKiA2MCAqIDEwMDApLFxuICAgICAgICBlbnRpdHlOYW1lOiAnVGVzdFZPJ1xuICAgICAgfSk7XG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=
@@ -5,17 +5,17 @@ import { isEmptyArray, isNil, isNotEmptyArray, isNotNil } from '../functions';
5
5
  import { Directive } from '@angular/core';
6
6
  import { EntityUtils } from '../../core/services/model/entity.model';
7
7
  import { EntityFilter, EntityFilterUtils } from '../../core/services/model/filter.model';
8
- import { firstFalsePromise, firstNotNil } from '../observables';
9
- import { StartableService } from './startable-service.class';
8
+ import { firstFalsePromise } from '../observables';
9
+ import { StartableObservableService } from './startable-observable-service.class';
10
10
  // @dynamic
11
11
  // eslint-disable-next-line @angular-eslint/directive-class-suffix
12
- export class InMemoryEntitiesService extends StartableService {
12
+ export class InMemoryEntitiesService extends StartableObservableService {
13
13
  constructor(dataType, filterType, options) {
14
14
  super(null);
15
15
  this.dataType = dataType;
16
16
  this.filterType = filterType;
17
17
  this.debug = false;
18
- this.dataSubject = new BehaviorSubject(null);
18
+ this._hiddenData = null;
19
19
  this.dirtySubject = new BehaviorSubject(false);
20
20
  this.savingSubject = new BehaviorSubject(false);
21
21
  options = Object.assign({ onSort: this.sort }, options);
@@ -30,6 +30,7 @@ export class InMemoryEntitiesService extends StartableService {
30
30
  }
31
31
  return undefined;
32
32
  });
33
+ this._startByReadyFunction = false; // Need setValue() to be called, to start the service
33
34
  this._sortByReplacement = Object.assign({
34
35
  // Detect rankOrder on the entity class
35
36
  id: (Object.getOwnPropertyNames(new dataType()).findIndex(key => key === 'rankOrder') !== -1) ? 'rankOrder' : undefined }, options.sortByReplacement);
@@ -46,22 +47,27 @@ export class InMemoryEntitiesService extends StartableService {
46
47
  get dirty() {
47
48
  return this.dirtySubject.value;
48
49
  }
49
- ngOnStart() {
50
+ ngOnStart(data) {
50
51
  return __awaiter(this, void 0, void 0, function* () {
52
+ if (!data)
53
+ throw new Error('Missing required data, to start this service');
51
54
  if (this.debug)
52
55
  console.debug('[memory-data-service] Starting...');
53
- return firstNotNil(this.dataSubject, { stop: this.stopSubject })
54
- .toPromise();
56
+ this._hiddenData = [];
57
+ this.markAsSaved();
58
+ this.markAsPristine();
59
+ return data;
55
60
  });
56
61
  }
57
62
  ngOnStop() {
58
63
  return __awaiter(this, void 0, void 0, function* () {
59
64
  if (this.debug)
60
65
  console.debug('[memory-data-service] Stopping...');
61
- this.savingSubject.next(false);
62
- this.dirtySubject.next(false);
63
66
  this.dataSubject.complete();
64
- this.dataSubject = new BehaviorSubject(null);
67
+ this.dataSubject.unsubscribe();
68
+ this._hiddenData = null;
69
+ this.markAsSaved();
70
+ this.markAsPristine();
65
71
  });
66
72
  }
67
73
  ngOnDestroy() {
@@ -69,12 +75,17 @@ export class InMemoryEntitiesService extends StartableService {
69
75
  }
70
76
  setValue(data) {
71
77
  if (this.dataSubject.value !== data) {
72
- if (!this.started)
73
- this.start();
74
- this._hiddenData = [];
75
- this.dataSubject.next(data);
78
+ // If service already started, then update data
79
+ if (this.started) {
80
+ this._hiddenData = [];
81
+ this.dataSubject.next(data);
82
+ this.markAsPristine();
83
+ }
84
+ // if service not started yet, then start it, using given data
85
+ else {
86
+ this.start(data);
87
+ }
76
88
  }
77
- this.markAsPristine();
78
89
  }
79
90
  loadAll(offset, size, sortBy, sortDirection, filter, opts) {
80
91
  return __awaiter(this, void 0, void 0, function* () {
@@ -84,11 +95,20 @@ export class InMemoryEntitiesService extends StartableService {
84
95
  if (isNil(originalData)) {
85
96
  console.warn('[memory-data-service] Cannot load all: no value set. Will return empty result');
86
97
  }
87
- // Wait ready
88
- if (!this.started)
98
+ try {
99
+ // Wait service is ready
89
100
  yield this.ready();
90
- if (this.saving)
91
- yield this.waitWhileSaving();
101
+ // Wait while busy (e.g. when saving, or deleting)
102
+ yield this.waitIdle({ stopError: false /*avoid error when stopped*/ });
103
+ }
104
+ catch (err) {
105
+ // Should be a stop error: log and continue
106
+ if (!this.stopped)
107
+ console.error('Unexpected error, while waiting :', err);
108
+ }
109
+ // Make sure service is not stopped
110
+ if (this.stopped)
111
+ return undefined;
92
112
  const excludedDataByFilter = [];
93
113
  let excludedDataByPagination;
94
114
  try {
@@ -148,10 +168,10 @@ export class InMemoryEntitiesService extends StartableService {
148
168
  if (nextOffset < total) {
149
169
  res.fetchMore = () => this.loadAll(nextOffset, size, sortBy, sortDirection, filter, opts)
150
170
  .then(res => {
151
- var _a;
171
+ var _a, _b;
152
172
  // Update hidden data (remove new fetched item)
153
173
  if ((_a = res.data) === null || _a === void 0 ? void 0 : _a.length) {
154
- this._hiddenData = this._hiddenData.filter(item => !res.data.includes(item));
174
+ this._hiddenData = (_b = this._hiddenData) === null || _b === void 0 ? void 0 : _b.filter(item => !res.data.includes(item));
155
175
  }
156
176
  return res;
157
177
  });
@@ -172,7 +192,8 @@ export class InMemoryEntitiesService extends StartableService {
172
192
  return this.dataSubject
173
193
  .pipe(takeUntil(this.stopSubject),
174
194
  // Warn if waiting value to be set
175
- tap((data) => this.debug && !data && console.debug('[memory-data-service] Waiting value to be set...')), filter(isNotNil), mergeMap(_ => this.loadAll(offset, size, sortBy, sortDirection, filterData, options)));
195
+ tap((data) => this.debug && !data && console.debug('[memory-data-service] Waiting value to be set...')), filter(isNotNil), mergeMap(_ => this.loadAll(offset, size, sortBy, sortDirection, filterData, options)), filter(isNotNil) // Skip no result (e.g. when stopped)
196
+ );
176
197
  }
177
198
  saveAll(data, options) {
178
199
  return __awaiter(this, void 0, void 0, function* () {
@@ -249,6 +270,11 @@ export class InMemoryEntitiesService extends StartableService {
249
270
  var _a;
250
271
  return ((_a = this._hiddenData) === null || _a === void 0 ? void 0 : _a.length) || 0;
251
272
  }
273
+ waitIdle(opts) {
274
+ return __awaiter(this, void 0, void 0, function* () {
275
+ yield this.waitWhileSaving(opts);
276
+ });
277
+ }
252
278
  /* -- protected methods -- */
253
279
  filter(data, _filter, hiddenData) {
254
280
  // if filter is DataFilter instance, use its test function
@@ -274,9 +300,11 @@ export class InMemoryEntitiesService extends StartableService {
274
300
  }));
275
301
  }
276
302
  waitWhileSaving(opts) {
277
- if (!this.saving)
278
- return;
279
- return firstFalsePromise(this.savingSubject, Object.assign({ stop: (opts === null || opts === void 0 ? void 0 : opts.stop) || merge(this.stopSubject, this.dataSubject) }, opts));
303
+ return __awaiter(this, void 0, void 0, function* () {
304
+ if (this.saving) {
305
+ return firstFalsePromise(this.savingSubject, Object.assign({ stop: (opts === null || opts === void 0 ? void 0 : opts.stop) || merge(this.stopSubject, this.dataSubject), stopError: false }, opts));
306
+ }
307
+ });
280
308
  }
281
309
  markAsSaving() {
282
310
  if (!this.savingSubject.value) {
@@ -307,4 +335,4 @@ InMemoryEntitiesService.ctorParameters = () => [
307
335
  { type: Function },
308
336
  { type: undefined }
309
337
  ];
310
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBYSxNQUFNLE1BQU0sQ0FBQztBQUN4RCxPQUFPLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHNUUsT0FBTyxFQUFDLFNBQVMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUMsV0FBVyxFQUFVLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsT0FBTyxFQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQWlCLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFjM0QsV0FBVztBQUVYLGtFQUFrRTtBQUNsRSxNQUFNLE9BQU8sdUJBS1gsU0FBUSxnQkFBcUI7SUFrQzdCLFlBQ1ksUUFBb0IsRUFDcEIsVUFBc0IsRUFDaEMsT0FBOEM7UUFFOUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBSkYsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBakNsQyxVQUFLLEdBQUcsS0FBSyxDQUFDO1FBSU4sZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztRQUNwQyxpQkFBWSxHQUFHLElBQUks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QVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBRVMsY0FBYztRQUN0QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQzs7O1lBMVhGLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgbWVyZ2UsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAsIHRha2VVbnRpbCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge2lzRW1wdHlBcnJheSwgaXNOaWwsIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWx9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0VudGl0aWVzU2VydmljZUxvYWRPcHRpb25zLCBFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnMsIEZpbHRlckZuLCBGaWx0ZXJGbkZhY3RvcnksIElFbnRpdGllc1NlcnZpY2UsIExvYWRSZXN1bHR9IGZyb20gJy4vZW50aXR5LXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHtTb3J0RGlyZWN0aW9ufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7RGlyZWN0aXZlLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtFbnRpdHlVdGlscywgSUVudGl0eX0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9tb2RlbC9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHtFbnRpdHlGaWx0ZXIsIEVudGl0eUZpbHRlclV0aWxzfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL2ZpbHRlci5tb2RlbCc7XG5pbXBvcnQge2ZpcnN0RmFsc2VQcm9taXNlLCBmaXJzdE5vdE5pbCwgV2FpdEZvck9wdGlvbnN9IGZyb20gJy4uL29ic2VydmFibGVzJztcbmltcG9ydCB7U3RhcnRhYmxlU2VydmljZX0gZnJvbSAnLi9zdGFydGFibGUtc2VydmljZS5jbGFzcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5NZW1vcnlFbnRpdGllc1NlcnZpY2VPcHRpb25zPFQsIEY+IHtcbiAgb25Tb3J0PzogKGRhdGE6IFRbXSwgc29ydEJ5Pzogc3RyaW5nLCBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbikgPT4gVFtdO1xuICBvbkxvYWQ/OiAoZGF0YTogVFtdKSA9PiBUW10gfCBQcm9taXNlPFRbXT47XG4gIG9uU2F2ZT86IChkYXRhOiBUW10pID0+IFRbXSB8IFByb21pc2U8VFtdPjtcbiAgZXF1YWxzPzogKGQxOiBULCBkMjogVCkgPT4gYm9vbGVhbjtcblxuICBmaWx0ZXJGbkZhY3Rvcnk/OiBGaWx0ZXJGbkZhY3Rvcnk8VCwgRj47XG4gIGZpbHRlckZuPzogRmlsdGVyRm48VD47XG5cbiAgc29ydEJ5UmVwbGFjZW1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vLyBAZHluYW1pY1xuQERpcmVjdGl2ZSgpXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBJbk1lbW9yeUVudGl0aWVzU2VydmljZTxcbiAgVCBleHRlbmRzIElFbnRpdHk8VCwgSUQ+LFxuICBGID0gYW55LFxuICBJRCA9IG51bWJlcixcbiAgTyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyA9IEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucz5cbiAgZXh0ZW5kcyBTdGFydGFibGVTZXJ2aWNlPFRbXT5cbiAgaW1wbGVtZW50cyBJRW50aXRpZXNTZXJ2aWNlPFQsIEYsIE8+LCBPbkRlc3Ryb3kge1xuXG4gIGRlYnVnID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfaGlkZGVuRGF0YTogVFtdO1xuXG4gIHByaXZhdGUgZGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRbXT4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlydHlTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2F2aW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zb3J0Rm46IChkYXRhOiBUW10sIHNvcnRCeT86IHN0cmluZywgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24pID0+IFRbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25Mb2FkOiAoZGF0YTogVFtdKSA9PiBUW10gfCBQcm9taXNlPFRbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uU2F2ZUZuOiAoZGF0YTogVFtdKSA9PiBUW10gfCBQcm9taXNlPFRbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2VxdWFsc0ZuOiAoZDE6IFQsIGQyOiBUKSA9PiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJGbkZhY3Rvcnk6IEZpbHRlckZuRmFjdG9yeTxULCBGPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfc29ydEJ5UmVwbGFjZW1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cblxuICBzZXQgdmFsdWUoZGF0YTogVFtdKSB7XG4gICAgdGhpcy5zZXRWYWx1ZShkYXRhKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBUW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTdWJqZWN0LmdldFZhbHVlKCk7XG4gIH1cblxuICBnZXQgc2F2aW5nKCk6IGJvb2xlYW57XG4gICAgcmV0dXJuIHRoaXMuc2F2aW5nU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIGdldCBkaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXJ0eVN1YmplY3QudmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgZGF0YVR5cGU6IG5ldygpID0+IFQsXG4gICAgcHJvdGVjdGVkIGZpbHRlclR5cGU6IG5ldygpID0+IEYsXG4gICAgb3B0aW9ucz86IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlT3B0aW9uczxULCBGPlxuICApIHtcbiAgICBzdXBlcihudWxsKTtcbiAgICBvcHRpb25zID0ge1xuICAgICAgb25Tb3J0OiB0aGlzLnNvcnQsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIHRoaXMuX3NvcnRGbiA9IG9wdGlvbnMub25Tb3J0O1xuICAgIHRoaXMuX29uTG9hZCA9IG9wdGlvbnMub25Mb2FkO1xuICAgIHRoaXMuX29uU2F2ZUZuID0gb3B0aW9ucy5vblNhdmU7XG4gICAgdGhpcy5fZXF1YWxzRm4gPSBvcHRpb25zLmVxdWFscztcbiAgICB0aGlzLl9maWx0ZXJGbkZhY3RvcnkgPSBvcHRpb25zLmZpbHRlckZuRmFjdG9yeSB8fCAoKGYpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuYXNGaWx0ZXIoZikgYXMgRjtcbiAgICAgIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBFbnRpdHlGaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlci5hc0ZpbHRlckZuKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fc29ydEJ5UmVwbGFjZW1lbnQgPSB7XG4gICAgICAvLyBEZXRlY3QgcmFua09yZGVyIG9uIHRoZSBlbnRpdHkgY2xhc3NcbiAgICAgIGlkOiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobmV3IGRhdGFUeXBlKCkpLmZpbmRJbmRleChrZXkgPT4ga2V5ID09PSAncmFua09yZGVyJykgIT09IC0xKSA/ICdyYW5rT3JkZXInIDogdW5kZWZpbmVkLFxuICAgICAgLi4ub3B0aW9ucy5zb3J0QnlSZXBsYWNlbWVudFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KCk6IFByb21pc2U8VFtdPiB7XG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1ttZW1vcnktZGF0YS1zZXJ2aWNlXSBTdGFydGluZy4uLicpO1xuICAgIHJldHVybiBmaXJzdE5vdE5pbCh0aGlzLmRhdGFTdWJqZWN0LCB7c3RvcDogdGhpcy5zdG9wU3ViamVjdH0pXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1ttZW1vcnktZGF0YS1zZXJ2aWNlXSBTdG9wcGluZy4uLicpO1xuICAgIHRoaXMuc2F2aW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLmRpcnR5U3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLmRhdGFTdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgdGhpcy5kYXRhU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VFtdPihudWxsKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3RvcCgpO1xuICB9XG5cbiAgc2V0VmFsdWUoZGF0YTogVFtdKSB7XG4gICAgaWYgKHRoaXMuZGF0YVN1YmplY3QudmFsdWUgIT09IGRhdGEpIHtcbiAgICAgIGlmICghdGhpcy5zdGFydGVkKSB0aGlzLnN0YXJ0KCk7XG4gICAgICB0aGlzLl9oaWRkZW5EYXRhID0gW107XG4gICAgICB0aGlzLmRhdGFTdWJqZWN0Lm5leHQoZGF0YSk7XG4gICAgfVxuICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRBbGwoXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIHNvcnRCeT86IHN0cmluZyxcbiAgICBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbixcbiAgICBmaWx0ZXI/OiBGLFxuICAgIG9wdHM/OiBFbnRpdGllc1NlcnZpY2VMb2FkT3B0aW9uc1xuICApOiBQcm9taXNlPExvYWRSZXN1bHQ8VD4+IHtcblxuICAgIG9mZnNldCA9IG9mZnNldCA+PSAwID8gb2Zmc2V0IDogMDtcbiAgICBzaXplID0gc2l6ZSA+PSAwID8gc2l6ZSA6IC0xO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxEYXRhID0gdGhpcy5kYXRhU3ViamVjdC52YWx1ZTtcbiAgICBpZiAoaXNOaWwob3JpZ2luYWxEYXRhKSkge1xuICAgICAgY29uc29sZS53YXJuKCdbbWVtb3J5LWRhdGEtc2VydmljZV0gQ2Fubm90IGxvYWQgYWxsOiBubyB2YWx1ZSBzZXQuIFdpbGwgcmV0dXJuIGVtcHR5IHJlc3VsdCcpO1xuICAgIH1cblxuICAgIC8vIFdhaXQgcmVhZHlcbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgIGlmICh0aGlzLnNhdmluZykgYXdhaXQgdGhpcy53YWl0V2hpbGVTYXZpbmcoKTtcblxuICAgIGNvbnN0IGV4Y2x1ZGVkRGF0YUJ5RmlsdGVyOiBUW10gPSBbXTtcbiAgICBsZXQgZXhjbHVkZWREYXRhQnlQYWdpbmF0aW9uOiBUW107XG5cbiAgICB0cnkge1xuICAgICAgaWYgKGlzRW1wdHlBcnJheShvcmlnaW5hbERhdGEpKSB7XG4gICAgICAgIHJldHVybiB7ZGF0YTogW10sIHRvdGFsOiAwfTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgc29ydFxuICAgICAgbGV0IGRhdGEgPSB0aGlzLl9zb3J0Rm4ob3JpZ2luYWxEYXRhLCBzb3J0QnksIHNvcnREaXJlY3Rpb24pIDtcblxuICAgICAgaWYgKHRoaXMuX29uTG9hZCkge1xuICAgICAgICBkYXRhID0gYXdhaXQgdGhpcy5fb25Mb2FkKGRhdGEpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBmaWx0ZXIgKHdpbGwgdXBkYXRlIGhpZGRlbkRhdGEpXG4gICAgICBkYXRhID0gdGhpcy5maWx0ZXIoZGF0YSwgZmlsdGVyLCBleGNsdWRlZERhdGFCeUZpbHRlcik7XG5cbiAgICAgIC8vIENvbXB1dGUgdGhlIHRvdGFsIGxlbmd0aFxuICAgICAgY29uc3QgdG90YWwgPSBkYXRhLmxlbmd0aDtcblxuICAgICAgLy8gSWYgcGFnZSBzaXplPTAgKGUuZy4gb25seSBuZWVkIHRvdGFsKVxuICAgICAgaWYgKHNpemUgPT09IDApIHtcbiAgICAgICAgZXhjbHVkZWREYXRhQnlQYWdpbmF0aW9uID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIHtkYXRhOiBbXSwgdG90YWx9O1xuICAgICAgfVxuXG4gICAgICAvLyBTbGljZSBpbiBhIHBhZ2UgKHVzaW5nIG9mZnNldCBhbmQgc2l6ZSlcbiAgICAgIGlmIChvZmZzZXQgPiAwKSB7XG5cbiAgICAgICAgLy8gT2Zmc2V0IGFmdGVyIHRoZSBlbmQ6IG5vIHJlc3VsdFxuICAgICAgICBpZiAob2Zmc2V0ID49IGRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgZXhjbHVkZWREYXRhQnlQYWdpbmF0aW9uID0gZGF0YTtcbiAgICAgICAgICBkYXRhID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZXhjbHVkZWREYXRhQnlQYWdpbmF0aW9uID0gKHNpemUgPiAwICYmICgob2Zmc2V0ICsgc2l6ZSkgPCBkYXRhLmxlbmd0aCkpXG4gICAgICAgICAgICAvLyBTbGljZSB1c2luZyBsaW1pdCB0byBzaXplXG4gICAgICAgICAgICA/IGRhdGEuc2xpY2UoMCwgb2Zmc2V0IC0xKS5jb25jYXQoZGF0YS5zbGljZShvZmZzZXQgKyBzaXplKSlcbiAgICAgICAgICAgIC8vIFNsaWNlIHdpdGhvdXQgbGltaXRcbiAgICAgICAgICAgIDogZGF0YS5zbGljZSgwLCBvZmZzZXQtMSk7XG5cbiAgICAgICAgICBkYXRhID0gKHNpemUgPiAwICYmICgob2Zmc2V0ICsgc2l6ZSkgPCBkYXRhLmxlbmd0aCkpXG4gICAgICAgICAgICAvLyBTbGljZSB1c2luZyBsaW1pdCB0byBzaXplXG4gICAgICAgICAgICA/IGRhdGEuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplKVxuICAgICAgICAgICAgLy8gU2xpY2Ugd2l0aG91dCBsaW1pdFxuICAgICAgICAgICAgOiBkYXRhLnNsaWNlKG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgYSBsaW1pdFxuICAgICAgZWxzZSBpZiAoc2l6ZSA+IDApe1xuICAgICAgICBleGNsdWRlZERhdGFCeVBhZ2luYXRpb24gPSBkYXRhLnNsaWNlKHNpemUpO1xuICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgwLCBzaXplKTtcbiAgICAgIH1cblxuICAgICAgLy8gTm8gbGltaXQ6XG4gICAgICBlbHNlIGlmIChzaXplID09PSAtMSl7XG4gICAgICAgIC8vIEtlZXAgYWxsIGRhdGFcbiAgICAgIH1cblxuICAgICAgLy8gLyFcXCBJZiBhbHJlYWR5IG9ic2VydmVkLCB0aGVuIGFsd2F5cyBjcmVhdGUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBhcnJheVxuICAgICAgLy8gQmVjYXVzZSBkYXRhc291cmNlIHdpbGwgb25seSB1cGRhdGUgaWYgdGhlIGFycmF5IGNoYW5nZWRcbiAgICAgIGlmIChkYXRhID09PSBvcmlnaW5hbERhdGEpIHtcbiAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzOiBMb2FkUmVzdWx0PFQ+ID0ge2RhdGEsIHRvdGFsfTtcblxuICAgICAgY29uc3QgbmV4dE9mZnNldCA9IChvZmZzZXQgfHwgMCkgKyBzaXplO1xuICAgICAgaWYgKG5leHRPZmZzZXQgPCB0b3RhbCkge1xuICAgICAgICByZXMuZmV0Y2hNb3JlID0gKCkgPT4gdGhpcy5sb2FkQWxsKG5leHRPZmZzZXQsIHNpemUsIHNvcnRCeSwgc29ydERpcmVjdGlvbiwgZmlsdGVyLCBvcHRzKVxuICAgICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgaGlkZGVuIGRhdGEgKHJlbW92ZSBuZXcgZmV0Y2hlZCBpdGVtKVxuICAgICAgICAgICAgaWYgKHJlcy5kYXRhPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5faGlkZGVuRGF0YSA9IHRoaXMuX2hpZGRlbkRhdGEuZmlsdGVyKGl0ZW0gPT4gIXJlcy5kYXRhLmluY2x1ZGVzKGl0ZW0pKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAvLyBSZW1lbWJlciBoaWRkZW4gZGF0YVxuICAgICAgaWYgKG9mZnNldCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9oaWRkZW5EYXRhID0gIWV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbiA/IGV4Y2x1ZGVkRGF0YUJ5RmlsdGVyIDogZXhjbHVkZWREYXRhQnlGaWx0ZXIuY29uY2F0KC4uLmV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgd2F0Y2hBbGwoXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIHNvcnRCeT86IHN0cmluZyxcbiAgICBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbixcbiAgICBmaWx0ZXJEYXRhPzogRixcbiAgICBvcHRpb25zPzogYW55XG4gICk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxUPj4ge1xuXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID49IDAgPyBvZmZzZXQgOiAwO1xuICAgIHNpemUgPSBzaXplID49IDAgPyBzaXplIDogLTE7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU3ViamVjdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnN0b3BTdWJqZWN0KSxcbiAgICAgICAgLy8gV2FybiBpZiB3YWl0aW5nIHZhbHVlIHRvIGJlIHNldFxuICAgICAgICB0YXAoKGRhdGEpID0+IHRoaXMuZGVidWcgJiYgIWRhdGEgJiYgY29uc29sZS5kZWJ1ZygnW21lbW9yeS1kYXRhLXNlcnZpY2VdIFdhaXRpbmcgdmFsdWUgdG8gYmUgc2V0Li4uJykpLFxuICAgICAgICBmaWx0ZXIoaXNOb3ROaWwpLFxuICAgICAgICBtZXJnZU1hcChfID0+IHRoaXMubG9hZEFsbChvZmZzZXQsIHNpemUsIHNvcnRCeSwgc29ydERpcmVjdGlvbiwgZmlsdGVyRGF0YSwgb3B0aW9ucykpXG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgc2F2ZUFsbChkYXRhOiBUW10sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPFRbXT4ge1xuICAgIGlmICghdGhpcy5kYXRhU3ViamVjdC52YWx1ZSkgdGhyb3cgbmV3IEVycm9yKCdbbWVtb3J5LXNlcnZpY2VdIENvdWxkIG5vdCBzYXZlLCBiZWNhdXNlIHZhbHVlIG5vdCBzZXQnKTtcblxuICAgIHRoaXMubWFya0FzU2F2aW5nKCk7XG5cbiAgICB0cnkge1xuXG4gICAgICAvLyBSZXN0b3JlIGhpZGRlbiBkYXRhXG4gICAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHRoaXMuX2hpZGRlbkRhdGEpKVxuICAgICAgICBkYXRhID0gZGF0YS5jb25jYXQoLi4udGhpcy5faGlkZGVuRGF0YSk7XG5cbiAgICAgIGlmICh0aGlzLl9vblNhdmVGbikge1xuICAgICAgICBjb25zdCByZXMgPSB0aGlzLl9vblNhdmVGbihkYXRhKTtcbiAgICAgICAgZGF0YSA9ICgocmVzIGluc3RhbmNlb2YgUHJvbWlzZSkpID8gYXdhaXQgcmVzIDogcmVzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRhdGFTdWJqZWN0Lm5leHQoZGF0YSk7XG4gICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtBc1NhdmVkKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlQWxsKGRhdGFUb1JlbW92ZTogVFtdLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICBsZXQgZGF0YSA9IHRoaXMuZGF0YVN1YmplY3QudmFsdWU7XG4gICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoJ1ttZW1vcnktc2VydmljZV0gQ291bGQgbm90IGRlbGV0ZSwgYmVjYXVzZSB2YWx1ZSBub3Qgc2V0Jyk7XG5cbiAgICB0aGlzLm1hcmtBc1NhdmluZygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlbW92ZSBkZWxldGVkIGl0ZW0sIGZyb20gZGF0YVxuICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBkYXRhLmZpbHRlcihlbnRpdHkgPT4ge1xuICAgICAgICBjb25zdCByZW1vdmVkID0gZGF0YVRvUmVtb3ZlLmZpbmRJbmRleChlbnRpdHlUb1JlbW92ZSA9PiB0aGlzLmVxdWFscyhlbnRpdHlUb1JlbW92ZSwgZW50aXR5KSkgIT09IC0xO1xuICAgICAgICByZXR1cm4gIXJlbW92ZWQ7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRlbGV0ZUNvdW50ID0gZGF0YS5sZW5ndGggLSB1cGRhdGVkRGF0YS5sZW5ndGg7XG4gICAgICBpZiAoZGVsZXRlQ291bnQgPiAwKSB7XG4gICAgICAgIGRhdGEgPSB1cGRhdGVkRGF0YTtcbiAgICAgICAgdGhpcy5kYXRhU3ViamVjdC5uZXh0KGRhdGEpO1xuICAgICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgdGhpcy5tYXJrQXNTYXZlZCgpO1xuICAgIH1cbiAgfVxuXG4gIHNvcnQoZGF0YTogVFtdLCBzb3J0Qnk/OiBzdHJpbmcsIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uKTogVFtdIHtcbiAgICAvLyBSZXBsYWNlIHNvcnRCeSwgdXNpbmcgdGhlIHJlcGxhY2VtZW50IG1hcFxuICAgIHNvcnRCeSA9IHNvcnRCeSAmJiB0aGlzLl9zb3J0QnlSZXBsYWNlbWVudFtzb3J0QnldIHx8IHNvcnRCeSB8fCAnaWQnO1xuXG4gICAgLy8gRXhlY3V0ZSB0aGUgc29ydFxuICAgIHJldHVybiBFbnRpdHlVdGlscy5zb3J0KGRhdGEsIHNvcnRCeSwgc29ydERpcmVjdGlvbik7XG4gIH1cblxuICBhc0ZpbHRlcihzb3VyY2U6IFBhcnRpYWw8Rj4pOiBGIHtcbiAgICByZXR1cm4gRW50aXR5RmlsdGVyVXRpbHMuZnJvbU9iamVjdChzb3VyY2UsIHRoaXMuZmlsdGVyVHlwZSk7XG4gIH1cblxuICBhZGRTb3J0QnlSZXBsYWNlbWVudChzb3VyY2U6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zb3J0QnlSZXBsYWNlbWVudFtzb3VyY2VdID0gdGFyZ2V0O1xuICB9XG5cbiAgZXF1YWxzKGQxOiBULCBkMjogVCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9lcXVhbHNGbikgcmV0dXJuIHRoaXMuX2VxdWFsc0ZuKGQxLCBkMik7XG4gICAgcmV0dXJuIGQxICYmIGQxLmVxdWFscyA/IGQxLmVxdWFscyhkMikgOiBFbnRpdHlVdGlscy5lcXVhbHMoZDEsIGQyLCAnaWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3VudCBkYXRhIHN0b3JlZCBieSB0aGUgc2VydmljZSAod2l0aG91dCBoaWRkZW4gZGF0YSkuXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBnZXQgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YVN1YmplY3QudmFsdWU/Lmxlbmd0aCB8fCAwKTtcbiAgfVxuXG4gIGdldCBoaWRkZW5Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9oaWRkZW5EYXRhPy5sZW5ndGggfHwgMDtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGZpbHRlcihkYXRhOiBUW10sIF9maWx0ZXI6IEYsIGhpZGRlbkRhdGE6IFRbXSk6IFRbXSB7XG5cbiAgICAvLyBpZiBmaWx0ZXIgaXMgRGF0YUZpbHRlciBpbnN0YW5jZSwgdXNlIGl0cyB0ZXN0IGZ1bmN0aW9uXG4gICAgY29uc3QgZmlsdGVyRm4gPSB0aGlzLl9maWx0ZXJGbkZhY3RvcnkgJiYgdGhpcy5fZmlsdGVyRm5GYWN0b3J5KF9maWx0ZXIpO1xuICAgIGlmIChmaWx0ZXJGbikge1xuICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gW107XG5cbiAgICAgIGRhdGEuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXJGbih2YWx1ZSkpXG4gICAgICAgICAgZmlsdGVyZWREYXRhLnB1c2godmFsdWUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgaGlkZGVuRGF0YS5wdXNoKHZhbHVlKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZmlsdGVyZWREYXRhO1xuICAgIH1cblxuICAgIC8vIGRlZmF1bHQsIG5vIGZpbHRlclxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbm5lY3QoKTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVN1YmplY3QucGlwZShcbiAgICAgIG1hcCgoZGF0YSkgPT4ge1xuICAgICAgICBkYXRhID0gZGF0YSB8fCBbXTtcbiAgICAgICAgY29uc3QgdG90YWwgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIHtkYXRhLCB0b3RhbH07XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICB3YWl0V2hpbGVTYXZpbmcob3B0cz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnNhdmluZykgcmV0dXJuO1xuXG4gICAgcmV0dXJuIGZpcnN0RmFsc2VQcm9taXNlKHRoaXMuc2F2aW5nU3ViamVjdCwge1xuICAgICAgc3RvcDogb3B0cz8uc3RvcCB8fCBtZXJnZSh0aGlzLnN0b3BTdWJqZWN0LCB0aGlzLmRhdGFTdWJqZWN0KSwgLy8gU3RvcCBpZiBkZXN0cm95ZWQgb3IgbmV3IGRhdGEgUmVjZWl2ZWRcbiAgICAgIC4uLm9wdHNcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrQXNTYXZpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUpIHtcbiAgICAgIHRoaXMuc2F2aW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrQXNTYXZlZCgpIHtcbiAgICBpZiAodGhpcy5zYXZpbmdTdWJqZWN0LnZhbHVlKSB7XG4gICAgICB0aGlzLnNhdmluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtBc0RpcnR5KCkge1xuICAgIGlmICghdGhpcy5kaXJ0eVN1YmplY3QudmFsdWUpIHtcbiAgICAgIHRoaXMuZGlydHlTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtBc1ByaXN0aW5lKCkge1xuICAgIGlmICh0aGlzLmRpcnR5U3ViamVjdC52YWx1ZSkge1xuICAgICAgdGhpcy5kaXJ0eVN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBYSxNQUFNLE1BQU0sQ0FBQztBQUN4RCxPQUFPLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHNUUsT0FBTyxFQUFDLFNBQVMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUMsV0FBVyxFQUFVLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsT0FBTyxFQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxpQkFBaUIsRUFBOEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5RSxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQWNoRixXQUFXO0FBRVgsa0VBQWtFO0FBQ2xFLE1BQU0sT0FBTyx1QkFLWCxTQUFRLDBCQUFvQztJQWdDNUMsWUFDWSxRQUFvQixFQUNwQixVQUFzQixFQUNoQyxPQUE4QztRQUU5QyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFKRixhQUFRLEdBQVIsUUFBUSxDQUFZO1FBQ3BCLGVBQVUsR0FBVixVQUFVLENBQVk7UUEvQmxDLFVBQUssR0FBRyxLQUFLLENBQUM7UUFFTixnQkFBVyxHQUFRLElBQUksQ0FBQztRQUNmLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDbkQs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YUFBYSxrQkFDekMsSUFBSSxFQUFFLENBQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLElBQUksS0FBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQzdELFNBQVMsRUFBRSxLQUFLLElBQ2IsSUFBSSxFQUNQLENBQUM7YUFDSjtRQUNILENBQUM7S0FBQTtJQUVTLFlBQVk7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFO1lBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQy9CO0lBQ0gsQ0FBQztJQUVTLFdBQVc7UUFDbkIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRTtZQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFUyxXQUFXO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRTtZQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFUyxjQUFjO1FBQ3RCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDL0I7SUFDSCxDQUFDOzs7WUFyWkYsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBtZXJnZSwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWFwLCBtZXJnZU1hcCwgdGFrZVVudGlsLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7aXNFbXB0eUFycmF5LCBpc05pbCwgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbH0gZnJvbSAnLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7RW50aXRpZXNTZXJ2aWNlTG9hZE9wdGlvbnMsIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucywgRmlsdGVyRm4sIEZpbHRlckZuRmFjdG9yeSwgSUVudGl0aWVzU2VydmljZSwgTG9hZFJlc3VsdH0gZnJvbSAnLi9lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQge1NvcnREaXJlY3Rpb259IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NvcnQnO1xuaW1wb3J0IHtEaXJlY3RpdmUsIE9uRGVzdHJveX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0VudGl0eVV0aWxzLCBJRW50aXR5fSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQge0VudGl0eUZpbHRlciwgRW50aXR5RmlsdGVyVXRpbHN9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvZmlsdGVyLm1vZGVsJztcbmltcG9ydCB7Zmlyc3RGYWxzZVByb21pc2UsIGZpcnN0Tm90TmlsLCBXYWl0Rm9yT3B0aW9uc30gZnJvbSAnLi4vb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHtTdGFydGFibGVTZXJ2aWNlfSBmcm9tICcuL3N0YXJ0YWJsZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7U3RhcnRhYmxlT2JzZXJ2YWJsZVNlcnZpY2V9IGZyb20gJy4vc3RhcnRhYmxlLW9ic2VydmFibGUtc2VydmljZS5jbGFzcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5NZW1vcnlFbnRpdGllc1NlcnZpY2VPcHRpb25zPFQsIEY+IHtcbiAgb25Tb3J0PzogKGRhdGE6IFRbXSwgc29ydEJ5Pzogc3RyaW5nLCBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbikgPT4gVFtdO1xuICBvbkxvYWQ/OiAoZGF0YTogVFtdKSA9PiBUW10gfCBQcm9taXNlPFRbXT47XG4gIG9uU2F2ZT86IChkYXRhOiBUW10pID0+IFRbXSB8IFByb21pc2U8VFtdPjtcbiAgZXF1YWxzPzogKGQxOiBULCBkMjogVCkgPT4gYm9vbGVhbjtcblxuICBmaWx0ZXJGbkZhY3Rvcnk/OiBGaWx0ZXJGbkZhY3Rvcnk8VCwgRj47XG4gIGZpbHRlckZuPzogRmlsdGVyRm48VD47XG5cbiAgc29ydEJ5UmVwbGFjZW1lbnQ/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vLyBAZHluYW1pY1xuQERpcmVjdGl2ZSgpXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBJbk1lbW9yeUVudGl0aWVzU2VydmljZTxcbiAgVCBleHRlbmRzIElFbnRpdHk8VCwgSUQ+LFxuICBGID0gYW55LFxuICBJRCA9IG51bWJlcixcbiAgTyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyA9IEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucz5cbiAgZXh0ZW5kcyBTdGFydGFibGVPYnNlcnZhYmxlU2VydmljZTxUW10sIFRbXT5cbiAgaW1wbGVtZW50cyBJRW50aXRpZXNTZXJ2aWNlPFQsIEYsIE8+LCBPbkRlc3Ryb3kge1xuXG4gIGRlYnVnID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfaGlkZGVuRGF0YTogVFtdID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBkaXJ0eVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzYXZpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NvcnRGbjogKGRhdGE6IFRbXSwgc29ydEJ5Pzogc3RyaW5nLCBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbikgPT4gVFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkxvYWQ6IChkYXRhOiBUW10pID0+IFRbXSB8IFByb21pc2U8VFtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25TYXZlRm46IChkYXRhOiBUW10pID0+IFRbXSB8IFByb21pc2U8VFtdPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfZXF1YWxzRm46IChkMTogVCwgZDI6IFQpID0+IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlckZuRmFjdG9yeTogRmlsdGVyRm5GYWN0b3J5PFQsIEY+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9zb3J0QnlSZXBsYWNlbWVudDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuXG4gIHNldCB2YWx1ZShkYXRhOiBUW10pIHtcbiAgICB0aGlzLnNldFZhbHVlKGRhdGEpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgfVxuXG4gIGdldCBzYXZpbmcoKTogYm9vbGVhbntcbiAgICByZXR1cm4gdGhpcy5zYXZpbmdTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgZ2V0IGRpcnR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpcnR5U3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBkYXRhVHlwZTogbmV3KCkgPT4gVCxcbiAgICBwcm90ZWN0ZWQgZmlsdGVyVHlwZTogbmV3KCkgPT4gRixcbiAgICBvcHRpb25zPzogSW5NZW1vcnlFbnRpdGllc1NlcnZpY2VPcHRpb25zPFQsIEY+XG4gICkge1xuICAgIHN1cGVyKG51bGwpO1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBvblNvcnQ6IHRoaXMuc29ydCxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9O1xuXG4gICAgdGhpcy5fc29ydEZuID0gb3B0aW9ucy5vblNvcnQ7XG4gICAgdGhpcy5fb25Mb2FkID0gb3B0aW9ucy5vbkxvYWQ7XG4gICAgdGhpcy5fb25TYXZlRm4gPSBvcHRpb25zLm9uU2F2ZTtcbiAgICB0aGlzLl9lcXVhbHNGbiA9IG9wdGlvbnMuZXF1YWxzO1xuICAgIHRoaXMuX2ZpbHRlckZuRmFjdG9yeSA9IG9wdGlvbnMuZmlsdGVyRm5GYWN0b3J5IHx8ICgoZikgPT4ge1xuICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5hc0ZpbHRlcihmKSBhcyBGO1xuICAgICAgaWYgKGZpbHRlciBpbnN0YW5jZW9mIEVudGl0eUZpbHRlcikge1xuICAgICAgICByZXR1cm4gZmlsdGVyLmFzRmlsdGVyRm4oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgdGhpcy5fc3RhcnRCeVJlYWR5RnVuY3Rpb24gPSBmYWxzZTsgLy8gTmVlZCBzZXRWYWx1ZSgpIHRvIGJlIGNhbGxlZCwgdG8gc3RhcnQgdGhlIHNlcnZpY2VcblxuICAgIHRoaXMuX3NvcnRCeVJlcGxhY2VtZW50ID0ge1xuICAgICAgLy8gRGV0ZWN0IHJhbmtPcmRlciBvbiB0aGUgZW50aXR5IGNsYXNzXG4gICAgICBpZDogKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG5ldyBkYXRhVHlwZSgpKS5maW5kSW5kZXgoa2V5ID0+IGtleSA9PT0gJ3JhbmtPcmRlcicpICE9PSAtMSkgPyAncmFua09yZGVyJyA6IHVuZGVmaW5lZCxcbiAgICAgIC4uLm9wdGlvbnMuc29ydEJ5UmVwbGFjZW1lbnRcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG5nT25TdGFydChkYXRhPzogVFtdKTogUHJvbWlzZTxUW10+IHtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZXF1aXJlZCBkYXRhLCB0byBzdGFydCB0aGlzIHNlcnZpY2UnKTtcbiAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW21lbW9yeS1kYXRhLXNlcnZpY2VdIFN0YXJ0aW5nLi4uJyk7XG4gICAgdGhpcy5faGlkZGVuRGF0YSA9IFtdO1xuICAgIHRoaXMubWFya0FzU2F2ZWQoKTtcbiAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUuZGVidWcoJ1ttZW1vcnktZGF0YS1zZXJ2aWNlXSBTdG9wcGluZy4uLicpO1xuICAgIHRoaXMuZGF0YVN1YmplY3QuY29tcGxldGUoKTtcbiAgICB0aGlzLmRhdGFTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5faGlkZGVuRGF0YSA9IG51bGw7XG4gICAgdGhpcy5tYXJrQXNTYXZlZCgpO1xuICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3RvcCgpO1xuICB9XG5cbiAgc2V0VmFsdWUoZGF0YTogVFtdKSB7XG4gICAgaWYgKHRoaXMuZGF0YVN1YmplY3QudmFsdWUgIT09IGRhdGEpIHtcblxuICAgICAgLy8gSWYgc2VydmljZSBhbHJlYWR5IHN0YXJ0ZWQsIHRoZW4gdXBkYXRlIGRhdGFcbiAgICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgICAgdGhpcy5faGlkZGVuRGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmRhdGFTdWJqZWN0Lm5leHQoZGF0YSk7XG4gICAgICAgIHRoaXMubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgIH1cbiAgICAgIC8vIGlmIHNlcnZpY2Ugbm90IHN0YXJ0ZWQgeWV0LCB0aGVuIHN0YXJ0IGl0LCB1c2luZyBnaXZlbiBkYXRhXG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGFydChkYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkQWxsKFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHNpemU6IG51bWJlcixcbiAgICBzb3J0Qnk/OiBzdHJpbmcsXG4gICAgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24sXG4gICAgZmlsdGVyPzogRixcbiAgICBvcHRzPzogRW50aXRpZXNTZXJ2aWNlTG9hZE9wdGlvbnNcbiAgKTogUHJvbWlzZTxMb2FkUmVzdWx0PFQ+PiB7XG5cbiAgICBvZmZzZXQgPSBvZmZzZXQgPj0gMCA/IG9mZnNldCA6IDA7XG4gICAgc2l6ZSA9IHNpemUgPj0gMCA/IHNpemUgOiAtMTtcblxuICAgIGNvbnN0IG9yaWdpbmFsRGF0YSA9IHRoaXMuZGF0YVN1YmplY3QudmFsdWU7XG4gICAgaWYgKGlzTmlsKG9yaWdpbmFsRGF0YSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignW21lbW9yeS1kYXRhLXNlcnZpY2VdIENhbm5vdCBsb2FkIGFsbDogbm8gdmFsdWUgc2V0LiBXaWxsIHJldHVybiBlbXB0eSByZXN1bHQnKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gV2FpdCBzZXJ2aWNlIGlzIHJlYWR5XG4gICAgICBhd2FpdCB0aGlzLnJlYWR5KCk7XG5cbiAgICAgIC8vIFdhaXQgd2hpbGUgYnVzeSAoZS5nLiB3aGVuIHNhdmluZywgb3IgZGVsZXRpbmcpXG4gICAgICBhd2FpdCB0aGlzLndhaXRJZGxlKHtzdG9wRXJyb3I6IGZhbHNlIC8qYXZvaWQgZXJyb3Igd2hlbiBzdG9wcGVkKi99KTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgLy8gU2hvdWxkIGJlIGEgc3RvcCBlcnJvcjogbG9nIGFuZCBjb250aW51ZVxuICAgICAgaWYgKCF0aGlzLnN0b3BwZWQpIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3IsIHdoaWxlIHdhaXRpbmcgOicsIGVycik7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIHNlcnZpY2UgaXMgbm90IHN0b3BwZWRcbiAgICBpZiAodGhpcy5zdG9wcGVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZXhjbHVkZWREYXRhQnlGaWx0ZXI6IFRbXSA9IFtdO1xuICAgIGxldCBleGNsdWRlZERhdGFCeVBhZ2luYXRpb246IFRbXTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoaXNFbXB0eUFycmF5KG9yaWdpbmFsRGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIHtkYXRhOiBbXSwgdG90YWw6IDB9O1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBzb3J0XG4gICAgICBsZXQgZGF0YSA9IHRoaXMuX3NvcnRGbihvcmlnaW5hbERhdGEsIHNvcnRCeSwgc29ydERpcmVjdGlvbikgO1xuXG4gICAgICBpZiAodGhpcy5fb25Mb2FkKSB7XG4gICAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLl9vbkxvYWQoZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFwcGx5IGZpbHRlciAod2lsbCB1cGRhdGUgaGlkZGVuRGF0YSlcbiAgICAgIGRhdGEgPSB0aGlzLmZpbHRlcihkYXRhLCBmaWx0ZXIsIGV4Y2x1ZGVkRGF0YUJ5RmlsdGVyKTtcblxuICAgICAgLy8gQ29tcHV0ZSB0aGUgdG90YWwgbGVuZ3RoXG4gICAgICBjb25zdCB0b3RhbCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgICAvLyBJZiBwYWdlIHNpemU9MCAoZS5nLiBvbmx5IG5lZWQgdG90YWwpXG4gICAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICBleGNsdWRlZERhdGFCeVBhZ2luYXRpb24gPSBkYXRhO1xuICAgICAgICByZXR1cm4ge2RhdGE6IFtdLCB0b3RhbH07XG4gICAgICB9XG5cbiAgICAgIC8vIFNsaWNlIGluIGEgcGFnZSAodXNpbmcgb2Zmc2V0IGFuZCBzaXplKVxuICAgICAgaWYgKG9mZnNldCA+IDApIHtcblxuICAgICAgICAvLyBPZmZzZXQgYWZ0ZXIgdGhlIGVuZDogbm8gcmVzdWx0XG4gICAgICAgIGlmIChvZmZzZXQgPj0gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICBleGNsdWRlZERhdGFCeVBhZ2luYXRpb24gPSBkYXRhO1xuICAgICAgICAgIGRhdGEgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBleGNsdWRlZERhdGFCeVBhZ2luYXRpb24gPSAoc2l6ZSA+IDAgJiYgKChvZmZzZXQgKyBzaXplKSA8IGRhdGEubGVuZ3RoKSlcbiAgICAgICAgICAgIC8vIFNsaWNlIHVzaW5nIGxpbWl0IHRvIHNpemVcbiAgICAgICAgICAgID8gZGF0YS5zbGljZSgwLCBvZmZzZXQgLTEpLmNvbmNhdChkYXRhLnNsaWNlKG9mZnNldCArIHNpemUpKVxuICAgICAgICAgICAgLy8gU2xpY2Ugd2l0aG91dCBsaW1pdFxuICAgICAgICAgICAgOiBkYXRhLnNsaWNlKDAsIG9mZnNldC0xKTtcblxuICAgICAgICAgIGRhdGEgPSAoc2l6ZSA+IDAgJiYgKChvZmZzZXQgKyBzaXplKSA8IGRhdGEubGVuZ3RoKSlcbiAgICAgICAgICAgIC8vIFNsaWNlIHVzaW5nIGxpbWl0IHRvIHNpemVcbiAgICAgICAgICAgID8gZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUpXG4gICAgICAgICAgICAvLyBTbGljZSB3aXRob3V0IGxpbWl0XG4gICAgICAgICAgICA6IGRhdGEuc2xpY2Uob2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBhIGxpbWl0XG4gICAgICBlbHNlIGlmIChzaXplID4gMCl7XG4gICAgICAgIGV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbiA9IGRhdGEuc2xpY2Uoc2l6ZSk7XG4gICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKDAsIHNpemUpO1xuICAgICAgfVxuXG4gICAgICAvLyBObyBsaW1pdDpcbiAgICAgIGVsc2UgaWYgKHNpemUgPT09IC0xKXtcbiAgICAgICAgLy8gS2VlcCBhbGwgZGF0YVxuICAgICAgfVxuXG4gICAgICAvLyAvIVxcIElmIGFscmVhZHkgb2JzZXJ2ZWQsIHRoZW4gYWx3YXlzIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGFycmF5XG4gICAgICAvLyBCZWNhdXNlIGRhdGFzb3VyY2Ugd2lsbCBvbmx5IHVwZGF0ZSBpZiB0aGUgYXJyYXkgY2hhbmdlZFxuICAgICAgaWYgKGRhdGEgPT09IG9yaWdpbmFsRGF0YSkge1xuICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXM6IExvYWRSZXN1bHQ8VD4gPSB7ZGF0YSwgdG90YWx9O1xuXG4gICAgICBjb25zdCBuZXh0T2Zmc2V0ID0gKG9mZnNldCB8fCAwKSArIHNpemU7XG4gICAgICBpZiAobmV4dE9mZnNldCA8IHRvdGFsKSB7XG4gICAgICAgIHJlcy5mZXRjaE1vcmUgPSAoKSA9PiB0aGlzLmxvYWRBbGwobmV4dE9mZnNldCwgc2l6ZSwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uLCBmaWx0ZXIsIG9wdHMpXG4gICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBoaWRkZW4gZGF0YSAocmVtb3ZlIG5ldyBmZXRjaGVkIGl0ZW0pXG4gICAgICAgICAgICBpZiAocmVzLmRhdGE/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICB0aGlzLl9oaWRkZW5EYXRhID0gdGhpcy5faGlkZGVuRGF0YT8uZmlsdGVyKGl0ZW0gPT4gIXJlcy5kYXRhLmluY2x1ZGVzKGl0ZW0pKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAvLyBSZW1lbWJlciBoaWRkZW4gZGF0YVxuICAgICAgaWYgKG9mZnNldCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9oaWRkZW5EYXRhID0gIWV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbiA/IGV4Y2x1ZGVkRGF0YUJ5RmlsdGVyIDogZXhjbHVkZWREYXRhQnlGaWx0ZXIuY29uY2F0KC4uLmV4Y2x1ZGVkRGF0YUJ5UGFnaW5hdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgd2F0Y2hBbGwoXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIHNvcnRCeT86IHN0cmluZyxcbiAgICBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbixcbiAgICBmaWx0ZXJEYXRhPzogRixcbiAgICBvcHRpb25zPzogYW55XG4gICk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxUPj4ge1xuXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ID49IDAgPyBvZmZzZXQgOiAwO1xuICAgIHNpemUgPSBzaXplID49IDAgPyBzaXplIDogLTE7XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhU3ViamVjdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnN0b3BTdWJqZWN0KSxcbiAgICAgICAgLy8gV2FybiBpZiB3YWl0aW5nIHZhbHVlIHRvIGJlIHNldFxuICAgICAgICB0YXAoKGRhdGEpID0+IHRoaXMuZGVidWcgJiYgIWRhdGEgJiYgY29uc29sZS5kZWJ1ZygnW21lbW9yeS1kYXRhLXNlcnZpY2VdIFdhaXRpbmcgdmFsdWUgdG8gYmUgc2V0Li4uJykpLFxuICAgICAgICBmaWx0ZXIoaXNOb3ROaWwpLFxuICAgICAgICBtZXJnZU1hcChfID0+IHRoaXMubG9hZEFsbChvZmZzZXQsIHNpemUsIHNvcnRCeSwgc29ydERpcmVjdGlvbiwgZmlsdGVyRGF0YSwgb3B0aW9ucykpLFxuICAgICAgICBmaWx0ZXIoaXNOb3ROaWwpIC8vIFNraXAgbm8gcmVzdWx0IChlLmcuIHdoZW4gc3RvcHBlZClcbiAgICAgICk7XG4gIH1cblxuICBhc3luYyBzYXZlQWxsKGRhdGE6IFRbXSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8VFtdPiB7XG4gICAgaWYgKCF0aGlzLmRhdGFTdWJqZWN0LnZhbHVlKSB0aHJvdyBuZXcgRXJyb3IoJ1ttZW1vcnktc2VydmljZV0gQ291bGQgbm90IHNhdmUsIGJlY2F1c2UgdmFsdWUgbm90IHNldCcpO1xuXG4gICAgdGhpcy5tYXJrQXNTYXZpbmcoKTtcblxuICAgIHRyeSB7XG5cbiAgICAgIC8vIFJlc3RvcmUgaGlkZGVuIGRhdGFcbiAgICAgIGlmIChpc05vdEVtcHR5QXJyYXkodGhpcy5faGlkZGVuRGF0YSkpXG4gICAgICAgIGRhdGEgPSBkYXRhLmNvbmNhdCguLi50aGlzLl9oaWRkZW5EYXRhKTtcblxuICAgICAgaWYgKHRoaXMuX29uU2F2ZUZuKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuX29uU2F2ZUZuKGRhdGEpO1xuICAgICAgICBkYXRhID0gKChyZXMgaW5zdGFuY2VvZiBQcm9taXNlKSkgPyBhd2FpdCByZXMgOiByZXM7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGF0YVN1YmplY3QubmV4dChkYXRhKTtcbiAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgIHRoaXMubWFya0FzU2F2ZWQoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVBbGwoZGF0YVRvUmVtb3ZlOiBUW10sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCBkYXRhID0gdGhpcy5kYXRhU3ViamVjdC52YWx1ZTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignW21lbW9yeS1zZXJ2aWNlXSBDb3VsZCBub3QgZGVsZXRlLCBiZWNhdXNlIHZhbHVlIG5vdCBzZXQnKTtcblxuICAgIHRoaXMubWFya0FzU2F2aW5nKCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVtb3ZlIGRlbGV0ZWQgaXRlbSwgZnJvbSBkYXRhXG4gICAgICBjb25zdCB1cGRhdGVkRGF0YSA9IGRhdGEuZmlsdGVyKGVudGl0eSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBkYXRhVG9SZW1vdmUuZmluZEluZGV4KGVudGl0eVRvUmVtb3ZlID0+IHRoaXMuZXF1YWxzKGVudGl0eVRvUmVtb3ZlLCBlbnRpdHkpKSAhPT0gLTE7XG4gICAgICAgIHJldHVybiAhcmVtb3ZlZDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGVsZXRlQ291bnQgPSBkYXRhLmxlbmd0aCAtIHVwZGF0ZWREYXRhLmxlbmd0aDtcbiAgICAgIGlmIChkZWxldGVDb3VudCA+IDApIHtcbiAgICAgICAgZGF0YSA9IHVwZGF0ZWREYXRhO1xuICAgICAgICB0aGlzLmRhdGFTdWJqZWN0Lm5leHQoZGF0YSk7XG4gICAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICB0aGlzLm1hcmtBc1NhdmVkKCk7XG4gICAgfVxuICB9XG5cbiAgc29ydChkYXRhOiBUW10sIHNvcnRCeT86IHN0cmluZywgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24pOiBUW10ge1xuICAgIC8vIFJlcGxhY2Ugc29ydEJ5LCB1c2luZyB0aGUgcmVwbGFjZW1lbnQgbWFwXG4gICAgc29ydEJ5ID0gc29ydEJ5ICYmIHRoaXMuX3NvcnRCeVJlcGxhY2VtZW50W3NvcnRCeV0gfHwgc29ydEJ5IHx8ICdpZCc7XG5cbiAgICAvLyBFeGVjdXRlIHRoZSBzb3J0XG4gICAgcmV0dXJuIEVudGl0eVV0aWxzLnNvcnQoZGF0YSwgc29ydEJ5LCBzb3J0RGlyZWN0aW9uKTtcbiAgfVxuXG4gIGFzRmlsdGVyKHNvdXJjZTogUGFydGlhbDxGPik6IEYge1xuICAgIHJldHVybiBFbnRpdHlGaWx0ZXJVdGlscy5mcm9tT2JqZWN0KHNvdXJjZSwgdGhpcy5maWx0ZXJUeXBlKTtcbiAgfVxuXG4gIGFkZFNvcnRCeVJlcGxhY2VtZW50KHNvdXJjZTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZykge1xuICAgIHRoaXMuX3NvcnRCeVJlcGxhY2VtZW50W3NvdXJjZV0gPSB0YXJnZXQ7XG4gIH1cblxuICBlcXVhbHMoZDE6IFQsIGQyOiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2VxdWFsc0ZuKSByZXR1cm4gdGhpcy5fZXF1YWxzRm4oZDEsIGQyKTtcbiAgICByZXR1cm4gZDEgJiYgZDEuZXF1YWxzID8gZDEuZXF1YWxzKGQyKSA6IEVudGl0eVV0aWxzLmVxdWFscyhkMSwgZDIsICdpZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50IGRhdGEgc3RvcmVkIGJ5IHRoZSBzZXJ2aWNlICh3aXRob3V0IGhpZGRlbiBkYXRhKS5cbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIGdldCBjb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5kYXRhU3ViamVjdC52YWx1ZT8ubGVuZ3RoIHx8IDApO1xuICB9XG5cbiAgZ2V0IGhpZGRlbkNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZGRlbkRhdGE/Lmxlbmd0aCB8fCAwO1xuICB9XG5cbiAgYXN5bmMgd2FpdElkbGUob3B0cz86IFdhaXRGb3JPcHRpb25zKSB7XG4gICAgYXdhaXQgdGhpcy53YWl0V2hpbGVTYXZpbmcob3B0cyk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBmaWx0ZXIoZGF0YTogVFtdLCBfZmlsdGVyOiBGLCBoaWRkZW5EYXRhOiBUW10pOiBUW10ge1xuXG4gICAgLy8gaWYgZmlsdGVyIGlzIERhdGFGaWx0ZXIgaW5zdGFuY2UsIHVzZSBpdHMgdGVzdCBmdW5jdGlvblxuICAgIGNvbnN0IGZpbHRlckZuID0gdGhpcy5fZmlsdGVyRm5GYWN0b3J5ICYmIHRoaXMuX2ZpbHRlckZuRmFjdG9yeShfZmlsdGVyKTtcbiAgICBpZiAoZmlsdGVyRm4pIHtcbiAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IFtdO1xuXG4gICAgICBkYXRhLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICBpZiAoZmlsdGVyRm4odmFsdWUpKVxuICAgICAgICAgIGZpbHRlcmVkRGF0YS5wdXNoKHZhbHVlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGhpZGRlbkRhdGEucHVzaCh2YWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcbiAgICB9XG5cbiAgICAvLyBkZWZhdWx0LCBubyBmaWx0ZXJcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25uZWN0KCk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxUPj4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTdWJqZWN0LnBpcGUoXG4gICAgICBtYXAoKGRhdGEpID0+IHtcbiAgICAgICAgZGF0YSA9IGRhdGEgfHwgW107XG4gICAgICAgIGNvbnN0IHRvdGFsID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIHJldHVybiB7ZGF0YSwgdG90YWx9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHdhaXRXaGlsZVNhdmluZyhvcHRzPzogV2FpdEZvck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zYXZpbmcpICB7XG4gICAgICByZXR1cm4gZmlyc3RGYWxzZVByb21pc2UodGhpcy5zYXZpbmdTdWJqZWN0LCB7XG4gICAgICAgIHN0b3A6IG9wdHM/LnN0b3AgfHwgbWVyZ2UodGhpcy5zdG9wU3ViamVjdCwgdGhpcy5kYXRhU3ViamVjdCksIC8vIFN0b3AgaWYgZGVzdHJveWVkIG9yIG5ldyBkYXRhIFJlY2VpdmVkXG4gICAgICAgIHN0b3BFcnJvcjogZmFsc2UsIC8vIEF2b2lkIGVycm9yIHdoZW4gc3RvcHBlZFxuICAgICAgICAuLi5vcHRzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0FzU2F2aW5nKCkge1xuICAgIGlmICghdGhpcy5zYXZpbmdTdWJqZWN0LnZhbHVlKSB7XG4gICAgICB0aGlzLnNhdmluZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0FzU2F2ZWQoKSB7XG4gICAgaWYgKHRoaXMuc2F2aW5nU3ViamVjdC52YWx1ZSkge1xuICAgICAgdGhpcy5zYXZpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrQXNEaXJ0eSgpIHtcbiAgICBpZiAoIXRoaXMuZGlydHlTdWJqZWN0LnZhbHVlKSB7XG4gICAgICB0aGlzLmRpcnR5U3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrQXNQcmlzdGluZSgpIHtcbiAgICBpZiAodGhpcy5kaXJ0eVN1YmplY3QudmFsdWUpIHtcbiAgICAgIHRoaXMuZGlydHlTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,122 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Optional } from '@angular/core';
3
+ import { BehaviorSubject, Subject, Subscription } from 'rxjs';
4
+ import { filter, takeUntil } from 'rxjs/operators';
5
+ /**
6
+ * Same as StartableService, bu with a dataSubject instead of a simple 'data' property
7
+ */
8
+ export class StartableObservableService {
9
+ constructor(prerequisiteService) {
10
+ this.dataSubject = new BehaviorSubject(null);
11
+ this.startSubject = new Subject();
12
+ this.stopSubject = new Subject();
13
+ this._debug = false;
14
+ this._startByReadyFunction = true; // should start when calling ready() ?
15
+ this._started = false;
16
+ this._startPromise = null;
17
+ this._startPrerequisite = null;
18
+ this._subscription = null;
19
+ this._startPrerequisite = prerequisiteService
20
+ ? () => prerequisiteService.ready()
21
+ : () => Promise.resolve();
22
+ }
23
+ start(opts) {
24
+ if (this._startPromise)
25
+ return this._startPromise;
26
+ if (this._started)
27
+ return Promise.resolve(this.dataSubject.value);
28
+ this._startPromise = this._startPrerequisite()
29
+ .then(() => this.ngOnStart(opts))
30
+ .then(data => {
31
+ this._started = true;
32
+ this._startPromise = undefined;
33
+ // Should be done AFTER 'this._started = true', because of the 'filter' operator, inside ready() function
34
+ this.dataSubject.next(data);
35
+ this.startSubject.next(data);
36
+ return data;
37
+ })
38
+ .catch(err => {
39
+ console.error('Failed to start a service: ' + (err && err.message || err), err);
40
+ this._started = false;
41
+ this._startPromise = null;
42
+ return null;
43
+ });
44
+ return this._startPromise;
45
+ }
46
+ ready() {
47
+ if (this._started)
48
+ return Promise.resolve(this.dataSubject.value);
49
+ if (this._startPromise)
50
+ return this._startPromise;
51
+ if (this._startByReadyFunction)
52
+ return this.start();
53
+ return this.dataSubject
54
+ .pipe(takeUntil(this.stopSubject),
55
+ // Wait start() to be called, to exclude the initial 'null' value
56
+ filter(_ => this._started))
57
+ .toPromise();
58
+ }
59
+ stop() {
60
+ return __awaiter(this, void 0, void 0, function* () {
61
+ try {
62
+ this.unsubscribe();
63
+ yield this.ngOnStop();
64
+ }
65
+ catch (err) {
66
+ console.error('Failed to stop a service: ' + (err && err.message || err), err);
67
+ }
68
+ finally {
69
+ this._started = false;
70
+ this._startPromise = undefined;
71
+ this.stopSubject.next(); // Stop all running observables
72
+ this.dataSubject.next(null); // Reset data
73
+ }
74
+ });
75
+ }
76
+ restart(opts) {
77
+ return __awaiter(this, void 0, void 0, function* () {
78
+ if (this._startPromise)
79
+ yield this._startPromise; // Wait end of previous loading
80
+ if (this._started)
81
+ yield this.stop(); // Then stop if started
82
+ return this.start(opts); // Then start again
83
+ });
84
+ }
85
+ get started() {
86
+ return this._started;
87
+ }
88
+ get starting() {
89
+ return !!this._startPromise;
90
+ }
91
+ get stopped() {
92
+ return !this._started && !this._startPromise;
93
+ }
94
+ get data() {
95
+ return this.dataSubject.value;
96
+ }
97
+ set data(value) {
98
+ if (this.dataSubject.value !== value) {
99
+ this.dataSubject.next(value);
100
+ }
101
+ }
102
+ registerSubscription(sub) {
103
+ this._subscription = this._subscription || new Subscription();
104
+ return this._subscription.add(sub);
105
+ }
106
+ unregisterSubscription(sub) {
107
+ var _a;
108
+ (_a = this._subscription) === null || _a === void 0 ? void 0 : _a.remove(sub);
109
+ }
110
+ unsubscribe() {
111
+ var _a;
112
+ (_a = this._subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
113
+ this._subscription = null;
114
+ }
115
+ ngOnStop() {
116
+ // Can be overwritten by subclasses
117
+ }
118
+ }
119
+ StartableObservableService.ctorParameters = () => [
120
+ { type: undefined, decorators: [{ type: Optional }] }
121
+ ];
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRhYmxlLW9ic2VydmFibGUtc2VydmljZS5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL3NlcnZpY2VzL3N0YXJ0YWJsZS1vYnNlcnZhYmxlLXNlcnZpY2UuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFDLGVBQWUsRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHakQ7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLDBCQUEwQjtJQWM5QyxZQUNjLG1CQUFtRDtRQWJ4RCxnQkFBVyxHQUFHLElBQUksZUFBZSxDQUFJLElBQUksQ0FBQyxDQUFDO1FBQzNDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQUssQ0FBQztRQUNoQyxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFakMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLDBCQUFxQixHQUFHLElBQUksQ0FBQyxDQUFDLHNDQUFzQztRQUV0RSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGtCQUFhLEdBQWUsSUFBSSxDQUFDO1FBQ2pDLHVCQUFrQixHQUF1QixJQUFJLENBQUM7UUFDOUMsa0JBQWEsR0FBaUIsSUFBSSxDQUFDO1FBS3pDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxtQkFBbUI7WUFDM0MsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRTtZQUNuQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBUTtRQUNaLElBQUksSUFBSSxDQUFDLGFBQWE7WUFB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YW5ndWxhci9jb3JlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaWx0ZXIsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtJU3RhcnRhYmxlU2VydmljZX0gZnJvbSAnLi9zdGFydGFibGUtc2VydmljZS5jbGFzcyc7XG5cbi8qKlxuICogU2FtZSBhcyBTdGFydGFibGVTZXJ2aWNlLCBidSB3aXRoIGEgZGF0YVN1YmplY3QgaW5zdGVhZCBvZiBhIHNpbXBsZSAnZGF0YScgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFN0YXJ0YWJsZU9ic2VydmFibGVTZXJ2aWNlPFQgPSBhbnksIE8gPSBhbnk+IGltcGxlbWVudHMgSVN0YXJ0YWJsZVNlcnZpY2U8VD4ge1xuXG4gIHJlYWRvbmx5IGRhdGFTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUPihudWxsKTtcbiAgcmVhZG9ubHkgc3RhcnRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8VD4oKTtcbiAgcmVhZG9ubHkgc3RvcFN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByb3RlY3RlZCBfZGVidWcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIF9zdGFydEJ5UmVhZHlGdW5jdGlvbiA9IHRydWU7IC8vIHNob3VsZCBzdGFydCB3aGVuIGNhbGxpbmcgcmVhZHkoKSA/XG5cbiAgcHJpdmF0ZSBfc3RhcnRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9zdGFydFByb21pc2U6IFByb21pc2U8VD4gPSBudWxsO1xuICBwcml2YXRlIF9zdGFydFByZXJlcXVpc2l0ZTogKCkgPT4gUHJvbWlzZTxhbnk+ID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBudWxsO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBwcmVyZXF1aXNpdGVTZXJ2aWNlPzogeyByZWFkeTogKCkgPT4gUHJvbWlzZTxhbnk+IH1cbiAgKSB7XG4gICAgdGhpcy5fc3RhcnRQcmVyZXF1aXNpdGUgPSBwcmVyZXF1aXNpdGVTZXJ2aWNlXG4gICAgICA/ICgpID0+IHByZXJlcXVpc2l0ZVNlcnZpY2UucmVhZHkoKVxuICAgICAgOiAoKSA9PiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHN0YXJ0KG9wdHM/OiBPKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0UHJvbWlzZSkgcmV0dXJuIHRoaXMuX3N0YXJ0UHJvbWlzZTtcbiAgICBpZiAodGhpcy5fc3RhcnRlZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmRhdGFTdWJqZWN0LnZhbHVlKTtcblxuICAgIHRoaXMuX3N0YXJ0UHJvbWlzZSA9IHRoaXMuX3N0YXJ0UHJlcmVxdWlzaXRlKClcbiAgICAgIC50aGVuKCgpID0+IHRoaXMubmdPblN0YXJ0KG9wdHMpKVxuICAgICAgLnRoZW4oZGF0YSA9PiB7XG5cbiAgICAgICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX3N0YXJ0UHJvbWlzZSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBTaG91bGQgYmUgZG9uZSBBRlRFUiAndGhpcy5fc3RhcnRlZCA9IHRydWUnLCBiZWNhdXNlIG9mIHRoZSAnZmlsdGVyJyBvcGVyYXRvciwgaW5zaWRlIHJlYWR5KCkgZnVuY3Rpb25cbiAgICAgICAgdGhpcy5kYXRhU3ViamVjdC5uZXh0KGRhdGEpO1xuICAgICAgICB0aGlzLnN0YXJ0U3ViamVjdC5uZXh0KGRhdGEpO1xuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgYSBzZXJ2aWNlOiAnICsgKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpLCBlcnIpO1xuICAgICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3N0YXJ0UHJvbWlzZSA9IG51bGw7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0UHJvbWlzZTtcbiAgfVxuXG4gIHJlYWR5KCk6IFByb21pc2U8VD4ge1xuICAgIGlmICh0aGlzLl9zdGFydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZGF0YVN1YmplY3QudmFsdWUpO1xuICAgIGlmICh0aGlzLl9zdGFydFByb21pc2UpIHJldHVybiB0aGlzLl9zdGFydFByb21pc2U7XG4gICAgaWYgKHRoaXMuX3N0YXJ0QnlSZWFkeUZ1bmN0aW9uKSByZXR1cm4gdGhpcy5zdGFydCgpO1xuXG4gICAgcmV0dXJuIHRoaXMuZGF0YVN1YmplY3RcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5zdG9wU3ViamVjdCksXG4gICAgICAgIC8vIFdhaXQgc3RhcnQoKSB0byBiZSBjYWxsZWQsIHRvIGV4Y2x1ZGUgdGhlIGluaXRpYWwgJ251bGwnIHZhbHVlXG4gICAgICAgIGZpbHRlcihfID0+IHRoaXMuX3N0YXJ0ZWQpXG4gICAgICApXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cblxuICBhc3luYyBzdG9wKCkge1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIGF3YWl0IHRoaXMubmdPblN0b3AoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0b3AgYSBzZXJ2aWNlOiAnICsgKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpLCBlcnIpO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3N0YXJ0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuc3RvcFN1YmplY3QubmV4dCgpOyAvLyBTdG9wIGFsbCBydW5uaW5nIG9ic2VydmFibGVzXG4gICAgICB0aGlzLmRhdGFTdWJqZWN0Lm5leHQobnVsbCk7IC8vIFJlc2V0IGRhdGFcbiAgICB9XG4gIH1cblxuICBhc3luYyByZXN0YXJ0KG9wdHM/OiBPKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0UHJvbWlzZSkgYXdhaXQgdGhpcy5fc3RhcnRQcm9taXNlOyAvLyBXYWl0IGVuZCBvZiBwcmV2aW91cyBsb2FkaW5nXG4gICAgaWYgKHRoaXMuX3N0YXJ0ZWQpIGF3YWl0IHRoaXMuc3RvcCgpOyAvLyBUaGVuIHN0b3AgaWYgc3RhcnRlZFxuICAgIHJldHVybiB0aGlzLnN0YXJ0KG9wdHMpOyAvLyBUaGVuIHN0YXJ0IGFnYWluXG4gIH1cblxuICBnZXQgc3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRlZDtcbiAgfVxuXG4gIGdldCBzdGFydGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl9zdGFydFByb21pc2U7XG4gIH1cblxuICBnZXQgc3RvcHBlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX3N0YXJ0ZWQgJiYgIXRoaXMuX3N0YXJ0UHJvbWlzZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZGF0YSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXQgZGF0YSh2YWx1ZTogVCkge1xuICAgIGlmICh0aGlzLmRhdGFTdWJqZWN0LnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5kYXRhU3ViamVjdC5uZXh0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJTdWJzY3JpcHRpb24oc3ViOiBTdWJzY3JpcHRpb24pOiBTdWJzY3JpcHRpb24ge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbiA9IHRoaXMuX3N1YnNjcmlwdGlvbiB8fCBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoc3ViKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1bnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHN1YjogU3Vic2NyaXB0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uPy5yZW1vdmUoc3ViKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1bnN1YnNjcmliZSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZ09uU3RvcCgpOiBQcm9taXNlPHZvaWQ+IHwgdm9pZCB7XG4gICAgLy8gQ2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHN1YmNsYXNzZXNcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBuZ09uU3RhcnQob3B0cz86IE8pOiBQcm9taXNlPFQ+O1xufVxuIl19