UNPKG

ngx-config-datatable

Version:
277 lines 21.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ContentChild, EventEmitter, Input, Output, TemplateRef } from '@angular/core'; import { BehaviorSubject, combineLatest, Subscription } from 'rxjs'; import { filter } from 'rxjs/operators'; export class DatatableComponent { constructor() { this.isShowCheckbox = true; this.isShowRowNumber = true; this.className = ''; this.sortCommand = new EventEmitter(); this.checkRowCommand = new EventEmitter(); this.sub = new Subscription(); this.datatableSetting$ = new BehaviorSubject(null); this.data$ = new BehaviorSubject([]); this.rows = []; this.footers = []; this.headerChecked = false; this.sub.add(combineLatest(this.datatableSetting$, this.data$).pipe(filter((/** * @param {?} __0 * @return {?} */ ([datatableSetting, data]) => datatableSetting ? true : false))).subscribe((/** * @param {?} __0 * @return {?} */ ([datatableSetting, data]) => { this.render(); }))); } /** * @param {?} v * @return {?} */ set datatableSetting(v) { this.datatableSetting$.next(v); } /** * @return {?} */ get datatableSetting() { return this.datatableSetting$.getValue(); } /** * @param {?} v * @return {?} */ set data(v) { this.data$.next(v); } /** * @return {?} */ get data() { return this.data$.getValue(); } /** * @return {?} */ ngOnDestroy() { this.sub.unsubscribe(); } /** * @private * @return {?} */ render() { this.rows = []; this.footers = []; this.addRows(); this.addSummaryRow(); } /** * @param {?} sortInfo * @return {?} */ changeSort(sortInfo) { for (const item of this.datatableSetting.headers) { if (item.propName !== sortInfo.propName) { item.sort = 'none'; } else { item.sort = sortInfo.sort; } } this.sortCommand.emit(sortInfo); } /** * @param {?} event * @return {?} */ headerCheckIt(event) { event.preventDefault(); this.headerChecked = !this.headerChecked; for (const row of this.rows) { // tslint:disable-next-line:no-string-literal row['cbk__checked'] = this.headerChecked; } this.checkAllCheckbox(); } /** * @param {?} event * @param {?} row * @return {?} */ rowCheckIt(event, row) { event.preventDefault(); this.checkAllCheckbox(); } /** * @private * @return {?} */ checkAllCheckbox() { // tslint:disable-next-line:no-string-literal this.headerChecked = !this.rows.some((/** * @param {?} a * @return {?} */ a => !a['cbk__checked'])); // tslint:disable-next-line:no-string-literal /** @type {?} */ const ids = this.rows.filter((/** * @param {?} a * @return {?} */ a => !!a['cbk__checked'])).map((/** * @param {?} a * @return {?} */ a => a.id)); this.checkRowCommand.emit(ids); } /** * @private * @return {?} */ addRows() { this.checkDatatableSetting(); for (const row of this.data) { /** @type {?} */ const cs = { id: row.id, rowData: row, columns: [] }; for (const item of this.datatableSetting.headers) { if (!item.isEnabled) { continue; } /** @type {?} */ let vv = row[item.propName]; if (item.converter) { vv = item.converter.to(vv); } cs.columns.push({ isHtml: item.isHtml, content: vv }); } this.rows.push(cs); } } /** * @private * @return {?} */ addSummaryRow() { this.checkDatatableSetting(); /** @type {?} */ const fs = { id: '', rowData: { id: '' }, columns: [] }; if (!this.datatableSetting.headers.some((/** * @param {?} a * @return {?} */ a => a.isSum))) { return; } for (const item of this.datatableSetting.headers) { if (!item.isEnabled) { continue; } if (!item.isSum) { fs.columns.push({ isHtml: item.isHtml, content: '' }); continue; } /** @type {?} */ let tTotal = 0; for (const row of this.data) { /** @type {?} */ const vv = row[item.propName]; tTotal += +vv; } if (item.converter) { tTotal = item.converter.to(tTotal); } fs.columns.push({ isHtml: item.isHtml, content: tTotal }); } this.footers.push(fs); } /** * @private * @return {?} */ checkDatatableSetting() { if (!this.datatableSetting) { throw new Error('please set up the datatableSetting property'); } } } DatatableComponent.decorators = [ { type: Component, args: [{ selector: 'cdt-datatable', template: "<table *ngIf=\"datatableSetting\" [class]=\"className\">\n <thead>\n <tr>\n <th *ngIf=\"isShowCheckbox\">\n <input type=\"checkbox\" \n [checked]=\" headerChecked\"\n (change)=\"headerCheckIt($event)\">\n </th>\n <th *ngIf=\"isShowRowNumber\">#</th>\n <th [ngClass]=\"{'d-none': !item.isEnabled}\" *ngFor=\"let item of datatableSetting.headers\">\n <cdt-btn-sort [info]=\"item\" (clickLink)=\"changeSort($event)\"></cdt-btn-sort>\n </th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of rows; let i=index\">\n\n <td *ngIf=\"isShowCheckbox\">\n <input type=\"checkbox\" \n [checked]=\"!!row.cbk__checked\" \n (change)=\"row.cbk__checked=!row.cbk__checked;rowCheckIt($event, row)\">\n </td>\n\n <td *ngIf=\"isShowRowNumber\"><span>{{i+1}}</span></td>\n\n <ng-container *ngFor=\"let column of row.columns\">\n <td *ngIf=\"column.isHtml\" [innerHTML]=\"column.content\"></td>\n <td *ngIf=\"!column.isHtml\" [innerText]=\"column.content\"></td>\n </ng-container>\n\n <td>\n <ng-container *ngTemplateOutlet=\"rowTmpl, context: { $implicit: row }\"></ng-container>\n </td>\n\n </tr>\n </tbody>\n <tfoot>\n <tr *ngFor=\"let row of footers\">\n <th *ngIf=\"isShowCheckbox\">\n </th>\n <th *ngIf=\"isShowRowNumber\"></th>\n <ng-container *ngFor=\"let column of row.columns\">\n <td>{{column.content}}</td>\n </ng-container>\n <th>\n </th>\n </tr>\n </tfoot>\n</table>", styles: [""] }] } ]; /** @nocollapse */ DatatableComponent.ctorParameters = () => []; DatatableComponent.propDecorators = { rowTmpl: [{ type: ContentChild, args: ['rowCommand', { static: true },] }], isShowCheckbox: [{ type: Input }], isShowRowNumber: [{ type: Input }], className: [{ type: Input }], datatableSetting: [{ type: Input }], data: [{ type: Input }], sortCommand: [{ type: Output }], checkRowCommand: [{ type: Output }] }; if (false) { /** @type {?} */ DatatableComponent.prototype.rowTmpl; /** @type {?} */ DatatableComponent.prototype.isShowCheckbox; /** @type {?} */ DatatableComponent.prototype.isShowRowNumber; /** @type {?} */ DatatableComponent.prototype.className; /** @type {?} */ DatatableComponent.prototype.sortCommand; /** @type {?} */ DatatableComponent.prototype.checkRowCommand; /** * @type {?} * @private */ DatatableComponent.prototype.sub; /** * @type {?} * @private */ DatatableComponent.prototype.datatableSetting$; /** * @type {?} * @private */ DatatableComponent.prototype.data$; /** @type {?} */ DatatableComponent.prototype.rows; /** @type {?} */ DatatableComponent.prototype.footers; /** @type {?} */ DatatableComponent.prototype.headerChecked; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1jb25maWctZGF0YXRhYmxlLyIsInNvdXJjZXMiOlsibGliL2RhdGF0YWJsZS9jb21wb25lbnRzL2RhdGF0YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBV3hDLE1BQU0sT0FBTyxrQkFBa0I7SUFpQzdCO1FBN0JTLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBRXZCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFlZCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDMUMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBRWpELFFBQUcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3pCLHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUFvQixJQUFJLENBQUMsQ0FBQztRQUNqRSxVQUFLLEdBQUcsSUFBSSxlQUFlLENBQWMsRUFBRSxDQUFDLENBQUM7UUFFckQsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUNsQixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBR3BCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FDeEIsSUFBSSxDQUFDLGlCQUFpQixFQUN0QixJQUFJLENBQUMsS0FBSyxDQUNYLENBQUMsSUFBSSxDQUNKLE1BQU07Ozs7UUFBQyxDQUFDLENBQUMsZ0JBQWdCLEVB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WUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs2QkFFM0MsS0FBSzs4QkFDTCxLQUFLO3dCQUVMLEtBQUs7K0JBQ0wsS0FBSzttQkFPTCxLQUFLOzBCQU9MLE1BQU07OEJBQ04sTUFBTTs7OztJQXJCUCxxQ0FBd0U7O0lBRXhFLDRDQUErQjs7SUFDL0IsNkNBQWdDOztJQUVoQyx1Q0FBd0I7O0lBZXhCLHlDQUFvRDs7SUFDcEQsNkNBQXlEOzs7OztJQUV6RCxpQ0FBaUM7Ozs7O0lBQ2pDLCtDQUF5RTs7Ozs7SUFDekUsbUNBQXFEOztJQUVyRCxrQ0FBa0I7O0lBQ2xCLHFDQUFxQjs7SUFDckIsMkNBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElEYXRhdGFibGVTZXR0aW5nIH0gZnJvbSAnLi4vaW50ZXJmYWNlL0lEYXRhdGFibGVTZXR0aW5nJztcbmltcG9ydCB7IElIZWFkZXIgfSBmcm9tICcuLi9pbnRlcmZhY2UvSUhlYWRlcic7XG5pbXBvcnQgeyBJSWRPYmplY3QgfSBmcm9tICcuLi9pbnRlcmZhY2UvSUlkT2JqZWN0JztcbmltcG9ydCB7IElSb3cgfSBmcm9tICcuLi9pbnRlcmZhY2UvSVJvdyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NkdC1kYXRhdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YXRhYmxlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGF0YXRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICBAQ29udGVudENoaWxkKCdyb3dDb21tYW5kJywgeyBzdGF0aWM6IHRydWUgfSkgcm93VG1wbDogVGVtcGxhdGVSZWY8YW55PjtcblxuICBASW5wdXQoKSBpc1Nob3dDaGVja2JveCA9IHRydWU7XG4gIEBJbnB1dCgpIGlzU2hvd1Jvd051bWJlciA9IHRydWU7XG5cbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG4gIEBJbnB1dCgpXG4gIHNldCBkYXRhdGFibGVTZXR0aW5nKHY6IElEYXRhdGFibGVTZXR0aW5nKSB7XG4gICAgdGhpcy5kYXRhdGFibGVTZXR0aW5nJC5uZXh0KHYpO1xuICB9XG4gIGdldCBkYXRhdGFibGVTZXR0aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGF0YWJsZVNldHRpbmckLmdldFZhbHVlKCk7XG4gIH1cbiAgQElucHV0KClcbiAgc2V0IGRhdGEodjogSUlkT2JqZWN0W10pIHtcbiAgICB0aGlzLmRhdGEkLm5leHQodik7XG4gIH1cbiAgZ2V0IGRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YSQuZ2V0VmFsdWUoKTtcbiAgfVxuICBAT3V0cHV0KCkgc29ydENvbW1hbmQgPSBuZXcgRXZlbnRFbWl0dGVyPElIZWFkZXI+KCk7XG4gIEBPdXRwdXQoKSBjaGVja1Jvd0NvbW1hbmQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuXG4gIHByaXZhdGUgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGRhdGF0YWJsZVNldHRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJRGF0YXRhYmxlU2V0dGluZz4obnVsbCk7XG4gIHByaXZhdGUgZGF0YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElJZE9iamVjdFtdPihbXSk7XG5cbiAgcm93czogSVJvd1tdID0gW107XG4gIGZvb3RlcnM6IElSb3dbXSA9IFtdO1xuICBoZWFkZXJDaGVja2VkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zdWIuYWRkKGNvbWJpbmVMYXRlc3QoXG4gICAgICB0aGlzLmRhdGF0YWJsZVNldHRpbmckLFxuICAgICAgdGhpcy5kYXRhJFxuICAgICkucGlwZShcbiAgICAgIGZpbHRlcigoW2RhdGF0YWJsZVNldHRpbmcsIGRhdGFdKSA9PiBkYXRhdGFibGVTZXR0aW5nID8gdHJ1ZSA6IGZhbHNlKVxuICAgICkuc3Vic2NyaWJlKChbZGF0YXRhYmxlU2V0dGluZywgZGF0YV0pID0+IHtcbiAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfSkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWIudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyKCkge1xuICAgIHRoaXMucm93cyA9IFtdO1xuICAgIHRoaXMuZm9vdGVycyA9IFtdO1xuXG4gICAgdGhpcy5hZGRSb3dzKCk7XG4gICAgdGhpcy5hZGRTdW1tYXJ5Um93KCk7XG4gIH1cblxuICBjaGFuZ2VTb3J0KHNvcnRJbmZvOiBJSGVhZGVyKSB7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMuZGF0YXRhYmxlU2V0dGluZy5oZWFkZXJzKSB7XG4gICAgICBpZiAoaXRlbS5wcm9wTmFtZSAhPT0gc29ydEluZm8ucHJvcE5hbWUpIHtcbiAgICAgICAgaXRlbS5zb3J0ID0gJ25vbmUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbS5zb3J0ID0gc29ydEluZm8uc29ydDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zb3J0Q29tbWFuZC5lbWl0KHNvcnRJbmZvKTtcbiAgfVxuXG4gIGhlYWRlckNoZWNrSXQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmhlYWRlckNoZWNrZWQgPSAhdGhpcy5oZWFkZXJDaGVja2VkO1xuXG4gICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yb3dzKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tc3RyaW5nLWxpdGVyYWxcbiAgICAgIHJvd1snY2JrX19jaGVja2VkJ10gPSB0aGlzLmhlYWRlckNoZWNrZWQ7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tBbGxDaGVja2JveCgpO1xuICB9XG5cbiAgcm93Q2hlY2tJdChldmVudDogRXZlbnQsIHJvdykge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5jaGVja0FsbENoZWNrYm94KCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrQWxsQ2hlY2tib3goKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXN0cmluZy1saXRlcmFsXG4gICAgdGhpcy5oZWFkZXJDaGVja2VkID0gIXRoaXMucm93cy5zb21lKGEgPT4gIWFbJ2Nia19fY2hlY2tlZCddKTtcblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1zdHJpbmctbGl0ZXJhbFxuICAgIGNvbnN0IGlkcyA9IHRoaXMucm93cy5maWx0ZXIoYSA9PiAhIWFbJ2Nia19fY2hlY2tlZCddKS5tYXAoYSA9PiBhLmlkKTtcbiAgICB0aGlzLmNoZWNrUm93Q29tbWFuZC5lbWl0KGlkcyk7XG4gIH1cblxuICBwcml2YXRlIGFkZFJvd3MoKSB7XG4gICAgdGhpcy5jaGVja0RhdGF0YWJsZVNldHRpbmcoKTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMuZGF0YSkge1xuICAgICAgY29uc3QgY3M6IElSb3cgPSB7XG4gICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgIHJvd0RhdGE6IHJvdyxcbiAgICAgICAgY29sdW1uczogW11cbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kYXRhdGFibGVTZXR0aW5nLmhlYWRlcnMpIHtcbiAgICAgICAgaWYgKCFpdGVtLmlzRW5hYmxlZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2diA9IHJvd1tpdGVtLnByb3BOYW1lXTtcbiAgICAgICAgaWYgKGl0ZW0uY29udmVydGVyKSB7XG4gICAgICAgICAgdnYgPSBpdGVtLmNvbnZlcnRlci50byh2dik7XG4gICAgICAgIH1cbiAgICAgICAgY3MuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgICBpc0h0bWw6IGl0ZW0uaXNIdG1sLFxuICAgICAgICAgIGNvbnRlbnQ6IHZ2XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5yb3dzLnB1c2goY3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkU3VtbWFyeVJvdygpIHtcbiAgICB0aGlzLmNoZWNrRGF0YXRhYmxlU2V0dGluZygpO1xuXG4gICAgY29uc3QgZnM6IElSb3cgPSB7XG4gICAgICBpZDogJycsXG4gICAgICByb3dEYXRhOiB7IGlkOiAnJyB9LFxuICAgICAgY29sdW1uczogW11cbiAgICB9O1xuICAgIGlmICghdGhpcy5kYXRhdGFibGVTZXR0aW5nLmhlYWRlcnMuc29tZShhID0+IGEuaXNTdW0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRhdGF0YWJsZVNldHRpbmcuaGVhZGVycykge1xuICAgICAgaWYgKCFpdGVtLmlzRW5hYmxlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghaXRlbS5pc1N1bSkge1xuICAgICAgICBmcy5jb2x1bW5zLnB1c2goe1xuICAgICAgICAgIGlzSHRtbDogaXRlbS5pc0h0bWwsXG4gICAgICAgICAgY29udGVudDogJydcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgdFRvdGFsID0gMDtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMuZGF0YSkge1xuICAgICAgICBjb25zdCB2diA9IHJvd1tpdGVtLnByb3BOYW1lXTtcbiAgICAgICAgdFRvdGFsICs9ICt2djtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtLmNvbnZlcnRlcikge1xuICAgICAgICB0VG90YWwgPSBpdGVtLmNvbnZlcnRlci50byh0VG90YWwpO1xuICAgICAgfVxuICAgICAgZnMuY29sdW1ucy5wdXNoKHtcbiAgICAgICAgaXNIdG1sOiBpdGVtLmlzSHRtbCxcbiAgICAgICAgY29udGVudDogdFRvdGFsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5mb290ZXJzLnB1c2goZnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0RhdGF0YWJsZVNldHRpbmcoKSB7XG4gICAgaWYgKCF0aGlzLmRhdGF0YWJsZVNldHRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncGxlYXNlIHNldCB1cCB0aGUgZGF0YXRhYmxlU2V0dGluZyBwcm9wZXJ0eScpO1xuICAgIH1cbiAgfVxuXG59XG4iXX0=