ddata-ui-input
Version:
DData UI Input module, components, models & services
135 lines • 20.8 kB
JavaScript
import { Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewContainerRef } from '@angular/core';
import { ComponentRendererService } from '../../../../services/select/component-renderer.service';
import { Subscription } from 'rxjs';
import { map, tap } from 'rxjs/operators';
import * as i0 from "@angular/core";
export class DdataMultipleSelectDialogComponent {
constructor(changeDetector) {
this.changeDetector = changeDetector;
this.subscription = new Subscription();
this.method = 'list';
this.mode = 'multiple';
// for example: tag_id
this.field = 'id';
// for example: tag's name
this.text = 'name';
// for example: tag.id
this.valueField = 'id';
// for example: Array of Tag
this.items = [];
this.modalTitle = 'Dialog';
this.selectionFinished = new EventEmitter();
this.selected = new EventEmitter();
this.selectModel = new EventEmitter();
this.componentRendererService = new ComponentRendererService(changeDetector);
}
// close dialog on esc
onKeydownHandler(event) {
this.selectionFinished.emit();
}
ngOnInit() {
// get selected items from model's field
this.getSelectedItems();
}
ngAfterViewInit() {
// render component in dialog
const instance = this.componentRendererService
.setMethod(this.method)
.setSettings(this.settings)
.setDialogHost(this.dialogHost)
.setComponentRef(this.componentRef)
.render();
if (!instance) {
console.error('Component for dialog is not defined');
return;
}
if (this.mode === 'single') {
const selectedModel = this.model[this.getObjectFieldName()];
if (!!selectedModel) {
this.componentRendererService.setSelectedModels([
selectedModel
]);
}
}
if (this.mode === 'multiple') {
this.componentRendererService.setSelectedModels(this.model[this.field]);
}
// for edit component
this.subscription.add(instance.saveModel.subscribe((model) => this.setModel(model)));
this.subscription.add(instance.select.pipe(tap(() => {
if (this.mode === 'multiple') {
this.model[this.field] = [];
this.settings.listOptions.selectedElements = [];
}
}), map((models) => {
if (models === null) {
return models;
}
this.emitEvents(models);
return models;
})).subscribe());
}
getSelectedItems() {
if (this.mode === 'single') {
this.selectedModel = this.model[this.field];
}
}
hideModal() {
// get dialog component instance
const selectedElements = this.componentRendererService.getSelectedModels();
// emit selected elements
this.emitEvents(selectedElements);
// reset selected elements
this.componentRendererService.resetSelectedModels();
}
emitEvents(models) {
models.forEach((model) => {
// this must be happen on multiple select and on signle select case too
this.selectModel.emit(model);
});
this.selectionFinished.emit(models);
}
getObjectFieldName() {
return this.field.split('_id')[0];
}
setModel(model) {
// TODO test this on edit case
}
}
DdataMultipleSelectDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataMultipleSelectDialogComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
DdataMultipleSelectDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: DdataMultipleSelectDialogComponent, selector: "multiple-select-dialog", inputs: { settings: "settings", method: "method", mode: "mode", model: "model", field: "field", text: "text", valueField: "valueField", items: "items", modalTitle: "modalTitle" }, outputs: { selectionFinished: "selectionFinished", selected: "selected", selectModel: "selectModel" }, host: { listeners: { "document:keydown.escape": "onKeydownHandler($event)" } }, viewQueries: [{ propertyName: "dialogHost", first: true, predicate: ["dialogHost"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<!-- overlay -->\n<div class=\"modal-overlay active\"></div>\n\n<!-- modal -->\n<div class=\"modal\" tabindex=\"-1\" role=\"dialog\">\n <div class=\"modal-dialog modal-dialog-centered modal-lg modal-dialog-scrollable\" role=\"document\">\n <div class=\"modal-content\">\n <!-- header -->\n <div class=\"modal-header\">\n <div class=\"col-10\">\n <h5 class=\"modal-title\">\n {{ modalTitle }}\n </h5>\n </div>\n\n <div class=\"col-2 text-end\">\n <button type=\"button\" class=\"btn btn-light close\" (click)=\"hideModal()\" aria-label=\"Bez\u00E1r\u00E1s\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n </div>\n\n <!-- body -->\n <div class=\"modal-body\">\n <ng-template dynamicComponent #dialogHost></ng-template>\n </div>\n\n </div>\n </div>\n</div>\n", styles: ["@media screen and (min-width: 576px){.modal .modal-dialog{max-width:1000px}}.modal{display:block;z-index:9901}.modal-overlay{display:none;position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,.85);z-index:9900;opacity:0;transition:all .5s ease-in-out;color:#fff}.modal-overlay.active{display:flex;justify-content:center;align-items:center;opacity:1}\n"] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: DdataMultipleSelectDialogComponent, decorators: [{
type: Component,
args: [{ selector: 'multiple-select-dialog', template: "<!-- overlay -->\n<div class=\"modal-overlay active\"></div>\n\n<!-- modal -->\n<div class=\"modal\" tabindex=\"-1\" role=\"dialog\">\n <div class=\"modal-dialog modal-dialog-centered modal-lg modal-dialog-scrollable\" role=\"document\">\n <div class=\"modal-content\">\n <!-- header -->\n <div class=\"modal-header\">\n <div class=\"col-10\">\n <h5 class=\"modal-title\">\n {{ modalTitle }}\n </h5>\n </div>\n\n <div class=\"col-2 text-end\">\n <button type=\"button\" class=\"btn btn-light close\" (click)=\"hideModal()\" aria-label=\"Bez\u00E1r\u00E1s\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n </div>\n\n <!-- body -->\n <div class=\"modal-body\">\n <ng-template dynamicComponent #dialogHost></ng-template>\n </div>\n\n </div>\n </div>\n</div>\n", styles: ["@media screen and (min-width: 576px){.modal .modal-dialog{max-width:1000px}}.modal{display:block;z-index:9901}.modal-overlay{display:none;position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,.85);z-index:9900;opacity:0;transition:all .5s ease-in-out;color:#fff}.modal-overlay.active{display:flex;justify-content:center;align-items:center;opacity:1}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { settings: [{
type: Input
}], method: [{
type: Input
}], mode: [{
type: Input
}], model: [{
type: Input
}], field: [{
type: Input
}], text: [{
type: Input
}], valueField: [{
type: Input
}], items: [{
type: Input
}], modalTitle: [{
type: Input
}], selectionFinished: [{
type: Output
}], selected: [{
type: Output
}], selectModel: [{
type: Output
}], dialogHost: [{
type: ViewChild,
args: ['dialogHost', { read: ViewContainerRef }]
}], onKeydownHandler: [{
type: HostListener,
args: ['document:keydown.escape', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlwbGUtc2VsZWN0LWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZGF0YS11aS1pbnB1dC9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWN0L211bHRpcGxlLXNlbGVjdC9kaWFsb2cvbXVsdGlwbGUtc2VsZWN0LWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZGF0YS11aS1pbnB1dC9zcmMvbGliL2NvbXBvbmVudHMvc2VsZWN0L211bHRpcGxlLXNlbGVjdC9kaWFsb2cvbXVsdGlwbGUtc2VsZWN0LWRpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ2MsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQzdHLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFTMUMsTUFBTSxPQUFPLGtDQUFrQztJQXFDN0MsWUFBcUIsY0FBaUM7UUFBakMsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBbEM5QyxpQkFBWSxHQUFpQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBSS9DLFdBQU0sR0FBMkIsTUFBTSxDQUFDO1FBQ3hDLFNBQUksR0FBZSxVQUFVLENBQUM7UUFLdkMsc0JBQXNCO1FBQ2IsVUFBSyxHQUFHLElBQUksQ0FBQztRQUV0QiwwQkFBMEI7UUFDakIsU0FBSSxHQUFHLE1BQU0sQ0FBQztRQUV2QixzQkFBc0I7UUFDYixlQUFVLEdBQUcsSUFBSSxDQUFD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QUs7Z0JBRUksaUJBQWlCO3NCQUExQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFFOEMsVUFBVTtzQkFBOUQsU0FBUzt1QkFBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBR0UsZ0JBQWdCO3NCQUFwRSxZQUFZO3VCQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZU1vZGVsSW50ZXJmYWNlLCBGaWVsZHNJbnRlcmZhY2UgfSBmcm9tICdkZGF0YS1jb3JlJztcbmltcG9ydCB7IENvbXBvbmVudFJlbmRlcmVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3NlbGVjdC9jb21wb25lbnQtcmVuZGVyZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGlhbG9nQ29udGVudFdpdGhPcHRpb25zSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2RpYWxvZy9jb250ZW50L2RpYWxvZy1jb250ZW50LmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZWxlY3RUeXBlIH0gZnJvbSAnLi4vLi4vc2VsZWN0LnR5cGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdWx0aXBsZS1zZWxlY3QtZGlhbG9nJyxcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpcGxlLXNlbGVjdC1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tdWx0aXBsZS1zZWxlY3QtZGlhbG9nLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGRhdGFNdWx0aXBsZVNlbGVjdERpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgY29tcG9uZW50UmVuZGVyZXJTZXJ2aWNlOiBDb21wb25lbnRSZW5kZXJlclNlcnZpY2U7XG4gIHByaXZhdGUgY29tcG9uZW50UmVmOiBhbnk7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgc2VsZWN0ZWRNb2RlbDogYW55O1xuXG4gIEBJbnB1dCgpIHNldHRpbmdzOiBEaWFsb2dDb250ZW50V2l0aE9wdGlvbnNJbnRlcmZhY2U7XG4gIEBJbnB1dCgpIG1ldGhvZDogJ2NyZWF0ZS1lZGl0JyB8ICdsaXN0JyA9ICdsaXN0JztcbiAgQElucHV0KCkgbW9kZTogU2VsZWN0VHlwZSA9ICdtdWx0aXBsZSc7XG5cbiAgLy8gZm9yIGV4YW1wbGU6IGFuIEFkZHJlc3MgbW9kZWxcbiAgQElucHV0KCkgbW9kZWw6IEJhc2VNb2RlbEludGVyZmFjZTxhbnk+ICYgRmllbGRzSW50ZXJmYWNlPGFueT47XG5cbiAgLy8gZm9yIGV4YW1wbGU6IHRhZ19pZFxuICBASW5wdXQoKSBmaWVsZCA9ICdpZCc7XG5cbiAgLy8gZm9yIGV4YW1wbGU6IHRhZydzIG5hbWVcbiAgQElucHV0KCkgdGV4dCA9ICduYW1lJztcblxuICAvLyBmb3IgZXhhbXBsZTogdGFnLmlkXG4gIEBJbnB1dCgpIHZhbHVlRmllbGQgPSAnaWQnO1xuXG4gIC8vIGZvciBleGFtcGxlOiBBcnJheSBvZiBUYWdcbiAgQElucHV0KCkgaXRlbXM6IGFueVtdID0gW107XG4gIEBJbnB1dCgpIG1vZGFsVGl0bGUgPSAnRGlhbG9nJztcblxuICBAT3V0cHV0KCkgc2VsZWN0aW9uRmluaXNoZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc2VsZWN0TW9kZWw6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2RpYWxvZ0hvc3QnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgZGlhbG9nSG9zdDogVmlld0NvbnRhaW5lclJlZjtcblxuICAvLyBjbG9zZSBkaWFsb2cgb24gZXNjXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJywgWyckZXZlbnQnXSkgb25LZXlkb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uRmluaXNoZWQuZW1pdCgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdGhpcy5jb21wb25lbnRSZW5kZXJlclNlcnZpY2UgPSBuZXcgQ29tcG9uZW50UmVuZGVyZXJTZXJ2aWNlKGNoYW5nZURldGVjdG9yKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIGdldCBzZWxlY3RlZCBpdGVtcyBmcm9tIG1vZGVsJ3MgZmllbGRcbiAgICB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAvLyByZW5kZXIgY29tcG9uZW50IGluIGRpYWxvZ1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5jb21wb25lbnRSZW5kZXJlclNlcnZpY2VcbiAgICAgIC5zZXRNZXRob2QodGhpcy5tZXRob2QpXG4gICAgICAuc2V0U2V0dGluZ3ModGhpcy5zZXR0aW5ncylcbiAgICAgIC5zZXREaWFsb2dIb3N0KHRoaXMuZGlhbG9nSG9zdClcbiAgICAgIC5zZXRDb21wb25lbnRSZWYodGhpcy5jb21wb25lbnRSZWYpXG4gICAgICAucmVuZGVyKCk7XG5cbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdDb21wb25lbnQgZm9yIGRpYWxvZyBpcyBub3QgZGVmaW5lZCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NpbmdsZScpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkTW9kZWwgPSB0aGlzLm1vZGVsW3RoaXMuZ2V0T2JqZWN0RmllbGROYW1lKCldO1xuXG4gICAgICBpZiAoISFzZWxlY3RlZE1vZGVsKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50UmVuZGVyZXJTZXJ2aWNlLnNldFNlbGVjdGVkTW9kZWxzKFtcbiAgICAgICAgICBzZWxlY3RlZE1vZGVsXG4gICAgICAgIF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm1vZGUgPT09ICdtdWx0aXBsZScpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVuZGVyZXJTZXJ2aWNlLnNldFNlbGVjdGVkTW9kZWxzKFxuICAgICAgICB0aGlzLm1vZGVsW3RoaXMuZmllbGRdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGZvciBlZGl0IGNvbXBvbmVudFxuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZChpbnN0YW5jZS5zYXZlTW9kZWwuc3Vic2NyaWJlKChtb2RlbDogYW55KSA9PiB0aGlzLnNldE1vZGVsKG1vZGVsKSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgaW5zdGFuY2Uuc2VsZWN0LnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ211bHRpcGxlJykge1xuICAgICAgICAgICAgdGhpcy5tb2RlbFt0aGlzLmZpZWxkXSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5saXN0T3B0aW9ucy5zZWxlY3RlZEVsZW1lbnRzID0gW107XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcblxuICAgICAgICBtYXAoKG1vZGVsczogYW55W10pID0+IHtcbiAgICAgICAgICBpZiAobW9kZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9kZWxzO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZW1pdEV2ZW50cyhtb2RlbHMpO1xuXG4gICAgICAgICAgcmV0dXJuIG1vZGVscztcbiAgICAgICAgfSksXG4gICAgICApLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRJdGVtcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnc2luZ2xlJykge1xuICAgICAgdGhpcy5zZWxlY3RlZE1vZGVsID0gdGhpcy5tb2RlbFt0aGlzLmZpZWxkXTtcbiAgICB9XG4gIH1cblxuICBoaWRlTW9kYWwoKTogdm9pZCB7XG4gICAgLy8gZ2V0IGRpYWxvZyBjb21wb25lbnQgaW5zdGFuY2VcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5jb21wb25lbnRSZW5kZXJlclNlcnZpY2UuZ2V0U2VsZWN0ZWRNb2RlbHMoKTtcblxuICAgIC8vIGVtaXQgc2VsZWN0ZWQgZWxlbWVudHNcbiAgICB0aGlzLmVtaXRFdmVudHMoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAvLyByZXNldCBzZWxlY3RlZCBlbGVtZW50c1xuICAgIHRoaXMuY29tcG9uZW50UmVuZGVyZXJTZXJ2aWNlLnJlc2V0U2VsZWN0ZWRNb2RlbHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEV2ZW50cyhtb2RlbHM6IGFueVtdKTogdm9pZCB7XG4gICAgbW9kZWxzLmZvckVhY2goKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgIC8vIHRoaXMgbXVzdCBiZSBoYXBwZW4gb24gbXVsdGlwbGUgc2VsZWN0IGFuZCBvbiBzaWdubGUgc2VsZWN0IGNhc2UgdG9vXG4gICAgICB0aGlzLnNlbGVjdE1vZGVsLmVtaXQobW9kZWwpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zZWxlY3Rpb25GaW5pc2hlZC5lbWl0KG1vZGVscyk7XG4gIH1cblxuICBwcml2YXRlIGdldE9iamVjdEZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmZpZWxkLnNwbGl0KCdfaWQnKVswXTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TW9kZWwobW9kZWw6IGFueSk6IGFueSB7XG4gICAgLy8gVE9ETyB0ZXN0IHRoaXMgb24gZWRpdCBjYXNlXG4gIH1cbn1cbiIsIjwhLS0gb3ZlcmxheSAtLT5cbjxkaXYgY2xhc3M9XCJtb2RhbC1vdmVybGF5IGFjdGl2ZVwiPjwvZGl2PlxuXG48IS0tIG1vZGFsIC0tPlxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWQgbW9kYWwtbGcgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGVcIiByb2xlPVwiZG9jdW1lbnRcIj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuICAgICAgPCEtLSBoZWFkZXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTBcIj5cbiAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiPlxuICAgICAgICAgICAge3sgbW9kYWxUaXRsZSB9fVxuICAgICAgICAgIDwvaDU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMiB0ZXh0LWVuZFwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBjbG9zZVwiIChjbGljayk9XCJoaWRlTW9kYWwoKVwiIGFyaWEtbGFiZWw9XCJCZXrDoXLDoXNcIj5cbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gYm9keSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBkeW5hbWljQ29tcG9uZW50ICNkaWFsb2dIb3N0PjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19