tnx-shared 5.1.174 → 5.1.178

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 (51) hide show
  1. package/bundles/tnx-shared.umd.js +1639 -160
  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/base/tree-list-base.d.ts +125 -0
  6. package/classes/base/tree-list-base.d.ts.map +1 -0
  7. package/classes/public-function.d.ts +1 -1
  8. package/components/check-box-list/check-box-list.component.d.ts.map +1 -1
  9. package/components/crud/crud-form/crud-form.component.d.ts +4 -3
  10. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  11. package/components/crud/tree-table/tree-table.component.d.ts +71 -0
  12. package/components/crud/tree-table/tree-table.component.d.ts.map +1 -0
  13. package/components/crud/tree-table/tree-table.component.ngfactory.d.ts.map +1 -0
  14. package/components/crud/tree-table/tree-table.component.scss.shim.ngstyle.d.ts.map +1 -0
  15. package/components/tn-app-notification/tn-app-notification.component.d.ts +3 -3
  16. package/components/tn-app-notification/tn-app-notification.component.d.ts.map +1 -1
  17. package/configs/component-context.constant.d.ts +5 -0
  18. package/configs/component-context.constant.d.ts.map +1 -1
  19. package/directives/primeng/tn-table.directive.d.ts +9 -0
  20. package/directives/primeng/tn-table.directive.d.ts.map +1 -1
  21. package/esm2015/classes/base/tree-list-base.js +746 -0
  22. package/esm2015/components/chat/chat-box/chat-box.component.js +1 -1
  23. package/esm2015/components/chat/chat-send-message-box/chat-send-message-box.component.js +1 -1
  24. package/esm2015/components/check-box-list/check-box-list.component.js +60 -19
  25. package/esm2015/components/crud/crud-form/crud-form.component.js +6 -2
  26. package/esm2015/components/crud/tree-table/tree-table.component.js +377 -0
  27. package/esm2015/components/tn-app-notification/tn-app-notification.component.js +32 -22
  28. package/esm2015/configs/component-context.constant.js +6 -1
  29. package/esm2015/directives/primeng/tn-table.directive.js +44 -1
  30. package/esm2015/public-api.js +2 -1
  31. package/esm2015/services/base.service.js +11 -1
  32. package/esm2015/services/crud.service.js +1 -1
  33. package/esm2015/services/notification.service.js +5 -2
  34. package/esm2015/tnx-shared.js +119 -118
  35. package/esm2015/tnx-shared.module.js +5 -2
  36. package/fesm2015/tnx-shared.js +1243 -41
  37. package/fesm2015/tnx-shared.js.map +1 -1
  38. package/package.json +2 -2
  39. package/public-api.d.ts +1 -0
  40. package/public-api.d.ts.map +1 -1
  41. package/services/base.service.d.ts +2 -0
  42. package/services/base.service.d.ts.map +1 -1
  43. package/services/crud.service.d.ts.map +1 -1
  44. package/services/notification.service.d.ts +1 -0
  45. package/services/notification.service.d.ts.map +1 -1
  46. package/tnx-shared.d.ts +118 -117
  47. package/tnx-shared.d.ts.map +1 -1
  48. package/tnx-shared.metadata.json +1 -1
  49. package/tnx-shared.module.d.ts +3 -2
  50. package/tnx-shared.module.d.ts.map +1 -1
  51. package/tnx-shared.module.ngfactory.d.ts.map +1 -1
