UNPKG

ngx-nic-parser

Version:

A calculator of Date of birth and gender using NIC in SriLanka using Angular

150 lines 24 kB
import { Component, Input, Output, EventEmitter } from '@angular/core'; import { FormControl, FormGroup, Validators } from "@angular/forms"; import { Month } from "./month"; import { BirthMonthAndDate } from "./birth-month-and-date"; import { Response } from "./response"; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/common"; export class NgxNicParserComponent { constructor() { this.id = ''; this.title = ''; this.requiredMessage = ''; this.patternErrorMessage = ''; this.placeholder = ''; this.clearNICNumber = ''; this.checkDob = new EventEmitter(); this.nicForm = new FormGroup({ nic: new FormControl('', [Validators.required, Validators.pattern("^([0-9]{9}[x|X|v|V]|[0-9]{12})")]) }); } get nicNumber() { return this.nicForm.get('nic'); } ngOnInit() { } nicParser() { if (this.nicForm.valid) { let $nicNumber = this.nicForm.value.nic; if ($nicNumber.length != 10 && $nicNumber.length != 12) { this.checkDob.emit(new Response({ code: 404, message: 'Invalid Nic Number' })); } else if ($nicNumber.length == 10 && !($nicNumber.substr(0, 9))) { this.checkDob.emit(new Response({ code: 404, message: 'Invalid Nic Number' })); } else { let $year = this.getBirthYear($nicNumber); let $dayText = this.getNumberOfDatesToDob($nicNumber); const $gender = this.getGender($dayText); $dayText = $dayText > 500 ? $dayText - 500 : $dayText; const $obj = this.getBirthMonthAndDate($dayText); const $dayName = this.getWeekDay($year, $obj.month, $obj.day); const $res = Object.assign(Object.assign({}, $obj), { year: $year, gender: $gender, weekDay: $dayName }); this.checkDob.emit(new Response({ code: 200, message: '' }, $res)); } } } getBirthYear($nicNumber) { if ($nicNumber.length == 10) { return Number("19" + $nicNumber.substr(0, 2)); } else { return Number($nicNumber.substr(0, 4)); } } getBirthMonthAndDate($dayText) { if ($dayText < 1 && $dayText > 366) { this.checkDob.emit(new Response({ code: 404, message: 'Invalid Nic Number' })); } else { let b = this.isLeapYear(); if ($dayText > b[10]) { return this.setBirthMonthAndDate(($dayText - b[10]), Month[Month.DECEMBER], Month.DECEMBER); } else if ($dayText > b[9]) { return this.setBirthMonthAndDate(($dayText - b[9]), Month[Month.NOVEMBER], Month.NOVEMBER); } else if ($dayText > b[8]) { return this.setBirthMonthAndDate(($dayText - b[8]), Month[Month.OCTOBER], Month.OCTOBER); } else if ($dayText > b[7]) { return this.setBirthMonthAndDate(($dayText - b[7]), Month[Month.SEPTEMBER], Month.SEPTEMBER); } else if ($dayText > b[6]) { return this.setBirthMonthAndDate(($dayText - b[6]), Month[Month.AUGUST], Month.AUGUST); } else if ($dayText > b[5]) { return this.setBirthMonthAndDate(($dayText - b[5]), Month[Month.JULY], Month.JULY); } else if ($dayText > b[4]) { return this.setBirthMonthAndDate(($dayText - b[4]), Month[Month.JUNE], Month.JUNE); } else if ($dayText > b[3]) { return this.setBirthMonthAndDate(($dayText - b[3]), Month[Month.MAY], Month.MAY); } else if ($dayText > b[2]) { return this.setBirthMonthAndDate(($dayText - b[2]), Month[Month.APRIL], Month.APRIL); } else if ($dayText > b[1]) { return this.setBirthMonthAndDate(($dayText - b[1]), Month[Month.MARCH], Month.MARCH); } else if ($dayText < 32) { return this.setBirthMonthAndDate(($dayText), Month[Month.JANUARY], Month.JANUARY); } else if ($dayText > 31) { return this.setBirthMonthAndDate(($dayText - 31), Month[Month.FEBRUARY], Month.FEBRUARY); } } } setBirthMonthAndDate(day, monthName, monthNumber) { return new BirthMonthAndDate(day, monthName, monthNumber); } getNumberOfDatesToDob($nicNumber) { if ($nicNumber.length == 10) { return parseInt($nicNumber.substr(2, 3)); } else { return parseInt($nicNumber.substr(4, 3)); } } getGender($numberOfDays) { if ($numberOfDays > 500) { return "Female"; } else { return "Male"; } } isLeapYear() { return [31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]; } getWeekDay($year, $month, $day) { return new Date($year, $month, $day).toLocaleString('en-us', { weekday: 'long' }); } } NgxNicParserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: NgxNicParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); NgxNicParserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.0.5", type: NgxNicParserComponent, selector: "ngx-nic-parser", inputs: { id: "id", title: "title", requiredMessage: "requiredMessage", patternErrorMessage: "patternErrorMessage", placeholder: "placeholder", clearNICNumber: "clearNICNumber" }, outputs: { checkDob: "checkDob" }, ngImport: i0, template: "<form [formGroup]=\"nicForm\">\r\n <div class=\"form-group\">\r\n <label for=\"{{id}}\">{{title}}</label>\r\n <input placeholder=\"{{placeholder}}\"\r\n type=\"text\" id=\"{{id}}\" name=\"{{id}}\"\r\n class=\"form-control\" [formControl]=\"nicNumber\"\r\n (keydown.enter)=\"nicParser()\">\r\n <div *ngIf=\"nicNumber?.touched && nicNumber?.invalid\" class=\"error-message\">\r\n <div *ngIf=\"nicNumber?.errors?.required\">{{requiredMessage}}</div>\r\n <div *ngIf=\"nicNumber?.errors?.pattern\">{{patternErrorMessage}}</div>\r\n </div>\r\n </div>\r\n</form>\r\n", styles: [".error-message{color:red;font-size:12px}\n"], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlDirective, selector: "[formControl]", inputs: ["disabled", "formControl", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: NgxNicParserComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-nic-parser', templateUrl: './ngx-nic-parser.component.html', styleUrls: ['./ngx-nic-parser.component.css'], }] }], propDecorators: { id: [{ type: Input }], title: [{ type: Input }], requiredMessage: [{ type: Input }], patternErrorMessage: [{ type: Input }], placeholder: [{ type: Input }], clearNICNumber: [{ type: Input }], checkDob: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW5pYy1wYXJzZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5pYy1wYXJzZXIvc3JjL2xpYi9uZ3gtbmljLXBhcnNlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbmljLXBhcnNlci9zcmMvbGliL25neC1uaWMtcGFyc2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDOzs7O0FBT3BDLE1BQU0sT0FBTyxxQkFBcUI7SUFMbEM7UUFNVyxPQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ1IsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLHdCQUFtQixHQUFHLEVBQUUsQ0FBQztRQUN6QixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUNuQixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUVsRCxZQUFPLEdBQUcsSUFBSSxTQUFTLENBQUM7WUFDdEIsR0FBRyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUM7U0FDdEcsQ0FBQyxDQUFDO0tBbUdKO0lB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QUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVNLFVBQVUsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLElBQVk7UUFDM0QsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztJQUNsRixDQUFDOztrSEE3R1UscUJBQXFCO3NHQUFyQixxQkFBcUIsNlFDWGxDLHVtQkFhQTsyRkRGYSxxQkFBcUI7a0JBTGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsV0FBVyxFQUFFLGlDQUFpQztvQkFDOUMsU0FBUyxFQUFFLENBQUMsZ0NBQWdDLENBQUM7aUJBQzlDOzhCQUVVLEVBQUU7c0JBQVYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNJLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnN9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQge01vbnRofSBmcm9tIFwiLi9tb250aFwiO1xyXG5pbXBvcnQge0JpcnRoTW9udGhBbmREYXRlfSBmcm9tIFwiLi9iaXJ0aC1tb250aC1hbmQtZGF0ZVwiO1xyXG5pbXBvcnQge1Jlc3BvbnNlfSBmcm9tIFwiLi9yZXNwb25zZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtbmljLXBhcnNlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1uaWMtcGFyc2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9uZ3gtbmljLXBhcnNlci5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hOaWNQYXJzZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIGlkID0gJyc7XHJcbiAgQElucHV0KCkgdGl0bGUgPSAnJztcclxuICBASW5wdXQoKSByZXF1aXJlZE1lc3NhZ2UgPSAnJztcclxuICBASW5wdXQoKSBwYXR0ZXJuRXJyb3JNZXNzYWdlID0gJyc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcclxuICBASW5wdXQoKSBjbGVhck5JQ051bWJlciA9ICcnO1xyXG4gIEBPdXRwdXQoKSBjaGVja0RvYiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVzcG9uc2U+KCk7XHJcblxyXG4gIG5pY0Zvcm0gPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgIG5pYzogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKFwiXihbMC05XXs5fVt4fFh8dnxWXXxbMC05XXsxMn0pXCIpXSlcclxuICB9KTtcclxuXHJcbiAgZ2V0IG5pY051bWJlcigpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMubmljRm9ybS5nZXQoJ25pYycpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBuaWNQYXJzZXIoKSB7XHJcbiAgICBpZiAodGhpcy5uaWNGb3JtLnZhbGlkKSB7XHJcbiAgICAgIGxldCAkbmljTnVtYmVyID0gdGhpcy5uaWNGb3JtLnZhbHVlLm5pYztcclxuICAgICAgaWYgKCRuaWNOdW1iZXIubGVuZ3RoICE9IDEwICYmICRuaWNOdW1iZXIubGVuZ3RoICE9IDEyKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0RvYi5lbWl0KG5ldyBSZXNwb25zZSh7Y29kZTogNDA0LCBtZXNzYWdlOiAnSW52YWxpZCBOaWMgTnVtYmVyJ30pKTtcclxuICAgICAgfSBlbHNlIGlmICgkbmljTnVtYmVyLmxlbmd0aCA9PSAxMCAmJiAhKCRuaWNOdW1iZXIuc3Vic3RyKDAsIDkpKSkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tEb2IuZW1pdChuZXcgUmVzcG9uc2Uoe2NvZGU6IDQwNCwgbWVzc2FnZTogJ0ludmFsaWQgTmljIE51bWJlcid9KSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0ICR5ZWFyID0gdGhpcy5nZXRCaXJ0aFllYXIoJG5pY051bWJlcik7XHJcbiAgICAgICAgbGV0ICRkYXlUZXh0ID0gdGhpcy5nZXROdW1iZXJPZkRhdGVzVG9Eb2IoJG5pY051bWJlcik7XHJcbiAgICAgICAgY29uc3QgJGdlbmRlciA9IHRoaXMuZ2V0R2VuZGVyKCRkYXlUZXh0KTtcclxuICAgICAgICAkZGF5VGV4dCA9ICRkYXlUZXh0ID4gNTAwID8gJGRheVRleHQgLSA1MDAgOiAkZGF5VGV4dDtcclxuICAgICAgICBjb25zdCAkb2JqID0gdGhpcy5nZXRCaXJ0aE1vbnRoQW5kRGF0ZSgkZGF5VGV4dCk7XHJcbiAgICAgICAgY29uc3QgJGRheU5hbWUgPSB0aGlzLmdldFdlZWtEYXkoJHllYXIsICRvYmoubW9udGgsICRvYmouZGF5KTtcclxuICAgICAgICBjb25zdCAkcmVzID0gey4uLiRvYmosIHllYXI6ICR5ZWFyLCBnZW5kZXI6ICRnZW5kZXIsIHdlZWtEYXk6ICRkYXlOYW1lfTtcclxuICAgICAgICB0aGlzLmNoZWNrRG9iLmVtaXQobmV3IFJlc3BvbnNlKHtjb2RlOiAyMDAsIG1lc3NhZ2U6ICcnfSwgJHJlcykpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmlydGhZZWFyKCRuaWNOdW1iZXI6IGFueSkge1xyXG4gICAgaWYgKCRuaWNOdW1iZXIubGVuZ3RoID09IDEwKSB7XHJcbiAgICAgIHJldHVybiBOdW1iZXIoXCIxOVwiICsgJG5pY051bWJlci5zdWJzdHIoMCwgMikpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIE51bWJlcigkbmljTnVtYmVyLnN1YnN0cigwLCA0KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmlydGhNb250aEFuZERhdGUoJGRheVRleHQ6IG51bWJlcik6IGFueSB7XHJcbiAgICBpZiAoJGRheVRleHQgPCAxICYmICRkYXlUZXh0ID4gMzY2KSB7XHJcbiAgICAgIHRoaXMuY2hlY2tEb2IuZW1pdChuZXcgUmVzcG9uc2Uoe2NvZGU6IDQwNCwgbWVzc2FnZTogJ0ludmFsaWQgTmljIE51bWJlcid9KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgYiA9IHRoaXMuaXNMZWFwWWVhcigpO1xyXG4gICAgICBpZiAoJGRheVRleHQgPiBiWzEwXSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldEJpcnRoTW9udGhBbmREYXRlKCgkZGF5VGV4dCAtIGJbMTBdKSwgTW9udGhbTW9udGguREVDRU1CRVJdLCBNb250aC5ERUNFTUJFUik7XHJcbiAgICAgIH0gZWxzZSBpZiAoJGRheVRleHQgPiBiWzldKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0QmlydGhNb250aEFuZERhdGUoKCRkYXlUZXh0IC0gYls5XSksIE1vbnRoW01vbnRoLk5PVkVNQkVSXSwgTW9udGguTk9WRU1CRVIpO1xyXG4gICAgICB9IGVsc2UgaWYgKCRkYXlUZXh0ID4gYls4XSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldEJpcnRoTW9udGhBbmREYXRlKCgkZGF5VGV4dCAtIGJbOF0pLCBNb250aFtNb250aC5PQ1RPQkVSXSwgTW9udGguT0NUT0JFUik7XHJcbiAgICAgIH0gZWxzZSBpZiAoJGRheVRleHQgPiBiWzddKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0QmlydGhNb250aEFuZERhdGUoKCRkYXlUZXh0IC0gYls3XSksIE1vbnRoW01vbnRoLlNFUFRFTUJFUl0sIE1vbnRoLlNFUFRFTUJFUik7XHJcbiAgICAgIH0gZWxzZSBpZiAoJGRheVRleHQgPiBiWzZdKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0QmlydGhNb250aEFuZERhdGUoKCRkYXlUZXh0IC0gYls2XSksIE1vbnRoW01vbnRoLkFVR1VTVF0sIE1vbnRoLkFVR1VTVCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoJGRheVRleHQgPiBiWzVdKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0QmlydGhNb250aEFuZERhdGUoKCRkYXlUZXh0IC0gYls1XSksIE1vbnRoW01vbnRoLkpVTFldLCBNb250aC5KVUxZKTtcclxuICAgICAgfSBlbHNlIGlmICgkZGF5VGV4dCA+IGJbNF0pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXRCaXJ0aE1vbnRoQW5kRGF0ZSgoJGRheVRleHQgLSBiWzRdKSwgTW9udGhbTW9udGguSlVORV0sIE1vbnRoLkpVTkUpO1xyXG4gICAgICB9IGVsc2UgaWYgKCRkYXlUZXh0ID4gYlszXSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldEJpcnRoTW9udGhBbmREYXRlKCgkZGF5VGV4dCAtIGJbM10pLCBNb250aFtNb250aC5NQVldLCBNb250aC5NQVkpO1xyXG4gICAgICB9IGVsc2UgaWYgKCRkYXlUZXh0ID4gYlsyXSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldEJpcnRoTW9udGhBbmREYXRlKCgkZGF5VGV4dCAtIGJbMl0pLCBNb250aFtNb250aC5BUFJJTF0sIE1vbnRoLkFQUklMKTtcclxuICAgICAgfSBlbHNlIGlmICgkZGF5VGV4dCA+IGJbMV0pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXRCaXJ0aE1vbnRoQW5kRGF0ZSgoJGRheVRleHQgLSBiWzFdKSwgTW9udGhbTW9udGguTUFSQ0hdLCBNb250aC5NQVJDSCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoJGRheVRleHQgPCAzMikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldEJpcnRoTW9udGhBbmREYXRlKCgkZGF5VGV4dCksIE1vbnRoW01vbnRoLkpBTlVBUlldLCBNb250aC5KQU5VQVJZKTtcclxuICAgICAgfSBlbHNlIGlmICgkZGF5VGV4dCA+IDMxKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0QmlydGhNb250aEFuZERhdGUoKCRkYXlUZXh0IC0gMzEpLCBNb250aFtNb250aC5GRUJSVUFSWV0sIE1vbnRoLkZFQlJVQVJZKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEJpcnRoTW9udGhBbmREYXRlKGRheTogYW55LCBtb250aE5hbWU6IHN0cmluZywgbW9udGhOdW1iZXI6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIG5ldyBCaXJ0aE1vbnRoQW5kRGF0ZShcclxuICAgICAgZGF5LCBtb250aE5hbWUsIG1vbnRoTnVtYmVyXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TnVtYmVyT2ZEYXRlc1RvRG9iKCRuaWNOdW1iZXI6IGFueSkge1xyXG4gICAgaWYgKCRuaWNOdW1iZXIubGVuZ3RoID09IDEwKSB7XHJcbiAgICAgIHJldHVybiBwYXJzZUludCgkbmljTnVtYmVyLnN1YnN0cigyLCAzKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gcGFyc2VJbnQoJG5pY051bWJlci5zdWJzdHIoNCwgMykpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEdlbmRlcigkbnVtYmVyT2ZEYXlzOiBudW1iZXIpIHtcclxuICAgIGlmICgkbnVtYmVyT2ZEYXlzID4gNTAwKSB7XHJcbiAgICAgIHJldHVybiBcIkZlbWFsZVwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFwiTWFsZVwiO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzTGVhcFllYXIoKSB7XHJcbiAgICByZXR1cm4gWzMxLCA2MCwgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1LCAzNjZdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFdlZWtEYXkoJHllYXI6IG51bWJlciwgJG1vbnRoOiBudW1iZXIsICRkYXk6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbmV3IERhdGUoJHllYXIsICRtb250aCwgJGRheSkudG9Mb2NhbGVTdHJpbmcoJ2VuLXVzJywge3dlZWtkYXk6ICdsb25nJ30pO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cIm5pY0Zvcm1cIj5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgPGxhYmVsIGZvcj1cInt7aWR9fVwiPnt7dGl0bGV9fTwvbGFiZWw+XHJcbiAgICA8aW5wdXQgcGxhY2Vob2xkZXI9XCJ7e3BsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ7e2lkfX1cIiBuYW1lPVwie3tpZH19XCJcclxuICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiIFtmb3JtQ29udHJvbF09XCJuaWNOdW1iZXJcIlxyXG4gICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm5pY1BhcnNlcigpXCI+XHJcbiAgICA8ZGl2ICpuZ0lmPVwibmljTnVtYmVyPy50b3VjaGVkICYmIG5pY051bWJlcj8uaW52YWxpZFwiIGNsYXNzPVwiZXJyb3ItbWVzc2FnZVwiPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwibmljTnVtYmVyPy5lcnJvcnM/LnJlcXVpcmVkXCI+e3tyZXF1aXJlZE1lc3NhZ2V9fTwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwibmljTnVtYmVyPy5lcnJvcnM/LnBhdHRlcm5cIj57e3BhdHRlcm5FcnJvck1lc3NhZ2V9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZm9ybT5cclxuIl19