UNPKG

@kephas/angular

Version:

Provides integration capabilities with Angular.

203 lines 19.6 kB
import { Input, ElementRef, ViewContainerRef, Component } from '@angular/core'; import { WidgetBase } from '../../public-api'; /** * Provides a base implementation for value editors. * * @export * @abstract * @class ValueEditorBase * @implements {OnInit} * @implements {AfterViewInit} * @implements {ControlValueAccessor} * @template TValue The value type. */ export class ValueEditorBase extends WidgetBase { /** * Creates an instance of ValueEditorBase. * * @param {ElementRef} elementRef The element reference. * @param {ViewContainerRef} viewContainerRef The view container reference. * @memberof ValueEditorBase */ constructor(elementRef, viewContainerRef) { super(elementRef, viewContainerRef); /** * Gets or sets a value indicating whether the value is changed from the change event. * * @protected * @memberof ValueEditorBase */ this.valueChangeFromEvent = false; /** * Gets or sets a value indicating whether the value is changed from the value property. * * @protected * @memberof ValueEditorBase */ this.valueChangeFromValue = false; this._onChange = (_) => { // The implementation will get overwritten by Angular in RegisterOnChange. }; this._onTouched = () => { // The implementation will get overwritten by Angular in RegisterOnTouched. }; } /** * Gets or sets the value to edit. * * @type {TValue} * @memberOf ValueEditorBase */ get value() { return this.getEditorValue(); } set value(value) { if (this._valueBeforeChange === value) { return; } this.updateEditor(value); } /** * Updates the underlying editor with the provided value. * * @protected * @param {TValue} value * @returns {boolean} * @memberof ValueEditorBase */ updateEditor(value) { if (this.valueChangeFromValue) { return false; } const prevValueChangeFromValue = this.valueChangeFromValue; this.valueChangeFromValue = true; try { const oldValue = this._valueBeforeChange; this.onValueChanging(oldValue, value); this._valueBeforeChange = value; if (!this.valueChangeFromEvent) { this.setEditorValue(value); value = this.getEditorValue(); } this.onValueChanged(oldValue, value); } catch (error) { this.logger.error(error, 'Error while updating the editor.'); throw error; } finally { this.valueChangeFromValue = prevValueChangeFromValue; } return true; } /** * Overridable method invoked when the value is about to be changed. * * @protected * @param {(TValue | undefined)} oldValue The old value. * @param {(TValue | undefined)} newValue The new value. * @memberof ValueEditorBase */ onValueChanging(oldValue, newValue) { } /** * Overridable method invoked after the value was changed. * * @protected * @param {(TValue | undefined)} oldValue The old value. * @param {(TValue | undefined)} newValue The new value. * @memberof ValueEditorBase */ onValueChanged(oldValue, newValue) { this._onChange(newValue); } /** * Callback invoked from the change event of the underlying editor. * * @protected * @param {*} e * @returns * @memberof PropertyEditorComponent */ onEditorChange(e) { if (this.valueChangeFromValue) { return; } const prevValueChangeFromEvent = this.valueChangeFromEvent; this.valueChangeFromEvent = true; try { const newValue = this.getEditorValueOnChange(e); this.value = newValue; } catch (error) { this.notification.notifyError(error); } finally { this.valueChangeFromEvent = prevValueChangeFromEvent; } } /** * Gets the underlying editor's value upon change. * * @protected * @param {*} e The change event arguments. * @returns {TValue} The widget value. * @memberof ValueEditorBase */ getEditorValueOnChange(e) { return this.getEditorValue(); } /** * Write a new value to the element. * * @param {*} obj The new value. * * @memberOf PropertyEditorComponent */ writeValue(obj) { this.value = obj; } /** * Set the function to be called when the control receives a change event. * * @param {*} fn The callback function. * * @memberOf PropertyEditorComponent */ registerOnChange(fn) { this._onChange = fn; } /** * Set the function to be called when the control receives a touch event. * * @param {*} fn The callback function. * * @memberOf PropertyEditorComponent */ registerOnTouched(fn) { this._onTouched = fn; } /** * This function is called when the control status changes to or from "DISABLED". * Depending on the value, it will enable or disable the appropriate DOM element. * * @param {boolean} isDisabled True if the state is disabled. * * @memberOf PropertyEditorComponent */ setDisabledState(isDisabled) { } } ValueEditorBase.decorators = [ { type: Component, args: [{ template: '' },] } ]; ValueEditorBase.ctorParameters = () => [ { type: ElementRef }, { type: ViewContainerRef } ]; ValueEditorBase.propDecorators = { value: [{ type: Input }] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWVFZGl0b3JCYXNlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvdmFsdWVFZGl0b3JCYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxLQUFLLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFDakQsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDOzs7Ozs7Ozs7O0dBVUc7QUFJSCxNQUFNLE9BQWdCLGVBQ2xCLFNBQVEsVUFBVTtJQXFDbEI7Ozs7OztPQU1HO0lBQ0gsWUFDSSxVQUFzQixFQUN0QixnQkFBa0M7UUFFbEMsS0FBSyxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBN0J4Qzs7Ozs7V0FLRztRQUNPLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUV2Qzs7Ozs7V0FLRztRQUNPLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQW9NL0IsY0FBUyxHQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDM0IsMEVBQTBFO1FBQzlFLENBQUMsQ0FBQztRQUVNLGVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDdEIsMkVBQTJFO1FBQy9FLENBQUMsQ0FBQztJQTFMRixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUNJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBYTtRQUNuQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxLQUFLLEVBQUU7WUFDbkMsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNPLFlBQVksQ0FBQyxLQUFhO1FBQ2hDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzNCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDM0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUVqQyxJQUFJO1lBQ0EsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1lBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFFaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUNqQztZQUVELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3hDO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztZQUM3RCxNQUFNLEtBQUssQ0FBQztTQUNmO2dCQUFTO1lBQ04sSUFBSSxDQUFDLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO1NBQ3hEO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxlQUFlLENBQUMsUUFBNEIsRUFBRSxRQUE0QjtJQUNwRixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNPLGNBQWMsQ0FBQyxRQUE0QixFQUFFLFFBQTRCO1FBQy9FLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxjQUFjLENBQUMsQ0FBTTtRQUMzQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUMzQixPQUFPO1NBQ1Y7UUFFRCxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztRQUMzRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLElBQUk7WUFDQSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7U0FDekI7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3hDO2dCQUFTO1lBQ04sSUFBSSxDQUFDLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO1NBQ3hEO0lBQ0wsQ0FBQztJQW9CRDs7Ozs7OztPQU9HO0lBQ08sc0JBQXNCLENBQUMsQ0FBTTtRQUNuQyxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBR0Q7Ozs7OztPQU1HO0lBQ0gsVUFBVSxDQUFDLEdBQVE7UUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZ0JBQWdCLENBQUMsRUFBTztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsaUJBQWlCLENBQUMsRUFBTztRQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGdCQUFnQixDQUFDLFVBQW1CO0lBQ3BDLENBQUM7OztZQXZPSixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLEVBQUU7YUFDYjs7O1lBbEJVLFVBQVU7WUFBRSxnQkFBZ0I7OztvQkE2RWxDLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgSW5wdXQsIEVsZW1lbnRSZWYsIFZpZXdDb250YWluZXJSZWYsIENvbXBvbmVudFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgV2lkZ2V0QmFzZSB9IGZyb20gJy4uLy4uL3B1YmxpYy1hcGknO1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVzIGEgYmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgdmFsdWUgZWRpdG9ycy5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAYWJzdHJhY3RcclxuICogQGNsYXNzIFZhbHVlRWRpdG9yQmFzZVxyXG4gKiBAaW1wbGVtZW50cyB7T25Jbml0fVxyXG4gKiBAaW1wbGVtZW50cyB7QWZ0ZXJWaWV3SW5pdH1cclxuICogQGltcGxlbWVudHMge0NvbnRyb2xWYWx1ZUFjY2Vzc29yfVxyXG4gKiBAdGVtcGxhdGUgVFZhbHVlIFRoZSB2YWx1ZSB0eXBlLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGU6ICcnXHJcbn0pXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBWYWx1ZUVkaXRvckJhc2U8VFZhbHVlPlxyXG4gICAgZXh0ZW5kcyBXaWRnZXRCYXNlXHJcbiAgICBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgZGVzY3JpcHRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSBwcm9tcHQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge3N0cmluZ31cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIHByb21wdD86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmFsdWUgaXMgY2hhbmdlZCBmcm9tIHRoZSBjaGFuZ2UgZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgdmFsdWVDaGFuZ2VGcm9tRXZlbnQgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmFsdWUgaXMgY2hhbmdlZCBmcm9tIHRoZSB2YWx1ZSBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB2YWx1ZUNoYW5nZUZyb21WYWx1ZSA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgX3ZhbHVlQmVmb3JlQ2hhbmdlPzogVFZhbHVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBWYWx1ZUVkaXRvckJhc2UuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50UmVmfSBlbGVtZW50UmVmIFRoZSBlbGVtZW50IHJlZmVyZW5jZS5cclxuICAgICAqIEBwYXJhbSB7Vmlld0NvbnRhaW5lclJlZn0gdmlld0NvbnRhaW5lclJlZiBUaGUgdmlldyBjb250YWluZXIgcmVmZXJlbmNlLlxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihlbGVtZW50UmVmLCB2aWV3Q29udGFpbmVyUmVmKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgdG8gZWRpdC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VFZhbHVlfVxyXG4gICAgICogQG1lbWJlck9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHZhbHVlKCk6IFRWYWx1ZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RWRpdG9yVmFsdWUoKTtcclxuICAgIH1cclxuICAgIHNldCB2YWx1ZSh2YWx1ZTogVFZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3ZhbHVlQmVmb3JlQ2hhbmdlID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUVkaXRvcih2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSB1bmRlcmx5aW5nIGVkaXRvciB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0ge1RWYWx1ZX0gdmFsdWVcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlRWRpdG9yKHZhbHVlOiBUVmFsdWUpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy52YWx1ZUNoYW5nZUZyb21WYWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwcmV2VmFsdWVDaGFuZ2VGcm9tVmFsdWUgPSB0aGlzLnZhbHVlQ2hhbmdlRnJvbVZhbHVlO1xyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VGcm9tVmFsdWUgPSB0cnVlO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX3ZhbHVlQmVmb3JlQ2hhbmdlO1xyXG4gICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2luZyhvbGRWYWx1ZSwgdmFsdWUpO1xyXG4gICAgICAgICAgICB0aGlzLl92YWx1ZUJlZm9yZUNoYW5nZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnZhbHVlQ2hhbmdlRnJvbUV2ZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEVkaXRvclZhbHVlKHZhbHVlKTtcclxuICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5nZXRFZGl0b3JWYWx1ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VkKG9sZFZhbHVlLCB2YWx1ZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IsICdFcnJvciB3aGlsZSB1cGRhdGluZyB0aGUgZWRpdG9yLicpO1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlRnJvbVZhbHVlID0gcHJldlZhbHVlQ2hhbmdlRnJvbVZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdmVycmlkYWJsZSBtZXRob2QgaW52b2tlZCB3aGVuIHRoZSB2YWx1ZSBpcyBhYm91dCB0byBiZSBjaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7KFRWYWx1ZSB8IHVuZGVmaW5lZCl9IG9sZFZhbHVlIFRoZSBvbGQgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0geyhUVmFsdWUgfCB1bmRlZmluZWQpfSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlLlxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5naW5nKG9sZFZhbHVlOiBUVmFsdWUgfCB1bmRlZmluZWQsIG5ld1ZhbHVlOiBUVmFsdWUgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE92ZXJyaWRhYmxlIG1ldGhvZCBpbnZva2VkIGFmdGVyIHRoZSB2YWx1ZSB3YXMgY2hhbmdlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0geyhUVmFsdWUgfCB1bmRlZmluZWQpfSBvbGRWYWx1ZSBUaGUgb2xkIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHsoVFZhbHVlIHwgdW5kZWZpbmVkKX0gbmV3VmFsdWUgVGhlIG5ldyB2YWx1ZS5cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIG9uVmFsdWVDaGFuZ2VkKG9sZFZhbHVlOiBUVmFsdWUgfCB1bmRlZmluZWQsIG5ld1ZhbHVlOiBUVmFsdWUgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vbkNoYW5nZShuZXdWYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayBpbnZva2VkIGZyb20gdGhlIGNoYW5nZSBldmVudCBvZiB0aGUgdW5kZXJseWluZyBlZGl0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHsqfSBlXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICogQG1lbWJlcm9mIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBvbkVkaXRvckNoYW5nZShlOiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy52YWx1ZUNoYW5nZUZyb21WYWx1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwcmV2VmFsdWVDaGFuZ2VGcm9tRXZlbnQgPSB0aGlzLnZhbHVlQ2hhbmdlRnJvbUV2ZW50O1xyXG4gICAgICAgIHRoaXMudmFsdWVDaGFuZ2VGcm9tRXZlbnQgPSB0cnVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5nZXRFZGl0b3JWYWx1ZU9uQ2hhbmdlKGUpO1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb24ubm90aWZ5RXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VGcm9tRXZlbnQgPSBwcmV2VmFsdWVDaGFuZ2VGcm9tRXZlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgZWRpdG9yLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7VFZhbHVlfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYmUgc2V0LlxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2V0RWRpdG9yVmFsdWUodmFsdWU6IFRWYWx1ZSk6IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIGVkaXRvcidzIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEByZXR1cm5zIHtUVmFsdWV9IFRoZSB3aWRnZXQgdmFsdWUuXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRFZGl0b3JWYWx1ZSgpOiBUVmFsdWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIGVkaXRvcidzIHZhbHVlIHVwb24gY2hhbmdlLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7Kn0gZSBUaGUgY2hhbmdlIGV2ZW50IGFyZ3VtZW50cy5cclxuICAgICAqIEByZXR1cm5zIHtUVmFsdWV9IFRoZSB3aWRnZXQgdmFsdWUuXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXRFZGl0b3JWYWx1ZU9uQ2hhbmdlKGU6IGFueSk6IFRWYWx1ZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RWRpdG9yVmFsdWUoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXcml0ZSBhIG5ldyB2YWx1ZSB0byB0aGUgZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IG9iaiBUaGUgbmV3IHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJPZiBQcm9wZXJ0eUVkaXRvckNvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52YWx1ZSA9IG9iajtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSBjaGFuZ2UgZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlck9mIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHJlY2VpdmVzIGEgdG91Y2ggZXZlbnQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHsqfSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlck9mIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgc3RhdHVzIGNoYW5nZXMgdG8gb3IgZnJvbSBcIkRJU0FCTEVEXCIuXHJcbiAgICAgKiBEZXBlbmRpbmcgb24gdGhlIHZhbHVlLCBpdCB3aWxsIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBhcHByb3ByaWF0ZSBET00gZWxlbWVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRGlzYWJsZWQgVHJ1ZSBpZiB0aGUgc3RhdGUgaXMgZGlzYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlck9mIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX29uQ2hhbmdlID0gKF86IGFueSkgPT4ge1xyXG4gICAgICAgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGdldCBvdmVyd3JpdHRlbiBieSBBbmd1bGFyIGluIFJlZ2lzdGVyT25DaGFuZ2UuXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgX29uVG91Y2hlZCA9ICgpID0+IHtcclxuICAgICAgICAvLyBUaGUgaW1wbGVtZW50YXRpb24gd2lsbCBnZXQgb3ZlcndyaXR0ZW4gYnkgQW5ndWxhciBpbiBSZWdpc3Rlck9uVG91Y2hlZC5cclxuICAgIH07XHJcbn1cclxuIl19