med-table
Version:
Wrapper over table of primeng library for Ministry of Health
124 lines • 21.5 kB
JavaScript
import { set } from 'lodash';
import { FormGroup } from '@angular/forms';
import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
import { deepClone } from '../../utils';
import { STRING } from '../../constants/string';
import { EditorBuilder } from './editor-builder';
import { CELL_TYPES } from '../../types/cellTypes';
import { TableCell } from '../../services/TableCell';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "med-dynamic-form";
import * as i3 from "@angular/common";
const DEFAULT_VISIBLE_EDITOR_HANDLER = () => true;
export class TableCellComponent {
constructor(cd, fb) {
this.cd = cd;
this.fb = fb;
this.update = new EventEmitter();
this.onFocus = new EventEmitter();
this.cellType = CELL_TYPES;
this.fields = [];
this.form = new FormGroup({});
this._item = {};
this._config = { key: '', label: '' };
this._tableCell = new TableCell();
}
set config(newValue) {
this._tableCell.setConfig(newValue);
this._config = newValue;
}
get config() {
return this._config;
}
set item(newValue) {
this._tableCell.setItem(newValue);
this._item = newValue;
}
get item() {
return this._item;
}
get fieldData() {
return this._tableCell.fieldData;
}
get previewData() {
return this._tableCell.previewData;
}
get linkUrl() {
const { url, keyParam } = this.config.linkOptions || {};
if (!url)
return STRING.EMPTY;
if (keyParam) {
const param = this._tableCell.getValue(this.item, keyParam);
return `${url}?${keyParam}=${param}`;
}
return url;
}
get linkTarget() {
const { linkOptions: { target } = {} } = this.config;
return target ? target : '_self';
}
get isEditable() {
const { editorType, visibleEditorHandler = DEFAULT_VISIBLE_EDITOR_HANDLER } = this.config;
return Boolean(editorType) && visibleEditorHandler(this.item);
}
get isEmptyTemplate() {
// TODO should show default value if slot "template" is empty
const { nativeElement } = this.contentRef || {};
return !(nativeElement && nativeElement.innerText);
}
ngOnInit() {
const { key } = this.config;
const keyList = key.split(STRING.DOT);
this.form.addControl(...this.setFormControl(keyList));
}
ngAfterViewInit() {
this.cd.detectChanges();
}
setEditor() {
if (!this.isEditable) {
return;
}
const field = new EditorBuilder({
...this.config,
onLeave: this.onLeave.bind(this),
});
this.onFocus.emit({ item: this.item, key: this.config.key });
this.fields.push(field);
}
onLeave() {
const { key } = this.config;
const { value } = this.form;
if (this._tableCell.getValue(value, key) !== this.fieldData) {
const item = set(deepClone(this.item), key, this._tableCell.getValue(value, key));
this.update.emit({ item, key });
}
this.fields = [];
}
setFormControl([firstKey, ...keys]) {
if (!keys.length)
return [firstKey, this.fb.control(this.fieldData)];
const [newKey, control] = this.setFormControl(keys);
return [firstKey, this.fb.group({ [newKey]: control })];
}
}
TableCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TableCellComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
TableCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: TableCellComponent, selector: "table-cell", inputs: { template: "template", config: "config", item: "item" }, outputs: { update: "update", onFocus: "onFocus" }, viewQueries: [{ propertyName: "contentRef", first: true, predicate: ["contentRef"], descendants: true }], ngImport: i0, template: "<div class=\"table-cell__item\">\n <span class=\"table-cell__column-title\">\n {{ config.label }}\n </span>\n\n <span class=\"table-cell__content\">\n <med-dynamic-form\n *ngIf=\"fields.length\"\n [config]=\"fields\"\n [form]=\"form\"\n ></med-dynamic-form>\n\n <div\n [hidden]=\"fields.length\"\n [className]=\"isEditable ? 'table-cell__editable' : ''\"\n (click)=\"setEditor()\"\n >\n <span #contentRef>\n <ng-container *ngTemplateOutlet=\"\n template || defaultTemplate;\n context: { $implicit: previewData, item: item }\"\n ></ng-container>\n </span>\n\n <ng-container\n *ngIf=\"isEmptyTemplate\"\n [ngTemplateOutlet]=\"config.cellType === cellType.LINK ? linkTemplate : defaultTemplate\"\n ></ng-container>\n </div>\n </span>\n</div>\n\n<ng-template #linkTemplate>\n <a [attr.href]=\"linkUrl\" [attr.target]=\"linkTarget\" class=\"table-cell__link\">{{ previewData }}</a>\n</ng-template>\n\n<ng-template #defaultTemplate>\n {{ previewData }}\n</ng-template>\n", styles: [":host{width:100%}.table-cell__item{display:flex;width:100%;justify-content:flex-start!important}@media screen and (max-width: 960px){.table-cell__item{font-size:14px}}.table-cell__column-title{display:none;padding:5px;font-weight:700;flex:0 0 40%}@media screen and (max-width: 960px){.table-cell__column-title{display:block}}.table-cell__content{width:100%;height:100%;padding:5px;overflow-wrap:break-word;word-wrap:break-word;-webkit-hyphens:auto;hyphens:auto;word-break:break-all}.table-cell__editable{cursor:pointer;width:100%;height:100%;color:var(--green-700)}.table-cell__editable:hover{color:var(--green-400)}.table-cell__link{cursor:pointer;width:100%;height:100%;color:#3b82f6;text-decoration:none}.table-cell__link:hover{color:#3b6bff;text-decoration:underline}\n"], components: [{ type: i2.MedDynamicFormComponent, selector: "med-dynamic-form", inputs: ["config", "form"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TableCellComponent, decorators: [{
type: Component,
args: [{ selector: 'table-cell', template: "<div class=\"table-cell__item\">\n <span class=\"table-cell__column-title\">\n {{ config.label }}\n </span>\n\n <span class=\"table-cell__content\">\n <med-dynamic-form\n *ngIf=\"fields.length\"\n [config]=\"fields\"\n [form]=\"form\"\n ></med-dynamic-form>\n\n <div\n [hidden]=\"fields.length\"\n [className]=\"isEditable ? 'table-cell__editable' : ''\"\n (click)=\"setEditor()\"\n >\n <span #contentRef>\n <ng-container *ngTemplateOutlet=\"\n template || defaultTemplate;\n context: { $implicit: previewData, item: item }\"\n ></ng-container>\n </span>\n\n <ng-container\n *ngIf=\"isEmptyTemplate\"\n [ngTemplateOutlet]=\"config.cellType === cellType.LINK ? linkTemplate : defaultTemplate\"\n ></ng-container>\n </div>\n </span>\n</div>\n\n<ng-template #linkTemplate>\n <a [attr.href]=\"linkUrl\" [attr.target]=\"linkTarget\" class=\"table-cell__link\">{{ previewData }}</a>\n</ng-template>\n\n<ng-template #defaultTemplate>\n {{ previewData }}\n</ng-template>\n", styles: [":host{width:100%}.table-cell__item{display:flex;width:100%;justify-content:flex-start!important}@media screen and (max-width: 960px){.table-cell__item{font-size:14px}}.table-cell__column-title{display:none;padding:5px;font-weight:700;flex:0 0 40%}@media screen and (max-width: 960px){.table-cell__column-title{display:block}}.table-cell__content{width:100%;height:100%;padding:5px;overflow-wrap:break-word;word-wrap:break-word;-webkit-hyphens:auto;hyphens:auto;word-break:break-all}.table-cell__editable{cursor:pointer;width:100%;height:100%;color:var(--green-700)}.table-cell__editable:hover{color:var(--green-400)}.table-cell__link{cursor:pointer;width:100%;height:100%;color:#3b82f6;text-decoration:none}.table-cell__link:hover{color:#3b6bff;text-decoration:underline}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.FormBuilder }]; }, propDecorators: { template: [{
type: Input
}], config: [{
type: Input
}], item: [{
type: Input
}], update: [{
type: Output
}], onFocus: [{
type: Output
}], contentRef: [{
type: ViewChild,
args: ['contentRef']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY2VsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWQtdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlLWNlbGwvdGFibGUtY2VsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWQtdGFibGUvc3JjL2xpYi9jb21wb25lbnRzL3RhYmxlLWNlbGwvdGFibGUtY2VsbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBK0IsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkUsT0FBTyxFQUdMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7Ozs7O0FBSW5ELE1BQU0sOEJBQThCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0FBT2xELE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFBb0IsRUFBcUIsRUFBVSxFQUFlO1FBQTlDLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQXNCeEQsV0FBTSxHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBQ3RELFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUl4RCxh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QUUsR0FBRyxJQUFJLENBQVc7UUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUVyRSxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7OytHQWhIVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixpUkMvQi9CLDhqQ0F1Q0E7MkZEUmEsa0JBQWtCO2tCQUw5QixTQUFTOytCQUNFLFlBQVk7a0lBT2IsUUFBUTtzQkFBaEIsS0FBSztnQkFFTyxNQUFNO3NCQUFsQixLQUFLO2dCQVNPLElBQUk7c0JBQWhCLEtBQUs7Z0JBU0ksTUFBTTtzQkFBZixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBRWtCLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c2V0fSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TWVkRm9ybUZpZWxkQ29uZmlnfSBmcm9tICdtZWQtZHluYW1pYy1mb3JtJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtkZWVwQ2xvbmV9IGZyb20gJy4uLy4uL3V0aWxzJztcbmltcG9ydCB7U1RSSU5HfSBmcm9tICcuLi8uLi9jb25zdGFudHMvc3RyaW5nJztcbmltcG9ydCB7RWRpdG9yQnVpbGRlcn0gZnJvbSAnLi9lZGl0b3ItYnVpbGRlcic7XG5pbXBvcnQge0NFTExfVFlQRVN9IGZyb20gJy4uLy4uL3R5cGVzL2NlbGxUeXBlcyc7XG5pbXBvcnQge1RhYmxlQ2VsbH0gZnJvbSAnLi4vLi4vc2VydmljZXMvVGFibGVDZWxsJztcbmltcG9ydCB7TWVkVXBkYXRlRXZlbnR9IGZyb20gJy4uLy4uL3R5cGVzL01lZFVwZGF0ZUV2ZW50JztcbmltcG9ydCB7Q2VsbERhdGFDb25maWdMb2NhbH0gZnJvbSAnLi4vLi4vdHlwZXMvQ2VsbERhdGFDb25maWdMb2NhbCc7XG5cbmNvbnN0IERFRkFVTFRfVklTSUJMRV9FRElUT1JfSEFORExFUiA9ICgpID0+IHRydWU7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RhYmxlLWNlbGwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUtY2VsbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLWNlbGwuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUNlbGxDb21wb25lbnQ8SXRlbVR5cGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge31cblxuICBASW5wdXQoKSB0ZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQElucHV0KCkgc2V0IGNvbmZpZyhuZXdWYWx1ZTogQ2VsbERhdGFDb25maWdMb2NhbCkge1xuICAgIHRoaXMuX3RhYmxlQ2VsbC5zZXRDb25maWcobmV3VmFsdWUpO1xuICAgIHRoaXMuX2NvbmZpZyA9IG5ld1ZhbHVlO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpOiBDZWxsRGF0YUNvbmZpZ0xvY2FsIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGl0ZW0obmV3VmFsdWU6IEl0ZW1UeXBlKSB7XG4gICAgdGhpcy5fdGFibGVDZWxsLnNldEl0ZW0obmV3VmFsdWUpO1xuICAgIHRoaXMuX2l0ZW0gPSBuZXdWYWx1ZTtcbiAgfVxuXG4gIGdldCBpdGVtKCk6IEl0ZW1UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5faXRlbSBhcyBJdGVtVHlwZTtcbiAgfVxuXG4gIEBPdXRwdXQoKSB1cGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPE1lZFVwZGF0ZUV2ZW50PEl0ZW1UeXBlPj4oKTtcbiAgQE91dHB1dCgpIG9uRm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPE1lZFVwZGF0ZUV2ZW50PEl0ZW1UeXBlPj4oKTtcblxuICBAVmlld0NoaWxkKCdjb250ZW50UmVmJykgY29udGVudFJlZiE6IEVsZW1lbnRSZWY7XG5cbiAgcmVhZG9ubHkgY2VsbFR5cGUgPSBDRUxMX1RZUEVTO1xuICBmaWVsZHM6IE1lZEZvcm1GaWVsZENvbmZpZ1tdID0gW107XG4gIGZvcm06IGFueSA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICBwcml2YXRlIF9pdGVtOiBJdGVtVHlwZSB8IHt9ID0ge307XG4gIHByaXZhdGUgX2NvbmZpZzogQ2VsbERhdGFDb25maWdMb2NhbCA9IHtrZXk6ICcnLCBsYWJlbDogJyd9O1xuICBwcml2YXRlIF90YWJsZUNlbGwgPSBuZXcgVGFibGVDZWxsPEl0ZW1UeXBlPigpO1xuXG4gIGdldCBmaWVsZERhdGEoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVDZWxsLmZpZWxkRGF0YTtcbiAgfVxuXG4gIGdldCBwcmV2aWV3RGF0YSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUNlbGwucHJldmlld0RhdGE7XG4gIH1cblxuICBnZXQgbGlua1VybCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgdXJsLCBrZXlQYXJhbSB9ID0gdGhpcy5jb25maWcubGlua09wdGlvbnMgfHwge307XG5cbiAgICBpZighdXJsKSByZXR1cm4gU1RSSU5HLkVNUFRZO1xuXG4gICAgaWYgKGtleVBhcmFtKSB7XG4gICAgICBjb25zdCBwYXJhbSA9IHRoaXMuX3RhYmxlQ2VsbC5nZXRWYWx1ZSh0aGlzLml0ZW0sIGtleVBhcmFtKTtcbiAgICAgIHJldHVybiBgJHt1cmx9PyR7a2V5UGFyYW19PSR7cGFyYW19YDtcbiAgICB9XG5cbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgZ2V0IGxpbmtUYXJnZXQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IGxpbmtPcHRpb25zOiB7IHRhcmdldCB9ID0ge30gfSA9IHRoaXMuY29uZmlnO1xuICAgIHJldHVybiB0YXJnZXQgPyB0YXJnZXQgOiAnX3NlbGYnO1xuICB9XG5cbiAgZ2V0IGlzRWRpdGFibGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qge2VkaXRvclR5cGUsIHZpc2libGVFZGl0b3JIYW5kbGVyID0gREVGQVVMVF9WSVNJQkxFX0VESVRPUl9IQU5ETEVSfSA9IHRoaXMuY29uZmlnO1xuICAgIHJldHVybiBCb29sZWFuKGVkaXRvclR5cGUpICYmIHZpc2libGVFZGl0b3JIYW5kbGVyKHRoaXMuaXRlbSk7XG4gIH1cblxuICBnZXQgaXNFbXB0eVRlbXBsYXRlKCk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE8gc2hvdWxkIHNob3cgZGVmYXVsdCB2YWx1ZSBpZiBzbG90IFwidGVtcGxhdGVcIiBpcyBlbXB0eVxuICAgIGNvbnN0IHsgbmF0aXZlRWxlbWVudCB9ID0gdGhpcy5jb250ZW50UmVmIHx8IHt9O1xuICAgIHJldHVybiAhKG5hdGl2ZUVsZW1lbnQgJiYgbmF0aXZlRWxlbWVudC5pbm5lclRleHQpO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgeyBrZXkgfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IGtleUxpc3QgPSBrZXkuc3BsaXQoU1RSSU5HLkRPVCk7XG4gICAgdGhpcy5mb3JtLmFkZENvbnRyb2woLi4udGhpcy5zZXRGb3JtQ29udHJvbChrZXlMaXN0KSk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBzZXRFZGl0b3IoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzRWRpdGFibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWVsZCA9IG5ldyBFZGl0b3JCdWlsZGVyKHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgb25MZWF2ZTogdGhpcy5vbkxlYXZlLmJpbmQodGhpcyksXG4gICAgfSk7XG4gICAgdGhpcy5vbkZvY3VzLmVtaXQoe2l0ZW06IHRoaXMuaXRlbSwga2V5OiB0aGlzLmNvbmZpZy5rZXl9KTtcbiAgICB0aGlzLmZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgfVxuXG4gIHByaXZhdGUgb25MZWF2ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGtleSB9ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpcy5mb3JtO1xuXG4gICAgaWYgKHRoaXMuX3RhYmxlQ2VsbC5nZXRWYWx1ZSh2YWx1ZSwga2V5KSAhPT0gdGhpcy5maWVsZERhdGEpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBzZXQoZGVlcENsb25lKHRoaXMuaXRlbSksIGtleSwgdGhpcy5fdGFibGVDZWxsLmdldFZhbHVlKHZhbHVlLCBrZXkpKTtcbiAgICAgIHRoaXMudXBkYXRlLmVtaXQoe2l0ZW0sIGtleX0pO1xuICAgIH1cblxuICAgIHRoaXMuZmllbGRzID0gW107XG4gIH1cblxuICBwcml2YXRlIHNldEZvcm1Db250cm9sKFtmaXJzdEtleSwgLi4ua2V5c106IHN0cmluZ1tdKTogW3N0cmluZywgQWJzdHJhY3RDb250cm9sXSB7XG4gICAgaWYgKCFrZXlzLmxlbmd0aCkgcmV0dXJuIFtmaXJzdEtleSwgdGhpcy5mYi5jb250cm9sKHRoaXMuZmllbGREYXRhKV07XG5cbiAgICBjb25zdCBbbmV3S2V5LCBjb250cm9sXSA9IHRoaXMuc2V0Rm9ybUNvbnRyb2woa2V5cyk7XG4gICAgcmV0dXJuIFtmaXJzdEtleSwgdGhpcy5mYi5ncm91cCh7W25ld0tleV06IGNvbnRyb2x9KV07XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YWJsZS1jZWxsX19pdGVtXCI+XG4gIDxzcGFuIGNsYXNzPVwidGFibGUtY2VsbF9fY29sdW1uLXRpdGxlXCI+XG4gICAge3sgY29uZmlnLmxhYmVsIH19XG4gIDwvc3Bhbj5cblxuICA8c3BhbiBjbGFzcz1cInRhYmxlLWNlbGxfX2NvbnRlbnRcIj5cbiAgICA8bWVkLWR5bmFtaWMtZm9ybVxuICAgICAgKm5nSWY9XCJmaWVsZHMubGVuZ3RoXCJcbiAgICAgIFtjb25maWddPVwiZmllbGRzXCJcbiAgICAgIFtmb3JtXT1cImZvcm1cIlxuICAgID48L21lZC1keW5hbWljLWZvcm0+XG5cbiAgICA8ZGl2XG4gICAgICBbaGlkZGVuXT1cImZpZWxkcy5sZW5ndGhcIlxuICAgICAgW2NsYXNzTmFtZV09XCJpc0VkaXRhYmxlID8gJ3RhYmxlLWNlbGxfX2VkaXRhYmxlJyA6ICcnXCJcbiAgICAgIChjbGljayk9XCJzZXRFZGl0b3IoKVwiXG4gICAgPlxuICAgICAgPHNwYW4gI2NvbnRlbnRSZWY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICB0ZW1wbGF0ZSB8fCBkZWZhdWx0VGVtcGxhdGU7XG4gICAgICAgICAgY29udGV4dDogeyAkaW1wbGljaXQ6IHByZXZpZXdEYXRhLCBpdGVtOiBpdGVtIH1cIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJpc0VtcHR5VGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb25maWcuY2VsbFR5cGUgPT09IGNlbGxUeXBlLkxJTksgPyBsaW5rVGVtcGxhdGUgOiBkZWZhdWx0VGVtcGxhdGVcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L3NwYW4+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNsaW5rVGVtcGxhdGU+XG4gIDxhIFthdHRyLmhyZWZdPVwibGlua1VybFwiIFthdHRyLnRhcmdldF09XCJsaW5rVGFyZ2V0XCIgY2xhc3M9XCJ0YWJsZS1jZWxsX19saW5rXCI+e3sgcHJldmlld0RhdGEgfX08L2E+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRUZW1wbGF0ZT5cbiAge3sgcHJldmlld0RhdGEgfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=