moh-common-lib
Version:
A library of Angular components, services, and styles for B.C. Government Ministry of Health (MoH).
242 lines • 21.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, EventEmitter, Input, Output, Optional, Self } from '@angular/core';
import { NUMBER, SPACE } from '../../models/mask.constants';
import { NgControl } from '@angular/forms';
import { LabelReplacementTag } from '../../models/error-message.interface';
import { AbstractFormControl } from '../../models/abstract-form-control';
var PhnComponent = /** @class */ (function (_super) {
tslib_1.__extends(PhnComponent, _super);
function PhnComponent(controlDir) {
var _this = _super.call(this) || this;
_this.controlDir = controlDir;
_this.label = 'Personal Health Number (PHN)';
_this.placeholder = '1111 111 111';
_this.labelforId = 'phn_' + _this.objectId;
_this.required = false;
// Self-Validation inputs
_this.isBCPhn = true;
_this._defaultErrMsg = {
required: LabelReplacementTag + " is required.",
invalid: LabelReplacementTag + " is invalid.",
duplicate: LabelReplacementTag + " was already used for another family member.",
};
_this.valueChange = new EventEmitter();
_this.blur = new EventEmitter();
_this.phn = '';
if (controlDir) {
controlDir.valueAccessor = _this;
}
_this.mask =
[NUMBER, NUMBER, NUMBER, NUMBER, SPACE, NUMBER, NUMBER, NUMBER, SPACE, NUMBER, NUMBER, NUMBER];
return _this;
}
Object.defineProperty(PhnComponent.prototype, "value", {
get: /**
* @return {?}
*/
function () {
return this.phn;
},
set: /**
* @param {?} val
* @return {?}
*/
function (val) {
if (val) {
this.phn = val;
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
PhnComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
_super.prototype.ngOnInit.call(this);
this.registerValidation(this.controlDir, this.validateSelf);
};
/**
* @param {?} value
* @return {?}
*/
PhnComponent.prototype.onValueChange = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value !== this.phn) { // IE fix when focus does not display required error
this.phn = value;
this._onChange(value);
this.valueChange.emit(value);
}
};
/**
* @param {?} event
* @return {?}
*/
PhnComponent.prototype.onBlur = /**
* @param {?} event
* @return {?}
*/
function (event) {
this._onTouched(event);
this.blur.emit(event);
};
/**
* @param {?} value
* @return {?}
*/
PhnComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value !== undefined) {
this.phn = value;
}
};
/**
* @private
* @return {?}
*/
PhnComponent.prototype.validateSelf = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var validatePhnResult = this.validatePhn();
if (validatePhnResult) {
return validatePhnResult;
}
return null;
};
/**
* @private
* @return {?}
*/
PhnComponent.prototype.validatePhn = /**
* @private
* @return {?}
*/
function () {
if (this.phn && this.phn.trim().length > 0) {
// Init weights and other stuff
/** @type {?} */
var weights = [-1, 2, 4, 8, 5, 10, 9, 7, 3, -1];
/** @type {?} */
var sumOfRemainders = 0;
// Clean up string
/** @type {?} */
var value = this.phn.trim();
this.phn = value
.replace(/^0+/, '') // remove leading zeros
.replace(/_/g, '') // remove underlines
.replace(/\s/g, ''); // spaces
// Test for length
if (this.phn.length !== 10) {
return { 'invalid': true };
}
// Look for a number that starts with 9 if BC only
if (this.isBCPhn && this.phn[0] !== '9') {
return { 'invalid': true };
}
else if (!this.isBCPhn && this.phn[0] === '9') { // Number cannot have 9
return { 'invalid': true };
}
// Walk through each character
for (var i = 0; i < this.phn.length; i++) {
// pull out char
/** @type {?} */
var char = this.phn.charAt(i);
// parse the number
/** @type {?} */
var num = Number(char);
if (Number.isNaN(num)) {
return { 'invalid': true };
}
// Only use the multiplier if weight is greater than zero
/** @type {?} */
var result = 0;
if (weights[i] > 0) {
// multiply the value against the weight
result = num * weights[i];
// divide by 11 and save the remainder
result = result % 11;
// add it to our sum
sumOfRemainders += result;
}
}
// mod by 11
/** @type {?} */
var checkDigit = 11 - (sumOfRemainders % 11);
// if the result is 10 or 11, it is an invalid PHN
if (checkDigit === 10 || checkDigit === 11) {
return { 'invalid': true };
}
// Compare against 10th digitfinalDigit
/** @type {?} */
var finalDigit = Number(this.phn.substring(9, 10));
if (checkDigit !== finalDigit) {
return { 'invalid': true };
}
}
return null;
};
PhnComponent.decorators = [
{ type: Component, args: [{
selector: 'common-phn',
template: "\r\n<label for=\"{{labelforId}}\" class=\"control-label\">{{label}}</label>\r\n<input class=\"form-control\"\r\n spellcheck=\"false\"\r\n id=\"{{labelforId}}\"\r\n [ngModel]=\"phn\"\r\n (ngModelChange)=\"onValueChange($event)\"\r\n (blur)=\"onBlur($event)\"\r\n [placeholder]=\"placeholder\"\r\n [textMask]=\"{mask: mask}\"\r\n [disabled]=\"disabled\"\r\n [required]=\"required\"\r\n autocomplete=\"off\"/>\r\n\r\n\r\n <!-- Error messages for input -->\r\n <common-error-container\r\n [displayError]=\"controlDir && !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?.invalid\">\r\n {{_defaultErrMsg.invalid}}\r\n </div>\r\n <div *ngIf=\"controlDir?.errors?.duplicate\">\r\n {{_defaultErrMsg.duplicate}}\r\n </div>\r\n </common-error-container>\r\n",
styles: [""]
}] }
];
/** @nocollapse */
PhnComponent.ctorParameters = function () { return [
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }] }
]; };
PhnComponent.propDecorators = {
label: [{ type: Input }],
placeholder: [{ type: Input }],
labelforId: [{ type: Input }],
required: [{ type: Input }],
isBCPhn: [{ type: Input }],
value: [{ type: Input }],
valueChange: [{ type: Output }],
blur: [{ type: Output }]
};
return PhnComponent;
}(AbstractFormControl));
export { PhnComponent };
if (false) {
/** @type {?} */
PhnComponent.prototype.label;
/** @type {?} */
PhnComponent.prototype.placeholder;
/** @type {?} */
PhnComponent.prototype.labelforId;
/** @type {?} */
PhnComponent.prototype.required;
/** @type {?} */
PhnComponent.prototype.isBCPhn;
/** @type {?} */
PhnComponent.prototype._defaultErrMsg;
/** @type {?} */
PhnComponent.prototype.valueChange;
/** @type {?} */
PhnComponent.prototype.blur;
/** @type {?} */
PhnComponent.prototype.phn;
/** @type {?} */
PhnComponent.prototype.mask;
/** @type {?} */
PhnComponent.prototype.controlDir;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhuLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21vaC1jb21tb24tbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvcGhuL3Bobi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQXdCLFNBQVMsRUFBb0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQWdCLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDekYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFekU7SUFLa0Msd0NBQW1CO0lBZ0NuRCxzQkFBd0MsVUFBcUI7UUFBN0QsWUFDRSxpQkFBTyxTQU9SO1FBUnVDLGdCQUFVLEdBQVYsVUFBVSxDQUFXO1FBOUJwRCxXQUFLLEdBQVcsOEJBQThCLENBQUM7UUFDL0MsaUJBQVcsR0FBVyxjQUFjLENBQUM7UUFDckMsZ0JBQVUsR0FBVyxNQUFNLEdBQUcsS0FBSSxDQUFDLFFBQVEsQ0FBQztRQUM1QyxjQUFRLEdBQVksS0FBSyxDQUFDOztRQUcxQixhQUFPLEdBQVksSUFBSSxDQUFDO1FBRWpDLG9CQUFjLEdBQWlCO1lBQzdCLFFBQVEsRUFBSyxtQkFBbUIsa0JBQWU7WUFDL0MsT0FBTyxFQUFLLG1CQUFtQixpQkFBYztZQUM3QyxTQUFTLEVBQUssbUJBQW1CLGlEQUE4QztTQUNoRixDQUFDO1FBWVEsaUJBQVcsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMvRCxVQUFJLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFNUQsU0FBRyxHQUFXLEVBQUUsQ0FBQztRQUtmLElB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U0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO2FBQzVCOzs7Z0JBR0ssVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEQsSUFBSSxVQUFVLEtBQUssVUFBVSxFQUFFO2dCQUM3QixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDO2FBQzVCO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O2dCQXRKRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLHUvQkFBbUM7O2lCQUVwQzs7OztnQkFSOEIsU0FBUyx1QkF5Q3hCLFFBQVEsWUFBSSxJQUFJOzs7d0JBOUI3QixLQUFLOzhCQUNMLEtBQUs7NkJBQ0wsS0FBSzsyQkFDTCxLQUFLOzBCQUdMLEtBQUs7d0JBUUwsS0FBSzs4QkFVTCxNQUFNO3VCQUNOLE1BQU07O0lBeUhULG1CQUFDO0NBQUEsQUF6SkQsQ0FLa0MsbUJBQW1CLEdBb0pwRDtTQXBKWSxZQUFZOzs7SUFFdkIsNkJBQXdEOztJQUN4RCxtQ0FBOEM7O0lBQzlDLGtDQUFxRDs7SUFDckQsZ0NBQW1DOztJQUduQywrQkFBaUM7O0lBRWpDLHNDQUlFOztJQVlGLG1DQUF5RTs7SUFDekUsNEJBQTREOztJQUU1RCwyQkFBaUI7O0lBQ2pCLDRCQUFVOztJQUVHLGtDQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBPcHRpb25hbCwgU2VsZiwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTlVNQkVSLCBTUEFDRSB9IGZyb20gJy4uLy4uL21vZGVscy9tYXNrLmNvbnN0YW50cyc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEVycm9yTWVzc2FnZSwgTGFiZWxSZXBsYWNlbWVudFRhZyB9IGZyb20gJy4uLy4uL21vZGVscy9lcnJvci1tZXNzYWdlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Rm9ybUNvbnRyb2wgfSBmcm9tICcuLi8uLi9tb2RlbHMvYWJzdHJhY3QtZm9ybS1jb250cm9sJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY29tbW9uLXBobicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Bobi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGhuLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFBobkNvbXBvbmVudCBleHRlbmRzIEFic3RyYWN0Rm9ybUNvbnRyb2wgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuXHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZyA9ICdQZXJzb25hbCBIZWFsdGggTnVtYmVyIChQSE4pJztcclxuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nID0gJzExMTEgMTExIDExMSc7XHJcbiAgQElucHV0KCkgbGFiZWxmb3JJZDogc3RyaW5nID0gJ3Bobl8nICsgdGhpcy5vYmplY3RJZDtcclxuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBTZWxmLVZhbGlkYXRpb24gaW5wdXRzXHJcbiAgQElucHV0KCkgaXNCQ1BobjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIF9kZWZhdWx0RXJyTXNnOiBFcnJvck1lc3NhZ2UgPSB7XHJcbiAgICByZXF1aXJlZDogYCR7TGFiZWxSZXBsYWNlbWVudFRhZ30gaXMgcmVxdWlyZWQuYCxcclxuICAgIGludmFsaWQ6IGAke0xhYmVsUmVwbGFjZW1lbnRUYWd9IGlzIGludmFsaWQuYCxcclxuICAgIGR1cGxpY2F0ZTogYCR7TGFiZWxSZXBsYWNlbWVudFRhZ30gd2FzIGFscmVhZHkgdXNlZCBmb3IgYW5vdGhlciBmYW1pbHkgbWVtYmVyLmAsXHJcbiAgfTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgdmFsdWUoIHZhbDogc3RyaW5nICkge1xyXG4gICAgaWYgKCB2YWwpIHtcclxuICAgICAgdGhpcy5waG4gPSB2YWw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCB2YWx1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnBobjtcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgYmx1cjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgcGhuOiBzdHJpbmcgPSAnJztcclxuICBtYXNrOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBjb250cm9sRGlyOiBOZ0NvbnRyb2wgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKCBjb250cm9sRGlyICkge1xyXG4gICAgICBjb250cm9sRGlyLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWFzayA9XHJcbiAgICAgIFtOVU1CRVIsIE5VTUJFUiwgTlVNQkVSLCBOVU1CRVIsIFNQQUNFLCBOVU1CRVIsIE5VTUJFUiwgTlVNQkVSLCBTUEFDRSwgTlVNQkVSLCBOVU1CRVIsIE5VTUJFUl07XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG4gICAgdGhpcy5yZWdpc3RlclZhbGlkYXRpb24oIHRoaXMuY29udHJvbERpciwgdGhpcy52YWxpZGF0ZVNlbGYgKTtcclxuICB9XHJcblxyXG4gIG9uVmFsdWVDaGFuZ2UoIHZhbHVlOiBhbnkgKSB7XHJcblxyXG4gICAgaWYgKCB2YWx1ZSAhPT0gdGhpcy5waG4gKSB7IC8vIElFIGZpeCB3aGVuIGZvY3VzIGRvZXMgbm90IGRpc3BsYXkgcmVxdWlyZWQgZXJyb3JcclxuICAgICAgdGhpcy5waG4gPSB2YWx1ZTtcclxuICAgICAgdGhpcy5fb25DaGFuZ2UoIHZhbHVlICk7XHJcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCggdmFsdWUgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQmx1ciggZXZlbnQ6IGFueSApIHtcclxuICAgIHRoaXMuX29uVG91Y2hlZCggZXZlbnQgKTtcclxuICAgIHRoaXMuYmx1ci5lbWl0KCBldmVudCApO1xyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSggdmFsdWU6IGFueSApOiB2b2lkIHtcclxuICAgIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcclxuICAgICAgdGhpcy5waG4gPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVTZWxmKCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcclxuXHJcbiAgICBjb25zdCB2YWxpZGF0ZVBoblJlc3VsdCA9IHRoaXMudmFsaWRhdGVQaG4oKTtcclxuICAgIGlmICggdmFsaWRhdGVQaG5SZXN1bHQgKSB7XHJcbiAgICAgIHJldHVybiB2YWxpZGF0ZVBoblJlc3VsdDtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRhdGVQaG4oKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xyXG5cclxuICAgIGlmICggdGhpcy5waG4gJiYgdGhpcy5waG4udHJpbSgpLmxlbmd0aCA+IDAgKSB7XHJcblxyXG4gICAgICAvLyBJbml0IHdlaWdodHMgYW5kIG90aGVyIHN0dWZmXHJcbiAgICAgIGNvbnN0IHdlaWdodHM6IG51bWJlcltdID0gWy0xLCAyLCA0LCA4LCA1LCAxMCwgOSwgNywgMywgLTFdO1xyXG4gICAgICBsZXQgc3VtT2ZSZW1haW5kZXJzID0gMDtcclxuXHJcbiAgICAgIC8vIENsZWFuIHVwIHN0cmluZ1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucGhuLnRyaW0oKTtcclxuICAgICAgdGhpcy5waG4gPSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAucmVwbGFjZSggL14wKy8sICcnICkgLy8gcmVtb3ZlIGxlYWRpbmcgemVyb3NcclxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL18vZywgJycpIC8vIHJlbW92ZSB1bmRlcmxpbmVzXHJcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXHMvZywgJycpOyAvLyBzcGFjZXNcclxuXHJcbiAgICAgIC8vIFRlc3QgZm9yIGxlbmd0aFxyXG4gICAgICBpZiAodGhpcy5waG4ubGVuZ3RoICE9PSAxMCkge1xyXG4gICAgICAgIHJldHVybiB7ICdpbnZhbGlkJzogdHJ1ZSB9O1xyXG4gICAgICB9XHJcbiAgICAgIC8vIExvb2sgZm9yIGEgbnVtYmVyIHRoYXQgc3RhcnRzIHdpdGggOSBpZiBCQyBvbmx5XHJcbiAgICAgIGlmICh0aGlzLmlzQkNQaG4gJiYgdGhpcy5waG5bMF0gIT09ICc5Jykge1xyXG4gICAgICAgIHJldHVybiB7ICdpbnZhbGlkJzogdHJ1ZSB9O1xyXG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzQkNQaG4gJiYgdGhpcy5waG5bMF0gPT09ICc5JykgeyAvLyBOdW1iZXIgY2Fubm90IGhhdmUgOVxyXG4gICAgICAgIHJldHVybiB7ICdpbnZhbGlkJzogdHJ1ZSB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBXYWxrIHRocm91Z2ggZWFjaCBjaGFyYWN0ZXJcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBobi5sZW5ndGg7IGkrKykge1xyXG5cclxuICAgICAgICAvLyBwdWxsIG91dCBjaGFyXHJcbiAgICAgICAgY29uc3QgY2hhciA9IHRoaXMucGhuLmNoYXJBdChpKTtcclxuXHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIG51bWJlclxyXG4gICAgICAgIGNvbnN0IG51bSA9IE51bWJlcihjaGFyKTtcclxuXHJcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihudW0pKSB7XHJcbiAgICAgICAgICByZXR1cm4geyAnaW52YWxpZCc6IHRydWUgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE9ubHkgdXNlIHRoZSBtdWx0aXBsaWVyIGlmIHdlaWdodCBpcyBncmVhdGVyIHRoYW4gemVyb1xyXG4gICAgICAgIGxldCByZXN1bHQgPSAwO1xyXG4gICAgICAgIGlmICh3ZWlnaHRzW2ldID4gMCkge1xyXG4gICAgICAgICAgLy8gbXVsdGlwbHkgdGhlIHZhbHVlIGFnYWluc3QgdGhlIHdlaWdodFxyXG4gICAgICAgICAgcmVzdWx0ID0gbnVtICogd2VpZ2h0c1tpXTtcclxuXHJcbiAgICAgICAgICAvLyBkaXZpZGUgYnkgMTEgYW5kIHNhdmUgdGhlIHJlbWFpbmRlclxyXG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICUgMTE7XHJcblxyXG4gICAgICAgICAgLy8gYWRkIGl0IHRvIG91ciBzdW1cclxuICAgICAgICAgIHN1bU9mUmVtYWluZGVycyArPSByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBtb2QgYnkgMTFcclxuICAgICAgY29uc3QgY2hlY2tEaWdpdCA9IDExIC0gKHN1bU9mUmVtYWluZGVycyAlIDExKTtcclxuXHJcbiAgICAgIC8vIGlmIHRoZSByZXN1bHQgaXMgMTAgb3IgMTEsIGl0IGlzIGFuIGludmFsaWQgUEhOXHJcbiAgICAgIGlmIChjaGVja0RpZ2l0ID09PSAxMCB8fCBjaGVja0RpZ2l0ID09PSAxMSkge1xyXG4gICAgICAgIHJldHVybiB7ICdpbnZhbGlkJzogdHJ1ZSB9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDb21wYXJlIGFnYWluc3QgMTB0aCBkaWdpdGZpbmFsRGlnaXRcclxuICAgICAgY29uc3QgZmluYWxEaWdpdCA9IE51bWJlcih0aGlzLnBobi5zdWJzdHJpbmcoOSwgMTApKTtcclxuICAgICAgaWYgKGNoZWNrRGlnaXQgIT09IGZpbmFsRGlnaXQpIHtcclxuICAgICAgICByZXR1cm4geyAnaW52YWxpZCc6IHRydWUgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuIl19