UNPKG

@knora/action

Version:
286 lines 32.5 kB
import * as tslib_1 from "tslib"; import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; import { MatMenuTrigger } from '@angular/material'; let StringLiteralInputComponent = class StringLiteralInputComponent { constructor(_fb) { this._fb = _fb; this.languages = ['de', 'fr', 'it', 'en']; /** * Optional placeholder for the input field e.g. Label * * @param {string} [placeholder='Label'] */ this.placeholder = 'Label'; /** * Optional form field input type: textarea? set to true for textarea * otherwise it's a simple (short) input field * * @param {boolean} [textarea=false] */ this.textarea = false; /** * Optional form field value of type StringLiteral[] * * @param {StringLiteral[]} value */ this.value = []; /** * Optional disable the input field in case of no right to edit the field/value * * @param {boolean}: [disabled=false] */ this.disabled = false; /** * The readonly attribute specifies whether the control may be modified by the user. * * @param {boolean}: [readonly=false] */ this.readonly = false; /** * Returns (output) an array of StringLiteral on any change on the input field. * * @emits {StringLiteral[]} dataChanged */ this.dataChanged = new EventEmitter(); /** * Returns (output) true when the field was touched. This can be used to validate data, e.g. in case a value is required * * @emits {boolean} touched */ this.touched = new EventEmitter(); /** * Returns true when a user press ENTER. This can be used to submit data in the parent component. * * * @emits {boolean} enter */ this.enter = new EventEmitter(); // set selected language, if it's not defined yet if (!this.language) { if (localStorage.getItem('session') !== null) { // get language from the logged-in user profile data this.language = JSON.parse(localStorage.getItem('session')).user.lang; } else { // get default language from browser this.language = navigator.language.substr(0, 2); } } // does the defined language exists in our supported languages list? if (this.languages.indexOf(this.language) === -1) { // if not, select the first language from our list of supported languages this.language = this.languages[0]; } } ngOnInit() { // if (this.placeholder.length > 0) { // this.placeholder += ' (' + this.language + ')'; // } // reset stringLiterals if they have empty values this.resetValues(); // build the form this.form = this._fb.group({ text: new FormControl({ value: '', disabled: this.disabled }, { // updateOn: 'blur' }) }); // update values on form change this.form.valueChanges.subscribe(data => this.onValueChanged()); // get value from stringLiterals const val = this.getValueFromStringLiteral(this.language); this.updateFormField(val); } /** * @ignore * * emit data to parent on any change on the input field */ onValueChanged() { if (!this.form) { return; } const form = this.form; const control = form.get('text'); this.touched.emit(control && control.dirty); // if (control && control.dirty) { // console.warn('control dirty'); // } this.updateStringLiterals(this.language, this.form.controls['text'].value); this.dataChanged.emit(this.value); } toggleAll() { // TODO: open/show all languages with their values } /** * @ignore * * Set the language after selecting; This updates the array of StringLiterals: adds item with the selected language if it doesn't exist */ setLanguage(lang) { if (this.language === lang) { // console.warn('DO NOTHING! this language was already selected'); } else { // clean stringLIteral value for previous language, if text field is empty this.updateStringLiterals(this.language, this.form.controls['text'].value); this.language = lang; // update form field value / reset in case of no value const val = this.getValueFromStringLiteral(lang); this.updateFormField(val); } } /** * @ignore * * Switch focus to input field after selecting a language */ switchFocus() { // close the menu if (!this.textarea && this.btnToSelectLanguage && this.btnToSelectLanguage.menuOpen) { this.btnToSelectLanguage.closeMenu(); } if (!this.disabled) { this.form.controls['text'].enable(); this.textInput.nativeElement.focus(); } } /** * @ignore * * Set the value in the input field */ updateFormField(value) { if (!value) { value = ''; } this.form.controls['text'].setValue(value); } /** * @ignore * * Update the array of StringLiterals depending on value / empty value add or remove item from array. */ updateStringLiterals(lang, value) { const index = this.value.findIndex(i => i.language === lang); if (index > -1 && this.value[index].value.length > 0) { // value is not empty and exists in list of stringLiterals // console.log('update existing value for ' + lang + ' on position ' + index); this.value[index].value = value; } if ((!value || value.length === 0) && index > -1) { // value is empty: delete stringLiteral item for this language // console.log('delete empty value for ' + lang + ' on position ' + index); this.value.splice(index, 1); } if (index < 0 && value) { // value doesn't exist in stringLiterals: add one // console.log('add new value (' + value + ') for ' + lang); const newValue = { value: value, language: lang }; this.value.push(newValue); } } /** * @ignore * * In case of strange array of StringLiterals, this method will reset to a API-conform array. This means an array without empty values. */ resetValues() { const length = this.value.length; if (length > 0) { let index = length - 1; while (index >= 0) { // remove items with empty value if (!this.value[index].value.length) { this.value.splice(index, 1); } index--; } // does an item for selected lanuage exists if (this.value.findIndex(i => i.language === this.language) === -1) { this.language = this.value[0].language; } } else { this.value = []; } } /** * @ignore * * Get the value from array of StringLiterals for the selected language */ getValueFromStringLiteral(lang) { // console.log('existing value in', this.value); // get index for this language const index = this.value.findIndex(i => i.language === lang); if (this.value[index] && this.value[index].value.length > 0) { return this.value[index].value; } else { return undefined; } } }; StringLiteralInputComponent.ctorParameters = () => [ { type: FormBuilder } ]; tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], StringLiteralInputComponent.prototype, "placeholder", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", String) ], StringLiteralInputComponent.prototype, "language", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], StringLiteralInputComponent.prototype, "textarea", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Array) ], StringLiteralInputComponent.prototype, "value", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], StringLiteralInputComponent.prototype, "disabled", void 0); tslib_1.__decorate([ Input(), tslib_1.__metadata("design:type", Boolean) ], StringLiteralInputComponent.prototype, "readonly", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], StringLiteralInputComponent.prototype, "dataChanged", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], StringLiteralInputComponent.prototype, "touched", void 0); tslib_1.__decorate([ Output(), tslib_1.__metadata("design:type", EventEmitter) ], StringLiteralInputComponent.prototype, "enter", void 0); tslib_1.__decorate([ ViewChild('textInput', { static: false }), tslib_1.__metadata("design:type", ElementRef) ], StringLiteralInputComponent.prototype, "textInput", void 0); tslib_1.__decorate([ ViewChild('btnToSelectLanguage', { static: false }), tslib_1.__metadata("design:type", MatMenuTrigger) ], StringLiteralInputComponent.prototype, "btnToSelectLanguage", void 0); StringLiteralInputComponent = tslib_1.__decorate([ Component({ selector: 'kui-string-literal-input', template: "<form [formGroup]=\"form\">\n\n <!-- default input element -->\n <mat-form-field *ngIf=\"!textarea\" class=\"string-literal short-text\">\n\n <!-- select: button to select language -->\n <button mat-button type=\"button\" matPrefix class=\"select-lang\" [matMenuTriggerFor]=\"selectLanguage\"\n #btnToSelectLanguage=\"matMenuTrigger\" (click)=\"form.controls['text'].disable()\">\n <span class=\"label\">{{language}}</span>\n <mat-icon class=\"icon\" matSuffix>keyboard_arrow_down</mat-icon>\n </button>\n\n <!-- select: menu with list of languages -->\n <mat-menu #selectLanguage=\"matMenu\">\n <button mat-menu-item type=\"button\" *ngFor=\"let lang of languages\"\n (click)=\"setLanguage(lang);switchFocus()\">\n <span [class.existing-value]=\"getValueFromStringLiteral(lang)\">{{lang}}</span>\n </button>\n <!-- TODO / QUESTION: should we support a show all button, to display values for all languages?\n <mat-divider></mat-divider>\n <button mat-menu-item type=\"button\" (click)=\"toggleAll()\">\n <span>Show values for all languages</span>\n </button>\n -->\n </mat-menu>\n\n <!-- input field-->\n <input matInput [placeholder]=\"placeholder\" [formControl]=\"form.controls['text']\" #textInput\n [readonly]=\"readonly\" (keyup.enter)=\"enter.emit(true)\">\n </mat-form-field>\n\n <!-- input element type is textarea -->\n <div *ngIf=\"textarea\" class=\"string-literal long-text\">\n <!-- button toggle group: buttons to select language -->\n <mat-button-toggle-group matPrefix #group=\"matButtonToggleGroup\" vertical class=\"string-literal-select-lang\">\n <mat-button-toggle *ngFor=\"let lang of languages\" (click)=\"setLanguage(lang);switchFocus()\"\n [checked]=\"lang === language\">\n <span [class.existing-value]=\"getValueFromStringLiteral(lang)\">{{lang}}</span>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <mat-form-field class=\"string-literal-textarea\">\n <!-- textarea -->\n <textarea matInput [placeholder]=\"placeholder\" [formControl]=\"form.controls['text']\" #textInput\n [readonly]=\"readonly\"></textarea>\n </mat-form-field>\n </div>\n\n</form>\n", styles: [".mat-form-field{width:100%!important}.existing-value{font-weight:700}"] }), tslib_1.__metadata("design:paramtypes", [FormBuilder]) ], StringLiteralInputComponent); export { StringLiteralInputComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLWxpdGVyYWwtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGtub3JhL2FjdGlvbi8iLCJzb3VyY2VzIjpbImxpYi9zdHJpbmctbGl0ZXJhbC1pbnB1dC9zdHJpbmctbGl0ZXJhbC1pbnB1dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFRbkQsSUFBYSwyQkFBMkIsR0FBeEMsTUFBYSwyQkFBMkI7SUEyRXBDLFlBQ1ksR0FBZ0I7UUFBaEIsUUFBRyxHQUFILEdBQUcsQ0FBYTtRQXpFNUIsY0FBUyxHQUFhLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFL0M7Ozs7V0FJRztRQUNNLGdCQUFXLEdBQVksT0FBTyxDQUFDO1FBU3hDOzs7OztXQUtHO1FBQ00sYUFBUSxHQUFhLEtBQUssQ0FBQztRQUVwQzs7OztXQUlHO1FBQ00sVUFBSyxHQUFxQixFQUFFLENBQUM7UUFFdEM7Ozs7V0FJRztRQUNNLGFBQVEsR0FBYSxLQUFLLENBQUM7UUFFcEM7Ozs7V0FJRztRQUNNLGFBQVEsR0FBYSxLQUFLLENBQUM7UUFFcEM7Ozs7V0FJRztRQUNPLGdCQUFXLEdBQWtDLElBQUksWUFBWSxFQUFtQixDQUFDO1FBRTNGOzs7O1dBSUc7UUFDTyxZQUFPLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFFdkU7Ozs7V0FJRztRQUNPLFVBQUssR0FBMEIsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQVlqRSxpREFBaUQ7UUFDakQs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U0FBUyxDQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztzQ0FBWSxVQUFVOzhEQUFDO0FBRVo7SUFBcEQsU0FBUyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDO3NDQUFzQixjQUFjO3dFQUFDO0FBdkVoRiwyQkFBMkI7SUFMdkMsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLDBCQUEwQjtRQUNwQywrOEVBQW9EOztLQUV2RCxDQUFDOzZDQTZFbUIsV0FBVztHQTVFbkIsMkJBQTJCLENBNlJ2QztTQTdSWSwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0TWVudVRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG5pbXBvcnQgeyBTdHJpbmdMaXRlcmFsIH0gZnJvbSAnQGtub3JhL2FwaSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAna3VpLXN0cmluZy1saXRlcmFsLWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc3RyaW5nLWxpdGVyYWwtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3N0cmluZy1saXRlcmFsLWlucHV0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU3RyaW5nTGl0ZXJhbElucHV0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuXG4gICAgbGFuZ3VhZ2VzOiBzdHJpbmdbXSA9IFsnZGUnLCAnZnInLCAnaXQnLCAnZW4nXTtcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbmFsIHBsYWNlaG9sZGVyIGZvciB0aGUgaW5wdXQgZmllbGQgZS5nLiBMYWJlbFxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBbcGxhY2Vob2xkZXI9J0xhYmVsJ11cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwbGFjZWhvbGRlcj86IHN0cmluZyA9ICdMYWJlbCc7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBwcmVkZWZpbmVkIChzZWxlY3RlZCkgbGFuZ3VhZ2U6IGVuLCBkZSwgaXQsIGZyLCBldGMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGxhbmd1YWdlXG4gICAgICovXG4gICAgQElucHV0KCkgbGFuZ3VhZ2U/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBmb3JtIGZpZWxkIGlucHV0IHR5cGU6IHRleHRhcmVhPyBzZXQgdG8gdHJ1ZSBmb3IgdGV4dGFyZWFcbiAgICAgKiBvdGhlcndpc2UgaXQncyBhIHNpbXBsZSAoc2hvcnQpIGlucHV0IGZpZWxkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSBbdGV4dGFyZWE9ZmFsc2VdXG4gICAgICovXG4gICAgQElucHV0KCkgdGV4dGFyZWE/OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBmb3JtIGZpZWxkIHZhbHVlIG9mIHR5cGUgU3RyaW5nTGl0ZXJhbFtdXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ0xpdGVyYWxbXX0gdmFsdWVcbiAgICAgKi9cbiAgICBASW5wdXQoKSB2YWx1ZT86IFN0cmluZ0xpdGVyYWxbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgZGlzYWJsZSB0aGUgaW5wdXQgZmllbGQgaW4gY2FzZSBvZiBubyByaWdodCB0byBlZGl0IHRoZSBmaWVsZC92YWx1ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtib29sZWFufTogW2Rpc2FibGVkPWZhbHNlXVxuICAgICAqL1xuICAgIEBJbnB1dCgpIGRpc2FibGVkPzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJlYWRvbmx5IGF0dHJpYnV0ZSBzcGVjaWZpZXMgd2hldGhlciB0aGUgY29udHJvbCBtYXkgYmUgbW9kaWZpZWQgYnkgdGhlIHVzZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59OiBbcmVhZG9ubHk9ZmFsc2VdXG4gICAgICovXG4gICAgQElucHV0KCkgcmVhZG9ubHk/OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIChvdXRwdXQpIGFuIGFycmF5IG9mIFN0cmluZ0xpdGVyYWwgb24gYW55IGNoYW5nZSBvbiB0aGUgaW5wdXQgZmllbGQuXG4gICAgICpcbiAgICAgKiBAZW1pdHMge1N0cmluZ0xpdGVyYWxbXX0gZGF0YUNoYW5nZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZGF0YUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxTdHJpbmdMaXRlcmFsW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxTdHJpbmdMaXRlcmFsW10+KCk7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIChvdXRwdXQpIHRydWUgd2hlbiB0aGUgZmllbGQgd2FzIHRvdWNoZWQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgZGF0YSwgZS5nLiBpbiBjYXNlIGEgdmFsdWUgaXMgcmVxdWlyZWRcbiAgICAgKlxuICAgICAqIEBlbWl0cyB7Ym9vbGVhbn0gdG91Y2hlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSB0b3VjaGVkOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiBhIHVzZXIgcHJlc3MgRU5URVIuIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3VibWl0IGRhdGEgaW4gdGhlIHBhcmVudCBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiAqIEBlbWl0cyB7Ym9vbGVhbn0gZW50ZXJcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZW50ZXI6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIEBWaWV3Q2hpbGQoJ3RleHRJbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSB0ZXh0SW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdidG5Ub1NlbGVjdExhbmd1YWdlJywgeyBzdGF0aWM6IGZhbHNlIH0pIGJ0blRvU2VsZWN0TGFuZ3VhZ2U6IE1hdE1lbnVUcmlnZ2VyO1xuXG4gICAgZm9ybTogRm9ybUdyb3VwO1xuXG4gICAgY29uc3RydWN0b3IgKFxuICAgICAgICBwcml2YXRlIF9mYjogRm9ybUJ1aWxkZXJcbiAgICApIHtcblxuICAgICAgICAvLyBzZXQgc2VsZWN0ZWQgbGFuZ3VhZ2UsIGlmIGl0J3Mgbm90IGRlZmluZWQgeWV0XG4gICAgICAgIGlmICghdGhpcy5sYW5ndWFnZSkge1xuICAgICAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZXNzaW9uJykgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgbGFuZ3VhZ2UgZnJvbSB0aGUgbG9nZ2VkLWluIHVzZXIgcHJvZmlsZSBkYXRhXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Nlc3Npb24nKSkudXNlci5sYW5nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgZGVmYXVsdCBsYW5ndWFnZSBmcm9tIGJyb3dzZXJcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbmF2aWdhdG9yLmxhbmd1YWdlLnN1YnN0cigwLCAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRvZXMgdGhlIGRlZmluZWQgbGFuZ3VhZ2UgZXhpc3RzIGluIG91ciBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGxpc3Q/XG4gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlcy5pbmRleE9mKHRoaXMubGFuZ3VhZ2UpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gaWYgbm90LCBzZWxlY3QgdGhlIGZpcnN0IGxhbmd1YWdlIGZyb20gb3VyIGxpc3Qgb2Ygc3VwcG9ydGVkIGxhbmd1YWdlc1xuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IHRoaXMubGFuZ3VhZ2VzWzBdO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcblxuICAgICAgICAvLyBpZiAodGhpcy5wbGFjZWhvbGRlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vICAgICB0aGlzLnBsYWNlaG9sZGVyICs9ICcgKCcgKyB0aGlzLmxhbmd1YWdlICsgJyknO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gcmVzZXQgc3RyaW5nTGl0ZXJhbHMgaWYgdGhleSBoYXZlIGVtcHR5IHZhbHVlc1xuICAgICAgICB0aGlzLnJlc2V0VmFsdWVzKCk7XG5cbiAgICAgICAgLy8gYnVpbGQgdGhlIGZvcm1cbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5fZmIuZ3JvdXAoe1xuICAgICAgICAgICAgdGV4dDogbmV3IEZvcm1Db250cm9sKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGVPbjogJ2JsdXInXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gdXBkYXRlIHZhbHVlcyBvbiBmb3JtIGNoYW5nZVxuICAgICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZShkYXRhID0+IHRoaXMub25WYWx1ZUNoYW5nZWQoKSk7XG5cbiAgICAgICAgLy8gZ2V0IHZhbHVlIGZyb20gc3RyaW5nTGl0ZXJhbHNcbiAgICAgICAgY29uc3QgdmFsID0gdGhpcy5nZXRWYWx1ZUZyb21TdHJpbmdMaXRlcmFsKHRoaXMubGFuZ3VhZ2UpO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1GaWVsZCh2YWwpO1xuXG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICpcbiAgICAgKiBlbWl0IGRhdGEgdG8gcGFyZW50IG9uIGFueSBjaGFuZ2Ugb24gdGhlIGlucHV0IGZpZWxkXG4gICAgICovXG4gICAgb25WYWx1ZUNoYW5nZWQoKSB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5mb3JtO1xuICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybS5nZXQoJ3RleHQnKTtcbiAgICAgICAgdGhpcy50b3VjaGVkLmVtaXQoY29udHJvbCAmJiBjb250cm9sLmRpcnR5KTtcblxuICAgICAgICAvLyBpZiAoY29udHJvbCAmJiBjb250cm9sLmRpcnR5KSB7XG4gICAgICAgIC8vIGNvbnNvbGUud2FybignY29udHJvbCBkaXJ0eScpO1xuXG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVN0cmluZ0xpdGVyYWxzKHRoaXMubGFuZ3VhZ2UsIHRoaXMuZm9ybS5jb250cm9sc1sndGV4dCddLnZhbHVlKTtcblxuICAgICAgICB0aGlzLmRhdGFDaGFuZ2VkLmVtaXQodGhpcy52YWx1ZSk7XG5cbiAgICB9XG5cbiAgICB0b2dnbGVBbGwoKSB7XG4gICAgICAgIC8vIFRPRE86IG9wZW4vc2hvdyBhbGwgbGFuZ3VhZ2VzIHdpdGggdGhlaXIgdmFsdWVzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogU2V0IHRoZSBsYW5ndWFnZSBhZnRlciBzZWxlY3Rpbmc7IFRoaXMgdXBkYXRlcyB0aGUgYXJyYXkgb2YgU3RyaW5nTGl0ZXJhbHM6IGFkZHMgaXRlbSB3aXRoIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICovXG4gICAgc2V0TGFuZ3VhZ2UobGFuZzogc3RyaW5nKSB7XG5cbiAgICAgICAgaWYgKHRoaXMubGFuZ3VhZ2UgPT09IGxhbmcpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybignRE8gTk9USElORyEgdGhpcyBsYW5ndWFnZSB3YXMgYWxyZWFkeSBzZWxlY3RlZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY2xlYW4gc3RyaW5nTEl0ZXJhbCB2YWx1ZSBmb3IgcHJldmlvdXMgbGFuZ3VhZ2UsIGlmIHRleHQgZmllbGQgaXMgZW1wdHlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RyaW5nTGl0ZXJhbHModGhpcy5sYW5ndWFnZSwgdGhpcy5mb3JtLmNvbnRyb2xzWyd0ZXh0J10udmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZztcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBmb3JtIGZpZWxkIHZhbHVlIC8gcmVzZXQgaW4gY2FzZSBvZiBubyB2YWx1ZVxuICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5nZXRWYWx1ZUZyb21TdHJpbmdMaXRlcmFsKGxhbmcpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVGb3JtRmllbGQodmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKlxuICAgICAqIFN3aXRjaCBmb2N1cyB0byBpbnB1dCBmaWVsZCBhZnRlciBzZWxlY3RpbmcgYSBsYW5ndWFnZVxuICAgICAqL1xuICAgIHN3aXRjaEZvY3VzKCkge1xuICAgICAgICAvLyBjbG9zZSB0aGUgbWVudVxuICAgICAgICBpZiAoIXRoaXMudGV4dGFyZWEgJiYgdGhpcy5idG5Ub1NlbGVjdExhbmd1YWdlICYmIHRoaXMuYnRuVG9TZWxlY3RMYW5ndWFnZS5tZW51T3Blbikge1xuICAgICAgICAgICAgdGhpcy5idG5Ub1NlbGVjdExhbmd1YWdlLmNsb3NlTWVudSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbJ3RleHQnXS5lbmFibGUoKTtcbiAgICAgICAgICAgIHRoaXMudGV4dElucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBpZ25vcmVcbiAgICAgKlxuICAgICAqIFNldCB0aGUgdmFsdWUgaW4gdGhlIGlucHV0IGZpZWxkXG4gICAgICovXG4gICAgdXBkYXRlRm9ybUZpZWxkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbJ3RleHQnXS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogVXBkYXRlIHRoZSBhcnJheSBvZiBTdHJpbmdMaXRlcmFscyBkZXBlbmRpbmcgb24gdmFsdWUgLyBlbXB0eSB2YWx1ZSBhZGQgb3IgcmVtb3ZlIGl0ZW0gZnJvbSBhcnJheS5cbiAgICAgKi9cbiAgICB1cGRhdGVTdHJpbmdMaXRlcmFscyhsYW5nOiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWx1ZS5maW5kSW5kZXgoaSA9PiBpLmxhbmd1YWdlID09PSBsYW5nKTtcblxuICAgICAgICBpZiAoaW5kZXggPiAtMSAmJiB0aGlzLnZhbHVlW2luZGV4XS52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB2YWx1ZSBpcyBub3QgZW1wdHkgYW5kIGV4aXN0cyBpbiBsaXN0IG9mIHN0cmluZ0xpdGVyYWxzXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygndXBkYXRlIGV4aXN0aW5nIHZhbHVlIGZvciAnICsgbGFuZyArICcgb24gcG9zaXRpb24gJyArIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMudmFsdWVbaW5kZXhdLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKCF2YWx1ZSB8fCB2YWx1ZS5sZW5ndGggPT09IDApICYmIGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIC8vIHZhbHVlIGlzIGVtcHR5OiBkZWxldGUgc3RyaW5nTGl0ZXJhbCBpdGVtIGZvciB0aGlzIGxhbmd1YWdlXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnZGVsZXRlIGVtcHR5IHZhbHVlIGZvciAnICsgbGFuZyArICcgb24gcG9zaXRpb24gJyArIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleCA8IDAgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgIC8vIHZhbHVlIGRvZXNuJ3QgZXhpc3QgaW4gc3RyaW5nTGl0ZXJhbHM6IGFkZCBvbmVcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdhZGQgbmV3IHZhbHVlICgnICsgdmFsdWUgKyAnKSBmb3IgJyArIGxhbmcpO1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWU6IFN0cmluZ0xpdGVyYWwgPSB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5nXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5wdXNoKG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogSW4gY2FzZSBvZiBzdHJhbmdlIGFycmF5IG9mIFN0cmluZ0xpdGVyYWxzLCB0aGlzIG1ldGhvZCB3aWxsIHJlc2V0IHRvIGEgQVBJLWNvbmZvcm0gYXJyYXkuIFRoaXMgbWVhbnMgYW4gYXJyYXkgd2l0aG91dCBlbXB0eSB2YWx1ZXMuXG4gICAgICovXG4gICAgcmVzZXRWYWx1ZXMoKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aDogbnVtYmVyID0gdGhpcy52YWx1ZS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgICAgICAgICB3aGlsZSAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpdGVtcyB3aXRoIGVtcHR5IHZhbHVlXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnZhbHVlW2luZGV4XS52YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmRleC0tO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkb2VzIGFuIGl0ZW0gZm9yIHNlbGVjdGVkIGxhbnVhZ2UgZXhpc3RzXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZS5maW5kSW5kZXgoaSA9PiBpLmxhbmd1YWdlID09PSB0aGlzLmxhbmd1YWdlKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gdGhpcy52YWx1ZVswXS5sYW5ndWFnZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBmcm9tIGFycmF5IG9mIFN0cmluZ0xpdGVyYWxzIGZvciB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2VcbiAgICAgKi9cbiAgICBnZXRWYWx1ZUZyb21TdHJpbmdMaXRlcmFsKGxhbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdleGlzdGluZyB2YWx1ZSBpbicsIHRoaXMudmFsdWUpO1xuICAgICAgICAvLyBnZXQgaW5kZXggZm9yIHRoaXMgbGFuZ3VhZ2VcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZhbHVlLmZpbmRJbmRleChpID0+IGkubGFuZ3VhZ2UgPT09IGxhbmcpO1xuXG4gICAgICAgIGlmICh0aGlzLnZhbHVlW2luZGV4XSAmJiB0aGlzLnZhbHVlW2luZGV4XS52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZVtpbmRleF0udmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICB9XG5cbn1cbiJdfQ==