UNPKG

angular-bootstrap-datetimepicker

Version:

Native Angular (8+) datetime picker component styled by Twitter Bootstrap 4.

193 lines 21.9 kB
import * as tslib_1 from "tslib"; import { Directive, ElementRef, EventEmitter, forwardRef, HostListener, Inject, Input, Output, Renderer2 } from '@angular/core'; import { NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators, } from '@angular/forms'; import * as _moment from 'moment'; import { DL_DATE_TIME_DISPLAY_FORMAT, DL_DATE_TIME_INPUT_FORMATS, DlDateAdapter } from '../core/public-api'; import { DlDateTimeInputChange } from './dl-date-time-input-change'; /** * @internal */ var moment = _moment; /** * This directive allows the user to enter dates, using the keyboard, into an input box and * angular will then store a date value in the model. * * The input format(s), display format, and model format are independent and fully customizable. */ var DlDateTimeInputDirective = /** @class */ (function () { /** * Constructs a new instance of this directive. * @param _renderer * reference to the renderer. * @param _elementRef * reference to this element. * @param _dateAdapter * date adapter for the date type in the model. * @param _displayFormat * from `DL_DATE_TIME_DISPLAY_FORMAT`, which defines the format to use for a valid date/time value. * @param _inputFormats * from `DL_DATE_TIME_INPUT_FORMATS`, which defines the input formats that allowed as valid date/time values. * NB: moment is always in strict parse mode for this directive. */ function DlDateTimeInputDirective(_renderer, _elementRef, _dateAdapter, _displayFormat, _inputFormats) { var _this = this; this._renderer = _renderer; this._elementRef = _elementRef; this._dateAdapter = _dateAdapter; this._displayFormat = _displayFormat; this._inputFormats = _inputFormats; /* tslint:disable:member-ordering */ this._filterValidator = function (control) { // @ts-ignore return (_this._inputFilter || (function (value) { return true; }))(_this._value) ? null : { 'dlDateTimeInputFilter': { 'value': control.value } }; }; this._inputFilter = function () { return true; }; this._isValid = true; this._parseValidator = function () { return _this._isValid ? null : { 'dlDateTimeInputParse': { 'text': _this._elementRef.nativeElement.value } }; }; this._changed = []; this._touched = []; this._validator = Validators.compose([this._parseValidator, this._filterValidator]); this._validatorOnChange = function () { }; this._value = undefined; /** * Emits when a `change` event when date/time is selected or * the value of the date/time picker changes. **/ this.dateChange = new EventEmitter(); } DlDateTimeInputDirective_1 = DlDateTimeInputDirective; Object.defineProperty(DlDateTimeInputDirective.prototype, "dlDateTimeInputFilter", { /** * Set a function used to determine whether or not the `value` entered by the user is allowed. * @param inputFilterFunction * a function that returns `true` if the `value` entered by the user is allowed, otherwise `false`. */ set: function (inputFilterFunction) { this._inputFilter = inputFilterFunction; this._validatorOnChange(); }, enumerable: true, configurable: true }); Object.defineProperty(DlDateTimeInputDirective.prototype, "value", { /* tslint:enable:member-ordering */ /** * Returns `D` value of the date/time input or `undefined` | `null` if no value is set. **/ get: function () { return this._value; }, enumerable: true, configurable: true }); /** * Emit a `change` event when the value of the input changes. */ DlDateTimeInputDirective.prototype._onChange = function () { this.dateChange.emit(new DlDateTimeInputChange(this._value)); }; /** * Format the input text using {@link DL_DATE_TIME_DISPLAY_FORMAT} and mark the control as touched. */ DlDateTimeInputDirective.prototype._onBlur = function () { if (this._value) { this.writeValue(this._value); } this._touched.forEach(function (onTouched) { return onTouched(); }); }; /** * Parse the user input into a possibly valid date. * The model value is not set if the input is NOT one of the {@link DL_DATE_TIME_INPUT_FORMATS}. * @param value * Value of the input control. */ DlDateTimeInputDirective.prototype._onInput = function (value) { var _this = this; var testDate = value === null || value === undefined || value === '' ? undefined : moment(value, this._inputFormats, true); this._isValid = testDate && testDate.isValid(); this._value = this._isValid ? this._dateAdapter.fromMilliseconds(testDate.valueOf()) : undefined; this._changed.forEach(function (onChanged) { return onChanged(_this._value); }); }; /** * @internal */ DlDateTimeInputDirective.prototype.registerOnChange = function (onChange) { this._changed.push(onChange); }; /** * @internal */ DlDateTimeInputDirective.prototype.registerOnTouched = function (onTouched) { this._touched.push(onTouched); }; /** * @internal */ DlDateTimeInputDirective.prototype.registerOnValidatorChange = function (validatorOnChange) { this._validatorOnChange = validatorOnChange; }; /** * @internal */ DlDateTimeInputDirective.prototype.setDisabledState = function (isDisabled) { this._renderer.setProperty(this._elementRef.nativeElement, 'disabled', isDisabled); }; /** * @internal */ DlDateTimeInputDirective.prototype.validate = function (control) { return this._validator(control); }; /** * @internal */ DlDateTimeInputDirective.prototype.writeValue = function (value) { var normalizedValue = value === null || value === undefined ? '' : moment(value).format(this._displayFormat); this._renderer.setProperty(this._elementRef.nativeElement, 'value', normalizedValue); }; var DlDateTimeInputDirective_1; DlDateTimeInputDirective.ctorParameters = function () { return [ { type: Renderer2 }, { type: ElementRef }, { type: DlDateAdapter }, { type: String, decorators: [{ type: Inject, args: [DL_DATE_TIME_DISPLAY_FORMAT,] }] }, { type: Array, decorators: [{ type: Inject, args: [DL_DATE_TIME_INPUT_FORMATS,] }] } ]; }; tslib_1.__decorate([ Output() ], DlDateTimeInputDirective.prototype, "dateChange", void 0); tslib_1.__decorate([ Input() ], DlDateTimeInputDirective.prototype, "dlDateTimeInputFilter", null); tslib_1.__decorate([ HostListener('change') ], DlDateTimeInputDirective.prototype, "_onChange", null); tslib_1.__decorate([ HostListener('blur') ], DlDateTimeInputDirective.prototype, "_onBlur", null); tslib_1.__decorate([ HostListener('input', ['$event.target.value']) ], DlDateTimeInputDirective.prototype, "_onInput", null); DlDateTimeInputDirective = DlDateTimeInputDirective_1 = tslib_1.__decorate([ Directive({ selector: 'input[dlDateTimeInput]', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return DlDateTimeInputDirective_1; }), multi: true }, { provide: NG_VALIDATORS, useExisting: forwardRef(function () { return DlDateTimeInputDirective_1; }), multi: true } ] }), tslib_1.__param(3, Inject(DL_DATE_TIME_DISPLAY_FORMAT)), tslib_1.__param(4, Inject(DL_DATE_TIME_INPUT_FORMATS)) ], DlDateTimeInputDirective); return DlDateTimeInputDirective; }()); export { DlDateTimeInputDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGwtZGF0ZS10aW1lLWlucHV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItYm9vdHN0cmFwLWRhdGV0aW1lcGlja2VyLyIsInNvdXJjZXMiOlsiZGwtZGF0ZS10aW1lLWlucHV0L2RsLWRhdGUtdGltZS1pbnB1dC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM5SCxPQUFPLEVBR0wsYUFBYSxFQUNiLGlCQUFpQixFQUlqQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQUMsMkJBQTJCLEVBQUUsMEJBQTBCLEVBQUUsYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDMUcsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFbEU7O0dBRUc7QUFDSCxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFFdkI7Ozs7O0dBS0c7QUFRSDtJQTJCRTs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0gsa0NBQ1UsU0FBb0IsRUFDcEIsV0FBdUIsRUFDdkIsWUFBOEIsRUFDZ0IsY0FBc0IsRUFDdkIsYUFBdUI7UUFMOUUsaUJBTUk7UUFMTSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtRQUNnQixtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQUN2QixrQkFBYSxHQUFiLGFBQWEsQ0FBVTtRQTVDOUUsb0NBQW9DO1FBQzVCLHFCQUFnQixHQUFnQixVQUFDLE9BQXdCO1lBQy9ELGFBQWE7WUFDYixPQUFPLENBQUMsS0FB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Z0JBQ1QsYUFBYTs2Q0FDbEMsTUFBTSxTQUFDLDJCQUEyQjs0Q0FDbEMsTUFBTSxTQUFDLDBCQUEwQjs7SUFyQnBDO1FBREMsTUFBTSxFQUFFO2dFQUMwRDtJQThCbkU7UUFEQyxLQUFLLEVBQUU7eUVBSVA7SUFjdUI7UUFBdkIsWUFBWSxDQUFDLFFBQVEsQ0FBQzs2REFFdEI7SUFLcUI7UUFBckIsWUFBWSxDQUFDLE1BQU0sQ0FBQzsyREFLcEI7SUFRK0M7UUFBL0MsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7NERBUTlDO0lBcEdVLHdCQUF3QjtRQVBwQyxTQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsd0JBQXdCO1lBQ2xDLFNBQVMsRUFBRTtnQkFDVCxFQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSwwQkFBd0IsRUFBeEIsQ0FBd0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7Z0JBQ2xHLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSwwQkFBd0IsRUFBeEIsQ0FBd0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7YUFDL0Y7U0FDRixDQUFDO1FBOENHLG1CQUFBLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO1FBQ25DLG1CQUFBLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO09BOUMxQix3QkFBd0IsQ0FrSnBDO0lBQUQsK0JBQUM7Q0FBQSxBQWxKRCxJQWtKQztTQWxKWSx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE91dHB1dCwgUmVuZGVyZXIyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG4gIFZhbGlkYXRvckZuLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgKiBhcyBfbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge0RMX0RBVEVfVElNRV9ESVNQTEFZX0ZPUk1BVCwgRExfREFURV9USU1FX0lOUFVUX0ZPUk1BVFMsIERsRGF0ZUFkYXB0ZXJ9IGZyb20gJy4uL2NvcmUvcHVibGljLWFwaSc7XG5pbXBvcnQge0RsRGF0ZVRpbWVJbnB1dENoYW5nZX0gZnJvbSAnLi9kbC1kYXRlLXRpbWUtaW5wdXQtY2hhbmdlJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgbW9tZW50ID0gX21vbWVudDtcblxuLyoqXG4gKiAgVGhpcyBkaXJlY3RpdmUgYWxsb3dzIHRoZSB1c2VyIHRvIGVudGVyIGRhdGVzLCB1c2luZyB0aGUga2V5Ym9hcmQsIGludG8gYW4gaW5wdXQgYm94IGFuZFxuICogIGFuZ3VsYXIgd2lsbCB0aGVuIHN0b3JlIGEgZGF0ZSB2YWx1ZSBpbiB0aGUgbW9kZWwuXG4gKlxuICogIFRoZSBpbnB1dCBmb3JtYXQocyksIGRpc3BsYXkgZm9ybWF0LCBhbmQgbW9kZWwgZm9ybWF0IGFyZSBpbmRlcGVuZGVudCBhbmQgZnVsbHkgY3VzdG9taXphYmxlLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdpbnB1dFtkbERhdGVUaW1lSW5wdXRdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge3Byb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEbERhdGVUaW1lSW5wdXREaXJlY3RpdmUpLCBtdWx0aTogdHJ1ZX0sXG4gICAge3Byb3ZpZGU6IE5HX1ZBTElEQVRPUlMsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERsRGF0ZVRpbWVJbnB1dERpcmVjdGl2ZSksIG11bHRpOiB0cnVlfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIERsRGF0ZVRpbWVJbnB1dERpcmVjdGl2ZTxEPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuXG4gIC8qIHRzbGludDpkaXNhYmxlOm1lbWJlci1vcmRlcmluZyAqL1xuICBwcml2YXRlIF9maWx0ZXJWYWxpZGF0b3I6IFZhbGlkYXRvckZuID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuICh0aGlzLl9pbnB1dEZpbHRlciB8fCAoKHZhbHVlOiBhbnkpID0+IHRydWUpKSh0aGlzLl92YWx1ZSkgP1xuICAgICAgbnVsbCA6IHsnZGxEYXRlVGltZUlucHV0RmlsdGVyJzogeyd2YWx1ZSc6IGNvbnRyb2wudmFsdWV9fTtcbiAgfVxuICBwcml2YXRlIF9pbnB1dEZpbHRlcjogKHZhbHVlOiAoRCB8IG51bGwpKSA9PiBib29sZWFuID0gKCkgPT4gdHJ1ZTtcbiAgcHJpdmF0ZSBfaXNWYWxpZCA9IHRydWU7XG4gIHByaXZhdGUgX3BhcnNlVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9ICgpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVmFsaWQgP1xuICAgICAgbnVsbCA6IHsnZGxEYXRlVGltZUlucHV0UGFyc2UnOiB7J3RleHQnOiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWV9fTtcbiAgfVxuICBwcml2YXRlIF9jaGFuZ2VkOiAoKHZhbHVlOiBEKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgX3RvdWNoZWQ6ICgoKSA9PiB2b2lkKVtdID0gW107XG4gIHByaXZhdGUgX3ZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbdGhpcy5fcGFyc2VWYWxpZGF0b3IsIHRoaXMuX2ZpbHRlclZhbGlkYXRvcl0pO1xuICBwcml2YXRlIF92YWxpZGF0b3JPbkNoYW5nZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIF92YWx1ZTogRCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiBhIGBjaGFuZ2VgIGV2ZW50IHdoZW4gZGF0ZS90aW1lIGlzIHNlbGVjdGVkIG9yXG4gICAqIHRoZSB2YWx1ZSBvZiB0aGUgZGF0ZS90aW1lIHBpY2tlciBjaGFuZ2VzLlxuICAgKiovXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEbERhdGVUaW1lSW5wdXRDaGFuZ2U8RD4+KCk7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBkaXJlY3RpdmUuXG4gICAqIEBwYXJhbSBfcmVuZGVyZXJcbiAgICogIHJlZmVyZW5jZSB0byB0aGUgcmVuZGVyZXIuXG4gICAqIEBwYXJhbSBfZWxlbWVudFJlZlxuICAgKiAgcmVmZXJlbmNlIHRvIHRoaXMgZWxlbWVudC5cbiAgICogQHBhcmFtIF9kYXRlQWRhcHRlclxuICAgKiAgZGF0ZSBhZGFwdGVyIGZvciB0aGUgZGF0ZSB0eXBlIGluIHRoZSBtb2RlbC5cbiAgICogQHBhcmFtIF9kaXNwbGF5Rm9ybWF0XG4gICAqICBmcm9tIGBETF9EQVRFX1RJTUVfRElTUExBWV9GT1JNQVRgLCB3aGljaCBkZWZpbmVzIHRoZSBmb3JtYXQgdG8gdXNlIGZvciBhIHZhbGlkIGRhdGUvdGltZSB2YWx1ZS5cbiAgICogQHBhcmFtIF9pbnB1dEZvcm1hdHNcbiAgICogIGZyb20gYERMX0RBVEVfVElNRV9JTlBVVF9GT1JNQVRTYCwgd2hpY2ggZGVmaW5lcyB0aGUgaW5wdXQgZm9ybWF0cyB0aGF0IGFsbG93ZWQgYXMgdmFsaWQgZGF0ZS90aW1lIHZhbHVlcy5cbiAgICogIE5COiBtb21lbnQgaXMgYWx3YXlzIGluIHN0cmljdCBwYXJzZSBtb2RlIGZvciB0aGlzIGRpcmVjdGl2ZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIF9kYXRlQWRhcHRlcjogRGxEYXRlQWRhcHRlcjxEPixcbiAgICBASW5qZWN0KERMX0RBVEVfVElNRV9ESVNQTEFZX0ZPUk1BVCkgcHJpdmF0ZSByZWFkb25seSBfZGlzcGxheUZvcm1hdDogc3RyaW5nLFxuICAgIEBJbmplY3QoRExfREFURV9USU1FX0lOUFVUX0ZPUk1BVFMpIHByaXZhdGUgcmVhZG9ubHkgX2lucHV0Rm9ybWF0czogc3RyaW5nW11cbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBTZXQgYSBmdW5jdGlvbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgYHZhbHVlYCBlbnRlcmVkIGJ5IHRoZSB1c2VyIGlzIGFsbG93ZWQuXG4gICAqIEBwYXJhbSBpbnB1dEZpbHRlckZ1bmN0aW9uXG4gICAqICAgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYHRydWVgIGlmIHRoZSBgdmFsdWVgIGVudGVyZWQgYnkgdGhlIHVzZXIgaXMgYWxsb3dlZCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgZGxEYXRlVGltZUlucHV0RmlsdGVyKGlucHV0RmlsdGVyRnVuY3Rpb246ICh2YWx1ZTogRCB8IG51bGwpID0+IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pbnB1dEZpbHRlciA9IGlucHV0RmlsdGVyRnVuY3Rpb247XG4gICAgdGhpcy5fdmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgfVxuXG4gIC8qIHRzbGludDplbmFibGU6bWVtYmVyLW9yZGVyaW5nICovXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYERgIHZhbHVlIG9mIHRoZSBkYXRlL3RpbWUgaW5wdXQgb3IgYHVuZGVmaW5lZGAgfCBgbnVsbGAgaWYgbm8gdmFsdWUgaXMgc2V0LlxuICAgKiovXG4gIGdldCB2YWx1ZSgpOiBEIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogRW1pdCBhIGBjaGFuZ2VgIGV2ZW50IHdoZW4gdGhlIHZhbHVlIG9mIHRoZSBpbnB1dCBjaGFuZ2VzLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJykgX29uQ2hhbmdlKCkge1xuICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KG5ldyBEbERhdGVUaW1lSW5wdXRDaGFuZ2UodGhpcy5fdmFsdWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgdGhlIGlucHV0IHRleHQgdXNpbmcge0BsaW5rIERMX0RBVEVfVElNRV9ESVNQTEFZX0ZPUk1BVH0gYW5kIG1hcmsgdGhlIGNvbnRyb2wgYXMgdG91Y2hlZC5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKSBfb25CbHVyKCkge1xuICAgIGlmICh0aGlzLl92YWx1ZSkge1xuICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5fdG91Y2hlZC5mb3JFYWNoKG9uVG91Y2hlZCA9PiBvblRvdWNoZWQoKSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgdGhlIHVzZXIgaW5wdXQgaW50byBhIHBvc3NpYmx5IHZhbGlkIGRhdGUuXG4gICAqIFRoZSBtb2RlbCB2YWx1ZSBpcyBub3Qgc2V0IGlmIHRoZSBpbnB1dCBpcyBOT1Qgb25lIG9mIHRoZSB7QGxpbmsgRExfREFURV9USU1FX0lOUFVUX0ZPUk1BVFN9LlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICogICBWYWx1ZSBvZiB0aGUgaW5wdXQgY29udHJvbC5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQudGFyZ2V0LnZhbHVlJ10pIF9vbklucHV0KHZhbHVlOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgY29uc3QgdGVzdERhdGUgPSB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJ1xuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogbW9tZW50KHZhbHVlLCB0aGlzLl9pbnB1dEZvcm1hdHMsIHRydWUpO1xuXG4gICAgdGhpcy5faXNWYWxpZCA9IHRlc3REYXRlICYmIHRlc3REYXRlLmlzVmFsaWQoKTtcbiAgICB0aGlzLl92YWx1ZSA9IHRoaXMuX2lzVmFsaWQgPyB0aGlzLl9kYXRlQWRhcHRlci5mcm9tTWlsbGlzZWNvbmRzKHRlc3REYXRlLnZhbHVlT2YoKSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY2hhbmdlZC5mb3JFYWNoKG9uQ2hhbmdlZCA9PiBvbkNoYW5nZWQodGhpcy5fdmFsdWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhbmdlZC5wdXNoKG9uQ2hhbmdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX3RvdWNoZWQucHVzaChvblRvdWNoZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSh2YWxpZGF0b3JPbkNoYW5nZTogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbGlkYXRvck9uQ2hhbmdlID0gdmFsaWRhdG9yT25DaGFuZ2U7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3IoY29udHJvbCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBEKTogdm9pZCB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgPyAnJ1xuICAgICAgOiBtb21lbnQodmFsdWUpLmZvcm1hdCh0aGlzLl9kaXNwbGF5Rm9ybWF0KTtcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIG5vcm1hbGl6ZWRWYWx1ZSk7XG4gIH1cbn1cbiJdfQ==