UNPKG

moh-common-lib

Version:

A library of Angular components, services, and styles for B.C. Government Ministry of Health (MoH).

191 lines 18.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter, Optional, Self } from '@angular/core'; import { NgControl } from '@angular/forms'; import { NUMBER, SPACE } from '../../models/mask.constants'; import { LabelReplacementTag } from '../../models/error-message.interface'; import { AbstractFormControl } from '../../models/abstract-form-control'; /** * PhoneNumberComponent is a used to show the Phone number. * * * \@example * <common-phone-number name='phoneNumber' * [(ngModel)]='dataService.facAdminPhoneNumber' * required></common-phone-number> * @export */ export class PhoneNumberComponent extends AbstractFormControl { /** * @param {?} controlDir */ constructor(controlDir) { super(); this.controlDir = controlDir; this.displayMask = true; this.required = false; this.label = 'Mobile'; this.allowInternational = true; // TODO: Remove once all project using library remove placeholders -- Temporary solution this.enablePlaceHolder = true; this.valueChange = new EventEmitter(); this.phoneNumber = ''; // Abstact variable defined this._defaultErrMsg = { required: `${LabelReplacementTag} is required.`, incompleteValue: `${LabelReplacementTag} does not appear to be valid.` }; if (controlDir) { controlDir.valueAccessor = this; } } // Setter/getter for when not used in form (ex. data dislayed but not edittable) /** * @param {?} val * @return {?} */ set value(val) { if (val !== undefined) { this.phoneNumber = val; } } /** * @return {?} */ get value() { return this.phoneNumber; } /** * @return {?} */ ngOnInit() { super.ngOnInit(); /** @type {?} */ const internationalPrefix = '+1'; this.placeholder = this.enablePlaceHolder ? '(555) 555-5555' : ''; this.mask = ['(', /[2-9]/, NUMBER, NUMBER, ')', SPACE, NUMBER, NUMBER, NUMBER, '-', NUMBER, NUMBER, NUMBER, NUMBER]; if (this.allowInternational) { if (this.placeholder) { this.placeholder = `${internationalPrefix} ${this.placeholder}`; } /** @type {?} */ const prefixArrayOfChar = internationalPrefix.split(''); this.mask = [...prefixArrayOfChar, SPACE, ...this.mask]; } // Register self validation Promise.resolve().then((/** * @return {?} */ () => { if (this.controlDir) { /** @type {?} */ const allValidators = [this.validateSelf.bind(this)]; if (this.controlDir.control.validator) { allValidators.push(this.controlDir.control.validator); } this.controlDir.control.setValidators(allValidators); this.controlDir.control.updateValueAndValidity(); } })); } /** * @param {?} value * @return {?} */ setPhoneNumber(value) { this.phoneNumber = value; this.valueChange.emit(this.phoneNumber); this._onChange(value); } /** * @param {?} $event * @return {?} */ onBlur($event) { this._onTouched($event); } /** * @param {?} value * @return {?} */ writeValue(value) { if (value !== undefined) { // phoneNumber is where the actual data is displayed to user for this // component this.phoneNumber = value; } } /** * @private * @return {?} */ validateSelf() { /** @type {?} */ const value = this.phoneNumber; /** @type {?} */ const phoneLength = this.allowInternational ? 11 : 10; if (value) { /** @type {?} */ const stripped = value .replace(/_/g, '') // remove underlines .replace(/\s/g, '') // spaces .replace(/\+|-/g, '') // + or - symbol .replace('(', '') .replace(')', ''); /** @type {?} */ const valid = stripped.length === phoneLength; return valid ? null : { incompleteValue: true }; } return null; } } PhoneNumberComponent.PhoneNumberRegEx = '^[2-9]{1}\\d{2}[\\-]?\\d{3}[\\-]?\\d{4}$'; PhoneNumberComponent.decorators = [ { type: Component, args: [{ selector: 'common-phone-number', template: "\r\n<label for=\"phone_{{objectId}}\" class=\"control-label\">{{label}}</label>\r\n<div *ngIf=\"displayMask; else NoMask\">\r\n <input class=\"form-control\"\r\n type=\"text\"\r\n name=\"phone_{{objectId}}\"\r\n id=\"phone_{{objectId}}\"\r\n [ngModel]=\"phoneNumber\"\r\n (ngModelChange)=\"setPhoneNumber($event)\"\r\n (blur)=\"onBlur($event)\"\r\n [placeholder]=\"placeholder \"\r\n [textMask]=\"{mask: mask}\"\r\n [required]=\"required\"\r\n [disabled]=\"disabled\"/>\r\n</div>\r\n\r\n<!-- Error messages for component -->\r\n<common-error-container\r\n [displayError]=\"!disabled && (controlDir?.touched || controlDir?.dirty) && controlDir?.errors\">\r\n <div *ngIf=\"controlDir?.errors?.required\">\r\n {{_defaultErrMsg.required}}\r\n </div>\r\n <div *ngIf=\"controlDir?.errors?.incompleteValue\">\r\n {{_defaultErrMsg.incompleteValue}}\r\n </div>\r\n</common-error-container>\r\n\r\n\r\n<ng-template #NoMask>\r\n <input class=\"form-control\"\r\n type=\"text\"\r\n name=\"phone_{{objectId}}\"\r\n id=\"phone_{{objectId}}\"\r\n [value]=\"phoneNumber\"\r\n (input)=\"setPhoneNumber($event.target.value)\"\r\n (blur)=\"onBlur($event)\"\r\n [required]=\"required\"\r\n [disabled]=\"disabled\" />\r\n</ng-template>\r\n\r\n", styles: [""] }] } ]; /** @nocollapse */ PhoneNumberComponent.ctorParameters = () => [ { type: NgControl, decorators: [{ type: Optional }, { type: Self }] } ]; PhoneNumberComponent.propDecorators = { displayMask: [{ type: Input }], required: [{ type: Input }], label: [{ type: Input }], allowInternational: [{ type: Input }], enablePlaceHolder: [{ type: Input }], value: [{ type: Input }], valueChange: [{ type: Output }] }; if (false) { /** @type {?} */ PhoneNumberComponent.PhoneNumberRegEx; /** @type {?} */ PhoneNumberComponent.prototype.displayMask; /** @type {?} */ PhoneNumberComponent.prototype.required; /** @type {?} */ PhoneNumberComponent.prototype.label; /** @type {?} */ PhoneNumberComponent.prototype.allowInternational; /** @type {?} */ PhoneNumberComponent.prototype.enablePlaceHolder; /** @type {?} */ PhoneNumberComponent.prototype.valueChange; /** @type {?} */ PhoneNumberComponent.prototype.phoneNumber; /** @type {?} */ PhoneNumberComponent.prototype.mask; /** @type {?} */ PhoneNumberComponent.prototype.placeholder; /** @type {?} */ PhoneNumberComponent.prototype._defaultErrMsg; /** @type {?} */ PhoneNumberComponent.prototype.controlDir; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtbnVtYmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vaC1jb21tb24tbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvcGhvbmUtbnVtYmVyL3Bob25lLW51bWJlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osUUFBUSxFQUNSLElBQUksRUFFTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQWdCLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDekYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7O0FBb0J6RSxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsbUJBQW1COzs7O0lBb0MzRCxZQUF1QyxVQUFxQjtRQUMxRCxLQUFLLEVBQUUsQ0FBQztRQUQ2QixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBakNuRCxnQkFBVyxHQUFZLElBQUksQ0FBQztRQUM1QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLFVBQUssR0FBVyxRQUFRLENBQUM7UUFFekIsdUJBQWtCLEdBQVksSUFBSSxDQUFDOztRQUduQyxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFhakMsZ0JBQVcsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVsRSxnQkFBVyxHQUFXLEVBQUUsQ0FBQzs7UUFNaEMsbUJBQWMsR0FBaUI7WUFDN0IsUUFBUSxFQUFFLEdBQUcsbUJBQW1CLGVBQWU7WUFDL0MsZUFBZSxFQUFFLEdBQUcsbUJBQW1CLCtCQUErQjtTQUN2RSxDQUFDO1FBSUEsSUFBSSxVQUFVLEVBQUU7WUFDZCxVQUFV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SCxRQUFRLEdBQUcsS0FBSztpQkFDbkIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7aUJBQ3RDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUztpQkFDNUIsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7aUJBQ3JDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO2lCQUNoQixPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7a0JBRWIsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEtBQUssV0FBVztZQUM3QyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUVqRDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUE1R00scUNBQWdCLEdBQUcsMENBQTBDLENBQUM7O1lBUnRFLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixtNENBQTRDOzthQUU3Qzs7OztZQXJCUSxTQUFTLHVCQTJESCxRQUFRLFlBQUksSUFBSTs7OzBCQWpDNUIsS0FBSzt1QkFDTCxLQUFLO29CQUNMLEtBQUs7aUNBRUwsS0FBSztnQ0FHTCxLQUFLO29CQUdMLEtBQUs7MEJBVUwsTUFBTTs7OztJQXJCUCxzQ0FBcUU7O0lBQ3JFLDJDQUFxQzs7SUFDckMsd0NBQW1DOztJQUNuQyxxQ0FBa0M7O0lBRWxDLGtEQUE0Qzs7SUFHNUMsaURBQTJDOztJQWEzQywyQ0FBeUU7O0lBRXpFLDJDQUFnQzs7SUFFaEMsb0NBQWlCOztJQUNqQiwyQ0FBMkI7O0lBRzNCLDhDQUdFOztJQUVVLDBDQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3B0aW9uYWwsXHJcbiAgU2VsZixcclxuICBPbkluaXRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBOVU1CRVIsIFNQQUNFIH0gZnJvbSAnLi4vLi4vbW9kZWxzL21hc2suY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRXJyb3JNZXNzYWdlLCBMYWJlbFJlcGxhY2VtZW50VGFnIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Vycm9yLW1lc3NhZ2UuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RGb3JtQ29udHJvbCB9IGZyb20gJy4uLy4uL21vZGVscy9hYnN0cmFjdC1mb3JtLWNvbnRyb2wnO1xyXG5cclxuLyoqXHJcbiAqIFBob25lTnVtYmVyQ29tcG9uZW50IGlzIGEgdXNlZCB0byBzaG93IHRoZSBQaG9uZSBudW1iZXIuXHJcbiAqXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqICAgICAgICAgPGNvbW1vbi1waG9uZS1udW1iZXIgbmFtZT0ncGhvbmVOdW1iZXInXHJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09J2RhdGFTZXJ2aWNlLmZhY0FkbWluUGhvbmVOdW1iZXInXHJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ+PC9jb21tb24tcGhvbmUtbnVtYmVyPlxyXG4gKiBAZXhwb3J0XHJcbiAqL1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY29tbW9uLXBob25lLW51bWJlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Bob25lLW51bWJlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGhvbmUtbnVtYmVyLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgUGhvbmVOdW1iZXJDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Db250cm9sIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgc3RhdGljIFBob25lTnVtYmVyUmVnRXggPSAnXlsyLTldezF9XFxcXGR7Mn1bXFxcXC1dP1xcXFxkezN9W1xcXFwtXT9cXFxcZHs0fSQnO1xyXG4gIEBJbnB1dCgpIGRpc3BsYXlNYXNrOiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnTW9iaWxlJztcclxuXHJcbiAgQElucHV0KCkgYWxsb3dJbnRlcm5hdGlvbmFsOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gVE9ETzogUmVtb3ZlIG9uY2UgYWxsIHByb2plY3QgdXNpbmcgbGlicmFyeSByZW1vdmUgcGxhY2Vob2xkZXJzIC0tIFRlbXBvcmFyeSBzb2x1dGlvblxyXG4gIEBJbnB1dCgpIGVuYWJsZVBsYWNlSG9sZGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLy8gU2V0dGVyL2dldHRlciBmb3Igd2hlbiBub3QgdXNlZCBpbiBmb3JtIChleC4gZGF0YSBkaXNsYXllZCBidXQgbm90IGVkaXR0YWJsZSlcclxuICBASW5wdXQoKVxyXG4gIHNldCB2YWx1ZSggdmFsOiBzdHJpbmcgKSB7XHJcbiAgICBpZiAoIHZhbCAhPT0gdW5kZWZpbmVkICkge1xyXG4gICAgICB0aGlzLnBob25lTnVtYmVyID0gdmFsO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgdmFsdWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5waG9uZU51bWJlcjtcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgcHVibGljIHBob25lTnVtYmVyOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgcHVibGljIG1hc2s6IGFueTtcclxuICBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuXHJcbiAgLy8gQWJzdGFjdCB2YXJpYWJsZSBkZWZpbmVkXHJcbiAgX2RlZmF1bHRFcnJNc2c6IEVycm9yTWVzc2FnZSA9IHtcclxuICAgIHJlcXVpcmVkOiBgJHtMYWJlbFJlcGxhY2VtZW50VGFnfSBpcyByZXF1aXJlZC5gLFxyXG4gICAgaW5jb21wbGV0ZVZhbHVlOiBgJHtMYWJlbFJlcGxhY2VtZW50VGFnfSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgdmFsaWQuYFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIGNvbnRyb2xEaXI6IE5nQ29udHJvbCkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIGlmIChjb250cm9sRGlyKSB7XHJcbiAgICAgIGNvbnRyb2xEaXIudmFsdWVBY2Nlc3NvciA9IHRoaXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG4gICAgY29uc3QgaW50ZXJuYXRpb25hbFByZWZpeCA9ICcrMSc7XHJcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5lbmFibGVQbGFjZUhvbGRlciA/ICcoNTU1KSA1NTUtNTU1NScgOiAnJztcclxuICAgIHRoaXMubWFzayA9IFsnKCcsIC9bMi05XS8sIE5VTUJFUiwgTlVNQkVSLCAnKScsIFNQQUNFLCBOVU1CRVIsIE5VTUJFUiwgTlVNQkVSLCAnLScsIE5VTUJFUiwgTlVNQkVSLCBOVU1CRVIsIE5VTUJFUl07XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dJbnRlcm5hdGlvbmFsKSB7XHJcbiAgICAgIGlmICggdGhpcy5wbGFjZWhvbGRlciApIHtcclxuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gYCR7aW50ZXJuYXRpb25hbFByZWZpeH0gJHt0aGlzLnBsYWNlaG9sZGVyfWA7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcHJlZml4QXJyYXlPZkNoYXIgPSBpbnRlcm5hdGlvbmFsUHJlZml4LnNwbGl0KCcnKTsgLy8gWycrJywgJzEnXVxyXG4gICAgICB0aGlzLm1hc2sgPSBbLi4ucHJlZml4QXJyYXlPZkNoYXIsIFNQQUNFLCAuLi50aGlzLm1hc2tdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlZ2lzdGVyIHNlbGYgdmFsaWRhdGlvblxyXG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcblxyXG4gICAgICBpZiAodGhpcy5jb250cm9sRGlyKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbFZhbGlkYXRvcnMgPSBbdGhpcy52YWxpZGF0ZVNlbGYuYmluZCh0aGlzKV07XHJcbiAgICAgICAgaWYgKHRoaXMuY29udHJvbERpci5jb250cm9sLnZhbGlkYXRvcikge1xyXG4gICAgICAgICAgYWxsVmFsaWRhdG9ycy5wdXNoKHRoaXMuY29udHJvbERpci5jb250cm9sLnZhbGlkYXRvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29udHJvbERpci5jb250cm9sLnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9ycyk7XHJcbiAgICAgICAgdGhpcy5jb250cm9sRGlyLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBzZXRQaG9uZU51bWJlcih2YWx1ZSkge1xyXG4gICAgdGhpcy5waG9uZU51bWJlciA9IHZhbHVlO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMucGhvbmVOdW1iZXIpO1xyXG4gICAgdGhpcy5fb25DaGFuZ2UodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb25CbHVyKCAkZXZlbnQgKSB7XHJcbiAgICB0aGlzLl9vblRvdWNoZWQoJGV2ZW50KTtcclxuICB9XHJcblxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICAodmFsdWUgIT09IHVuZGVmaW5lZCApIHtcclxuICAgICAgLy8gcGhvbmVOdW1iZXIgaXMgd2hlcmUgdGhlIGFjdHVhbCBkYXRhIGlzIGRpc3BsYXllZCB0byB1c2VyIGZvciB0aGlzXHJcbiAgICAgIC8vIGNvbXBvbmVudFxyXG4gICAgICB0aGlzLnBob25lTnVtYmVyID0gdmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHZhbGlkYXRlU2VsZigpIHtcclxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5waG9uZU51bWJlcjtcclxuICAgIGNvbnN0IHBob25lTGVuZ3RoID0gdGhpcy5hbGxvd0ludGVybmF0aW9uYWwgPyAxMSA6IDEwO1xyXG5cclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBjb25zdCBzdHJpcHBlZCA9IHZhbHVlXHJcbiAgICAgICAgLnJlcGxhY2UoL18vZywgJycpIC8vIHJlbW92ZSB1bmRlcmxpbmVzXHJcbiAgICAgICAgLnJlcGxhY2UoL1xccy9nLCAnJykgLy8gc3BhY2VzXHJcbiAgICAgICAgLnJlcGxhY2UoL1xcK3wtL2csICcnKSAvLyArIG9yIC0gc3ltYm9sXHJcbiAgICAgICAgLnJlcGxhY2UoJygnLCAnJylcclxuICAgICAgICAucmVwbGFjZSgnKScsICcnKTtcclxuXHJcbiAgICAgIGNvbnN0IHZhbGlkID0gc3RyaXBwZWQubGVuZ3RoID09PSBwaG9uZUxlbmd0aDtcclxuICAgICAgcmV0dXJuIHZhbGlkID8gbnVsbCA6IHsgaW5jb21wbGV0ZVZhbHVlOiB0cnVlIH07XHJcblxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG59XHJcbiJdfQ==