tnx-shared 5.3.303 → 5.3.305

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/bundles/tnx-shared.umd.js +76 -84
  2. package/bundles/tnx-shared.umd.js.map +1 -1
  3. package/bundles/tnx-shared.umd.min.js +1 -1
  4. package/bundles/tnx-shared.umd.min.js.map +1 -1
  5. package/classes/form-schema.d.ts +2 -0
  6. package/classes/form-schema.d.ts.map +1 -1
  7. package/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.d.ts +3 -1
  8. package/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.d.ts.map +1 -1
  9. package/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.d.ts +3 -1
  10. package/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.d.ts.map +1 -1
  11. package/components/entity-picker/entity-picker-dialog/components/entity-picker-tree-data/entity-picker-tree-data.component.d.ts +3 -1
  12. package/components/entity-picker/entity-picker-dialog/components/entity-picker-tree-data/entity-picker-tree-data.component.d.ts.map +1 -1
  13. package/components/entity-picker/entity-picker-dialog/components/entity-picker-tree-selected/entity-picker-tree-selected.component.d.ts +3 -1
  14. package/components/entity-picker/entity-picker-dialog/components/entity-picker-tree-selected/entity-picker-tree-selected.component.d.ts.map +1 -1
  15. package/esm2015/classes/form-schema.js +3 -1
  16. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-data/entity-picker-data.component.js +7 -4
  17. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-selected/entity-picker-selected.component.js +7 -4
  18. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-tree-data/entity-picker-tree-data.component.js +7 -4
  19. package/esm2015/components/entity-picker/entity-picker-dialog/components/entity-picker-tree-selected/entity-picker-tree-selected.component.js +7 -4
  20. package/esm2015/components/entity-picker/entity-picker.component.js +1 -1
  21. package/esm2015/services/master-data.service.js +3 -16
  22. package/fesm2015/tnx-shared.js +25 -28
  23. package/fesm2015/tnx-shared.js.map +1 -1
  24. package/package.json +2 -2
  25. package/services/master-data.service.d.ts +0 -1
  26. package/services/master-data.service.d.ts.map +1 -1
  27. package/tnx-shared.metadata.json +1 -1
@@ -15,14 +15,12 @@ import * as i3 from "./storage-updated.service";
15
15
  import * as i4 from "./module-config.service";
16
16
  export class MasterDataService {
17
17
  constructor(_httpClient, _commonService, _injector, _storageUpdatedService, _moduleConfigService) {
18
- var _a, _b;
19
18
  this._httpClient = _httpClient;
20
19
  this._commonService = _commonService;
21
20
  this._injector = _injector;
22
21
  this._storageUpdatedService = _storageUpdatedService;
23
22
  this._moduleConfigService = _moduleConfigService;
24
23
  this.setupSignalr = false;
25
- this.isDisabledGetCache = false;
26
24
  this.storage = localStorage;
27
25
  this.categoryPrefix = 'cat_';
28
26
  this.categoryGroupPrefix = 'cat_group_';
@@ -31,7 +29,6 @@ export class MasterDataService {
31
29
  this.env = this._moduleConfigService.getConfig().environment;
32
30
  this.apiEndpoint = this.env.apiDomain.commonMasterDataEndpoint;
33
31
  this.apiVersion = this.env.apiVersion;
34
- this.isDisabledGetCache = (_b = (_a = this.env.cauHinhNghiepVu) === null || _a === void 0 ? void 0 : _a.isDisabledGetCacheCommonMasterdata) !== null && _b !== void 0 ? _b : false;
35
32
  this.groupCategoryEndpoint = `${this.apiEndpoint}/${this.apiVersion}/Groupcategory`;
36
33
  this.singleCategoryEndpoint = `${this.apiEndpoint}/${this.apiVersion}/SingleCategory`;
37
34
  if (!this.setupSignalr) {
@@ -78,17 +75,7 @@ export class MasterDataService {
78
75
  }
79
76
  get(groupCode) {
80
77
  return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
81
- let dataSource = [];
82
- if (this.isDisabledGetCache === true) {
83
- dataSource = yield this.getAllByGroupCode(groupCode);
84
- }
85
- else if (!this.storage.getItem(`${this.categoryPrefix}${groupCode}`)) {
86
- dataSource = yield this.getAllByGroupCode(groupCode);
87
- this.storage.setItem(`${this.categoryPrefix}${groupCode}`, JSON.stringify(dataSource));
88
- }
89
- else {
90
- dataSource = JSON.parse(this.storage.getItem(`${this.categoryPrefix}${groupCode}`));
91
- }
78
+ const dataSource = yield this.getAllByGroupCode(groupCode);
92
79
  resolve(dataSource);
93
80
  }));
94
81
  }
@@ -216,7 +203,7 @@ export class MasterDataService {
216
203
  return this.getData(`${this.singleCategoryEndpoint}/getData`, gridInfo);
217
204
  });
218
205
  }
