UNPKG

@bi8/am-dyn-form

Version:

ng update @angular/cli yarn add @angular/cli

134 lines 24.3 kB
import * as tslib_1 from "tslib"; import { Component, OnInit, SkipSelf, Host, Optional, Input, ViewChild, ContentChild, AfterContentInit, AfterViewInit, ContentChildren, ElementRef, QueryList, ViewChildren, Directive, HostBinding } from '@angular/core'; import { ControlContainer, AbstractControl } from '@angular/forms'; import { DynFormGroup } from './dyn-form-group'; import { DynFormArray } from './dyn-form-array'; import { NgSelectComponent } from '@ng-select/ng-select'; import { DynAutoSelectControl } from './dyn-auto-select-control'; //import {LogService, Logger} from "@bi8/am-logger"; /*@Directive({selector: '[class]'}) export class Class { @HostBinding('class') @Input('class') className: string = ''; }*/ var DynFieldComponent = /** @class */ (function () { //@ContentChild('.ng-has-value') stuff; //@ViewChildren(Class, {read: ElementRef}) classes: QueryList<ElementRef>; function DynFieldComponent(controlContainer, elRef) { this.controlContainer = controlContainer; this.elRef = elRef; this.paths = []; this.messages = new Map(); } DynFieldComponent.prototype.ngAfterContentInit = function () { }; DynFieldComponent.prototype.ngAfterViewInit = function () { var bling = this.elRef.nativeElement.querySelector('.ng-select-container'); if (bling) { if (this.dfc instanceof DynAutoSelectControl) { this.dfc.element = bling; } } if (this.ngSelect && this.dfc instanceof DynAutoSelectControl) { this.dfc.ngSelectComponent = this.ngSelect; } }; /*removeClass(){ if ( this.classes && this.classes.length ) { return this .classes .map((elRef:ElementRef):Element => elRef.nativeElement) .filter( (element: Element) => element.classList.remove('ng-has-value')); } }*/ DynFieldComponent.prototype.ngOnInit = function () { var e_1, _a; this.dfc = this.controlContainer.control.get(this.name); this.placeholder = this.dfc.config.placeholder; this.hint = this.dfc.config.hint; try { for (var _b = tslib_1.__values(this.dfc.config.messages), _c = _b.next(); !_c.done; _c = _b.next()) { var entry = _c.value; this.messages.set(entry.key, entry.value); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } this.path = this.resolvePath(); }; DynFieldComponent.prototype.resolvePath = function () { var _this = this; var paths = [this.dfc.key]; this.resolveParentPath(this.dfc.parent, paths); var resolvedPath = ''; paths.reverse().forEach(function (path, index) { if (path) { if (resolvedPath) { resolvedPath += '.'; } resolvedPath += path; _this.paths.push(resolvedPath); } }); return resolvedPath; }; DynFieldComponent.prototype.resolveParentPath = function (control, paths) { if (control instanceof DynFormGroup) { paths.push(control.key); } else if (control instanceof DynFormArray) { paths.push(control.key); } if (control.parent) { this.resolveParentPath(control.parent, paths); } }; DynFieldComponent.prototype.resolveValidationMessage = function (type) { var message = ''; if (this.messages.has(type)) { message = this.messages.get(type); } else if (this.dfc.config.useDefaultErrorMessages) { switch (type) { case 'required': message = 'Value required'; break; case 'pattern': message = 'Invalid format'; break; case 'email': message = 'Invalid email'; break; } } return message; }; DynFieldComponent.ctorParameters = function () { return [ { type: ControlContainer, decorators: [{ type: Optional }, { type: Host }, { type: SkipSelf }] }, { type: ElementRef } ]; }; tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Object) ], DynFieldComponent.prototype, "name", void 0); tslib_1.__decorate([ ViewChild('ngselect', { static: false }), tslib_1.__metadata("design:type", NgSelectComponent) ], DynFieldComponent.prototype, "ngSelect", void 0); DynFieldComponent = tslib_1.__decorate([ Component({ selector: 'dyn-field', template: "<ng-container [ngSwitch]=\"dfc.type\">\r\n <div fxLayout=\"row\" class=\"am-field-row\">\r\n <!--=====[ AUTO SELECT FIELD ]=====-->\r\n <ng-container *ngSwitchCase=\"'autoselect'\">\r\n <div class=\"am-field-container\" fxLayout=\"row\" fxFlex>\r\n <ng-select #ngselect [items]=\"dfc.items$ | async\"\r\n [formControl]=\"dfc\"\r\n [placeholder]=\"dfc.getCustomPlaceholder()\"\r\n [bindLabel]=\"dfc.bindLabel\"\r\n [typeahead]=\"dfc.typeahead$\"\r\n [loading]=\"dfc.loading\"\r\n [bindValue]=\"dfc.bindValue\"\r\n [multiple]=\"dfc.multiple\"\r\n [searchable]=\"dfc.searchable\"\r\n fxFlex=\"1 1 auto\"\r\n [ngClass]=\"{'am-has-value': dfc.hasValue, 'am-no-value' : !dfc.hasValue}\"\r\n style=\"width: 100px;\">\r\n <ng-template ng-label-tmp let-item=\"item\" *ngIf=\"dfc.labelTemplate\" let-clear=\"clear\">\r\n <ng-container [ngTemplateOutlet]=\"dfc.labelTemplate\" [ngTemplateOutletContext]=\"{item: item, clear: clear}\"></ng-container>\r\n </ng-template>\r\n\r\n <ng-template ng-option-tmp let-item=\"item\" let-index=\"index\" let-search=\"searchTerm\" *ngIf=\"dfc.optionTemplate\">\r\n <ng-container [ngTemplateOutlet]=\"dfc.optionTemplate\" [ngTemplateOutletContext]=\"{item: item, index: index, search: search}\"></ng-container>\r\n </ng-template>\r\n </ng-select>\r\n <span class=\"am-select-error\" *ngIf=\"dfc.hasError('required') && dfc.touched\">{{resolveValidationMessage('required')}}</span>\r\n <span class=\"am-select-error\" *ngIf=\"dfc.hasError('pattern') && dfc.touched\">{{resolveValidationMessage('pattern')}}</span>\r\n <span class=\"am-select-error\" *ngIf=\"dfc.hasError('email') && dfc.touched\">{{resolveValidationMessage('email')}}</span>\r\n <span class=\"am-select-error\" *ngIf=\"dfc.hasError('match') && dfc.touched\">{{resolveValidationMessage('match')}}</span>\r\n <span class=\"am-select-error\" *ngIf=\"dfc.hasError('time') && dfc.touched\">{{resolveValidationMessage('time')}}</span>\r\n <span class=\"am-select-error\" *ngIf=\"dfc.hasError('logical') && dfc.touched\">{{dfc.logicalErrorMessage}}</span>\r\n </div>\r\n </ng-container>\r\n\r\n <!--=====[ TEXT FIELD ]=====-->\r\n <mat-form-field *ngSwitchCase=\"'text'\" [hintLabel]=\"hint\" fxFlex>\r\n <input matInput\r\n hideRequiredMarker=\"false\"\r\n [name]=\"dfc.key\"\r\n [formControl]=\"dfc\"\r\n [type]=\"dfc.config.format\"\r\n [placeholder]=\"placeholder\"\r\n [maxlength]=\"dfc.config.maxlimit\"\r\n [required]=\"dfc.config.required\"\r\n [dir]=\"dfc.config.dir\">\r\n\r\n <mat-hint *ngIf=\"dfc.config.counter && dfc.config.maxlimit\" align=\"end\" class=\"no-text-wrap\">{{dfc.value ? dfc.value.length : 0}} / {{dfc.config.maxlimit}}</mat-hint>\r\n\r\n <mat-error *ngIf=\"dfc.hasError('required')\">{{resolveValidationMessage('required')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('pattern')\">{{resolveValidationMessage('pattern')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('email')\">{{resolveValidationMessage('email')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('match')\">{{resolveValidationMessage('match')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('time')\">{{resolveValidationMessage('time')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('logical')\">{{dfc.logicalErrorMessage}}</mat-error>\r\n </mat-form-field>\r\n\r\n <!--=====[ TEXTAREA FIELD ]=====-->\r\n <mat-form-field *ngSwitchCase=\"'textarea'\" [hintLabel]=\"hint\" fxFlex>\r\n <textarea matInput\r\n hideRequiredMarker=\"false\"\r\n matTextareaAutosize\r\n [matAutosizeMinRows]=\"dfc.config.minRows\"\r\n [matAutosizeMaxRows]=\"dfc.config.maxRows\"\r\n [name]=\"dfc.key\"\r\n [formControl]=\"dfc\"\r\n [placeholder]=\"placeholder\"\r\n [maxlength]=\"dfc.config.maxlimit\"\r\n [required]=\"dfc.config.required\"\r\n [dir]=\"dfc.config.dir\"></textarea>\r\n\r\n <mat-hint *ngIf=\"dfc.config.counter && dfc.config.maxlimit\" align=\"end\" class=\"no-text-wrap\">{{dfc.value ? dfc.value.length : 0}} / {{dfc.config.maxlimit}}</mat-hint>\r\n <mat-error *ngIf=\"dfc.hasError('required')\">{{resolveValidationMessage('required')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('pattern')\">{{resolveValidationMessage('pattern')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('email')\">{{resolveValidationMessage('email')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('match')\">{{resolveValidationMessage('match')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('logical')\">{{dfc.logicalErrorMessage}}</mat-error>\r\n </mat-form-field>\r\n\r\n <!--=====[ AUTOCOMPLETE ]=====-->\r\n <ng-container *ngSwitchCase=\"'auto-complete'\">\r\n <mat-form-field fxFlex>\r\n <input matInput\r\n [name]=\"dfc.key\"\r\n [placeholder]=\"placeholder\"\r\n [matAutocomplete]=\"auto\"\r\n [formControl]=\"dfc\"\r\n [required]=\"dfc.config.required\"\r\n [dir]=\"dfc.config.dir\">\r\n\r\n <mat-error *ngIf=\"dfc.hasError('required')\">{{resolveValidationMessage('required')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('match')\">{{resolveValidationMessage('match')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('logical')\">{{dfc.logicalErrorMessage}}</mat-error>\r\n\r\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"dfc.displayFn.bind(dfc)\">\r\n <mat-option *ngFor=\"let opt of dfc.selectOptions$ | async\" [value]=\"opt\">\r\n {{dfc.displayFn(opt)}}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!--=====[ DATE ]=====-->\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <mat-form-field fxFlex>\r\n <input matInput\r\n hideRequiredMarker=\"false\"\r\n [name]=\"dfc.key\"\r\n [formControl]=\"dfc\"\r\n type=\"text\"\r\n [min]=\"dfc.minDate\"\r\n [max]=\"dfc.maxDate\"\r\n [required]=\"dfc.config.required\"\r\n [matDatepicker]=\"picker\"\r\n [placeholder]=\"placeholder\"\r\n style=\"pointer-events:none;\" />\r\n\r\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n\r\n <mat-error *ngIf=\"dfc.hasError('required')\">{{resolveValidationMessage('required')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('pattern')\">{{resolveValidationMessage('pattern')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('match')\">{{resolveValidationMessage('match')}}</mat-error>\r\n <mat-error *ngIf=\"dfc.hasError('logical')\">{{dfc.logicalErrorMessage}}</mat-error>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!--=====[ DATE ]=====-->\r\n <ng-container *ngSwitchCase=\"'time'\">\r\n <am-timepicker [formControl]=\"dfc\"></am-timepicker>\r\n </ng-container>\r\n\r\n <!--=====[ SELECT FIELD ]=====-->\r\n <ng-container *ngSwitchCase=\"'select'\" >\r\n <mat-form-field fxFlex>\r\n <mat-select [formControl]=\"dfc\"\r\n [placeholder]=\"placeholder\"\r\n [required]=\"dfc.config.required\"\r\n required=\"true\"\r\n [multiple]=\"dfc.multiple\">\r\n <mat-option *ngIf=\"dfc.showNone\" (click)=\"dfc.reset()\">{{dfc.noneLabel}}</mat-option>\r\n <mat-option *ngFor=\"let opt of dfc.selectOptions$ | async\" [value]=\"opt.code\">{{opt.value}}</mat-option>\r\n </mat-select>\r\n <mat-error *ngIf=\"dfc.hasError('required') && dfc.touched\">This option is required</mat-error>\r\n </mat-form-field>\r\n </ng-container>\r\n\r\n <!--=====[ CHECK BOX ]=====-->\r\n <ng-container *ngSwitchCase=\"'checkbox'\">\r\n <mat-checkbox [formControl]=\"dfc\" fxFlex>\r\n {{placeholder}}\r\n </mat-checkbox>\r\n </ng-container>\r\n\r\n <!--=====[ LABEL ]=====-->\r\n <ng-container *ngSwitchCase=\"'label'\">\r\n <div fxFlex>{{placeholder}}</div>\r\n </ng-container>\r\n </div>\r\n</ng-container>\r\n", styles: [""] }), tslib_1.__param(0, Optional()), tslib_1.__param(0, Host()), tslib_1.__param(0, SkipSelf()), tslib_1.__metadata("design:paramtypes", [ControlContainer, ElementRef]) ], DynFieldComponent); return DynFieldComponent; }()); export { DynFieldComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BiaTgvYW0tZHluLWZvcm0vIiwic291cmNlcyI6WyJhcHAvbW9kdWxlcy9hbS1keW4tZm9ybS9keW4tZmllbGQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixRQUFRLEVBQ1IsSUFBSSxFQUNKLFFBQVEsRUFDUixLQUFLLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGVBQWUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUM3RSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsZUFBZSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFakUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxvREFBb0Q7QUFFcEQ7OztHQUdHO0FBT0g7SUFnQkUsdUNBQXVDO0lBQ3ZDLDBFQUEwRTtJQUUxRSwyQkFBbUQsZ0JBQWtDLEVBQVUsS0FBaUI7UUFBN0QscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFVLFVBQUssR0FBTCxLQUFLLENBQVk7UUFaaEgsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUlyQixhQUFRLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFTMUMsQ0FBQztJQUVELDhDQUFrQixHQUFsQjtJQUNBLENBQUM7SUFFRCwyQ0FBZSxHQUFmO1FBQ0UsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFh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QUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsdUJBQXVCLEVBQUU7WUFDbEQsUUFBUSxJQUFJLEVBQUU7Z0JBQ1osS0FBSyxVQUFVO29CQUNiLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQztvQkFDM0IsTUFBTTtnQkFDUixLQUFLLFNBQVM7b0JBQ1osT0FBTyxHQUFHLGdCQUFnQixDQUFDO29CQUMzQixNQUFNO2dCQUNSLEtBQUssT0FBTztvQkFDVixPQUFPLEdBQUcsZUFBZSxDQUFDO29CQUMxQixNQUFNO2FBQ1Q7U0FDRjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7O2dCQTNGb0UsZ0JBQWdCLHVCQUF4RSxRQUFRLFlBQUksSUFBSSxZQUFJLFFBQVE7Z0JBQTZELFVBQVU7O0lBakJ2RztRQUFSLEtBQUssRUFBRTs7bURBQU07SUFZMEI7UUFBdkMsU0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsQ0FBQzswQ0FBVyxpQkFBaUI7dURBQUM7SUFkekQsaUJBQWlCO1FBTDdCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxXQUFXO1lBQ3JCLHNqUkFBeUM7O1NBRTFDLENBQUM7UUFvQmEsbUJBQUEsUUFBUSxFQUFFLENBQUEsRUFBRSxtQkFBQSxJQUFJLEVBQUUsQ0FBQSxFQUFFLG1CQUFBLFFBQVEsRUFBRSxDQUFBO2lEQUEwQixnQkFBZ0IsRUFBaUIsVUFBVTtPQW5CckcsaUJBQWlCLENBK0c3QjtJQUFELHdCQUFDO0NBQUEsQUEvR0QsSUErR0M7U0EvR1ksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgT25Jbml0LFxyXG4gIFNraXBTZWxmLFxyXG4gIEhvc3QsXHJcbiAgT3B0aW9uYWwsXHJcbiAgSW5wdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBBZnRlckNvbnRlbnRJbml0LFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBRdWVyeUxpc3QsIFZpZXdDaGlsZHJlbiwgRGlyZWN0aXZlLCBIb3N0QmluZGluZ1xyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0NvbnRyb2xDb250YWluZXIsIEFic3RyYWN0Q29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge0R5bkZvcm1Db250cm9sfSBmcm9tICcuL2R5bi1mb3JtLWNvbnRyb2wnO1xyXG5pbXBvcnQge0R5bkZvcm1Hcm91cH0gZnJvbSAnLi9keW4tZm9ybS1ncm91cCc7XHJcbmltcG9ydCB7RHluRm9ybUFycmF5fSBmcm9tICcuL2R5bi1mb3JtLWFycmF5JztcclxuaW1wb3J0IHtOZ1NlbGVjdENvbXBvbmVudH0gZnJvbSAnQG5nLXNlbGVjdC9uZy1zZWxlY3QnO1xyXG5pbXBvcnQge0R5bkF1dG9TZWxlY3RDb250cm9sfSBmcm9tICcuL2R5bi1hdXRvLXNlbGVjdC1jb250cm9sJztcclxuLy9pbXBvcnQge0xvZ1NlcnZpY2UsIExvZ2dlcn0gZnJvbSBcIkBiaTgvYW0tbG9nZ2VyXCI7XHJcblxyXG4vKkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnW2NsYXNzXSd9KVxyXG5leHBvcnQgY2xhc3MgQ2xhc3MgIHtcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgQElucHV0KCdjbGFzcycpIGNsYXNzTmFtZTogc3RyaW5nID0gJyc7XHJcbn0qL1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkeW4tZmllbGQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9keW4tZmllbGQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2R5bi1maWVsZC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEeW5GaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gIEBJbnB1dCgpIG5hbWU7XHJcblxyXG4gIC8vbG9nZ2VyOiBMb2dnZXI7XHJcbiAgZGZjOiBhbnk7XHJcbiAgcGF0aDogc3RyaW5nO1xyXG4gIHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIGhpbnQ6IHN0cmluZztcclxuICBtZXNzYWdlczogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgLy9AQ29udGVudENoaWxkKCduZ1NlbGVjdCcpIG5nU2VsZWN0OiBOZ1NlbGVjdENvbXBvbmVudDtcclxuICBAVmlld0NoaWxkKCduZ3NlbGVjdCcsIHtzdGF0aWM6IGZhbHNlfSkgbmdTZWxlY3Q6IE5nU2VsZWN0Q29tcG9uZW50O1xyXG5cclxuICAvL0BDb250ZW50Q2hpbGQoJy5uZy1oYXMtdmFsdWUnKSBzdHVmZjtcclxuICAvL0BWaWV3Q2hpbGRyZW4oQ2xhc3MsIHtyZWFkOiBFbGVtZW50UmVmfSkgY2xhc3NlczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASG9zdCgpIEBTa2lwU2VsZigpIHB1YmxpYyBjb250cm9sQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLCBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmKSB7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgYmxpbmcgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLm5nLXNlbGVjdC1jb250YWluZXInKTtcclxuICAgIGlmIChibGluZykge1xyXG4gICAgICBpZiAodGhpcy5kZmMgaW5zdGFuY2VvZiBEeW5BdXRvU2VsZWN0Q29udHJvbCkge1xyXG4gICAgICAgICh0aGlzLmRmYyBhcyBEeW5BdXRvU2VsZWN0Q29udHJvbCkuZWxlbWVudCA9IGJsaW5nO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubmdTZWxlY3QgJiYgdGhpcy5kZmMgaW5zdGFuY2VvZiBEeW5BdXRvU2VsZWN0Q29udHJvbCkge1xyXG4gICAgICAodGhpcy5kZmMgYXMgRHluQXV0b1NlbGVjdENvbnRyb2wpLm5nU2VsZWN0Q29tcG9uZW50ID0gdGhpcy5uZ1NlbGVjdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qcmVtb3ZlQ2xhc3MoKXtcclxuICAgIGlmICggdGhpcy5jbGFzc2VzICYmIHRoaXMuY2xhc3Nlcy5sZW5ndGggKSB7XHJcbiAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgLmNsYXNzZXNcclxuICAgICAgICAubWFwKChlbFJlZjpFbGVtZW50UmVmKTpFbGVtZW50ID0+IGVsUmVmLm5hdGl2ZUVsZW1lbnQpXHJcbiAgICAgICAgLmZpbHRlciggKGVsZW1lbnQ6IEVsZW1lbnQpID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbmctaGFzLXZhbHVlJykpO1xyXG4gICAgfVxyXG4gIH0qL1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZGZjID0gPER5bkZvcm1Db250cm9sPnRoaXMuY29udHJvbENvbnRhaW5lci5jb250cm9sLmdldCh0aGlzLm5hbWUpO1xyXG4gICAgdGhpcy5wbGFjZWhvbGRlciA9IHRoaXMuZGZjLmNvbmZpZy5wbGFjZWhvbGRlcjtcclxuICAgIHRoaXMuaGludCA9IHRoaXMuZGZjLmNvbmZpZy5oaW50O1xyXG5cclxuICAgIGZvciAobGV0IGVudHJ5IG9mIHRoaXMuZGZjLmNvbmZpZy5tZXNzYWdlcykge1xyXG4gICAgICB0aGlzLm1lc3NhZ2VzLnNldChlbnRyeS5rZXksIGVudHJ5LnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBhdGggPSB0aGlzLnJlc29sdmVQYXRoKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc29sdmVQYXRoKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgcGF0aHM6IHN0cmluZ1tdID0gW3RoaXMuZGZjLmtleV07XHJcbiAgICB0aGlzLnJlc29sdmVQYXJlbnRQYXRoKHRoaXMuZGZjLnBhcmVudCwgcGF0aHMpO1xyXG5cclxuICAgIGxldCByZXNvbHZlZFBhdGggPSAnJztcclxuXHJcbiAgICBwYXRocy5yZXZlcnNlKCkuZm9yRWFjaCgocGF0aCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKHBhdGgpIHtcclxuICAgICAgICBpZiAocmVzb2x2ZWRQYXRoKSB7XHJcbiAgICAgICAgICByZXNvbHZlZFBhdGggKz0gJy4nO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXNvbHZlZFBhdGggKz0gcGF0aDtcclxuICAgICAgICB0aGlzLnBhdGhzLnB1c2gocmVzb2x2ZWRQYXRoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzb2x2ZVBhcmVudFBhdGgoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwYXRoczogc3RyaW5nW10pIHtcclxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHluRm9ybUdyb3VwKSB7XHJcbiAgICAgIHBhdGhzLnB1c2goKGNvbnRyb2wgYXMgRHluRm9ybUdyb3VwKS5rZXkpO1xyXG5cclxuICAgIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIER5bkZvcm1BcnJheSkge1xyXG4gICAgICBwYXRocy5wdXNoKChjb250cm9sIGFzIER5bkZvcm1BcnJheSkua2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29udHJvbC5wYXJlbnQpIHtcclxuICAgICAgdGhpcy5yZXNvbHZlUGFyZW50UGF0aChjb250cm9sLnBhcmVudCwgcGF0aHMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVzb2x2ZVZhbGlkYXRpb25NZXNzYWdlKHR5cGU6IHN0cmluZykge1xyXG4gICAgbGV0IG1lc3NhZ2UgPSAnJztcclxuICAgIGlmICh0aGlzLm1lc3NhZ2VzLmhhcyh0eXBlKSkge1xyXG4gICAgICBtZXNzYWdlID0gdGhpcy5tZXNzYWdlcy5nZXQodHlwZSlcclxuXHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGZjLmNvbmZpZy51c2VEZWZhdWx0RXJyb3JNZXNzYWdlcykge1xyXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICBjYXNlICdyZXF1aXJlZCc6XHJcbiAgICAgICAgICBtZXNzYWdlID0gJ1ZhbHVlIHJlcXVpcmVkJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3BhdHRlcm4nOlxyXG4gICAgICAgICAgbWVzc2FnZSA9ICdJbnZhbGlkIGZvcm1hdCc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdlbWFpbCc6XHJcbiAgICAgICAgICBtZXNzYWdlID0gJ0ludmFsaWQgZW1haWwnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBtZXNzYWdlO1xyXG4gIH1cclxufVxyXG4iXX0=