@@ -0,0 +1,377 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Component, ContentChildren, EventEmitter, Injector, Input, Output, QueryList, TemplateRef, ViewChild } from '@angular/core';
3
+ import { TreeTable } from 'tn-custom-primeng/treetable';
4
+ import { ComponentBase } from '../../../classes/base/component-base';
5
+ import { CrudListConfig, CrudListData, CrudListSetting, Operator } from '../../../classes/form-schema';
6
+ import { ComCtxConstants } from '../../../configs/component-context.constant';
7
+ import { GridInfo } from '../../../models/grid-info';
8
+ import { CrudService } from '../../../services/crud.service';
9
+ import { TnCustomScrollbarComponent } from '../../tn-custom-scrollbar/tn-custom-scrollbar.component';
10
+ export class TreeTableComponent extends ComponentBase {
11
+ constructor(injector, _crudService) {
12
+ super(injector);
13
+ this._crudService = _crudService;
14
+ this.model = new CrudListData();
15
+ this.setting = new CrudListSetting();
16
+ this.config = new CrudListConfig();
17
+ this._dataSource = [];
18
+ this.hiddenDelete = false;
19
+ this.hiddenEdit = false;
20
+ this.onReload = new EventEmitter();
21
+ this.onAdd = new EventEmitter();
22
+ this.onEdit = new EventEmitter();
23
+ this.onView = new EventEmitter();
24
+ this.onDelete = new EventEmitter();
25
+ this.template = {};
26
+ this.cachedTransforms = {};
27
+ }
28
+ set dataSource(value) {
29
+ let dataSource = [];
30
+ if (value) {
31
+ dataSource = value;
32
+ }
33
+ this.processDataSource(dataSource);
34
+ this._dataSource = dataSource;
35
+ }
36
+ get dataSource() {
37
+ return this._dataSource;
38
+ }
39
+ ngOnInit() {
40
+ this.getData();
41
+ }
42
+ getData() {
43
+ const infoGetData = this.getGridInfo();
44
+ this.onReload.emit(infoGetData);
45
+ }
46
+ processDataSource(dataSource) {
47
+ if (!dataSource)
48
+ return;
49
+ dataSource.forEach(itemSource => {
50
+ const source = itemSource.data;
51
+ if (source.id == undefined) {
52
+ source.id = this._commonService.guid();
53
+ }
54
+ source.objStyleClass = {};
55
+ if (!source.colSpan) {
56
+ source.colSpan = {};
57
+ }
58
+ if (!source.rowSpan) {
59
+ source.rowSpan = {};
60
+ }
61
+ if (!source.hidden) {
62
+ source.hidden = {};
63
+ }
64
+ if (source.isNew) {
65
+ source.objStyleClass.isNew = true;
66
+ }
67
+ if (source.isExpiring) {
68
+ source.objStyleClass.expiring = true;
69
+ }
70
+ if (source.class) {
71
+ source.class.split(' ').filter(p => p).forEach(cls => {
72
+ source.objStyleClass[cls] = true;
73
+ });
74
+ }
75
+ // this.setting.advanceData.fieldHasMaximumLength.forEach(_col => {
76
+ // const col = <ColumnSchemaBase>_col;
77
+ // const value = source[col.field];
78
+ // if (value && value.substring && value.length > col.maxLengthDisplay) {
79
+ // // sv: short value
80
+ // source[`${col.field}__sv`] = `${value.substring(0, col.maxLengthDisplay)}`;
81
+ // }
82
+ // });
83
+ // this.setting.advanceData.fieldHasMaximumWord.forEach(_col => {
84
+ // const col = <ColumnSchemaBase>_col;
85
+ // const valueShortWord = this.subWord(source[col.field], col.maxWordDisplay);
86
+ // if (valueShortWord) {
87
+ // // sv: short value
88
+ // source[`${col.field}__sv`] = `${valueShortWord}`;
89
+ // }
90
+ // });
91
+ this.processDataSource(itemSource.children);
92
+ });
93
+ }
94
+ subWord(value, wordCount) {
95
+ if (!value || !value.trim)
96
+ return value;
97
+ value = value.trim();
98
+ let index = -1, beforeChar = 'a';
99
+ for (let i = 0; i < value.length; i++) {
100
+ if (value[i] == '' && beforeChar != '') {
101
+ wordCount--;
102
+ }
103
+ beforeChar = value[i];
104
+ if (wordCount == 0) {
105
+ index = i;
106
+ break;
107
+ }
108
+ }
109
+ if (index > -1)
110
+ return value.substring(0, index);
111
+ return null;
112
+ }
113
+ toggleShowFull(rowData, field) {
114
+ rowData[field + '__showFull'] = !rowData[field + '__showFull'];
115
+ }
116
+ reload(filter_custom, page = 1) {
117
+ this.filter_custom = filter_custom;
118
+ this.setting.pageSetting.page = page;
119
+ this.getData();
120
+ }
121
+ adjustPositionLoadingMask() {
122
+ // if (this.interval) {
123
+ // clearInterval(this.interval);
124
+ // }
125
+ // if (!this.model.loading) {
126
+ // return;
127
+ // }
128
+ // this.interval = setInterval(f => {
129
+ // const element = this.table.containerViewChild.nativeElement.querySelector('.p-datatable-loading-overlay');
130
+ // if (element) {
131
+ // const parent = element.closest('p-table');
132
+ // if (parent) {
133
+ // const nodeScrollBarContent = parent.parentNode;
134
+ // if (!nodeScrollBarContent.classList.contains('ps-content')) {
135
+ // return;
136
+ // }
137
+ // nodeScrollBarContent.parentNode.prepend(element);
138
+ // }
139
+ // const firstTh = element.parentNode.querySelector('p-table thead tr:first-child > th');
140
+ // const firstThSize = firstTh.getBoundingClientRect();
141
+ // const loadingIcon = element.querySelector('.p-datatable-loading-icon');
142
+ // const fontSize = parseFloat(getComputedStyle(loadingIcon).fontSize);
143
+ // const top = (firstThSize.height - fontSize) / 2;
144
+ // const left = (firstThSize.width - fontSize) / 2;
145
+ // loadingIcon.style.marginTop = `${top}px`;
146
+ // loadingIcon.style.marginLeft = `${left}px`;
147
+ // }
148
+ // else {
149
+ // this.adjustPositionLoadingMask();
150
+ // }
151
+ // }, 20);
152
+ }
153
+ processBaseData() {
154
+ return __awaiter(this, void 0, void 0, function* () {
155
+ yield this.preProcessData(this.model.dataSource);
156
+ });
157
+ }
158
+ preProcessData(dataSource) {
159
+ return __awaiter(this, void 0, void 0, function* () {
160
+ const colHasPipe = this.setting.cols.filter(x => x.pipe);
161
+ for (const col of colHasPipe) {
162
+ for (const item of dataSource) {
163
+ this.transform(col.pipe, col.asyncPipe, item[col.field]).then(rs => {
164
+ item[`pipe__${col.field} `] = rs;
165
+ });
166
+ }
167
+ }
168
+ });
169
+ }
170
+ transform(pipe, asyncPipe, value) {
171
+ return __awaiter(this, void 0, void 0, function* () {
172
+ if (this.cachedTransforms[value]) {
173
+ return this.cachedTransforms[value];
174
+ }
175
+ if (asyncPipe) {
176
+ const val = yield pipe.transform(value);
177
+ this.cachedTransforms[value] = val;
178
+ return val;
179
+ }
180
+ else {
181
+ const val = pipe.transform(value);
182
+ this.cachedTransforms[value] = val;
183
+ return val;
184
+ }
185
+ });
186
+ }
187
+ getGridInfo() {
188
+ const gridInfo = new GridInfo({
189
+ pageInfo: {
190
+ page: this.setting.pageSetting.page,
191
+ pageSize: this.setting.pageSetting.pageSize
192
+ },
193
+ filters: this.getFilters(),
194
+ sorts: []
195
+ });
196
+ return gridInfo;
197
+ }
198
+ getFilters() {
199
+ const result = [];
200
+ if (this.keyword) {
201
+ result.push(this.newFilter('ten', Operator.contain, this.keyword));
202
+ }
203
+ if (this.filter_custom && this.filter_custom.length) {
204
+ result.push(...this.filter_custom);
205
+ }
206
+ return result;
207
+ }
208
+ getContextCell(rowData, rowIndex, col, $this) {
209
+ return {
210
+ crudList: $this,
211
+ rowData,
212
+ rowIndex,
213
+ col,
214
+ field: col.field
215
+ };
216
+ }
217
+ disableEdit(rowData) {
218
+ if (rowData.__disableEdit) {
219
+ return true;
220
+ }
221
+ if (this.hiddenEdit) {
222
+ return true;
223
+ }
224
+ if (rowData['metadataStatus'] && rowData['metadataStatus'] != '0') {
225
+ return true;
226
+ }
227
+ return false;
228
+ }
229
+ disableDelete(rowData) {
230
+ if (rowData.__disableDelete) {
231
+ return true;
232
+ }
233
+ if (this.hiddenDelete) {
234
+ return true;
235
+ }
236
+ if (rowData['metadataStatus'] && rowData['metadataStatus'] != '0') {
237
+ return true;
238
+ }
239
+ return false;
240
+ }
241
+ findTemplate(templateName) {
242
+ let item = this._commonService.findTemplateFromList(this.children, templateName);
243
+ if (!item && this.templates) {
244
+ item = this._commonService.findTemplateFromList(this.templates, templateName);
245
+ }
246
+ return item;
247
+ }
248
+ hasTemplate(templateName) {
249
+ if (this.template[templateName] === undefined) {
250
+ this.template[templateName] = this.findTemplate(templateName);
251
+ }
252
+ return this.template[templateName] != null;
253
+ }
254
+ getTemplate(templateName) {
255
+ if (this.template[templateName] === undefined) {
256
+ this.template[templateName] = this.findTemplate(templateName);
257
+ }
258
+ return this.template[templateName];
259
+ }
260
+ getComponentByType(controlType) {
261
+ // if (controlType == 'trangThaiV5') {
262
+ // return this.templateTrangThaiV5;
263
+ // }
264
+ // if (controlType == '__viewHistory') {
265
+ // return this.templateColViewHistory;
266
+ // }
267
+ return this.findTemplate(controlType);
268
+ }
269
+ handleAdd(evt) {
270
+ this.onAdd.emit(evt);
271
+ }
272
+ handleView(rowData) {
273
+ this.onView.emit(rowData);
274
+ }
275
+ handleEdit(rowData) {
276
+ this.onEdit.emit(rowData);
277
+ }
278
+ handleDelete(rowData) {
279
+ this.onDelete.emit(rowData);
280
+ }
281
+ onNext(event) {
282
+ this.setting.pageSetting.page = this.setting.pageSetting.page + 1;
283
+ this.getData();
284
+ this.scrollTop();
285
+ }
286
+ onPrev(event) {
287
+ if (this.setting.pageSetting.page > 1) {
288
+ this.setting.pageSetting.page = this.setting.pageSetting.page - 1;
289
+ }
290
+ this.getData();
291
+ this.scrollTop();
292
+ }
293
+ onOldest(event) {
294
+ this.setting.pageSetting.page = Math.ceil(this.model.total / this.setting.pageSetting.pageSize);
295
+ this.getData();
296
+ this.scrollTop();
297
+ }
298
+ onLatest(event) {
299
+ this.setting.pageSetting.page = 1;
300
+ this.getData();
301
+ this.scrollTop();
302
+ }
303
+ savePageSize() {
304
+ this.savePageSetting();
305
+ }
306
+ savePageSetting() {
307
+ let pathName = location.pathname;
308
+ if (this.setting.settingKey) {
309
+ pathName += '/' + this.setting.settingKey;
310
+ }
311
+ let pageSetting = [];
312
+ let checkExist = false;
313
+ const dataPageSetting = localStorage.getItem(ComCtxConstants.LOCALSTORAGE_KEY.PAGE_SETTING);
314
+ if (dataPageSetting) {
315
+ pageSetting = JSON.parse(dataPageSetting);
316
+ pageSetting.forEach(element => {
317
+ if (element.pathname === pathName) {
318
+ element.pageSize = this.setting.pageSetting.pageSize;
319
+ checkExist = true;
320
+ }
321
+ });
322
+ }
323
+ if (!checkExist) {
324
+ pageSetting.push({ pathname: pathName, pageSize: this.setting.pageSetting.pageSize });
325
+ }
326
+ localStorage.setItem(ComCtxConstants.LOCALSTORAGE_KEY.PAGE_SETTING, JSON.stringify(pageSetting));
327
+ }
328
+ scrollTop() {
329
+ setTimeout(() => {
330
+ if (this.scrollbar) {
331
+ this.scrollbar.scrollToTop(0, 0);
332
+ }
333
+ });
334
+ }
335
+ scrollToBottom() {
336
+ setTimeout(() => {
337
+ if (this.scrollbar) {
338
+ this.scrollbar.scrollToBottom(0, 0);
339
+ }
340
+ });
341
+ }
342
+ handleDanhMaPC(evt) {
343
+ this.setting.baseService.updateMaPhanCapBase()
344
+ .then(res => this.handleResponse(res, 'Đánh lại mã phân cấp thành công', f => {
345
+ this.reload();
346
+ }));
347
+ }
348
+ }
349
+ TreeTableComponent.decorators = [
350
+ { type: Component, args: [{
351
+ selector: 'tn-tree-table',
352
+ template: "<div class=\"custom-card card card-w-title tn-g-page-layout-1\">\r\n <div class=\"ui-helper-clearfix tn-g-page-layout-1__header-area\">\r\n <div class=\"p-grid ui-fluid custom-p-col page-title-area\">\r\n <div class=\"main-title p-col-8\">\r\n <h1>{{setting.title}}</h1>\r\n </div>\r\n <div class=\"p-col-4\">\r\n <paging-next-back-only [model]=\"model\" [setting]=\"setting\" (onOldest)=\"onOldest($event)\"\r\n (onNext)=\"onNext($event)\" (onPrev)=\"onPrev($event)\" (onLatest)=\"onLatest($event)\"\r\n (onChangeLimitPage)=\"savePageSize()\">\r\n </paging-next-back-only>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"p-grid crudListToolbar tn-g-page-layout-1__toolbar-area\">\r\n <div class=\"p-col-8 button-group function-topbar\">\r\n <button pButton pRipple type=\"button\" label=\"Th\u00EAm m\u1EDBi\" icon=\"pi pi-plus\" class=\"p-button-text\"\r\n (click)=\"handleAdd($event)\"></button>\r\n <button pButton pRipple type=\"button\" label=\"\u0110\u00E1nh l\u1EA1i m\u00E3 ph\u00E2n c\u1EA5p\" icon=\"pi pi-plus\" class=\"p-button-text\"\r\n (click)=\"handleDanhMaPC($event)\"></button>\r\n </div>\r\n <div class=\"p-col-4 p-inputgroup\">\r\n <input [placeholder]=\"'T\u00ECm ki\u1EBFm'\" [(ngModel)]=\"keyword\" pInputText type=\"text\" (change)=\"getData()\">\r\n <button pButton type=\"button\" class=\"btn-info btn-search\" label=\"T\u00ECm ki\u1EBFm\" (click)=\"getData()\"></button>\r\n </div>\r\n </div>\r\n <div class=\"tn-g-page-layout-1__table-area\">\r\n <tn-custom-scrollbar [showScrollHorizontal]=\"true\" class=\"--has-border\">\r\n <p-treeTable #treetable [value]=\"dataSource\" [columns]=\"setting.cols\" styleClass=\"treeOrganization\">\r\n <ng-template let-columns pTemplate=\"header\">\r\n <tr>\r\n <th style=\"width: 70px\" class=\"chkbox\">\r\n <button type=\"button\" pButton pRipple icon=\"pi pi-refresh\"\r\n class=\"p-button-rounded p-button-text btnReload\" pTooltip=\"L\u00E0m m\u1EDBi d\u1EEF li\u1EC7u\"\r\n tooltipPosition=\"top\" [disabled]=\"model.loading\" (click)=\"getData()\"></button>\r\n </th>\r\n <th *ngFor=\"let col of columns\" [ttSortableColumn]=\"col.field\" [style.width]=\"col.width\"\r\n [style.textAlign]=\"col.textAlign\" [className]=\"col.class\" [pTooltip]=\"col.fullLabel\"\r\n tooltipStyleClass=\"unset-width\" style=\"text-align: center;\">\r\n {{col.label}}\r\n <p-treeTableSortIcon [field]=\"col.field\"></p-treeTableSortIcon>\r\n </th>\r\n <th style=\"text-align: center; width: 8em\">\r\n Ch\u1EE9c n\u0103ng\r\n </th>\r\n </tr>\r\n </ng-template>\r\n <ng-template let-rowNode let-rowData=\"rowData\" let-index=\"index\" let-columns=\"columns\" pTemplate=\"body\">\r\n <tr [ttRow]=\"rowNode\">\r\n <td class=\"chkbox\"></td>\r\n <ng-container *ngFor=\"let col of columns; let i = index\">\r\n <ng-container\r\n *ngTemplateOutlet=\"contentTd; context: {$implicit: rowData, rowNode: rowNode, col: col, index: index, i: i}\">\r\n </ng-container>\r\n </ng-container>\r\n <td style=\"text-align: center; width: 8em;\">\r\n <div *ngIf=\"hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutlet]=\"getTemplate('function')\"\r\n [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!hasTemplate('function')\" class=\"p-toolbar-group-center button-group\">\r\n <ng-container [ngTemplateOutletContext]=\"{rowData: rowData, rowIndex: index}\"\r\n [ngTemplateOutlet]=\"getTemplate('buttonBefore')\"></ng-container>\r\n <button *ngIf=\"!rowData.hiddenEdit\" type=\"button\" pButton pRipple\r\n pTooltip=\"{{'FORM.EDIT' | translate}}\" tooltipPosition=\"top\"\r\n [disabled]=\"disableEdit(rowData)\"\r\n class=\"p-button-rounded p-button-text p-button-info link-or-action\"\r\n icon=\"pi pi-pencil\" (click)=\"handleEdit(rowData)\"></button>\r\n <button *ngIf=\"!rowData.hiddenDelete\" type=\"button\" pButton pRipple\r\n [disabled]=\"disableDelete(rowData)\" pTooltip=\"{{'FORM.DELETE' | translate}}\"\r\n tooltipPosition=\"top\"\r\n class=\"p-button-rounded p-button-text p-button-danger link-or-action\"\r\n icon=\"pi pi-trash\" (click)=\"handleDelete(rowData)\"></button>\r\n <!-- <button *ngIf=\"this.menuButtons\" type=\"button\" pButton icon=\"pi pi-ellipsis-v\"\r\n class=\"link-or-action p-button-text p-button-info p-button-rounded\"\r\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\r\n (click)=\"showContextMenu($event, rowData)\"></button> -->\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-treeTable>\r\n <div class=\"row-bottom-sticky\"></div>\r\n </tn-custom-scrollbar>\r\n </div>\r\n</div>\r\n\r\n<ng-template #contentTd let-rowData let-rowNode=\"rowNode\" let-col=\"col\" let-index=\"index\" let-i=\"i\">\r\n <td *ngIf=\"col && col.visible && col.field != 'function' && (!rowData.hidden || !rowData.hidden[col.field])\"\r\n [attr.colSpan]=\"rowData.colSpan && rowData.colSpan[col.field]\"\r\n [attr.rowSpan]=\"rowData.rowSpan && rowData.rowSpan[col.field]\" [ngStyle]=\"col.extendData.style\"\r\n [class]=\"col.cellClass\" [class.first-td]=\"i == 0\">\r\n <tn-treeTableToggler *ngIf=\"i == 0\" [rowNode]=\"rowNode\"></tn-treeTableToggler>\r\n <span *ngIf=\"col.pipe\">\r\n <!-- <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span> -->\r\n {{rowData['pipe__' + col.field]}}\r\n </span>\r\n <span *ngIf=\"!col.pipe\">\r\n <!-- <span class=\"p-column-title\" [pTooltip]=\"col.fullLabel\" [escape]=\"false\"\r\n tooltipPosition=\"top\">{{col.label}}</span> -->\r\n <span *ngIf=\"setting.showEditLink && col.showEditLink\" [pTooltip]=\"config.tooltipView\" tooltipPosition=\"top\"\r\n class=\"link-or-action\">\r\n <a href=\"javascript:;\" (click)=\"handleView(rowData)\" [pTooltip]=\"config.tooltipView\"\r\n tooltipPosition=\"top\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, this)\">\r\n </ng-container>\r\n </a>\r\n </span>\r\n <span *ngIf=\"!setting.showEditLink || !col.showEditLink\">\r\n <ng-container [ngTemplateOutlet]=\"contentCell\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, index, col, this)\">\r\n </ng-container>\r\n </span>\r\n </span>\r\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\r\n </td>\r\n</ng-template>\r\n<ng-template #contentCell let-col=\"col\" let-rowData=\"rowData\" let-rowIndex=\"rowIndex\" let-field=\"field\"\r\n let-expanded=\"expanded\">\r\n <ng-container *ngIf=\"col.template\">\r\n <ng-container [ngTemplateOutlet]=\"col.template\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, this)\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!col.template\">\r\n <ng-container [ngSwitch]=\"col.dataType\">\r\n <span *ngSwitchCase=\"'color'\" style=\"display:block;text-align:center;\">\r\n <div pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" [ngStyle]=\"{'background-color':rowData[field]}\"\r\n style=\"width:30px;height:30px;margin:0 auto;\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'icon'\" style=\"display:block;text-align:center;\">\r\n <i pTooltip=\"{{rowData[field]}}\" tooltipPosition=\"top\" style=\"text-align: center;\"\r\n [ngClass]=\"rowData[field]\"></i>\r\n </span>\r\n <span *ngSwitchCase=\"'date'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy'}}\" tooltipPosition=\"top\">\r\n {{_crudService.renderDate(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'datetime'\" pTooltip=\"{{rowData[field] | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"top\">\r\n {{_crudService.renderDateTime(rowData[field], col.format)}}\r\n </span>\r\n <span *ngSwitchCase=\"'user'\" class=\"user\">\r\n {{rowData[field] | userFormat | async}}\r\n </span>\r\n <div *ngSwitchCase=\"'users'\" [innerHTML]=\"rowData[field] | usersFormat | async\">\r\n </div>\r\n <span *ngSwitchCase=\"'int'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'decimal'\">\r\n {{rowData[field]}}\r\n </span>\r\n <span *ngSwitchCase=\"'boolean'\">\r\n <p-checkbox class=\"boolean-data-type\" [(ngModel)]=\"rowData[field]\" binary=\"true\"\r\n [disabled]=\"col.disableCheckBox\">\r\n </p-checkbox>\r\n </span>\r\n <span *ngSwitchCase=\"'html'\">\r\n <div *ngIf=\"rowData[field]==null?'':rowData[field]\" [innerHTML]=\"rowData[field] | safeHtml\"></div>\r\n </span>\r\n <span *ngSwitchCase=\"'metadataStatus'\">\r\n <span *ngIf=\"rowData['rejectReason']\" class=\"label-danger\" [pTooltip]=\"rowData['rejectReason']\"\r\n tooltipStyleClass=\"unset-width\" [escape]=\"false\" tooltipPosition=\"top\">T\u1EEB ch\u1ED1i</span>\r\n <span *ngIf=\"rowData[field] == '0' && !rowData['rejectReason']\" class=\"label-secondary\">Ch\u01B0a\r\n duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '1' && !rowData['rejectReason']\" class=\"label-warning\">Ch\u1EDD duy\u1EC7t</span>\r\n <span *ngIf=\"rowData[field] == '2'\" class=\"label-primary\">\u0110\u00E3 duy\u1EC7t</span>\r\n </span>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"null\">\r\n <ng-container *ngTemplateOutlet=\"contentCellString; context: {$implicit: rowData, field: col.field}\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchDefault>\r\n <ng-container [ngTemplateOutlet]=\"getComponentByType(col.dataType)\"\r\n [ngTemplateOutletContext]=\"getContextCell(rowData, rowIndex, col, this)\">\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n<ng-template #contentCellString let-rowData let-field=\"field\">\r\n <span>\r\n <!-- __sv: Short Value -->\r\n <ng-container *ngIf=\"rowData[field + '__sv']\">\r\n <ng-container *ngIf=\"!rowData[field + '__showFull']\">\r\n {{rowData[field + '__sv']}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\" pTooltip=\"B\u1EA5m \u0111\u1EC3 xem th\u00EAm\"\r\n tooltipPosition=\"top\">[...]</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowData[field + '__showFull']\">\r\n {{rowData[field]}}\r\n <span class=\"toggle-showfull\" (click)=\"toggleShowFull(rowData, field)\">Thu g\u1ECDn</span>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowData[field + '__sv']\">\r\n {{rowData[field]}}\r\n </ng-container>\r\n </span>\r\n</ng-template>\r\n<ng-template #containerSticky>\r\n <span class=\"fix-sticky top\"></span>\r\n <span class=\"fix-sticky right\"></span>\r\n <!-- <span class=\"fix-sticky bottom\"></span> -->\r\n <span class=\"fix-sticky left\"></span>\r\n</ng-template>",
353
+ styles: [""]
354
+ },] }
355
+ ];
356
+ TreeTableComponent.ctorParameters = () => [
357
+ { type: Injector },
358
+ { type: CrudService }
359
+ ];
360
+ TreeTableComponent.propDecorators = {
361
+ treeTable: [{ type: ViewChild, args: ['treetable',] }],
362
+ scrollbar: [{ type: ViewChild, args: ['scrollbar', { static: true },] }],
363
+ children: [{ type: ContentChildren, args: [TemplateRef,] }],
364
+ templates: [{ type: Input }],
365
+ model: [{ type: Input }],
366
+ setting: [{ type: Input }],
367
+ config: [{ type: Input }],
368
+ dataSource: [{ type: Input }],
369
+ hiddenDelete: [{ type: Input }],
370
+ hiddenEdit: [{ type: Input }],
371
+ onReload: [{ type: Output }],
372
+ onAdd: [{ type: Output }],
373
+ onEdit: [{ type: Output }],
374
+ onView: [{ type: Output }],
375
+ onDelete: [{ type: Output }]
376
+ };
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG54LXNoYXJlZC9zcmMvbGliLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9jcnVkL3RyZWUtdGFibGUvdHJlZS10YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBaUIsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUosT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQzlFLE9BQU8sRUFBVSxRQUFRLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0seURBQXlELENBQUM7QUFPckcsTUFBTSxPQUFPLGtCQUFtQixTQUFRLGFBQWE7SUErQmpELFlBQ0ksUUFBa0IsRUFDWCxZQUF5QjtRQUVoQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFGVCxpQkFBWSxHQUFaLFlBQVksQ0FBYTtRQTVCM0IsVUFBSyxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3pDLFlBQU8sR0FBb0IsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNqRCxXQUFNLEdBQW1CLElBQUksY0FBYyxFQUFFLENBQUM7UUFDdkQsZ0JBQVcsR0FBVSxFQUFFLENB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OzthQUU3Qzs7O1lBYmtELFFBQVE7WUFNbEQsV0FBVzs7O3dCQVNmLFNBQVMsU0FBQyxXQUFXO3dCQUNyQixTQUFTLFNBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTt1QkFDdkMsZUFBZSxTQUFDLFdBQVc7d0JBQzNCLEtBQUs7b0JBQ0wsS0FBSztzQkFDTCxLQUFLO3FCQUNMLEtBQUs7eUJBRUwsS0FBSzsyQkFXTCxLQUFLO3lCQUNMLEtBQUs7dUJBQ0wsTUFBTTtvQkFDTixNQUFNO3FCQUNOLE1BQU07cUJBQ04sTUFBTTt1QkFDTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUGlwZVRyYW5zZm9ybSwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRyZWVUYWJsZSB9IGZyb20gJ3RuLWN1c3RvbS1wcmltZW5nL3RyZWV0YWJsZSc7XHJcbmltcG9ydCB7IENvbXBvbmVudEJhc2UgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2Jhc2UvY29tcG9uZW50LWJhc2UnO1xyXG5pbXBvcnQgeyBDcnVkTGlzdENvbmZpZywgQ3J1ZExpc3REYXRhLCBDcnVkTGlzdFNldHRpbmcsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XHJcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4uLy4uLy4uL2NvbmZpZ3MvY29tcG9uZW50LWNvbnRleHQuY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBGaWx0ZXIsIEdyaWRJbmZvIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dyaWQtaW5mbyc7XHJcbmltcG9ydCB7IENydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3J1ZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG5DdXN0b21TY3JvbGxiYXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi90bi1jdXN0b20tc2Nyb2xsYmFyL3RuLWN1c3RvbS1zY3JvbGxiYXIuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd0bi10cmVlLXRhYmxlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi90cmVlLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3RyZWUtdGFibGUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHJlZVRhYmxlQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBAVmlld0NoaWxkKCd0cmVldGFibGUnKSB0cmVlVGFibGU6IFRyZWVUYWJsZTtcclxuICAgIEBWaWV3Q2hpbGQoJ3Njcm9sbGJhcicsIHsgc3RhdGljOiB0cnVlIH0pIHNjcm9sbGJhcjogVG5DdXN0b21TY3JvbGxiYXJDb21wb25lbnQ7XHJcbiAgICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSBjaGlsZHJlbjogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xyXG4gICAgQElucHV0KCkgdGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcbiAgICBASW5wdXQoKSBtb2RlbDogQ3J1ZExpc3REYXRhID0gbmV3IENydWRMaXN0RGF0YSgpO1xyXG4gICAgQElucHV0KCkgc2V0dGluZzogQ3J1ZExpc3RTZXR0aW5nID0gbmV3IENydWRMaXN0U2V0dGluZygpO1xyXG4gICAgQElucHV0KCkgY29uZmlnOiBDcnVkTGlzdENvbmZpZyA9IG5ldyBDcnVkTGlzdENvbmZpZygpO1xyXG4gICAgX2RhdGFTb3VyY2U6IGFueVtdID0gW107XHJcbiAgICBASW5wdXQoKSBzZXQgZGF0YVNvdXJjZSh2YWx1ZTogYW55W10pIHtcclxuICAgICAgICBsZXQgZGF0YVNvdXJjZSA9IFtdO1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBkYXRhU291cmNlID0gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJvY2Vzc0RhdGFTb3VyY2UoZGF0YVNvdXJjZSk7XHJcbiAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7XHJcbiAgICB9XHJcbiAgICBnZXQgZGF0YVNvdXJjZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZTtcclxuICAgIH1cclxuICAgIEBJbnB1dCgpIGhpZGRlbkRlbGV0ZSA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgaGlkZGVuRWRpdCA9IGZhbHNlO1xyXG4gICAgQE91dHB1dCgpIG9uUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25BZGQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25FZGl0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uVmlldzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkRlbGV0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIHRlbXBsYXRlOiBhbnkgPSB7fTtcclxuICAgIHByaXZhdGUgZmlsdGVyX2N1c3RvbTogRmlsdGVyW107XHJcbiAgICBjYWNoZWRUcmFuc2Zvcm1zID0ge307XHJcbiAgICBrZXl3b3JkOiBzdHJpbmc7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHVibGljIF9jcnVkU2VydmljZTogQ3J1ZFNlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0RGF0YSgpIHtcclxuICAgICAgICBjb25zdCBpbmZvR2V0RGF0YSA9IHRoaXMuZ2V0R3JpZEluZm8oKTtcclxuICAgICAgICB0aGlzLm9uUmVsb2FkLmVtaXQoaW5mb0dldERhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNzRGF0YVNvdXJjZShkYXRhU291cmNlKSB7XHJcbiAgICAgICAgaWYgKCFkYXRhU291cmNlKSByZXR1cm47XHJcbiAgICAgICAgZGF0YVNvdXJjZS5mb3JFYWNoKGl0ZW1Tb3VyY2UgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBpdGVtU291cmNlLmRhdGE7XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2UuaWQgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2UuaWQgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzb3VyY2Uub2JqU3R5bGVDbGFzcyA9IHt9O1xyXG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5jb2xTcGFuKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2UuY29sU3BhbiA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghc291cmNlLnJvd1NwYW4pIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5yb3dTcGFuID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFzb3VyY2UuaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBzb3VyY2UuaGlkZGVuID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHNvdXJjZS5pc05ldykge1xyXG4gICAgICAgICAgICAgICAgc291cmNlLm9ialN0eWxlQ2xhc3MuaXNOZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2UuaXNFeHBpcmluZykge1xyXG4gICAgICAgICAgICAgICAgc291cmNlLm9ialN0eWxlQ2xhc3MuZXhwaXJpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2UuY2xhc3MpIHtcclxuICAgICAgICAgICAgICAgIHNvdXJjZS5jbGFzcy5zcGxpdCgnICcpLmZpbHRlcihwID0+IHApLmZvckVhY2goY2xzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2Uub2JqU3R5bGVDbGFzc1tjbHNdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtTGVuZ3RoLmZvckVhY2goX2NvbCA9PiB7XHJcbiAgICAgICAgICAgIC8vICAgICBjb25zdCBjb2wgPSA8Q29sdW1uU2NoZW1hQmFzZT5fY29sO1xyXG4gICAgICAgICAgICAvLyAgICAgY29uc3QgdmFsdWUgPSBzb3VyY2VbY29sLmZpZWxkXTtcclxuICAgICAgICAgICAgLy8gICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5zdWJzdHJpbmcgJiYgdmFsdWUubGVuZ3RoID4gY29sLm1heExlbmd0aERpc3BsYXkpIHtcclxuICAgICAgICAgICAgLy8gICAgICAgICAvLyBzdjogc2hvcnQgdmFsdWVcclxuICAgICAgICAgICAgLy8gICAgICAgICBzb3VyY2VbYCR7Y29sLmZpZWxkfV9fc3ZgXSA9IGAke3ZhbHVlLnN1YnN0cmluZygwLCBjb2wubWF4TGVuZ3RoRGlzcGxheSl9YDtcclxuICAgICAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgICAgICAvLyB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGRIYXNNYXhpbXVtV29yZC5mb3JFYWNoKF9jb2wgPT4ge1xyXG4gICAgICAgICAgICAvLyAgICAgY29uc3QgY29sID0gPENvbHVtblNjaGVtYUJhc2U+X2NvbDtcclxuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHZhbHVlU2hvcnRXb3JkID0gdGhpcy5zdWJXb3JkKHNvdXJjZVtjb2wuZmllbGRdLCBjb2wubWF4V29yZERpc3BsYXkpO1xyXG4gICAgICAgICAgICAvLyAgICAgaWYgKHZhbHVlU2hvcnRXb3JkKSB7XHJcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gc3Y6IHNob3J0IHZhbHVlXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgc291cmNlW2Ake2NvbC5maWVsZH1fX3N2YF0gPSBgJHt2YWx1ZVNob3J0V29yZH1gO1xyXG4gICAgICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgICAgICAvLyB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RhdGFTb3VyY2UoaXRlbVNvdXJjZS5jaGlsZHJlbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN1YldvcmQodmFsdWU6IHN0cmluZywgd29yZENvdW50OiBudW1iZXIpIHtcclxuICAgICAgICBpZiAoIXZhbHVlIHx8ICF2YWx1ZS50cmltKSByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gLTEsIGJlZm9yZUNoYXIgPSAnYSc7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodmFsdWVbaV0gPT0gJycgJiYgYmVmb3JlQ2hhciAhPSAnJykge1xyXG4gICAgICAgICAgICAgICAgd29yZENvdW50LS07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYmVmb3JlQ2hhciA9IHZhbHVlW2ldO1xyXG4gICAgICAgICAgICBpZiAod29yZENvdW50ID09IDApIHtcclxuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4KTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGVTaG93RnVsbChyb3dEYXRhLCBmaWVsZCkge1xyXG4gICAgICAgIHJvd0RhdGFbZmllbGQgKyAnX19zaG93RnVsbCddID0gIXJvd0RhdGFbZmllbGQgKyAnX19zaG93RnVsbCddO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbG9hZChmaWx0ZXJfY3VzdG9tPzogRmlsdGVyW10sIHBhZ2UgPSAxKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJfY3VzdG9tID0gZmlsdGVyX2N1c3RvbTtcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IHBhZ2U7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRqdXN0UG9zaXRpb25Mb2FkaW5nTWFzaygpIHtcclxuICAgICAgICAvLyBpZiAodGhpcy5pbnRlcnZhbCkge1xyXG4gICAgICAgIC8vICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBpZiAoIXRoaXMubW9kZWwubG9hZGluZykge1xyXG4gICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmID0+IHtcclxuICAgICAgICAvLyAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMudGFibGUuY29udGFpbmVyVmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGF0YXRhYmxlLWxvYWRpbmctb3ZlcmxheScpO1xyXG4gICAgICAgIC8vICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5jbG9zZXN0KCdwLXRhYmxlJyk7XHJcbiAgICAgICAgLy8gICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgY29uc3Qgbm9kZVNjcm9sbEJhckNvbnRlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTtcclxuICAgICAgICAvLyAgICAgICAgICAgICBpZiAoIW5vZGVTY3JvbGxCYXJDb250ZW50LmNsYXNzTGlzdC5jb250YWlucygncHMtY29udGVudCcpKSB7XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgICAgICAgbm9kZVNjcm9sbEJhckNvbnRlbnQucGFyZW50Tm9kZS5wcmVwZW5kKGVsZW1lbnQpO1xyXG4gICAgICAgIC8vICAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgZmlyc3RUaCA9IGVsZW1lbnQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKCdwLXRhYmxlIHRoZWFkIHRyOmZpcnN0LWNoaWxkID4gdGgnKTtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IGZpcnN0VGhTaXplID0gZmlyc3RUaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAvLyAgICAgICAgIGNvbnN0IGxvYWRpbmdJY29uID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucC1kYXRhdGFibGUtbG9hZGluZy1pY29uJyk7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBmb250U2l6ZSA9IHBhcnNlRmxvYXQoZ2V0Q29tcHV0ZWRTdHlsZShsb2FkaW5nSWNvbikuZm9udFNpemUpO1xyXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgdG9wID0gKGZpcnN0VGhTaXplLmhlaWdodCAtIGZvbnRTaXplKSAvIDI7XHJcbiAgICAgICAgLy8gICAgICAgICBjb25zdCBsZWZ0ID0gKGZpcnN0VGhTaXplLndpZHRoIC0gZm9udFNpemUpIC8gMjtcclxuICAgICAgICAvLyAgICAgICAgIGxvYWRpbmdJY29uLnN0eWxlLm1hcmdpblRvcCA9IGAke3RvcH1weGA7XHJcbiAgICAgICAgLy8gICAgICAgICBsb2FkaW5nSWNvbi5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7bGVmdH1weGA7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmFkanVzdFBvc2l0aW9uTG9hZGluZ01hc2soKTtcclxuICAgICAgICAvLyAgICAgfVxyXG4gICAgICAgIC8vIH0sIDIwKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwcm9jZXNzQmFzZURhdGEoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5wcmVQcm9jZXNzRGF0YSh0aGlzLm1vZGVsLmRhdGFTb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgcHJlUHJvY2Vzc0RhdGEoZGF0YVNvdXJjZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgY29sSGFzUGlwZSA9IHRoaXMuc2V0dGluZy5jb2xzLmZpbHRlcih4ID0+IHgucGlwZSk7XHJcbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgY29sSGFzUGlwZSkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YVNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm0oPFBpcGVUcmFuc2Zvcm0+Y29sLnBpcGUsIGNvbC5hc3luY1BpcGUsIGl0ZW1bY29sLmZpZWxkXSkudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbVtgcGlwZV9fJHtjb2wuZmllbGR9IGBdID0gcnM7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHRyYW5zZm9ybShwaXBlOiBQaXBlVHJhbnNmb3JtLCBhc3luY1BpcGU6IGJvb2xlYW4sIHZhbHVlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICBpZiAodGhpcy5jYWNoZWRUcmFuc2Zvcm1zW3ZhbHVlXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRUcmFuc2Zvcm1zW3ZhbHVlXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhc3luY1BpcGUpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsID0gYXdhaXQgcGlwZS50cmFuc2Zvcm0odmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlZFRyYW5zZm9ybXNbdmFsdWVdID0gdmFsO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsID0gcGlwZS50cmFuc2Zvcm0odmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLmNhY2hlZFRyYW5zZm9ybXNbdmFsdWVdID0gdmFsO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRHcmlkSW5mbygpIHtcclxuICAgICAgICBjb25zdCBncmlkSW5mbyA9IG5ldyBHcmlkSW5mbyh7XHJcbiAgICAgICAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSxcclxuICAgICAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZVNpemVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZmlsdGVyczogdGhpcy5nZXRGaWx0ZXJzKCksXHJcbiAgICAgICAgICAgIHNvcnRzOiBbXVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZ3JpZEluZm87XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRGaWx0ZXJzKCk6IEZpbHRlcltdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5rZXl3b3JkKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMubmV3RmlsdGVyKCd0ZW4nLCBPcGVyYXRvci5jb250YWluLCB0aGlzLmtleXdvcmQpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyX2N1c3RvbSAmJiB0aGlzLmZpbHRlcl9jdXN0b20ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuZmlsdGVyX2N1c3RvbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldENvbnRleHRDZWxsKHJvd0RhdGEsIHJvd0luZGV4LCBjb2wsICR0aGlzKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgY3J1ZExpc3Q6ICR0aGlzLFxyXG4gICAgICAgICAgICByb3dEYXRhLFxyXG4gICAgICAgICAgICByb3dJbmRleCxcclxuICAgICAgICAgICAgY29sLFxyXG4gICAgICAgICAgICBmaWVsZDogY29sLmZpZWxkXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZUVkaXQocm93RGF0YSkge1xyXG4gICAgICAgIGlmIChyb3dEYXRhLl9fZGlzYWJsZUVkaXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmhpZGRlbkVkaXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChyb3dEYXRhWydtZXRhZGF0YVN0YXR1cyddICYmIHJvd0RhdGFbJ21ldGFkYXRhU3RhdHVzJ10gIT0gJzAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2FibGVEZWxldGUocm93RGF0YSkge1xyXG4gICAgICAgIGlmIChyb3dEYXRhLl9fZGlzYWJsZURlbGV0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuRGVsZXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocm93RGF0YVsnbWV0YWRhdGFTdGF0dXMnXSAmJiByb3dEYXRhWydtZXRhZGF0YVN0YXR1cyddICE9ICcwJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmaW5kVGVtcGxhdGUodGVtcGxhdGVOYW1lKSB7XHJcbiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLl9jb21tb25TZXJ2aWNlLmZpbmRUZW1wbGF0ZUZyb21MaXN0KHRoaXMuY2hpbGRyZW4sIHRlbXBsYXRlTmFtZSk7XHJcbiAgICAgICAgaWYgKCFpdGVtICYmIHRoaXMudGVtcGxhdGVzKSB7XHJcbiAgICAgICAgICAgIGl0ZW0gPSB0aGlzLl9jb21tb25TZXJ2aWNlLmZpbmRUZW1wbGF0ZUZyb21MaXN0KHRoaXMudGVtcGxhdGVzLCB0ZW1wbGF0ZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFzVGVtcGxhdGUodGVtcGxhdGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZVt0ZW1wbGF0ZU5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVt0ZW1wbGF0ZU5hbWVdID0gdGhpcy5maW5kVGVtcGxhdGUodGVtcGxhdGVOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVbdGVtcGxhdGVOYW1lXSAhPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLnRlbXBsYXRlW3RlbXBsYXRlTmFtZV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlW3RlbXBsYXRlTmFtZV0gPSB0aGlzLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVt0ZW1wbGF0ZU5hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRCeVR5cGUoY29udHJvbFR5cGU6IHN0cmluZykge1xyXG4gICAgICAgIC8vIGlmIChjb250cm9sVHlwZSA9PSAndHJhbmdUaGFpVjUnKSB7XHJcbiAgICAgICAgLy8gICAgIHJldHVybiB0aGlzLnRlbXBsYXRlVHJhbmdUaGFpVjU7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGlmIChjb250cm9sVHlwZSA9PSAnX192aWV3SGlzdG9yeScpIHtcclxuICAgICAgICAvLyAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVDb2xWaWV3SGlzdG9yeTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFRlbXBsYXRlKGNvbnRyb2xUeXBlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlQWRkKGV2dCkge1xyXG4gICAgICAgIHRoaXMub25BZGQuZW1pdChldnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVWaWV3KHJvd0RhdGE6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25WaWV3LmVtaXQocm93RGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUVkaXQocm93RGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5vbkVkaXQuZW1pdChyb3dEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlRGVsZXRlKHJvd0RhdGE6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25EZWxldGUuZW1pdChyb3dEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25OZXh0KGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2UgPSB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSArIDE7XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25QcmV2KGV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlID4gMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlIC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXREYXRhKCk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxUb3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25PbGRlc3QoZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcucGFnZVNldHRpbmcucGFnZSA9IE1hdGguY2VpbCh0aGlzLm1vZGVsLnRvdGFsIC8gdGhpcy5zZXR0aW5nLnBhZ2VTZXR0aW5nLnBhZ2VTaXplKTtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkxhdGVzdChldmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlID0gMTtcclxuICAgICAgICB0aGlzLmdldERhdGEoKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzYXZlUGFnZVNpemUoKSB7XHJcbiAgICAgICAgdGhpcy5zYXZlUGFnZVNldHRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNhdmVQYWdlU2V0dGluZygpIHtcclxuICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLnNldHRpbmdLZXkpIHtcclxuICAgICAgICAgICAgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5zZXR0aW5nLnNldHRpbmdLZXk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwYWdlU2V0dGluZyA9IFtdO1xyXG4gICAgICAgIGxldCBjaGVja0V4aXN0ID0gZmFsc2U7XHJcbiAgICAgICAgY29uc3QgZGF0YVBhZ2VTZXR0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQ29tQ3R4Q29uc3RhbnRzLkxPQ0FMU1RPUkFHRV9LRVkuUEFHRV9TRVRUSU5HKTtcclxuICAgICAgICBpZiAoZGF0YVBhZ2VTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIHBhZ2VTZXR0aW5nID0gSlNPTi5wYXJzZShkYXRhUGFnZVNldHRpbmcpO1xyXG4gICAgICAgICAgICBwYWdlU2V0dGluZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wYWdlU2l6ZSA9IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0V4aXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWNoZWNrRXhpc3QpIHtcclxuICAgICAgICAgICAgcGFnZVNldHRpbmcucHVzaCh7IHBhdGhuYW1lOiBwYXRoTmFtZSwgcGFnZVNpemU6IHRoaXMuc2V0dGluZy5wYWdlU2V0dGluZy5wYWdlU2l6ZSB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENvbUN0eENvbnN0YW50cy5MT0NBTFNUT1JBR0VfS0VZLlBBR0VfU0VUVElORywgSlNPTi5zdHJpbmdpZnkocGFnZVNldHRpbmcpKTtcclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxUb3AoKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbGJhcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxiYXIuc2Nyb2xsVG9Ub3AoMCwgMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxUb0JvdHRvbSgpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsYmFyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbGJhci5zY3JvbGxUb0JvdHRvbSgwLCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVEYW5oTWFQQyhldnQpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UudXBkYXRlTWFQaGFuQ2FwQmFzZSgpXHJcbiAgICAgICAgICAgIC50aGVuKHJlcyA9PiB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlcywgJ8SQw6FuaCBs4bqhaSBtw6MgcGjDom4gY+G6pXAgdGjDoG5oIGPDtG5nJywgZiA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZCgpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICB9XHJcbn1cclxuIl19