219
- // thực hiện get list singleCategory theo groupCategoryCode trên redis
206
+ // thực hiện get list singleCategory theo groupCategoryCode trên redis cache
220
207
  doGetAllCustom(groupCode) {
221
208
  return __awaiter(this, void 0, void 0, function* () {
222
209
  const uri = `${this.singleCategoryEndpoint}/GetDataByGroupCode/${groupCode}`;
@@ -421,4 +408,4 @@ MasterDataService.ctorParameters = () => [
421
408
  { type: StorageUpdatedService },
422
409
  { type: ModuleConfigService }
423
410
  ];
424
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzdGVyLWRhdGEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RueC1zaGFyZWQvc3JjL2xpYi9zZXJ2aWNlcy9tYXN0ZXItZGF0YS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLHNCQUFzQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBVSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQW1CLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFLbkUsTUFBTSxPQUFPLGlCQUFpQjtJQWUxQixZQUNZLFdBQXVCLEVBQ3ZCLGNBQTZCLEVBQzdCLFNBQW1CLEVBQ25CLHNCQUE2QyxFQUM3QyxvQkFBeUM7O1FBSnpDLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFDbkIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF1QjtRQUM3Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBbEJyRCxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFFbEIsWUFBTyxHQUFHLFlBQVksQ0FBQztRQUN2Qixt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QUUsUUFBa0I7UUFDdEMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCxPQUFPLGFBQWEsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Ozs7WUE1YkosVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCOzs7WUFkUSxVQUFVO1lBTVYsYUFBYTtZQUxELFFBQVE7WUFPcEIscUJBQXFCO1lBRHJCLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNlbGVjdEl0ZW0gfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1hc3RlckRhdGFJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL21hc3Rlci1kYXRhLWl0ZW0nO1xuaW1wb3J0IHsgUmVzcG9uc2VSZXN1bHQgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UtcmVzdWx0JztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuL2NvbW1vbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL21vZHVsZS1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlVXBkYXRlZFNlcnZpY2UgfSBmcm9tICcuL3N0b3JhZ2UtdXBkYXRlZC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlciwgR3JpZEluZm8gfSBmcm9tICcuLi9tb2RlbHMvZ3JpZC1pbmZvJztcbmltcG9ydCB7IERyb3Bkb3duT3B0aW9ucywgT3BlcmF0b3IgfSBmcm9tICcuLi9jbGFzc2VzL2Zvcm0tc2NoZW1hJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNYXN0ZXJEYXRhU2VydmljZSB7XG5cbiAgICBzZXR1cFNpZ25hbHIgPSBmYWxzZTtcbiAgICBpc0Rpc2FibGVkR2V0Q2FjaGUgPSBmYWxzZTtcbiAgICBhcGlFbmRwb2ludDogYW55O1xuICAgIHJlYWRvbmx5IHN0b3JhZ2UgPSBsb2NhbFN0b3JhZ2U7XG4gICAgcmVhZG9ubHkgY2F0ZWdvcnlQcmVmaXggPSAnY2F0Xyc7XG4gICAgcmVhZG9ubHkgY2F0ZWdvcnlHcm91cFByZWZpeCA9ICdjYXRfZ3JvdXBfJztcbiAgICByZWFkb25seSBhZG1pbmlzdHJhdGl2ZVVuaXQgPSAnYWRtaW5pc3RyYXRpdmVfdW5pdF8nO1xuICAgIHJlYWRvbmx5IGFkbWluaXN0cmF0aXZlVW5pdEl0ZW0gPSAnYWRtaW5pc3RyYXRpdmVfaXRlbV91bml0Xyc7XG4gICAgcmVhZG9ubHkgZ3JvdXBDYXRlZ29yeUVuZHBvaW50O1xuICAgIHJlYWRvbmx5IHNpbmdsZUNhdGVnb3J5RW5kcG9pbnQ7XG4gICAgcmVhZG9ubHkgYXBpVmVyc2lvbjtcbiAgICByZWFkb25seSBlbnY7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfaHR0cENsaWVudDogSHR0cENsaWVudCxcbiAgICAgICAgcHJpdmF0ZSBfY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIF9zdG9yYWdlVXBkYXRlZFNlcnZpY2U6IFN0b3JhZ2VVcGRhdGVkU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfbW9kdWxlQ29uZmlnU2VydmljZTogTW9kdWxlQ29uZmlnU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmVudiA9IHRoaXMuX21vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQ7XG4gICAgICAgIHRoaXMuYXBpRW5kcG9pbnQgPSB0aGlzLmVudi5hcGlEb21haW4uY29tbW9uTWFzdGVyRGF0YUVuZHBvaW50O1xuXG4gICAgICAgIHRoaXMuYXBpVmVyc2lvbiA9IHRoaXMuZW52LmFwaVZlcnNpb247XG4gICAgICAgIHRoaXMuaXNEaXNhYmxlZEdldENhY2hlID0gdGhpcy5lbnYuY2F1SGluaE5naGllcFZ1Py5pc0Rpc2FibGVkR2V0Q2FjaGVDb21tb25NYXN0ZXJkYXRhID8/IGZhbHNlO1xuICAgICAgICB0aGlzLmdyb3VwQ2F0ZWdvcnlFbmRwb2ludCA9IGAke3RoaXMuYXBpRW5kcG9pbnR9LyR7dGhpcy5hcGlWZXJzaW9ufS9Hcm91cGNhdGVnb3J5YDtcbiAgICAgICAgdGhpcy5zaW5nbGVDYXRlZ29yeUVuZHBvaW50ID0gYCR7dGhpcy5hcGlFbmRwb2ludH0vJHt0aGlzLmFwaVZlcnNpb259L1NpbmdsZUNhdGVnb3J5YDtcblxuICAgICAgICBpZiAoIXRoaXMuc2V0dXBTaWduYWxyKSB7XG4gICAgICAgICAgICB0aGlzLl9zdG9yYWdlVXBkYXRlZFNlcnZpY2Uuc3Vic2NyaWJlQ2hhbmdlZExvY2FsU3RvcmFnZSgnY2F0XyonLCBhc3luYyAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhT2JqO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhT2JqID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYXRhT2JqID0gZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFPYmopIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YVNvdXJjZTogTWFzdGVyRGF0YUl0ZW1bXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50ID0gZGF0YU9iai5tZXNzYWdlLmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LmluZGV4T2YodGhpcy5jYXRlZ29yeUdyb3VwUHJlZml4KSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBncm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBDb2RlID0gZGF0YU9iai5tZXNzYWdlLmNvbnRlbnQucmVwbGFjZSh0aGlzLmNhdGVnb3J5R3JvdXBQcmVmaXgsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0R3JvdXBJdGVtQnlDb2RlKGdyb3VwQ29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShgJHt0aGlzLmNhdGVnb3J5R3JvdXBQcmVmaXh9JHtncm91cENvZGV9YCwgSlNPTi5zdHJpbmdpZnkocmVzdWx0LmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBDb2RlID0gZGF0YU9iai5tZXNzYWdlLmNvbnRlbnQucmVwbGFjZSh0aGlzLmNhdGVnb3J5UHJlZml4LCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRvR2V0QWxsKGdyb3VwQ29kZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kYXRhLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiBlbGVtZW50LmlkLCBjb2RlOiBlbGVtZW50LmNvZGUsIG5hbWU6IGVsZW1lbnQubmFtZSB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuY2F0ZWdvcnlQcmVmaXh9JHtncm91cENvZGV9YCwgSlNPTi5zdHJpbmdpZnkoZGF0YVNvdXJjZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0dXBTaWduYWxyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBnZXRBbGxCeUdyb3VwQ29kZShncm91cENvZGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBkYXRhU291cmNlOiBNYXN0ZXJEYXRhSXRlbVtdID0gW107XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZG9HZXRBbGxDdXN0b20oZ3JvdXBDb2RlKTtcbiAgICAgICAgcmVzdWx0LmRhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGRhdGFTb3VyY2UucHVzaChcbiAgICAgICAgICAgICAgICB7IGlkOiBlbGVtZW50LmlkLCBjb2RlOiBlbGVtZW50LmNvZGUsIG5hbWU6IGVsZW1lbnQubmFtZSB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2U7XG4gICAgfVxuXG4gICAgZ2V0KGdyb3VwQ29kZTogc3RyaW5nKTogUHJvbWlzZTxNYXN0ZXJEYXRhSXRlbVtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgZGF0YVNvdXJjZTogTWFzdGVyRGF0YUl0ZW1bXSA9IFtdO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNEaXNhYmxlZEdldENhY2hlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGF3YWl0IHRoaXMuZ2V0QWxsQnlHcm91cENvZGUoZ3JvdXBDb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnN0b3JhZ2UuZ2V0SXRlbShgJHt0aGlzLmNhdGVnb3J5UHJlZml4fSR7Z3JvdXBDb2RlfWApKSB7XG4gICAgICAgICAgICAgICAgZGF0YVNvdXJjZSA9IGF3YWl0IHRoaXMuZ2V0QWxsQnlHcm91cENvZGUoZ3JvdXBDb2RlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShgJHt0aGlzLmNhdGVnb3J5UHJlZml4fSR7Z3JvdXBDb2RlfWAsIEpTT04uc3RyaW5naWZ5KGRhdGFTb3VyY2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UgPSA8TWFzdGVyRGF0YUl0ZW1bXT5KU09OLnBhcnNlKHRoaXMuc3RvcmFnZS5nZXRJdGVtKGAke3RoaXMuY2F0ZWdvcnlQcmVmaXh9JHtncm91cENvZGV9YCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKGRhdGFTb3VyY2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRDb25maWdCeUNvZGUoY29kZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSAnJztcbiAgICAgICAgICAgIGlmICghdGhpcy5zdG9yYWdlLmdldEl0ZW0oY29kZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRvR2V0Q29uZmlnQnlDb2RlKGNvZGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGNvZGUsIEpTT04uc3RyaW5naWZ5KHJlc3VsdC5kYXRhKSk7XG5cbiAgICAgICAgICAgICAgICBjb25maWcgPSA8c3RyaW5nPnJlc3VsdC5kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uZmlnID0gPHN0cmluZz5KU09OLnBhcnNlKHRoaXMuc3RvcmFnZS5nZXRJdGVtKGNvZGUpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZShjb25maWcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXREcm9wZG93bihncm91cENvZGU6IHN0cmluZyk6IFByb21pc2U8U2VsZWN0SXRlbVtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldChncm91cENvZGUpLnRoZW4oc291cmNlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcCA9IHNvdXJjZS5tYXAoeCA9PiA8U2VsZWN0SXRlbT57IHRpdGxlOiB4Lm5hbWUsIGxhYmVsOiB4Lm5hbWUsIHZhbHVlOiB4LmNvZGUgfSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShvcCk7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiByZWplY3QoPFNlbGVjdEl0ZW1bXT5bXSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRETUNodW5nRHJvcGRvd24oY29kZTogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KGAke3RoaXMuc2luZ2xlQ2F0ZWdvcnlFbmRwb2ludH0vR2V0QnlGaWx0ZXJDb2RlQW5kTmFtZUJ5R3JvdXBDb2RlLyR7Y29kZX1gKVxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5fY29tbW9uU2VydmljZS5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0SXRlbXMoZ3JvdXBDb2RlOiBzdHJpbmcpOiBQcm9taXNlPFNlbGVjdEl0ZW1bXT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXQoZ3JvdXBDb2RlKS50aGVuKHNvdXJjZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3AgPSBzb3VyY2UubWFwKHggPT4gPFNlbGVjdEl0ZW0+eyBsYWJlbDogeC5uYW1lLCB2YWx1ZTogeC5jb2RlIH0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUob3ApO1xuICAgICAgICAgICAgfSwgZXJyb3IgPT4gcmVqZWN0KDxTZWxlY3RJdGVtW10+W10pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZ2V0R3JvdXBCeUNvZGUoZ3JvdXBDb2RlOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgLy8gICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gICAgICAgICB0aGlzLmdldChncm91cENvZGUpLnRoZW4oc291cmNlID0+IHtcbiAgICAvLyAgICAgICAgICAgICByZXNvbHZlKHNvdXJjZSk7XG4gICAgLy8gICAgICAgICB9LCBlcnJvciA9PiByZWplY3QoPGFueVtdPltdKSk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH1cblxuICAgIGdldERyb3Bkb3duQWRkcmVzcyhpZCwgbGV2ZWwgPSAxKTogUHJvbWlzZTxTZWxlY3RJdGVtW10+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2V0QWRkcmVzcyhpZCwgbGV2ZWwpLnRoZW4oc291cmNlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcCA9IHNvdXJjZS5tYXAoeCA9PiA8U2VsZWN0SXRlbT57IHRpdGxlOiB4Lm5hbWUsIGxhYmVsOiB4Lm5hbWUsIHZhbHVlOiB4LmNvZGUgfSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShvcCk7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiByZWplY3QoPFNlbGVjdEl0ZW1bXT5bXSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzKGlkLCBsZXZlbCA9IDEpOiBQcm9taXNlPE1hc3RlckRhdGFJdGVtW10+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBkYXRhU291cmNlOiBNYXN0ZXJEYXRhSXRlbVtdID0gW107XG4gICAgICAgICAgICBpZiAoIXRoaXMuc3RvcmFnZS5nZXRJdGVtKGAke3RoaXMuYWRtaW5pc3RyYXRpdmVVbml0fS5MZXZlbCR7bGV2ZWx9LiR7aWR9YCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRvZ2V0QWRkcmVzcyhpZCwgbGV2ZWwpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuYWRtaW5pc3RyYXRpdmVVbml0fS5MZXZlbCR7bGV2ZWx9LiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkocmVzdWx0LmRhdGEpKTtcbiAgICAgICAgICAgICAgICBkYXRhU291cmNlID0gPE1hc3RlckRhdGFJdGVtW10+cmVzdWx0LmRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UgPSA8TWFzdGVyRGF0YUl0ZW1bXT5KU09OLnBhcnNlKHRoaXMuc3RvcmFnZS5nZXRJdGVtKGAke3RoaXMuYWRtaW5pc3RyYXRpdmVVbml0fS5MZXZlbCR7bGV2ZWx9LiR7aWR9YCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKGRhdGFTb3VyY2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRXYXJkc0J5c3RyZWV0KHN0cmVldE5hbWU6IHN0cmluZywgZGlzdHJpY3RDb2RlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHJlZXRzID0gYXdhaXQgdGhpcy5nZXRBZGRyZXNzKGRpc3RyaWN0Q29kZSwgMik7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRJZHMgPSBzdHJlZXRzLmZpbHRlcih4ID0+IHgubmFtZSA9PSBzdHJlZXROYW1lKS5tYXAoeCA9PiB4LnBhcmVudElkKTtcbiAgICAgICAgICAgIHJlc29sdmUocGFyZW50SWRzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZG9nZXRBZGRyZXNzKGlkOiBzdHJpbmcsIGxldmVsID0gMSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3Qgc2VydmljZVVyaSA9IGAke3RoaXMuYXBpRW5kcG9pbnR9L0NpdHlDYXRlZ29yeS9HZXRCeVBhcmVudElkLyR7aWR9P2xldmVsPSR7bGV2ZWx9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnQuZ2V0PFJlc3BvbnNlUmVzdWx0PihzZXJ2aWNlVXJpKVxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5fY29tbW9uU2VydmljZS5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0SXRlbURldGFpbFVuaXQoaWQ6IHN0cmluZyk6IFByb21pc2U8TWFzdGVyRGF0YUl0ZW0+IHtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1EYXRhOiBNYXN0ZXJEYXRhSXRlbSA9IG5ldyBNYXN0ZXJEYXRhSXRlbSgpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN0b3JhZ2UuZ2V0SXRlbShgJHt0aGlzLmFkbWluaXN0cmF0aXZlVW5pdEl0ZW19JHtpZH1gKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VVcmkgPSBgJHt0aGlzLmFwaUVuZHBvaW50fS9DaXR5Q2F0ZWdvcnkvR2V0QnlDb2RlLyR7aWR9YDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9odHRwQ2xpZW50LmdldDxSZXNwb25zZVJlc3VsdD4oc2VydmljZVVyaSlcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5fY29tbW9uU2VydmljZS5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXG4gICAgICAgICAgICAgICAgICAgIC50b1Byb21pc2UoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuYWRtaW5pc3RyYXRpdmVVbml0SXRlbX0ke2lkfWAsIEpTT04uc3RyaW5naWZ5KHJlc3VsdC5kYXRhKSk7XG5cbiAgICAgICAgICAgICAgICBpdGVtRGF0YSA9IDxNYXN0ZXJEYXRhSXRlbT5yZXN1bHQuZGF0YTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbURhdGEgPSA8TWFzdGVyRGF0YUl0ZW0+SlNPTi5wYXJzZSh0aGlzLnN0b3JhZ2UuZ2V0SXRlbShgJHt0aGlzLmFkbWluaXN0cmF0aXZlVW5pdEl0ZW19JHtpZH1gKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoaXRlbURhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRvR2V0Q29uZmlnQnlDb2RlKGNvZGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vICBUT0RPOiBkbyBoaeG7h24gZ2nhu50ga28gZMO5bmcgbsOqbiBmaXggdOG6oW0gdmFsdWUsIHNhdSBz4bq9IHjhu60gbMO9IHRp4bq/cFxuICAgICAgICAgICAgcmVzb2x2ZSg8UmVzcG9uc2VSZXN1bHQ+eyBkYXRhOiB7fSwgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbnN0IHNlcnZpY2VVcmkgPSBgJHt0aGlzLmFwaUVuZHBvaW50fS9Db25maWd1cmF0aW9uU2VydmljZS9HZXRWYWx1ZUJ5Q29kZT9jb2RlPSR7Y29kZX1gO1xuXG4gICAgICAgIC8vIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LmdldDxSZXNwb25zZVJlc3VsdD4oc2VydmljZVVyaSlcbiAgICAgICAgLy8gICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2NvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxuICAgICAgICAvLyAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZG9HZXRBbGwoZ3JvdXBDb2RlOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gYXdhaXQgdGhpcy5nZXRHcm91cEJ5Q29kZShncm91cENvZGUpO1xuICAgICAgICBpZiAoIWdyb3VwLmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSg8UmVzcG9uc2VSZXN1bHQ+eyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBbXSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdyaWRJbmZvID0gbmV3IEdyaWRJbmZvKHtcbiAgICAgICAgICAgIGZpZWxkczogJycsXG4gICAgICAgICAgICBwYWdlSW5mbzoge1xuICAgICAgICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IDEwMDAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNvcnRzOiBbeyBmaWVsZDogJ3NvcnQnLCBkaXI6IDEgfV0sXG4gICAgICAgICAgICBmaWx0ZXJzOiBbdGhpcy5fY29tbW9uU2VydmljZS5uZXdGaWx0ZXIoJ2dyb3VwQ2F0ZWdvcnlJZCcsIE9wZXJhdG9yLmVxdWFsLCBncm91cC5kYXRhLmlkKV1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YShgJHt0aGlzLnNpbmdsZUNhdGVnb3J5RW5kcG9pbnR9L2dldERhdGFgLCBncmlkSW5mbyk7XG4gICAgfVxuXG4gICAgLy8gdGjhu7FjIGhp4buHbiBnZXQgbGlzdCBzaW5nbGVDYXRlZ29yeSB0aGVvIGdyb3VwQ2F0ZWdvcnlDb2RlIHRyw6puIHJlZGlzXG4gICAgcHJpdmF0ZSBhc3luYyBkb0dldEFsbEN1c3RvbShncm91cENvZGU6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgdXJpID0gYCR7dGhpcy5zaW5nbGVDYXRlZ29yeUVuZHBvaW50fS9HZXREYXRhQnlHcm91cENvZGUvJHtncm91cENvZGV9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnQuZ2V0PFJlc3BvbnNlUmVzdWx0Pih1cmkpLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGF0YSh1cmksIGdyaWRJbmZvOiBHcmlkSW5mbyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnQucG9zdDxSZXNwb25zZVJlc3VsdD4odXJpLCBncmlkSW5mbykudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRHcm91cEJ5Q29kZShncm91cENvZGU6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgdXJpID0gYCR7dGhpcy5ncm91cENhdGVnb3J5RW5kcG9pbnR9L2dldEJ5Q29kZS8ke2dyb3VwQ29kZX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHVyaSkudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgYWRkV29ya0RheXMoZGF0ZTogc3RyaW5nLCBkYXlzOiBudW1iZXIsIGlzRGF5ID0gMSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3Qgc2VydmljZVVyaSA9IGAke3RoaXMuYXBpRW5kcG9pbnR9L0hvbGlkYXlDYXRlZ29yeS9HZXREYXRlP2RhdGU9JHtkYXRlfSZkYXlzPSR7ZGF5c30maXNEYXk9JHtpc0RheX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHNlcnZpY2VVcmkpXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLl9jb21tb25TZXJ2aWNlLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBnZXREYXRlQnlEdXJhdGlvbihkYXRlOiBzdHJpbmcsIHR5cGU6IGJvb2xlYW4sIGR1cmF0aW9uOiBudW1iZXIpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VVcmkgPSBgJHt0aGlzLmFwaUVuZHBvaW50fS9Ib2xpZGF5Q2F0ZWdvcnkvZ2V0RGF0ZUJ5RHVyYXRpb24/ZGF0ZT0ke2RhdGV9JnR5cGU9JHt0eXBlfSZkdXJhdGlvbj0ke2R1cmF0aW9ufWA7XG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LmdldDxSZXNwb25zZVJlc3VsdD4oc2VydmljZVVyaSlcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2NvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIGdldEl0ZW1CeUNvZGUoZGF0YVNvdXJjZTogYW55LCBjb2RlOiBzdHJpbmcpOiBNYXN0ZXJEYXRhSXRlbSB7XG4gICAgICAgIHJldHVybiBkYXRhU291cmNlLmZpbmQoeCA9PiB4LmNvZGUgPT09IGNvZGUpO1xuICAgIH1cblxuICAgIGdldEl0ZW1CeUluc3RhbmNlSWQoZGF0YVNvdXJjZTogYW55LCBpbnN0YW5jZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2UuZmluZCh4ID0+IHguaW5zdGFuY2VJZCA9PT0gaW5zdGFuY2VJZCk7XG4gICAgfVxuXG4gICAgZ2V0SXRlbUJ5SWQoZGF0YVNvdXJjZTogYW55LCBpZDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBkYXRhU291cmNlLmZpbmQoeCA9PiB4LmlkID09PSBpZCk7XG4gICAgfVxuXG4gICAgZ2V0SXRlbUJ5R3JvdXBBbmRDb2RlKGdyb3VwQ29kZTogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiBQcm9taXNlPE1hc3RlckRhdGFJdGVtPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgZGF0YVNvdXJjZTogTWFzdGVyRGF0YUl0ZW1bXSA9IFtdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN0b3JhZ2UuZ2V0SXRlbShgJHt0aGlzLmNhdGVnb3J5UHJlZml4fSR7Z3JvdXBDb2RlfWApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kb0dldEFsbChncm91cENvZGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuY2F0ZWdvcnlQcmVmaXh9JHtncm91cENvZGV9YCwgSlNPTi5zdHJpbmdpZnkocmVzdWx0LmRhdGEpKTtcbiAgICAgICAgICAgICAgICBkYXRhU291cmNlID0gPE1hc3RlckRhdGFJdGVtW10+cmVzdWx0LmRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UgPSA8TWFzdGVyRGF0YUl0ZW1bXT5KU09OLnBhcnNlKHRoaXMuc3RvcmFnZS5nZXRJdGVtKGAke3RoaXMuY2F0ZWdvcnlQcmVmaXh9JHtncm91cENvZGV9YCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKGRhdGFTb3VyY2UuZmluZCh4ID0+IHguY29kZSA9PT0gY29kZSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWZyZXNoQ2F0ZWdvcnkoKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsU3RvcmFnZSkge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHRoaXMuY2F0ZWdvcnlQcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cENvZGUgPSBrZXkuc3BsaXQoJ18nKVsxXTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldChncm91cENvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGdldEFkcmVzcyhjaXR5OiBhbnksIGRpc3RyaWN0OiBhbnksIHdhcmQ6IGFueSwgc3RyZWV0OiBhbnksIHN0clRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RyUmVzdWx0ID0gJyc7XG4gICAgICAgICAgICBpZiAoc3RyVGV4dCAmJiBzdHJUZXh0ICE9ICcnKSB7XG4gICAgICAgICAgICAgICAgc3RyUmVzdWx0ICs9IHN0clRleHQgKyAnLCAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0cmVldCAmJiBzdHJlZXQgIT0gJycpIHtcbiAgICAgICAgICAgICAgICBzdHJSZXN1bHQgKz0gc3RyZWV0ICsgJywgJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdhcmQgJiYgd2FyZCAhPSAnJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBhd2FpdCB0aGlzLmdldEl0ZW1EZXRhaWxVbml0KHdhcmQpO1xuICAgICAgICAgICAgICAgIGlmICh4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0clJlc3VsdCArPSB4Lm5hbWUgKyAnLCAnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRpc3RyaWN0ICYmIGRpc3RyaWN0ICE9ICcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IGF3YWl0IHRoaXMuZ2V0SXRlbURldGFpbFVuaXQoZGlzdHJpY3QpO1xuICAgICAgICAgICAgICAgIGlmICh4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0clJlc3VsdCArPSB4Lm5hbWUgKyAnLCAnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNpdHkgJiYgY2l0eSAhPSAnJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBhd2FpdCB0aGlzLmdldEl0ZW1EZXRhaWxVbml0KGNpdHkpO1xuICAgICAgICAgICAgICAgIGlmICh4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0clJlc3VsdCArPSB4Lm5hbWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHN0clJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFZhbHVlQnlDb2RlKGNvZGU6IGFueSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zaW5nbGVDYXRlZ29yeUVuZHBvaW50fS9nZXRWYWx1ZUJ5Q29kZT9jb2RlPSR7Y29kZX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHVybClcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2NvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIGdldEdyb3VwSXRlbUJ5Q29kZShjb2RlOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpRW5kcG9pbnR9L0dyb3VwQ2F0ZWdvcnkvJHtjb2RlfWA7XG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LmdldDxSZXNwb25zZVJlc3VsdD4odXJsKS5waXBlKGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2NvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIHBhcnNlTWF0aEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nLCBkZWNpbWFsUGxhY2VzOiBudW1iZXIsIGZvclZpZXRuYW1lc2U6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xuICAgICAgICBleHByZXNzaW9uID0gZW5jb2RlVVJJQ29tcG9uZW50KGV4cHJlc3Npb24pO1xuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaUVuZHBvaW50fS9NYXRoRXhwcmVzc2lvbi9QYXJzZU1hdGg/ZXhwcmVzc2lvbj0ke2V4cHJlc3Npb259JmRlY2ltYWxQbGFjZXM9JHtkZWNpbWFsUGxhY2VzfSZmb3JWaWV0bmFtZXNlPSR7Zm9yVmlldG5hbWVzZX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHVybClcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2NvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIGdldEJ5R3JpZFJlcXVlc3QoZ3JvdXBDb2RlOiBzdHJpbmcsIGdyaWRJbmZvOiBHcmlkSW5mbywgcGx1c1VybDogc3RyaW5nID0gJycpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgZGF0YTogYW55O1xuICAgICAgICAgICAgY29uc3QgZGF0YVN0b3JhZ2UgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShgJHt0aGlzLmNhdGVnb3J5UHJlZml4fSR7Z3JvdXBDb2RlfWApO1xuICAgICAgICAgICAgaWYgKCFkYXRhU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgIGxldCBhcGlVcmwgPSBgJHt0aGlzLnNpbmdsZUNhdGVnb3J5RW5kcG9pbnR9L2dldERhdGFgO1xuICAgICAgICAgICAgICAgIGlmIChwbHVzVXJsICE9IG51bGwgJiYgcGx1c1VybCAhPSAnJylcbiAgICAgICAgICAgICAgICAgICAgYXBpVXJsICs9ICcvJyArIHBsdXNVcmw7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuX2h0dHBDbGllbnRcbiAgICAgICAgICAgICAgICAgICAgLnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KGFwaVVybCwgZ3JpZEluZm8pXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKS50b1Byb21pc2UoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuY2F0ZWdvcnlQcmVmaXh9JHtncm91cENvZGV9YCwgSlNPTi5zdHJpbmdpZnkoZGF0YS5kYXRhKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnBhcnNlKGRhdGFTdG9yYWdlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVHcmlkSW5mb0Ryb3Bkb3duKGZpbHRlcnM6IEZpbHRlcltdLCBvcHRpb25zOiBEcm9wZG93bk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZ3JpZEluZm8gPSB7XG4gICAgICAgICAgICBwYWdlSW5mbzoge1xuICAgICAgICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IDEwMDAwMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpbHRlcnMsXG4gICAgICAgICAgICBzb3J0czogW10sXG4gICAgICAgICAgICBmaWVsZHM6IGAke29wdGlvbnMudmFsdWVGaWVsZH0ke29wdGlvbnMuZGlzcGxheUZpZWxkID09IG9wdGlvbnMudmFsdWVGaWVsZCA/ICcnIDogJywnICsgb3B0aW9ucy5kaXNwbGF5RmllbGR9JHtvcHRpb25zLmZpZWxkUGx1c31gXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuc29ydHMgIT0gbnVsbCAmJiBvcHRpb25zLnNvcnRzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICBncmlkSW5mby5zb3J0cyA9IFsuLi5vcHRpb25zLnNvcnRzXTtcbiAgICAgICAgaWYgKG9wdGlvbnMuc29ydEZpZWxkICE9IG51bGwgJiYgb3B0aW9ucy5zb3J0RmllbGQgIT0gJycpXG4gICAgICAgICAgICBncmlkSW5mby5zb3J0cy5wdXNoKHsgZmllbGQ6IG9wdGlvbnMuc29ydEZpZWxkLCBkaXI6IG9wdGlvbnMuc29ydERpciB9KTtcbiAgICAgICAgcmV0dXJuIGdyaWRJbmZvO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGVmYXVsdFZhbHVlKG9wdGlvbnM6IERyb3Bkb3duT3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucy5maWVsZFBsdXMubGVuZ3RoID4gMCAmJiAhb3B0aW9ucy5maWVsZFBsdXMuc3RhcnRzV2l0aCgnLCcpKVxuICAgICAgICAgICAgb3B0aW9ucy5maWVsZFBsdXMgPSAnLCcgKyBvcHRpb25zLmZpZWxkUGx1cztcbiAgICAgICAgaWYgKG9wdGlvbnMuc29ydEZpZWxkID09ICcnKVxuICAgICAgICAgICAgb3B0aW9ucy5zb3J0RmllbGQgPSBvcHRpb25zLmRpc3BsYXlGaWVsZDtcbiAgICAgICAgaWYgKG9wdGlvbnMuZnVuY0dldExhYmVsID09IG51bGwgfHwgdHlwZW9mIG9wdGlvbnMuZnVuY0dldExhYmVsICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZnVuY0dldExhYmVsID0gKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVtvcHRpb25zLmRpc3BsYXlGaWVsZF07XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0RGF0YURyb3Bkb3duKGdyb3VwQ29kZTogc3RyaW5nLCBhcnJWYWx1ZTogYW55W10sIG9wdGlvbnM/OiBEcm9wZG93bk9wdGlvbnMpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlKG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXQoZ3JvdXBDb2RlKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgIGlmIChhcnJWYWx1ZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXM7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXMuZmlsdGVyKHggPT4gYXJyVmFsdWUuc29tZSh2ID0+IHYgPT0geFtvcHRpb25zLnZhbHVlRmllbGRdKSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0RGF0YURyb3Bkb3duQnlGaWx0ZXIoZ3JvdXBDb2RlOiBzdHJpbmcsIGFyclZhbHVlOiBhbnlbXSwgZmlsdGVyczogRmlsdGVyW10sIG9wdGlvbnM/OiBEcm9wZG93bk9wdGlvbnMpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlKG9wdGlvbnMpO1xuICAgICAgICBmaWx0ZXJzLnNwbGljZSgwLCAwLCB0aGlzLl9jb21tb25TZXJ2aWNlLm5ld0ZpbHRlcignZ3JvdXBDYXRlZ29yeUNvZGUnLCBPcGVyYXRvci5lcXVhbCwgZ3JvdXBDb2RlKSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldChncm91cENvZGUpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJyVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzLmZpbHRlcih4ID0+IGFyclZhbHVlLnNvbWUodiA9PiB2ID09IHhbb3B0aW9ucy52YWx1ZUZpZWxkXSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvcjogYW55LCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICAgICAgY29uc3QgY29tbW9uU2VydmljZSA9IGluamVjdG9yLmdldChDb21tb25TZXJ2aWNlKTtcbiAgICAgICAgcmV0dXJuIGNvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyb3IsIGluamVjdG9yKTtcbiAgICB9XG59XG4iXX0=
411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzdGVyLWRhdGEuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RueC1zaGFyZWQvc3JjL2xpYi9zZXJ2aWNlcy9tYXN0ZXItZGF0YS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLHNCQUFzQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBVSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQW1CLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFLbkUsTUFBTSxPQUFPLGlCQUFpQjtJQWMxQixZQUNZLFdBQXVCLEVBQ3ZCLGNBQTZCLEVBQzdCLFNBQW1CLEVBQ25CLHNCQUE2QyxFQUM3QyxvQkFBeUM7UUFKekMsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVCO1FBQzdDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBcUI7UUFqQnJELGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRVosWUFBTyxHQUFHLFlBQVksQ0FBQztRQUN2QixtQkFBYyxHQUFHLE1BQU0sQ0FBQztRQUN4Qix3QkFB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QUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUU7Z0JBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFVLEVBQUUsUUFBa0I7UUFDdEMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRCxPQUFPLGFBQWEsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELENBQUM7Ozs7WUEvYUosVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCOzs7WUFkUSxVQUFVO1lBTVYsYUFBYTtZQUxELFFBQVE7WUFPcEIscUJBQXFCO1lBRHJCLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNlbGVjdEl0ZW0gfSBmcm9tICd0bi1jdXN0b20tcHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1hc3RlckRhdGFJdGVtIH0gZnJvbSAnLi4vbW9kZWxzL21hc3Rlci1kYXRhLWl0ZW0nO1xuaW1wb3J0IHsgUmVzcG9uc2VSZXN1bHQgfSBmcm9tICcuLi9tb2RlbHMvcmVzcG9uc2UtcmVzdWx0JztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuL2NvbW1vbi5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL21vZHVsZS1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBTdG9yYWdlVXBkYXRlZFNlcnZpY2UgfSBmcm9tICcuL3N0b3JhZ2UtdXBkYXRlZC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlciwgR3JpZEluZm8gfSBmcm9tICcuLi9tb2RlbHMvZ3JpZC1pbmZvJztcbmltcG9ydCB7IERyb3Bkb3duT3B0aW9ucywgT3BlcmF0b3IgfSBmcm9tICcuLi9jbGFzc2VzL2Zvcm0tc2NoZW1hJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNYXN0ZXJEYXRhU2VydmljZSB7XG5cbiAgICBzZXR1cFNpZ25hbHIgPSBmYWxzZTtcbiAgICBhcGlFbmRwb2ludDogYW55O1xuICAgIHJlYWRvbmx5IHN0b3JhZ2UgPSBsb2NhbFN0b3JhZ2U7XG4gICAgcmVhZG9ubHkgY2F0ZWdvcnlQcmVmaXggPSAnY2F0Xyc7XG4gICAgcmVhZG9ubHkgY2F0ZWdvcnlHcm91cFByZWZpeCA9ICdjYXRfZ3JvdXBfJztcbiAgICByZWFkb25seSBhZG1pbmlzdHJhdGl2ZVVuaXQgPSAnYWRtaW5pc3RyYXRpdmVfdW5pdF8nO1xuICAgIHJlYWRvbmx5IGFkbWluaXN0cmF0aXZlVW5pdEl0ZW0gPSAnYWRtaW5pc3RyYXRpdmVfaXRlbV91bml0Xyc7XG4gICAgcmVhZG9ubHkgZ3JvdXBDYXRlZ29yeUVuZHBvaW50O1xuICAgIHJlYWRvbmx5IHNpbmdsZUNhdGVnb3J5RW5kcG9pbnQ7XG4gICAgcmVhZG9ubHkgYXBpVmVyc2lvbjtcbiAgICByZWFkb25seSBlbnY7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfaHR0cENsaWVudDogSHR0cENsaWVudCxcbiAgICAgICAgcHJpdmF0ZSBfY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIF9zdG9yYWdlVXBkYXRlZFNlcnZpY2U6IFN0b3JhZ2VVcGRhdGVkU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfbW9kdWxlQ29uZmlnU2VydmljZTogTW9kdWxlQ29uZmlnU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLmVudiA9IHRoaXMuX21vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQ7XG4gICAgICAgIHRoaXMuYXBpRW5kcG9pbnQgPSB0aGlzLmVudi5hcGlEb21haW4uY29tbW9uTWFzdGVyRGF0YUVuZHBvaW50O1xuXG4gICAgICAgIHRoaXMuYXBpVmVyc2lvbiA9IHRoaXMuZW52LmFwaVZlcnNpb247XG4gICAgICAgIHRoaXMuZ3JvdXBDYXRlZ29yeUVuZHBvaW50ID0gYCR7dGhpcy5hcGlFbmRwb2ludH0vJHt0aGlzLmFwaVZlcnNpb259L0dyb3VwY2F0ZWdvcnlgO1xuICAgICAgICB0aGlzLnNpbmdsZUNhdGVnb3J5RW5kcG9pbnQgPSBgJHt0aGlzLmFwaUVuZHBvaW50fS8ke3RoaXMuYXBpVmVyc2lvbn0vU2luZ2xlQ2F0ZWdvcnlgO1xuXG4gICAgICAgIGlmICghdGhpcy5zZXR1cFNpZ25hbHIpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2VVcGRhdGVkU2VydmljZS5zdWJzY3JpYmVDaGFuZ2VkTG9jYWxTdG9yYWdlKCdjYXRfKicsIGFzeW5jIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGFPYmo7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFPYmogPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFPYmogPSBkYXRhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGF0YU9iaikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhU291cmNlOiBNYXN0ZXJEYXRhSXRlbVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBkYXRhT2JqLm1lc3NhZ2UuY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaW5kZXhPZih0aGlzLmNhdGVnb3J5R3JvdXBQcmVmaXgpID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyb3VwXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cENvZGUgPSBkYXRhT2JqLm1lc3NhZ2UuY29udGVudC5yZXBsYWNlKHRoaXMuY2F0ZWdvcnlHcm91cFByZWZpeCwgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRHcm91cEl0ZW1CeUNvZGUoZ3JvdXBDb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuY2F0ZWdvcnlHcm91cFByZWZpeH0ke2dyb3VwQ29kZX1gLCBKU09OLnN0cmluZ2lmeShyZXN1bHQuZGF0YSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cENvZGUgPSBkYXRhT2JqLm1lc3NhZ2UuY29udGVudC5yZXBsYWNlKHRoaXMuY2F0ZWdvcnlQcmVmaXgsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZG9HZXRBbGwoZ3JvdXBDb2RlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmRhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6IGVsZW1lbnQuaWQsIGNvZGU6IGVsZW1lbnQuY29kZSwgbmFtZTogZWxlbWVudC5uYW1lIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oYCR7dGhpcy5jYXRlZ29yeVByZWZpeH0ke2dyb3VwQ29kZX1gLCBKU09OLnN0cmluZ2lmeShkYXRhU291cmNlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5zZXR1cFNpZ25hbHIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGdldEFsbEJ5R3JvdXBDb2RlKGdyb3VwQ29kZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGRhdGFTb3VyY2U6IE1hc3RlckRhdGFJdGVtW10gPSBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kb0dldEFsbEN1c3RvbShncm91cENvZGUpO1xuICAgICAgICByZXN1bHQuZGF0YS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgZGF0YVNvdXJjZS5wdXNoKFxuICAgICAgICAgICAgICAgIHsgaWQ6IGVsZW1lbnQuaWQsIGNvZGU6IGVsZW1lbnQuY29kZSwgbmFtZTogZWxlbWVudC5uYW1lIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZGF0YVNvdXJjZTtcbiAgICB9XG5cbiAgICBnZXQoZ3JvdXBDb2RlOiBzdHJpbmcpOiBQcm9taXNlPE1hc3RlckRhdGFJdGVtW10+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBhd2FpdCB0aGlzLmdldEFsbEJ5R3JvdXBDb2RlKGdyb3VwQ29kZSk7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGFTb3VyY2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRDb25maWdCeUNvZGUoY29kZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSAnJztcbiAgICAgICAgICAgIGlmICghdGhpcy5zdG9yYWdlLmdldEl0ZW0oY29kZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRvR2V0Q29uZmlnQnlDb2RlKGNvZGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGNvZGUsIEpTT04uc3RyaW5naWZ5KHJlc3VsdC5kYXRhKSk7XG5cbiAgICAgICAgICAgICAgICBjb25maWcgPSA8c3RyaW5nPnJlc3VsdC5kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uZmlnID0gPHN0cmluZz5KU09OLnBhcnNlKHRoaXMuc3RvcmFnZS5nZXRJdGVtKGNvZGUpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZShjb25maWcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXREcm9wZG93bihncm91cENvZGU6IHN0cmluZyk6IFByb21pc2U8U2VsZWN0SXRlbVtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldChncm91cENvZGUpLnRoZW4oc291cmNlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcCA9IHNvdXJjZS5tYXAoeCA9PiA8U2VsZWN0SXRlbT57IHRpdGxlOiB4Lm5hbWUsIGxhYmVsOiB4Lm5hbWUsIHZhbHVlOiB4LmNvZGUgfSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShvcCk7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiByZWplY3QoPFNlbGVjdEl0ZW1bXT5bXSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRETUNodW5nRHJvcGRvd24oY29kZTogc3RyaW5nKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KGAke3RoaXMuc2luZ2xlQ2F0ZWdvcnlFbmRwb2ludH0vR2V0QnlGaWx0ZXJDb2RlQW5kTmFtZUJ5R3JvdXBDb2RlLyR7Y29kZX1gKVxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5fY29tbW9uU2VydmljZS5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0SXRlbXMoZ3JvdXBDb2RlOiBzdHJpbmcpOiBQcm9taXNlPFNlbGVjdEl0ZW1bXT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXQoZ3JvdXBDb2RlKS50aGVuKHNvdXJjZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3AgPSBzb3VyY2UubWFwKHggPT4gPFNlbGVjdEl0ZW0+eyBsYWJlbDogeC5uYW1lLCB2YWx1ZTogeC5jb2RlIH0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUob3ApO1xuICAgICAgICAgICAgfSwgZXJyb3IgPT4gcmVqZWN0KDxTZWxlY3RJdGVtW10+W10pKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZ2V0R3JvdXBCeUNvZGUoZ3JvdXBDb2RlOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgLy8gICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgLy8gICAgICAgICB0aGlzLmdldChncm91cENvZGUpLnRoZW4oc291cmNlID0+IHtcbiAgICAvLyAgICAgICAgICAgICByZXNvbHZlKHNvdXJjZSk7XG4gICAgLy8gICAgICAgICB9LCBlcnJvciA9PiByZWplY3QoPGFueVtdPltdKSk7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH1cblxuICAgIGdldERyb3Bkb3duQWRkcmVzcyhpZCwgbGV2ZWwgPSAxKTogUHJvbWlzZTxTZWxlY3RJdGVtW10+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ2V0QWRkcmVzcyhpZCwgbGV2ZWwpLnRoZW4oc291cmNlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBvcCA9IHNvdXJjZS5tYXAoeCA9PiA8U2VsZWN0SXRlbT57IHRpdGxlOiB4Lm5hbWUsIGxhYmVsOiB4Lm5hbWUsIHZhbHVlOiB4LmNvZGUgfSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShvcCk7XG4gICAgICAgICAgICB9LCBlcnJvciA9PiByZWplY3QoPFNlbGVjdEl0ZW1bXT5bXSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzKGlkLCBsZXZlbCA9IDEpOiBQcm9taXNlPE1hc3RlckRhdGFJdGVtW10+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBkYXRhU291cmNlOiBNYXN0ZXJEYXRhSXRlbVtdID0gW107XG4gICAgICAgICAgICBpZiAoIXRoaXMuc3RvcmFnZS5nZXRJdGVtKGAke3RoaXMuYWRtaW5pc3RyYXRpdmVVbml0fS5MZXZlbCR7bGV2ZWx9LiR7aWR9YCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmRvZ2V0QWRkcmVzcyhpZCwgbGV2ZWwpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuYWRtaW5pc3RyYXRpdmVVbml0fS5MZXZlbCR7bGV2ZWx9LiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkocmVzdWx0LmRhdGEpKTtcbiAgICAgICAgICAgICAgICBkYXRhU291cmNlID0gPE1hc3RlckRhdGFJdGVtW10+cmVzdWx0LmRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UgPSA8TWFzdGVyRGF0YUl0ZW1bXT5KU09OLnBhcnNlKHRoaXMuc3RvcmFnZS5nZXRJdGVtKGAke3RoaXMuYWRtaW5pc3RyYXRpdmVVbml0fS5MZXZlbCR7bGV2ZWx9LiR7aWR9YCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKGRhdGFTb3VyY2UpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRXYXJkc0J5c3RyZWV0KHN0cmVldE5hbWU6IHN0cmluZywgZGlzdHJpY3RDb2RlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHJlZXRzID0gYXdhaXQgdGhpcy5nZXRBZGRyZXNzKGRpc3RyaWN0Q29kZSwgMik7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRJZHMgPSBzdHJlZXRzLmZpbHRlcih4ID0+IHgubmFtZSA9PSBzdHJlZXROYW1lKS5tYXAoeCA9PiB4LnBhcmVudElkKTtcbiAgICAgICAgICAgIHJlc29sdmUocGFyZW50SWRzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZG9nZXRBZGRyZXNzKGlkOiBzdHJpbmcsIGxldmVsID0gMSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3Qgc2VydmljZVVyaSA9IGAke3RoaXMuYXBpRW5kcG9pbnR9L0NpdHlDYXRlZ29yeS9HZXRCeVBhcmVudElkLyR7aWR9P2xldmVsPSR7bGV2ZWx9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnQuZ2V0PFJlc3BvbnNlUmVzdWx0PihzZXJ2aWNlVXJpKVxuICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5fY29tbW9uU2VydmljZS5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgZ2V0SXRlbURldGFpbFVuaXQoaWQ6IHN0cmluZyk6IFByb21pc2U8TWFzdGVyRGF0YUl0ZW0+IHtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGl0ZW1EYXRhOiBNYXN0ZXJEYXRhSXRlbSA9IG5ldyBNYXN0ZXJEYXRhSXRlbSgpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN0b3JhZ2UuZ2V0SXRlbShgJHt0aGlzLmFkbWluaXN0cmF0aXZlVW5pdEl0ZW19JHtpZH1gKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VVcmkgPSBgJHt0aGlzLmFwaUVuZHBvaW50fS9DaXR5Q2F0ZWdvcnkvR2V0QnlDb2RlLyR7aWR9YDtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9odHRwQ2xpZW50LmdldDxSZXNwb25zZVJlc3VsdD4oc2VydmljZVVyaSlcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdGhpcy5fY29tbW9uU2VydmljZS5oYW5kbGVFcnJvcihlcnIsIHRoaXMuX2luamVjdG9yKSkpXG4gICAgICAgICAgICAgICAgICAgIC50b1Byb21pc2UoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuYWRtaW5pc3RyYXRpdmVVbml0SXRlbX0ke2lkfWAsIEpTT04uc3RyaW5naWZ5KHJlc3VsdC5kYXRhKSk7XG5cbiAgICAgICAgICAgICAgICBpdGVtRGF0YSA9IDxNYXN0ZXJEYXRhSXRlbT5yZXN1bHQuZGF0YTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbURhdGEgPSA8TWFzdGVyRGF0YUl0ZW0+SlNPTi5wYXJzZSh0aGlzLnN0b3JhZ2UuZ2V0SXRlbShgJHt0aGlzLmFkbWluaXN0cmF0aXZlVW5pdEl0ZW19JHtpZH1gKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoaXRlbURhdGEpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRvR2V0Q29uZmlnQnlDb2RlKGNvZGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vICBUT0RPOiBkbyBoaeG7h24gZ2nhu50ga28gZMO5bmcgbsOqbiBmaXggdOG6oW0gdmFsdWUsIHNhdSBz4bq9IHjhu60gbMO9IHRp4bq/cFxuICAgICAgICAgICAgcmVzb2x2ZSg8UmVzcG9uc2VSZXN1bHQ+eyBkYXRhOiB7fSwgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGNvbnN0IHNlcnZpY2VVcmkgPSBgJHt0aGlzLmFwaUVuZHBvaW50fS9Db25maWd1cmF0aW9uU2VydmljZS9HZXRWYWx1ZUJ5Q29kZT9jb2RlPSR7Y29kZX1gO1xuXG4gICAgICAgIC8vIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LmdldDxSZXNwb25zZVJlc3VsdD4oc2VydmljZVVyaSlcbiAgICAgICAgLy8gICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2NvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxuICAgICAgICAvLyAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZG9HZXRBbGwoZ3JvdXBDb2RlOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gYXdhaXQgdGhpcy5nZXRHcm91cEJ5Q29kZShncm91cENvZGUpO1xuICAgICAgICBpZiAoIWdyb3VwLmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSg8UmVzcG9uc2VSZXN1bHQ+eyBzdWNjZXNzOiB0cnVlLCBkYXRhOiBbXSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdyaWRJbmZvID0gbmV3IEdyaWRJbmZvKHtcbiAgICAgICAgICAgIGZpZWxkczogJycsXG4gICAgICAgICAgICBwYWdlSW5mbzoge1xuICAgICAgICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IDEwMDAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNvcnRzOiBbeyBmaWVsZDogJ3NvcnQnLCBkaXI6IDEgfV0sXG4gICAgICAgICAgICBmaWx0ZXJzOiBbdGhpcy5fY29tbW9uU2VydmljZS5uZXdGaWx0ZXIoJ2dyb3VwQ2F0ZWdvcnlJZCcsIE9wZXJhdG9yLmVxdWFsLCBncm91cC5kYXRhLmlkKV1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YShgJHt0aGlzLnNpbmdsZUNhdGVnb3J5RW5kcG9pbnR9L2dldERhdGFgLCBncmlkSW5mbyk7XG4gICAgfVxuXG4gICAgLy8gdGjhu7FjIGhp4buHbiBnZXQgbGlzdCBzaW5nbGVDYXRlZ29yeSB0aGVvIGdyb3VwQ2F0ZWdvcnlDb2RlIHRyw6puIHJlZGlzIGNhY2hlXG4gICAgcHJpdmF0ZSBhc3luYyBkb0dldEFsbEN1c3RvbShncm91cENvZGU6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgdXJpID0gYCR7dGhpcy5zaW5nbGVDYXRlZ29yeUVuZHBvaW50fS9HZXREYXRhQnlHcm91cENvZGUvJHtncm91cENvZGV9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnQuZ2V0PFJlc3BvbnNlUmVzdWx0Pih1cmkpLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGF0YSh1cmksIGdyaWRJbmZvOiBHcmlkSW5mbyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnQucG9zdDxSZXNwb25zZVJlc3VsdD4odXJpLCBncmlkSW5mbykudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRHcm91cEJ5Q29kZShncm91cENvZGU6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgdXJpID0gYCR7dGhpcy5ncm91cENhdGVnb3J5RW5kcG9pbnR9L2dldEJ5Q29kZS8ke2dyb3VwQ29kZX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHVyaSkudG9Qcm9taXNlKCk7XG4gICAgfVxuXG4gICAgYWRkV29ya0RheXMoZGF0ZTogc3RyaW5nLCBkYXlzOiBudW1iZXIsIGlzRGF5ID0gMSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3Qgc2VydmljZVVyaSA9IGAke3RoaXMuYXBpRW5kcG9pbnR9L0hvbGlkYXlDYXRlZ29yeS9HZXREYXRlP2RhdGU9JHtkYXRlfSZkYXlzPSR7ZGF5c30maXNEYXk9JHtpc0RheX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHNlcnZpY2VVcmkpXG4gICAgICAgICAgICAucGlwZShjYXRjaEVycm9yKChlcnI6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB0aGlzLl9jb21tb25TZXJ2aWNlLmhhbmRsZUVycm9yKGVyciwgdGhpcy5faW5qZWN0b3IpKSlcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBnZXREYXRlQnlEdXJhdGlvbihkYXRlOiBzdHJpbmcsIHR5cGU6IGJvb2xlYW4sIGR1cmF0aW9uOiBudW1iZXIpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VVcmkgPSBgJHt0aGlzLmFwaUVuZHBvaW50fS9Ib2xpZGF5Q2F0ZWdvcnkvZ2V0RGF0ZUJ5RHVyYXRpb24/ZGF0ZT0ke2RhdGV9JnR5cGU9JHt0eXBlfSZkdXJhdGlvbj0ke2R1cmF0aW9ufWA7XG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LmdldDxSZXNwb25zZVJlc3VsdD4oc2VydmljZVVyaSlcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2NvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIGdldEl0ZW1CeUNvZGUoZGF0YVNvdXJjZTogYW55LCBjb2RlOiBzdHJpbmcpOiBNYXN0ZXJEYXRhSXRlbSB7XG4gICAgICAgIHJldHVybiBkYXRhU291cmNlLmZpbmQoeCA9PiB4LmNvZGUgPT09IGNvZGUpO1xuICAgIH1cblxuICAgIGdldEl0ZW1CeUluc3RhbmNlSWQoZGF0YVNvdXJjZTogYW55LCBpbnN0YW5jZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2UuZmluZCh4ID0+IHguaW5zdGFuY2VJZCA9PT0gaW5zdGFuY2VJZCk7XG4gICAgfVxuXG4gICAgZ2V0SXRlbUJ5SWQoZGF0YVNvdXJjZTogYW55LCBpZDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBkYXRhU291cmNlLmZpbmQoeCA9PiB4LmlkID09PSBpZCk7XG4gICAgfVxuXG4gICAgZ2V0SXRlbUJ5R3JvdXBBbmRDb2RlKGdyb3VwQ29kZTogc3RyaW5nLCBjb2RlOiBzdHJpbmcpOiBQcm9taXNlPE1hc3RlckRhdGFJdGVtPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgZGF0YVNvdXJjZTogTWFzdGVyRGF0YUl0ZW1bXSA9IFtdO1xuICAgICAgICAgICAgaWYgKCF0aGlzLnN0b3JhZ2UuZ2V0SXRlbShgJHt0aGlzLmNhdGVnb3J5UHJlZml4fSR7Z3JvdXBDb2RlfWApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5kb0dldEFsbChncm91cENvZGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuY2F0ZWdvcnlQcmVmaXh9JHtncm91cENvZGV9YCwgSlNPTi5zdHJpbmdpZnkocmVzdWx0LmRhdGEpKTtcbiAgICAgICAgICAgICAgICBkYXRhU291cmNlID0gPE1hc3RlckRhdGFJdGVtW10+cmVzdWx0LmRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UgPSA8TWFzdGVyRGF0YUl0ZW1bXT5KU09OLnBhcnNlKHRoaXMuc3RvcmFnZS5nZXRJdGVtKGAke3RoaXMuY2F0ZWdvcnlQcmVmaXh9JHtncm91cENvZGV9YCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKGRhdGFTb3VyY2UuZmluZCh4ID0+IHguY29kZSA9PT0gY29kZSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWZyZXNoQ2F0ZWdvcnkoKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGxvY2FsU3RvcmFnZSkge1xuICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKHRoaXMuY2F0ZWdvcnlQcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cENvZGUgPSBrZXkuc3BsaXQoJ18nKVsxXTtcbiAgICAgICAgICAgICAgICB0aGlzLmdldChncm91cENvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGdldEFkcmVzcyhjaXR5OiBhbnksIGRpc3RyaWN0OiBhbnksIHdhcmQ6IGFueSwgc3RyZWV0OiBhbnksIHN0clRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RyUmVzdWx0ID0gJyc7XG4gICAgICAgICAgICBpZiAoc3RyVGV4dCAmJiBzdHJUZXh0ICE9ICcnKSB7XG4gICAgICAgICAgICAgICAgc3RyUmVzdWx0ICs9IHN0clRleHQgKyAnLCAnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0cmVldCAmJiBzdHJlZXQgIT0gJycpIHtcbiAgICAgICAgICAgICAgICBzdHJSZXN1bHQgKz0gc3RyZWV0ICsgJywgJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHdhcmQgJiYgd2FyZCAhPSAnJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBhd2FpdCB0aGlzLmdldEl0ZW1EZXRhaWxVbml0KHdhcmQpO1xuICAgICAgICAgICAgICAgIGlmICh4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0clJlc3VsdCArPSB4Lm5hbWUgKyAnLCAnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRpc3RyaWN0ICYmIGRpc3RyaWN0ICE9ICcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IGF3YWl0IHRoaXMuZ2V0SXRlbURldGFpbFVuaXQoZGlzdHJpY3QpO1xuICAgICAgICAgICAgICAgIGlmICh4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0clJlc3VsdCArPSB4Lm5hbWUgKyAnLCAnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNpdHkgJiYgY2l0eSAhPSAnJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSBhd2FpdCB0aGlzLmdldEl0ZW1EZXRhaWxVbml0KGNpdHkpO1xuICAgICAgICAgICAgICAgIGlmICh4ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0clJlc3VsdCArPSB4Lm5hbWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHN0clJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFZhbHVlQnlDb2RlKGNvZGU6IGFueSk6IFByb21pc2U8UmVzcG9uc2VSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5zaW5nbGVDYXRlZ29yeUVuZHBvaW50fS9nZXRWYWx1ZUJ5Q29kZT9jb2RlPSR7Y29kZX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHVybClcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2NvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIGdldEdyb3VwSXRlbUJ5Q29kZShjb2RlOiBzdHJpbmcpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpRW5kcG9pbnR9L0dyb3VwQ2F0ZWdvcnkvJHtjb2RlfWA7XG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LmdldDxSZXNwb25zZVJlc3VsdD4odXJsKS5waXBlKGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2NvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIHBhcnNlTWF0aEV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nLCBkZWNpbWFsUGxhY2VzOiBudW1iZXIsIGZvclZpZXRuYW1lc2U6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxSZXNwb25zZVJlc3VsdD4ge1xuICAgICAgICBleHByZXNzaW9uID0gZW5jb2RlVVJJQ29tcG9uZW50KGV4cHJlc3Npb24pO1xuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaUVuZHBvaW50fS9NYXRoRXhwcmVzc2lvbi9QYXJzZU1hdGg/ZXhwcmVzc2lvbj0ke2V4cHJlc3Npb259JmRlY2ltYWxQbGFjZXM9JHtkZWNpbWFsUGxhY2VzfSZmb3JWaWV0bmFtZXNlPSR7Zm9yVmlldG5hbWVzZX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5nZXQ8UmVzcG9uc2VSZXN1bHQ+KHVybClcbiAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHRoaXMuX2NvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIGdldEJ5R3JpZFJlcXVlc3QoZ3JvdXBDb2RlOiBzdHJpbmcsIGdyaWRJbmZvOiBHcmlkSW5mbywgcGx1c1VybDogc3RyaW5nID0gJycpOiBQcm9taXNlPFJlc3BvbnNlUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgZGF0YTogYW55O1xuICAgICAgICAgICAgY29uc3QgZGF0YVN0b3JhZ2UgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShgJHt0aGlzLmNhdGVnb3J5UHJlZml4fSR7Z3JvdXBDb2RlfWApO1xuICAgICAgICAgICAgaWYgKCFkYXRhU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgIGxldCBhcGlVcmwgPSBgJHt0aGlzLnNpbmdsZUNhdGVnb3J5RW5kcG9pbnR9L2dldERhdGFgO1xuICAgICAgICAgICAgICAgIGlmIChwbHVzVXJsICE9IG51bGwgJiYgcGx1c1VybCAhPSAnJylcbiAgICAgICAgICAgICAgICAgICAgYXBpVXJsICs9ICcvJyArIHBsdXNVcmw7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuX2h0dHBDbGllbnRcbiAgICAgICAgICAgICAgICAgICAgLnBvc3Q8UmVzcG9uc2VSZXN1bHQ+KGFwaVVybCwgZ3JpZEluZm8pXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoZXJyID0+IHRoaXMuaGFuZGxlRXJyb3IoZXJyLCB0aGlzLl9pbmplY3RvcikpKS50b1Byb21pc2UoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGAke3RoaXMuY2F0ZWdvcnlQcmVmaXh9JHtncm91cENvZGV9YCwgSlNPTi5zdHJpbmdpZnkoZGF0YS5kYXRhKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnBhcnNlKGRhdGFTdG9yYWdlKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVHcmlkSW5mb0Ryb3Bkb3duKGZpbHRlcnM6IEZpbHRlcltdLCBvcHRpb25zOiBEcm9wZG93bk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZ3JpZEluZm8gPSB7XG4gICAgICAgICAgICBwYWdlSW5mbzoge1xuICAgICAgICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgICAgICAgcGFnZVNpemU6IDEwMDAwMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpbHRlcnMsXG4gICAgICAgICAgICBzb3J0czogW10sXG4gICAgICAgICAgICBmaWVsZHM6IGAke29wdGlvbnMudmFsdWVGaWVsZH0ke29wdGlvbnMuZGlzcGxheUZpZWxkID09IG9wdGlvbnMudmFsdWVGaWVsZCA/ICcnIDogJywnICsgb3B0aW9ucy5kaXNwbGF5RmllbGR9JHtvcHRpb25zLmZpZWxkUGx1c31gXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuc29ydHMgIT0gbnVsbCAmJiBvcHRpb25zLnNvcnRzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICBncmlkSW5mby5zb3J0cyA9IFsuLi5vcHRpb25zLnNvcnRzXTtcbiAgICAgICAgaWYgKG9wdGlvbnMuc29ydEZpZWxkICE9IG51bGwgJiYgb3B0aW9ucy5zb3J0RmllbGQgIT0gJycpXG4gICAgICAgICAgICBncmlkSW5mby5zb3J0cy5wdXNoKHsgZmllbGQ6IG9wdGlvbnMuc29ydEZpZWxkLCBkaXI6IG9wdGlvbnMuc29ydERpciB9KTtcbiAgICAgICAgcmV0dXJuIGdyaWRJbmZvO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGVmYXVsdFZhbHVlKG9wdGlvbnM6IERyb3Bkb3duT3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucy5maWVsZFBsdXMubGVuZ3RoID4gMCAmJiAhb3B0aW9ucy5maWVsZFBsdXMuc3RhcnRzV2l0aCgnLCcpKVxuICAgICAgICAgICAgb3B0aW9ucy5maWVsZFBsdXMgPSAnLCcgKyBvcHRpb25zLmZpZWxkUGx1cztcbiAgICAgICAgaWYgKG9wdGlvbnMuc29ydEZpZWxkID09ICcnKVxuICAgICAgICAgICAgb3B0aW9ucy5zb3J0RmllbGQgPSBvcHRpb25zLmRpc3BsYXlGaWVsZDtcbiAgICAgICAgaWYgKG9wdGlvbnMuZnVuY0dldExhYmVsID09IG51bGwgfHwgdHlwZW9mIG9wdGlvbnMuZnVuY0dldExhYmVsICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZnVuY0dldExhYmVsID0gKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVtvcHRpb25zLmRpc3BsYXlGaWVsZF07XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0RGF0YURyb3Bkb3duKGdyb3VwQ29kZTogc3RyaW5nLCBhcnJWYWx1ZTogYW55W10sIG9wdGlvbnM/OiBEcm9wZG93bk9wdGlvbnMpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlKG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXQoZ3JvdXBDb2RlKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgIGlmIChhcnJWYWx1ZSA9PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXM7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXMuZmlsdGVyKHggPT4gYXJyVmFsdWUuc29tZSh2ID0+IHYgPT0geFtvcHRpb25zLnZhbHVlRmllbGRdKSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHJlamVjdChlcnIpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0RGF0YURyb3Bkb3duQnlGaWx0ZXIoZ3JvdXBDb2RlOiBzdHJpbmcsIGFyclZhbHVlOiBhbnlbXSwgZmlsdGVyczogRmlsdGVyW10sIG9wdGlvbnM/OiBEcm9wZG93bk9wdGlvbnMpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdFZhbHVlKG9wdGlvbnMpO1xuICAgICAgICBmaWx0ZXJzLnNwbGljZSgwLCAwLCB0aGlzLl9jb21tb25TZXJ2aWNlLm5ld0ZpbHRlcignZ3JvdXBDYXRlZ29yeUNvZGUnLCBPcGVyYXRvci5lcXVhbCwgZ3JvdXBDb2RlKSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldChncm91cENvZGUpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJyVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzLmZpbHRlcih4ID0+IGFyclZhbHVlLnNvbWUodiA9PiB2ID09IHhbb3B0aW9ucy52YWx1ZUZpZWxkXSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4gcmVqZWN0KGVycikpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvcjogYW55LCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICAgICAgY29uc3QgY29tbW9uU2VydmljZSA9IGluamVjdG9yLmdldChDb21tb25TZXJ2aWNlKTtcbiAgICAgICAgcmV0dXJuIGNvbW1vblNlcnZpY2UuaGFuZGxlRXJyb3IoZXJyb3IsIGluamVjdG9yKTtcbiAgICB9XG59XG4iXX0=
@@ -1142,6 +1142,8 @@ class EntityPickerControlSchema extends FormControlBaseWithService {
1142
1142
  this.rowButtonBeforeTemplate = null;
1143
1143
  this.hiddenPageSetting = false;
1144
1144
  this.showEditLink = true;
1145
+ this.titleUnPicked = 'Danh sách các mục chưa chọn';
1146
+ this.titlePicked = 'Danh sách các mục đã chọn';
1145
1147
  for (const key in init) {
1146
1148
  this[key] = init[key];
1147
1149
  }
@@ -5228,14 +5230,12 @@ StorageUpdatedService.ctorParameters = () => [
5228
5230
 
5229
5231
  class MasterDataService {
5230
5232
  constructor(_httpClient, _commonService, _injector, _storageUpdatedService, _moduleConfigService) {
5231
- var _a, _b;
5232
5233
  this._httpClient = _httpClient;
5233
5234
  this._commonService = _commonService;
5234
5235
  this._injector = _injector;
5235
5236
  this._storageUpdatedService = _storageUpdatedService;
5236
5237
  this._moduleConfigService = _moduleConfigService;
5237
5238
  this.setupSignalr = false;
5238
- this.isDisabledGetCache = false;
5239
5239
  this.storage = localStorage;
5240
5240
  this.categoryPrefix = 'cat_';
5241
5241
  this.categoryGroupPrefix = 'cat_group_';
@@ -5244,7 +5244,6 @@ class MasterDataService {
5244
5244
  this.env = this._moduleConfigService.getConfig().environment;
5245
5245
  this.apiEndpoint = this.env.apiDomain.commonMasterDataEndpoint;
5246
5246
  this.apiVersion = this.env.apiVersion;
5247
- this.isDisabledGetCache = (_b = (_a = this.env.cauHinhNghiepVu) === null || _a === void 0 ? void 0 : _a.isDisabledGetCacheCommonMasterdata) !== null && _b !== void 0 ? _b : false;
5248
5247
  this.groupCategoryEndpoint = `${this.apiEndpoint}/${this.apiVersion}/Groupcategory`;
5249
5248
  this.singleCategoryEndpoint = `${this.apiEndpoint}/${this.apiVersion}/SingleCategory`;
5250
5249
  if (!this.setupSignalr) {
@@ -5291,17 +5290,7 @@ class MasterDataService {
5291
5290
  }
5292
5291
  get(groupCode) {
5293
5292
  return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
5294
- let dataSource = [];
5295
- if (this.isDisabledGetCache === true) {
5296
- dataSource = yield this.getAllByGroupCode(groupCode);
5297
- }
5298
- else if (!this.storage.getItem(`${this.categoryPrefix}${groupCode}`)) {
5299
- dataSource = yield this.getAllByGroupCode(groupCode);
5300
- this.storage.setItem(`${this.categoryPrefix}${groupCode}`, JSON.stringify(dataSource));
5301
- }
5302
- else {
5303
- dataSource = JSON.parse(this.storage.getItem(`${this.categoryPrefix}${groupCode}`));
5304
- }
5293
+ const dataSource = yield this.getAllByGroupCode(groupCode);
5305
5294
  resolve(dataSource);
5306
5295
  }));
5307
5296
  }
@@ -5429,7 +5418,7 @@ class MasterDataService {
5429
5418
  return this.getData(`${this.singleCategoryEndpoint}/getData`, gridInfo);
5430
5419
  });
5431
5420
  }
5432
- // thực hiện get list singleCategory theo groupCategoryCode trên redis
5421
+ // thực hiện get list singleCategory theo groupCategoryCode trên redis cache
5433
5422
  doGetAllCustom(groupCode) {
5434
5423
  return __awaiter(this, void 0, void 0, function* () {
5435
5424
  const uri = `${this.singleCategoryEndpoint}/GetDataByGroupCode/${groupCode}`;
@@ -38166,9 +38155,10 @@ class SearchDataModel {
38166
38155
  }
38167
38156
 
38168
38157
  class EntityPickerDataComponent extends DataListBase {
38169
- constructor(_injector, _deviceDetectorService) {
38158
+ constructor(_injector, _deviceDetectorService, dom) {
38170
38159
  super(_injector);
38171
38160
  this._deviceDetectorService = _deviceDetectorService;
38161
+ this.dom = dom;
38172
38162
  this.datasourceFieldFilter = [];
38173
38163
  this.isSingleSelection = false;
38174
38164
  this.onContentInit = new EventEmitter();
@@ -38350,14 +38340,15 @@ class EntityPickerDataComponent extends DataListBase {
38350
38340
  EntityPickerDataComponent.decorators = [
38351
38341
  { type: Component, args: [{
38352
38342
  selector: 'app-entity-picker-data',
38353
- template: "<crud-list #crudList [menuButtons]=\"getMenuButtons\" [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\"\n [showScrollHorizontal]=\"true\" (onContentInit)=\"onContentInit.emit($event)\" (onReload)=\"_triggerProcessData($event)\"\n (onAdd)=\"_add($event)\" (onRowSelect)=\"handleRowSelect($event)\" (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\"\n (onDelete)=\"_delete($event)\" (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_unmarkLoading()\">\n <ng-template #toolbar let-crudList=\"crudList\" let-selectedItems=\"selectedItems\">\n <button *ngIf=\"!model.dataSource.length && setting.hiddenAdvanceSearch\" pButton\n style=\"visibility: hidden\"></button>\n <button *ngIf=\"!isSingleSelection && model.dataSource.length > 0\" type=\"button\" pButton pRipple\n label=\"L\u1EA5y t\u1EA5t c\u1EA3 ({{model.dataSource.length}})\" icon=\"pi pi-angle-double-right\"\n class=\"p-button-text p-button-success\" [disabled]=\"model.loading\" (click)=\"pickAll()\"></button>\n <button *ngIf=\"!isSingleSelection && selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"L\u1EA5y m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{selectedItems.length}})\" icon=\"pi pi-angle-right\"\n class=\"p-button-text p-button-success\" [disabled]=\"model.loading\" (click)=\"pickSelected(selectedItems)\"></button>\n <button *ngIf=\"datasourceFieldFilter.length\" type=\"button\" pButton pRipple label=\"T\u00ECm ki\u1EBFm nhi\u1EC1u ng\u01B0\u1EDDi d\u00F9ng\"\n icon=\"pi pi-search\" class=\"p-button-text p-button-primary\" [disabled]=\"model.loading\" (click)=\"handleAdvansearch()\"></button>\n <button *ngIf=\"datasourceFieldFilter.length && searchData\" type=\"button\" pButton pRipple\n label=\"X\u00F3a danh s\u00E1ch t\u00ECm ki\u1EBFm\" pTooltip=\"X\u00F3a t\u1EA5t c\u1EA3 ng\u01B0\u1EDDi d\u00F9ng \u1EDF Danh s\u00E1ch t\u00ECm ki\u1EBFm\" icon=\"pi pi-times\"\n class=\"p-button-text p-button-primary\" [disabled]=\"model.loading\" (click)=\"handleSearch(null)\"></button>\n </ng-template>\n <ng-template let-crudList=\"crudList\" #function let-rowData=\"rowData\">\n <button pButton type=\"button\" class=\"link-or-action p-button-success p-button-text p-button-rounded\"\n icon=\"pi pi-check\" pTooltip=\"Ch\u1ECDn m\u1EE5c n\u00E0y\" tooltipPosition=\"top\" [disabled]=\"rowData.disabled\"\n (click)=\"pickEntity(rowData)\"></button>\n </ng-template>\n</crud-list>\n\n\n<tn-dialog *ngIf=\"showFormAdvancedSearch\" #dialog [styleClass]=\"'address-form'\" [header]=\"'T\u00ECm ki\u1EBFm nhi\u1EC1u ng\u01B0\u1EDDi d\u00F9ng'\"\n [popupSize]=\"popupSizeSearchForm\" [maskClass]=\"setting.maskClass\" (onHide)=\"showFormAdvancedSearch = false\">\n <entity-picker-search-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [parentSetting]=\"setting\"\n [datasourceFieldFilter]=\"datasourceFieldFilter\" [lstDataNotExist]=\"lstDataNotExist\" [model]=\"formModel\"\n (onSearch)=\"handleSearch($event)\" (onCancel)=\"showFormAdvancedSearch = false;\">\n </entity-picker-search-form>\n</tn-dialog>",
38343
+ template: "<crud-list #crudList [menuButtons]=\"getMenuButtons\" [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\"\n [showScrollHorizontal]=\"true\" (onContentInit)=\"onContentInit.emit($event)\" (onReload)=\"_triggerProcessData($event)\"\n (onAdd)=\"_add($event)\" (onRowSelect)=\"handleRowSelect($event)\" (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\"\n (onDelete)=\"_delete($event)\" (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_unmarkLoading()\">\n <ng-template #customTitle>\n <h1 [innerHTML]=\"dom.bypassSecurityTrustHtml(control.titleUnPicked)\"></h1>\n </ng-template>\n <ng-template #toolbar let-crudList=\"crudList\" let-selectedItems=\"selectedItems\">\n <button *ngIf=\"!model.dataSource.length && setting.hiddenAdvanceSearch\" pButton\n style=\"visibility: hidden\"></button>\n <button *ngIf=\"!isSingleSelection && model.dataSource.length > 0\" type=\"button\" pButton pRipple\n label=\"L\u1EA5y t\u1EA5t c\u1EA3 ({{model.dataSource.length}})\" icon=\"pi pi-angle-double-right\"\n class=\"p-button-text p-button-success\" [disabled]=\"model.loading\" (click)=\"pickAll()\"></button>\n <button *ngIf=\"!isSingleSelection && selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"L\u1EA5y m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{selectedItems.length}})\" icon=\"pi pi-angle-right\"\n class=\"p-button-text p-button-success\" [disabled]=\"model.loading\" (click)=\"pickSelected(selectedItems)\"></button>\n <button *ngIf=\"datasourceFieldFilter.length\" type=\"button\" pButton pRipple label=\"T\u00ECm ki\u1EBFm nhi\u1EC1u ng\u01B0\u1EDDi d\u00F9ng\"\n icon=\"pi pi-search\" class=\"p-button-text p-button-primary\" [disabled]=\"model.loading\" (click)=\"handleAdvansearch()\"></button>\n <button *ngIf=\"datasourceFieldFilter.length && searchData\" type=\"button\" pButton pRipple\n label=\"X\u00F3a danh s\u00E1ch t\u00ECm ki\u1EBFm\" pTooltip=\"X\u00F3a t\u1EA5t c\u1EA3 ng\u01B0\u1EDDi d\u00F9ng \u1EDF Danh s\u00E1ch t\u00ECm ki\u1EBFm\" icon=\"pi pi-times\"\n class=\"p-button-text p-button-primary\" [disabled]=\"model.loading\" (click)=\"handleSearch(null)\"></button>\n </ng-template>\n <ng-template let-crudList=\"crudList\" #function let-rowData=\"rowData\">\n <button pButton type=\"button\" class=\"link-or-action p-button-success p-button-text p-button-rounded\"\n icon=\"pi pi-check\" pTooltip=\"Ch\u1ECDn m\u1EE5c n\u00E0y\" tooltipPosition=\"top\" [disabled]=\"rowData.disabled\"\n (click)=\"pickEntity(rowData)\"></button>\n </ng-template>\n</crud-list>\n\n\n<tn-dialog *ngIf=\"showFormAdvancedSearch\" #dialog [styleClass]=\"'address-form'\" [header]=\"'T\u00ECm ki\u1EBFm nhi\u1EC1u ng\u01B0\u1EDDi d\u00F9ng'\"\n [popupSize]=\"popupSizeSearchForm\" [maskClass]=\"setting.maskClass\" (onHide)=\"showFormAdvancedSearch = false\">\n <entity-picker-search-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [parentSetting]=\"setting\"\n [datasourceFieldFilter]=\"datasourceFieldFilter\" [lstDataNotExist]=\"lstDataNotExist\" [model]=\"formModel\"\n (onSearch)=\"handleSearch($event)\" (onCancel)=\"showFormAdvancedSearch = false;\">\n </entity-picker-search-form>\n</tn-dialog>",
38354
38344
  providers: [ComponentContextService],
38355
38345
  styles: ["::ng-deep app-entity-picker-data .custom-card{padding:.5em!important}"]
38356
38346
  },] }
38357
38347
  ];
38358
38348
  EntityPickerDataComponent.ctorParameters = () => [
38359
38349
  { type: Injector },
38360
- { type: DeviceDetectorService }
38350
+ { type: DeviceDetectorService },
38351
+ { type: DomSanitizer }
38361
38352
  ];
38362
38353
  EntityPickerDataComponent.propDecorators = {
38363
38354
  parentSetting: [{ type: Input }],
@@ -38376,8 +38367,9 @@ EntityPickerDataComponent.propDecorators = {
38376
38367
  };
38377
38368
 
38378
38369
  class EntityPickerSelectedComponent extends DataListBase {
38379
- constructor(_injector) {
38370
+ constructor(_injector, dom) {
38380
38371
  super(_injector);
38372
+ this.dom = dom;
38381
38373
  this.onContentInit = new EventEmitter();
38382
38374
  this.onUnPick = new EventEmitter();
38383
38375
  this.onUnPickAll = new EventEmitter();
@@ -38564,13 +38556,14 @@ EntityPickerSelectedComponent.decorators = [
38564
38556
  { type: Component, args: [{
38565
38557
  // tslint:disable-next-line: component-selector
38566
38558
  selector: 'app-entity-picker-selected',
38567
- template: "<crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\" [showScrollHorizontal]=\"true\"\n (onContentInit)=\"onContentInit.emit($event)\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"_add($event)\"\n (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\" (onDelete)=\"_delete($event)\"\n (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_unmarkLoading()\">\n\n <ng-template #toolbar let-crudList=\"crudList\" let-selectedItems=\"selectedItems\">\n <button *ngIf=\"!model.dataSource.length && setting.hiddenAdvanceSearch\" pButton\n style=\"visibility: hidden\"></button>\n <button *ngIf=\"itemCanDeletes.length\" type=\"button\" pButton pRipple\n label=\"B\u1ECF t\u1EA5t c\u1EA3 ({{itemCanDeletes.length}})\" icon=\"pi pi-angle-double-left\"\n class=\"p-button-text p-button-danger\" [disabled]=\"model.loading\" (click)=\"unPickAll()\"></button>\n <button *ngIf=\"selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"B\u1ECF m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{selectedItems.length}})\" icon=\"pi pi-angle-left\"\n class=\"p-button-text p-button-danger\" [disabled]=\"model.loading\" (click)=\"unPickSelected(selectedItems)\"></button>\n </ng-template>\n\n <ng-template let-crudList=\"crudList\" #function let-rowData=\"rowData\">\n <button *ngIf=\"!rowData.hiddenDelete\" pButton type=\"button\"\n class=\"link-or-action p-button-danger p-button-text p-button-rounded\" icon=\"pi pi-times\"\n pTooltip=\"B\u1ECF ch\u1ECDn m\u1EE5c n\u00E0y\" tooltipPosition=\"top\" (click)=\"unPickEntity(rowData)\"></button>\n </ng-template>\n\n</crud-list>",
38559
+ template: "<crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\" [showScrollHorizontal]=\"true\"\n (onContentInit)=\"onContentInit.emit($event)\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"_add($event)\"\n (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\" (onDelete)=\"_delete($event)\"\n (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_unmarkLoading()\">\n <ng-template #customTitle>\n <h1 [innerHTML]=\"dom.bypassSecurityTrustHtml(control.titlePicked)\"></h1>\n </ng-template>\n <ng-template #toolbar let-crudList=\"crudList\" let-selectedItems=\"selectedItems\">\n <button *ngIf=\"!model.dataSource.length && setting.hiddenAdvanceSearch\" pButton\n style=\"visibility: hidden\"></button>\n <button *ngIf=\"itemCanDeletes.length\" type=\"button\" pButton pRipple\n label=\"B\u1ECF t\u1EA5t c\u1EA3 ({{itemCanDeletes.length}})\" icon=\"pi pi-angle-double-left\"\n class=\"p-button-text p-button-danger\" [disabled]=\"model.loading\" (click)=\"unPickAll()\"></button>\n <button *ngIf=\"selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"B\u1ECF m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{selectedItems.length}})\" icon=\"pi pi-angle-left\"\n class=\"p-button-text p-button-danger\" [disabled]=\"model.loading\" (click)=\"unPickSelected(selectedItems)\"></button>\n </ng-template>\n\n <ng-template let-crudList=\"crudList\" #function let-rowData=\"rowData\">\n <button *ngIf=\"!rowData.hiddenDelete\" pButton type=\"button\"\n class=\"link-or-action p-button-danger p-button-text p-button-rounded\" icon=\"pi pi-times\"\n pTooltip=\"B\u1ECF ch\u1ECDn m\u1EE5c n\u00E0y\" tooltipPosition=\"top\" (click)=\"unPickEntity(rowData)\"></button>\n </ng-template>\n\n</crud-list>",
38568
38560
  providers: [ComponentContextService],
38569
38561
  styles: ["::ng-deep app-entity-picker-selected .custom-card{padding:.5em .5em 0!important}"]
38570
38562
  },] }
38571
38563
  ];
38572
38564
  EntityPickerSelectedComponent.ctorParameters = () => [
38573
- { type: Injector }
38565
+ { type: Injector },
38566
+ { type: DomSanitizer }
38574
38567
  ];
38575
38568
  EntityPickerSelectedComponent.propDecorators = {
38576
38569
  parentSetting: [{ type: Input }],
@@ -40828,9 +40821,10 @@ EntityPickerSearchFormComponent.propDecorators = {
40828
40821
  };
40829
40822
 
40830
40823
  class EntityPickerTreeDataComponent extends TreeListBase {
40831
- constructor(_injector, _deviceDetectorService) {
40824
+ constructor(_injector, _deviceDetectorService, dom) {
40832
40825
  super(_injector);
40833
40826
  this._deviceDetectorService = _deviceDetectorService;
40827
+ this.dom = dom;
40834
40828
  this.isSingleSelection = false;
40835
40829
  this.onContentInit = new EventEmitter();
40836
40830
  this.onRowSelect = new EventEmitter();
@@ -40951,14 +40945,15 @@ class EntityPickerTreeDataComponent extends TreeListBase {
40951
40945
  EntityPickerTreeDataComponent.decorators = [
40952
40946
  { type: Component, args: [{
40953
40947
  selector: 'app-entity-picker-tree-data',
40954
- template: "<!-- <crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\" [showScrollHorizontal]=\"true\"\n (onContentInit)=\"onContentInit.emit($event)\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"_add($event)\"\n (onRowSelect)=\"handleRowSelect($event)\" (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\"\n (onDelete)=\"_delete($event)\" (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_unmarkLoading()\">\n <ng-template #toolbar let-crudList=\"crudList\" let-selectedItems=\"selectedItems\">\n <button *ngIf=\"!isSingleSelection && model.dataSource.length > 0\" type=\"button\" pButton pRipple\n label=\"L\u1EA5y t\u1EA5t c\u1EA3 ({{model.dataSource.length}})\" icon=\"pi pi-angle-double-right\"\n class=\"p-button-text p-button-success\" (click)=\"pickAll()\"></button>\n <button *ngIf=\"!isSingleSelection && selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"L\u1EA5y m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{selectedItems.length}})\" icon=\"pi pi-angle-right\"\n class=\"p-button-text p-button-success\" (click)=\"pickSelected(selectedItems)\"></button>\n </ng-template>\n <ng-template let-crudList=\"crudList\" #function let-rowData=\"rowData\">\n <button pButton type=\"button\" class=\"link-or-action p-button-success p-button-text p-button-rounded\"\n icon=\"pi pi-check\" pTooltip=\"Ch\u1ECDn m\u1EE5c n\u00E0y\" tooltipPosition=\"top\" [disabled]=\"rowData.disabled\"\n (click)=\"pickEntity(rowData)\"></button>\n </ng-template>\n</crud-list> -->\n\n<tn-tree-table [model]=\"model\" [setting]=\"setting\" [allDataSource]=\"model.allDataSource\" [hiddenAdd]=\"true\"\n (onContentInit)=\"onContentInit.emit($event)\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"_add($event)\"\n (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\" (onDelete)=\"_delete($event)\"\n (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_handleReloaded($event)\">\n <ng-template #toolbar let-crudList=\"crudList\" let-selectedItems=\"selectedItems\">\n <button *ngIf=\"!isSingleSelection && model.dataSource.length > 0\" type=\"button\" pButton pRipple\n label=\"L\u1EA5y t\u1EA5t c\u1EA3 ({{model.dataSource.length}})\" icon=\"pi pi-angle-double-right\"\n class=\"p-button-text p-button-success\" (click)=\"pickAll()\"></button>\n <button *ngIf=\"!isSingleSelection && selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"L\u1EA5y m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{selectedItems.length}})\" icon=\"pi pi-angle-right\"\n class=\"p-button-text p-button-success\" (click)=\"pickSelected(selectedItems)\"></button>\n </ng-template>\n <ng-template let-crudList=\"crudList\" #function let-rowData=\"rowData\">\n <button pButton type=\"button\" class=\"link-or-action p-button-success p-button-text p-button-rounded\"\n icon=\"pi pi-check\" pTooltip=\"Ch\u1ECDn m\u1EE5c n\u00E0y\" tooltipPosition=\"top\" [disabled]=\"rowData.disabled\"\n (click)=\"pickEntity(rowData)\"></button>\n </ng-template>\n</tn-tree-table>",
40948
+ template: "<!-- <crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\" [showScrollHorizontal]=\"true\"\n (onContentInit)=\"onContentInit.emit($event)\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"_add($event)\"\n (onRowSelect)=\"handleRowSelect($event)\" (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\"\n (onDelete)=\"_delete($event)\" (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_unmarkLoading()\">\n <ng-template #toolbar let-crudList=\"crudList\" let-selectedItems=\"selectedItems\">\n <button *ngIf=\"!isSingleSelection && model.dataSource.length > 0\" type=\"button\" pButton pRipple\n label=\"L\u1EA5y t\u1EA5t c\u1EA3 ({{model.dataSource.length}})\" icon=\"pi pi-angle-double-right\"\n class=\"p-button-text p-button-success\" (click)=\"pickAll()\"></button>\n <button *ngIf=\"!isSingleSelection && selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"L\u1EA5y m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{selectedItems.length}})\" icon=\"pi pi-angle-right\"\n class=\"p-button-text p-button-success\" (click)=\"pickSelected(selectedItems)\"></button>\n </ng-template>\n <ng-template let-crudList=\"crudList\" #function let-rowData=\"rowData\">\n <button pButton type=\"button\" class=\"link-or-action p-button-success p-button-text p-button-rounded\"\n icon=\"pi pi-check\" pTooltip=\"Ch\u1ECDn m\u1EE5c n\u00E0y\" tooltipPosition=\"top\" [disabled]=\"rowData.disabled\"\n (click)=\"pickEntity(rowData)\"></button>\n </ng-template>\n</crud-list> -->\n\n<tn-tree-table [model]=\"model\" [setting]=\"setting\" [allDataSource]=\"model.allDataSource\" [hiddenAdd]=\"true\"\n (onContentInit)=\"onContentInit.emit($event)\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"_add($event)\"\n (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\" (onDelete)=\"_delete($event)\"\n (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_handleReloaded($event)\">\n <ng-template #customTitle>\n <h1 [innerHTML]=\"dom.bypassSecurityTrustHtml(control.titleUnPicked)\"></h1>\n </ng-template>\n <ng-template #toolbar let-crudList=\"crudList\" let-selectedItems=\"selectedItems\">\n <button *ngIf=\"!isSingleSelection && model.dataSource.length > 0\" type=\"button\" pButton pRipple\n label=\"L\u1EA5y t\u1EA5t c\u1EA3 ({{model.dataSource.length}})\" icon=\"pi pi-angle-double-right\"\n class=\"p-button-text p-button-success\" (click)=\"pickAll()\"></button>\n <button *ngIf=\"!isSingleSelection && selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"L\u1EA5y m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{selectedItems.length}})\" icon=\"pi pi-angle-right\"\n class=\"p-button-text p-button-success\" (click)=\"pickSelected(selectedItems)\"></button>\n </ng-template>\n <ng-template let-crudList=\"crudList\" #function let-rowData=\"rowData\">\n <button pButton type=\"button\" class=\"link-or-action p-button-success p-button-text p-button-rounded\"\n icon=\"pi pi-check\" pTooltip=\"Ch\u1ECDn m\u1EE5c n\u00E0y\" tooltipPosition=\"top\" [disabled]=\"rowData.disabled\"\n (click)=\"pickEntity(rowData)\"></button>\n </ng-template>\n</tn-tree-table>",
40955
40949
  providers: [ComponentContextService],
40956
40950
  styles: ["::ng-deep app-entity-picker-data .custom-card{padding:.5em!important}"]
40957
40951
  },] }
40958
40952
  ];
40959
40953
  EntityPickerTreeDataComponent.ctorParameters = () => [
40960
40954
  { type: Injector },
40961
- { type: DeviceDetectorService }
40955
+ { type: DeviceDetectorService },
40956
+ { type: DomSanitizer }
40962
40957
  ];
40963
40958
  EntityPickerTreeDataComponent.propDecorators = {
40964
40959
  parentSetting: [{ type: Input }],
@@ -40977,8 +40972,9 @@ EntityPickerTreeDataComponent.propDecorators = {
40977
40972
  };
40978
40973
 
40979
40974
  class EntityPickerTreeSelectedComponent extends TreeListBase {
40980
- constructor(_injector) {
40975
+ constructor(_injector, dom) {
40981
40976
  super(_injector);
40977
+ this.dom = dom;
40982
40978
  this.onContentInit = new EventEmitter();
40983
40979
  this.onUnPick = new EventEmitter();
40984
40980
  this.onUnPickAll = new EventEmitter();
@@ -41122,13 +41118,14 @@ EntityPickerTreeSelectedComponent.decorators = [
41122
41118
  { type: Component, args: [{
41123
41119
  // tslint:disable-next-line: component-selector
41124
41120
  selector: 'app-entity-picker-tree-selected',
41125
- template: "<crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\" [showScrollHorizontal]=\"true\"\n (onContentInit)=\"onContentInit.emit($event)\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"_add($event)\"\n (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\" (onDelete)=\"_delete($event)\"\n (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_unmarkLoading()\">\n\n <ng-template #toolbar let-crudList=\"crudList\" let-selectedItems=\"selectedItems\">\n <button *ngIf=\"!model.dataSource.length && setting.hiddenAdvanceSearch\" pButton\n style=\"visibility: hidden\"></button>\n <button *ngIf=\"itemCanDeletes.length\" type=\"button\" pButton pRipple\n label=\"B\u1ECF t\u1EA5t c\u1EA3 ({{itemCanDeletes.length}})\" icon=\"pi pi-angle-double-left\"\n class=\"p-button-text p-button-danger\" (click)=\"unPickAll()\"></button>\n <button *ngIf=\"selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"B\u1ECF m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{selectedItems.length}})\" icon=\"pi pi-angle-left\"\n class=\"p-button-text p-button-danger\" (click)=\"unPickSelected(selectedItems)\"></button>\n </ng-template>\n\n <ng-template let-crudList=\"crudList\" #function let-rowData=\"rowData\">\n <button *ngIf=\"!rowData.hiddenDelete\" pButton type=\"button\"\n class=\"link-or-action p-button-danger p-button-text p-button-rounded\" icon=\"pi pi-times\"\n pTooltip=\"B\u1ECF ch\u1ECDn m\u1EE5c n\u00E0y\" tooltipPosition=\"top\" (click)=\"unPickEntity(rowData)\"></button>\n </ng-template>\n\n</crud-list>",
41121
+ template: "<crud-list #crudList [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\" [showScrollHorizontal]=\"true\"\n (onContentInit)=\"onContentInit.emit($event)\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"_add($event)\"\n (onEdit)=\"_edit($event)\" (onView)=\"_view($event)\" (onDelete)=\"_delete($event)\"\n (onDeleteMultiple)=\"_deleteMultiple($event)\" (onReloaded)=\"_unmarkLoading()\">\n <ng-template #customTitle>\n <h1 [innerHTML]=\"dom.bypassSecurityTrustHtml(control.titlePicked)\"></h1>\n </ng-template>\n <ng-template #toolbar let-crudList=\"crudList\" let-selectedItems=\"selectedItems\">\n <button *ngIf=\"!model.dataSource.length && setting.hiddenAdvanceSearch\" pButton\n style=\"visibility: hidden\"></button>\n <button *ngIf=\"itemCanDeletes.length\" type=\"button\" pButton pRipple\n label=\"B\u1ECF t\u1EA5t c\u1EA3 ({{itemCanDeletes.length}})\" icon=\"pi pi-angle-double-left\"\n class=\"p-button-text p-button-danger\" (click)=\"unPickAll()\"></button>\n <button *ngIf=\"selectedItems.length > 0\" type=\"button\" pButton pRipple\n label=\"B\u1ECF m\u1EE5c \u0111\u00E3 ch\u1ECDn ({{selectedItems.length}})\" icon=\"pi pi-angle-left\"\n class=\"p-button-text p-button-danger\" (click)=\"unPickSelected(selectedItems)\"></button>\n </ng-template>\n\n <ng-template let-crudList=\"crudList\" #function let-rowData=\"rowData\">\n <button *ngIf=\"!rowData.hiddenDelete\" pButton type=\"button\"\n class=\"link-or-action p-button-danger p-button-text p-button-rounded\" icon=\"pi pi-times\"\n pTooltip=\"B\u1ECF ch\u1ECDn m\u1EE5c n\u00E0y\" tooltipPosition=\"top\" (click)=\"unPickEntity(rowData)\"></button>\n </ng-template>\n\n</crud-list>",
41126
41122
  providers: [ComponentContextService],
41127
41123
  styles: ["::ng-deep app-entity-picker-selected .custom-card{padding:.5em .5em 0!important}"]
41128
41124
  },] }
41129
41125
  ];
41130
41126
  EntityPickerTreeSelectedComponent.ctorParameters = () => [
41131
- { type: Injector }
41127
+ { type: Injector },
41128
+ { type: DomSanitizer }
41132
41129
  ];
41133
41130
  EntityPickerTreeSelectedComponent.propDecorators = {
41134
41131
  parentSetting: [{ type: Input }],
@@ -41508,7 +41505,7 @@ class EntityPickerComponent extends DataListBase {
41508
41505
  EntityPickerComponent.decorators = [
41509
41506
  { type: Component, args: [{
41510
41507
  selector: 'entity-picker',
41511
- template: "<crud-list #crudList [templates]=\"children\" [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\"\n [hiddenDelete]=\"readOnly\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"_add($event)\" (onEdit)=\"_edit($event)\"\n (onView)=\"_view($event)\" (onDelete)=\"_delete($event)\" (onDeleteMultiple)=\"_deleteMultiple($event)\"\n (onReloaded)=\"_unmarkLoading()\" class=\"--no-wrapper-padding\">\n <ng-template #toolbar let-crudList=\"crudList\">\n <button *ngIf=\"!readOnly\" type=\"button\" pButton icon=\"pi pi-external-link\" class=\"p-button-text\"\n [label]=\"control.title\" [disabled]=\"control.disabled\" (click)=\"selectEntity()\"></button>\n <ng-container *ngIf=\"required\">\n <span class=\"star-required\">*</span>\n </ng-container>\n <ng-container *ngIf=\"control.multiple && !readOnly && !setting.hiddenCheckbox\">\n <button type=\"button\" pButton class=\"p-button-warning p-button-text p-button-rounded link-or-action\"\n icon=\"pi pi-trash\" label=\"B\u1ECF m\u1EE5c \u0111\u00E3 ch\u1ECDn\" tooltipPosition=\"top\"\n [disabled]=\"model.selectedItems.length == 0\" (click)=\"handleUnMultiPickEntity()\"></button>\n </ng-container>\n </ng-template>\n <ng-template let-crudList=\"crudList\" #function let-rowData=\"rowData\" let-index=\"index\">\n <div *ngIf=\"!control.rowButtonTemplate && !readOnly\" class=\"p-toolbar-group-center button-group\">\n <ng-container *ngIf=\"control.rowButtonBeforeTemplate\" class=\"p-toolbar-group-center button-group\">\n <ng-container\n *ngTemplateOutlet=\"control.rowButtonBeforeTemplate; context: {rowData: rowData, rowIndex: index, control: control}\">\n </ng-container>\n </ng-container>\n <button type=\"button\" pButton class=\"p-button-warning p-button-text p-button-rounded link-or-action\"\n icon=\"pi pi-trash\" pTooltip=\"B\u1ECF ch\u1ECDn m\u1EE5c n\u00E0y\" tooltipPosition=\"top\"\n (click)=\"handleUnPickEntity(rowData)\"></button>\n </div>\n <div *ngIf=\"control.rowButtonTemplate\" class=\"p-toolbar-group-center button-group\">\n <ng-container\n *ngTemplateOutlet=\"control.rowButtonTemplate; context: {rowData: rowData, rowIndex: index, control: control}\">\n </ng-container>\n </div>\n </ng-template>\n</crud-list>\n<tn-dialog #dialog *ngIf=\"showDetailForm\" styleClass=\"entity-picker-box-dialog no-padding\" [useDefaultScrollBar]=\"true\"\n [header]=\"control.title | translate\" [popupSize]=\"popupSize\" (onHide)=\"handleHide($event)\">\n <entity-picker-box #entityPickerBox [control]=\"control\" [parentSetting]=\"setting\" [advanceData]=\"advanceData\"\n (onRowSelect)=\"handleEntityPickerBoxRowSelect($event)\" [selectedValue]=\"selectedValue\"\n (onChanged)=\"handleChangeEntity($event)\" (onSelect)=\"handleSelectEntity($event)\"\n (onUnSelect)=\"handleUnSelectEntity($event)\" (onDone)=\"handleHide($event)\">\n </entity-picker-box>\n <ng-template #footer>\n <button type=\"button\" pButton class=\"p-button-text\" (click)=\"onClickSubmitButton($event, entityPickerBox)\"\n [label]=\"'Ho\u00E0n th\u00E0nh' | translate\" icon=\"pi pi-check\"></button>\n </ng-template>\n</tn-dialog>",
41508
+ template: "<crud-list #crudList [templates]=\"children\" [model]=\"model\" [setting]=\"setting\" [dataSource]=\"model.dataSource\"\n [hiddenDelete]=\"readOnly\" (onReload)=\"_triggerProcessData($event)\" (onAdd)=\"_add($event)\" (onEdit)=\"_edit($event)\"\n (onView)=\"_view($event)\" (onDelete)=\"_delete($event)\" (onDeleteMultiple)=\"_deleteMultiple($event)\"\n (onReloaded)=\"_unmarkLoading()\" class=\"--no-wrapper-padding\">\n <ng-template #toolbar let-crudList=\"crudList\">\n <button *ngIf=\"!readOnly\" type=\"button\" pButton icon=\"pi pi-external-link\" class=\"p-button-text\"\n [label]=\"control.title\" [disabled]=\"control.disabled\" (click)=\"selectEntity()\"></button>\n <ng-container *ngIf=\"required\">\n <span class=\"star-required\">*</span>\n </ng-container>\n <ng-container *ngIf=\"control.multiple && !readOnly && !setting.hiddenCheckbox\">\n <button type=\"button\" pButton class=\"p-button-warning p-button-text p-button-rounded link-or-action\"\n icon=\"pi pi-trash\" label=\"B\u1ECF m\u1EE5c \u0111\u00E3 ch\u1ECDn\" tooltipPosition=\"top\"\n [disabled]=\"model.selectedItems.length == 0\" (click)=\"handleUnMultiPickEntity()\"></button>\n </ng-container>\n </ng-template>\n <ng-template #function let-crudList=\"crudList\" let-rowData=\"rowData\" let-index=\"index\">\n <div *ngIf=\"!control.rowButtonTemplate && !readOnly\" class=\"p-toolbar-group-center button-group\">\n <ng-container *ngIf=\"control.rowButtonBeforeTemplate\" class=\"p-toolbar-group-center button-group\">\n <ng-container\n *ngTemplateOutlet=\"control.rowButtonBeforeTemplate; context: {rowData: rowData, rowIndex: index, control: control}\">\n </ng-container>\n </ng-container>\n <button type=\"button\" pButton class=\"p-button-warning p-button-text p-button-rounded link-or-action\"\n icon=\"pi pi-trash\" pTooltip=\"B\u1ECF ch\u1ECDn m\u1EE5c n\u00E0y\" tooltipPosition=\"top\"\n (click)=\"handleUnPickEntity(rowData)\"></button>\n </div>\n <div *ngIf=\"control.rowButtonTemplate\" class=\"p-toolbar-group-center button-group\">\n <ng-container\n *ngTemplateOutlet=\"control.rowButtonTemplate; context: {rowData: rowData, rowIndex: index, control: control}\">\n </ng-container>\n </div>\n </ng-template>\n</crud-list>\n<tn-dialog #dialog *ngIf=\"showDetailForm\" styleClass=\"entity-picker-box-dialog no-padding\" [useDefaultScrollBar]=\"true\"\n [header]=\"control.title | translate\" [popupSize]=\"popupSize\" (onHide)=\"handleHide($event)\">\n <entity-picker-box #entityPickerBox [control]=\"control\" [parentSetting]=\"setting\" [advanceData]=\"advanceData\"\n (onRowSelect)=\"handleEntityPickerBoxRowSelect($event)\" [selectedValue]=\"selectedValue\"\n (onChanged)=\"handleChangeEntity($event)\" (onSelect)=\"handleSelectEntity($event)\"\n (onUnSelect)=\"handleUnSelectEntity($event)\" (onDone)=\"handleHide($event)\">\n </entity-picker-box>\n <ng-template #footer>\n <button type=\"button\" pButton class=\"p-button-text\" (click)=\"onClickSubmitButton($event, entityPickerBox)\"\n [label]=\"'Ho\u00E0n th\u00E0nh' | translate\" icon=\"pi pi-check\"></button>\n </ng-template>\n</tn-dialog>",
41512
41509
  providers: [
41513
41510
  {
41514
41511
  provide: NG_VALUE_ACCESSOR,