UNPKG

ng6-text-restrictions

Version:

This is a project for restrict the use of caracteres in forms inputs.

291 lines (284 loc) 19.1 kB
import { Directive, HostListener, NgModule } from '@angular/core'; import { NgControl } from '@angular/forms'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var AlphaMxDirective = /** @class */ (function () { function AlphaMxDirective(ngControl) { this.ngControl = ngControl; /** * Expreción regular que se evalua */ this.ALPHA_MX = '^([A-Za-záéíóúñüÁÉÍÓÚÑÜ ])+$'; /** * Nuevo objeto RegExp */ this.regExp = new RegExp(this.ALPHA_MX); } /** * Maneja evento de cambio en el input y se ejecuta la funcion onInputChange. * {*} event Valor de input * @memberof AlphaMxDirective */ /** * Maneja evento de cambio en el input y se ejecuta la funcion onInputChange. * {*} event Valor de input * \@memberof AlphaMxDirective * @param {?} event * @return {?} */ AlphaMxDirective.prototype.onModelChange = /** * Maneja evento de cambio en el input y se ejecuta la funcion onInputChange. * {*} event Valor de input * \@memberof AlphaMxDirective * @param {?} event * @return {?} */ function (event) { this.onInputChange(event, false); }; /** * Maneja el evento de tecla de retroceso enviando true como segundo parametro. * {*} event Evento de tecla de retroceso * @memberof AlphaMxDirective */ /** * Maneja el evento de tecla de retroceso enviando true como segundo parametro. * {*} event Evento de tecla de retroceso * \@memberof AlphaMxDirective * @param {?} event * @return {?} */ AlphaMxDirective.prototype.keydownBackspace = /** * Maneja el evento de tecla de retroceso enviando true como segundo parametro. * {*} event Evento de tecla de retroceso * \@memberof AlphaMxDirective * @param {?} event * @return {?} */ function (event) { this.onInputChange(event.target.value, true); }; /** * Evalua los parametros con RegExp y actualiza el contenido del input * por medio de ngControl.valueAccessor, si el valor no es valido se remplaza * el contenido con la funcion replace. * {*} event Valor que se obtiene del input. * {*} backSpace Bandera valor true si el evento es desatado por esta tecla. * @memberof AlphaMxDirective */ /** * Evalua los parametros con RegExp y actualiza el contenido del input * por medio de ngControl.valueAccessor, si el valor no es valido se remplaza * el contenido con la funcion replace. * {*} event Valor que se obtiene del input. * {*} backSpace Bandera valor true si el evento es desatado por esta tecla. * \@memberof AlphaMxDirective * @param {?} event * @param {?} backSpace * @return {?} */ AlphaMxDirective.prototype.onInputChange = /** * Evalua los parametros con RegExp y actualiza el contenido del input * por medio de ngControl.valueAccessor, si el valor no es valido se remplaza * el contenido con la funcion replace. * {*} event Valor que se obtiene del input. * {*} backSpace Bandera valor true si el evento es desatado por esta tecla. * \@memberof AlphaMxDirective * @param {?} event * @param {?} backSpace * @return {?} */ function (event, backSpace) { /** @type {?} */ var newVal; if (backSpace) { newVal = event; this.ngControl.valueAccessor.writeValue(newVal); } else { if ((this.regExp.test(event))) { this.ngControl.valueAccessor.writeValue(event); } else { newVal = event.replace(/[^A-Za-záéíóúñüÁÉÍÓÚÑÜ\s]/g, ''); this.ngControl.valueAccessor.writeValue(newVal); } } }; AlphaMxDirective.decorators = [ { type: Directive, args: [{ selector: '[alhAlphaMx]' },] }, ]; /** @nocollapse */ AlphaMxDirective.ctorParameters = function () { return [ { type: NgControl } ]; }; AlphaMxDirective.propDecorators = { onModelChange: [{ type: HostListener, args: ['ngModelChange', ['$event'],] }], keydownBackspace: [{ type: HostListener, args: ['keydown.backspace', ['$event'],] }] }; return AlphaMxDirective; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var DigitDirective = /** @class */ (function () { function DigitDirective(ngControl) { this.ngControl = ngControl; /** * Expreción regular que se evalua */ this.DIGIT = '^[0-9]*$'; /** * Nuevo objeto RegExp */ this.regExp = new RegExp(this.DIGIT); } /** * Maneja evento de cambio en el input y se ejecuta la funcion onInputChange. * {*} event Valor de input * @memberof AlphaMxDirective */ /** * Maneja evento de cambio en el input y se ejecuta la funcion onInputChange. * {*} event Valor de input * \@memberof AlphaMxDirective * @param {?} event * @return {?} */ DigitDirective.prototype.onModelChange = /** * Maneja evento de cambio en el input y se ejecuta la funcion onInputChange. * {*} event Valor de input * \@memberof AlphaMxDirective * @param {?} event * @return {?} */ function (event) { if (event !== null) { this.onInputChange(event, false); } else { this.ngControl.valueAccessor.writeValue(this.valorActual); } }; /** * Maneja el evento de tecla de retroceso enviando true como segundo parametro. * {*} event Evento de tecla de retroceso * @memberof AlphaMxDirective */ /** * Maneja el evento de tecla de retroceso enviando true como segundo parametro. * {*} event Evento de tecla de retroceso * \@memberof AlphaMxDirective * @param {?} event * @return {?} */ DigitDirective.prototype.keydownBackspace = /** * Maneja el evento de tecla de retroceso enviando true como segundo parametro. * {*} event Evento de tecla de retroceso * \@memberof AlphaMxDirective * @param {?} event * @return {?} */ function (event) { this.onInputChange(event.target.value, true); }; /** * Evalua los parametros con RegExp y actualiza el contenido del input * por medio de ngControl.valueAccessor, si el valor no es valido se remplaza * el contenido con la funcion replace. * {*} event Valor que se obtiene del input. * {*} backSpace Bandera valor true si el evento es desatado por esta tecla. * @memberof AlphaMxDirective */ /** * Evalua los parametros con RegExp y actualiza el contenido del input * por medio de ngControl.valueAccessor, si el valor no es valido se remplaza * el contenido con la funcion replace. * {*} event Valor que se obtiene del input. * {*} backSpace Bandera valor true si el evento es desatado por esta tecla. * \@memberof AlphaMxDirective * @param {?} event * @param {?} backSpace * @return {?} */ DigitDirective.prototype.onInputChange = /** * Evalua los parametros con RegExp y actualiza el contenido del input * por medio de ngControl.valueAccessor, si el valor no es valido se remplaza * el contenido con la funcion replace. * {*} event Valor que se obtiene del input. * {*} backSpace Bandera valor true si el evento es desatado por esta tecla. * \@memberof AlphaMxDirective * @param {?} event * @param {?} backSpace * @return {?} */ function (event, backSpace) { /** @type {?} */ var newVal; if (backSpace) { newVal = event; this.ngControl.valueAccessor.writeValue(newVal); } else { if ((this.regExp.test(event))) { this.valorActual = event; this.ngControl.valueAccessor.writeValue(this.valorActual); } else { newVal = event.replace(/[^0-9]/g, ''); this.ngControl.valueAccessor.writeValue(newVal); } } }; DigitDirective.decorators = [ { type: Directive, args: [{ selector: '[alhDigit]' },] }, ]; /** @nocollapse */ DigitDirective.ctorParameters = function () { return [ { type: NgControl } ]; }; DigitDirective.propDecorators = { onModelChange: [{ type: HostListener, args: ['ngModelChange', ['$event'],] }], keydownBackspace: [{ type: HostListener, args: ['keydown.backspace', ['$event'],] }] }; return DigitDirective; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ var Ng6TextRestrictionsModule = /** @class */ (function () { function Ng6TextRestrictionsModule() { } Ng6TextRestrictionsModule.decorators = [ { type: NgModule, args: [{ imports: [], declarations: [ AlphaMxDirective, DigitDirective, ], exports: [ AlphaMxDirective, DigitDirective, ] },] }, ]; return Ng6TextRestrictionsModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ export { AlphaMxDirective, DigitDirective, Ng6TextRestrictionsModule }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmc2LXRleHQtcmVzdHJpY3Rpb25zLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZzYtdGV4dC1yZXN0cmljdGlvbnMvbGliL2FscGhhLW14L2FscGhhLW14LmRpcmVjdGl2ZS50cyIsIm5nOi8vbmc2LXRleHQtcmVzdHJpY3Rpb25zL2xpYi9kaWdpdC9kaWdpdC5kaXJlY3RpdmUudHMiLCJuZzovL25nNi10ZXh0LXJlc3RyaWN0aW9ucy9saWIvbmc2LXRleHQtcmVzdHJpY3Rpb25zLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thbGhBbHBoYU14XSdcbn0pXG5leHBvcnQgY2xhc3MgQWxwaGFNeERpcmVjdGl2ZSB7XG5cbiAgLyoqIEV4cHJlY2nDg8KzbiByZWd1bGFyIHF1ZSBzZSBldmFsdWEgKi9cbiAgcHVibGljIEFMUEhBX01YID0gJ14oW0EtWmEtesODwqHDg8Kpw4PCrcODwrPDg8K6w4PCscODwrzDg8KBw4PCicODwo3Dg8KTw4PCmsODwpHDg8KcIF0pKyQnO1xuICAvKiogIE51ZXZvIG9iamV0byBSZWdFeHAgKi9cbiAgcmVnRXhwID0gbmV3IFJlZ0V4cCh0aGlzLkFMUEhBX01YKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYSBldmVudG8gZGUgY2FtYmlvIGVuIGVsIGlucHV0IHkgc2UgZWplY3V0YSBsYSBmdW5jaW9uIG9uSW5wdXRDaGFuZ2UuXG4gICAqIHsqfSBldmVudCBWYWxvciBkZSBpbnB1dFxuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignbmdNb2RlbENoYW5nZScsIFsnJGV2ZW50J10pXG4gIG9uTW9kZWxDaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoZXZlbnQsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW5lamEgZWwgZXZlbnRvIGRlIHRlY2xhIGRlIHJldHJvY2VzbyBlbnZpYW5kbyB0cnVlIGNvbW8gc2VndW5kbyBwYXJhbWV0cm8uXG4gICAqIHsqfSBldmVudCBFdmVudG8gZGUgdGVjbGEgZGUgcmV0cm9jZXNvXG4gICAqIEBtZW1iZXJvZiBBbHBoYU14RGlyZWN0aXZlXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmJhY2tzcGFjZScsIFsnJGV2ZW50J10pXG4gIGtleWRvd25CYWNrc3BhY2UoZXZlbnQpIHtcbiAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWEgbG9zIHBhcmFtZXRyb3MgY29uIFJlZ0V4cCB5IGFjdHVhbGl6YSBlbCBjb250ZW5pZG8gZGVsIGlucHV0XG4gICAqIHBvciBtZWRpbyBkZSBuZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvciwgc2kgZWwgdmFsb3Igbm8gZXMgdmFsaWRvIHNlIHJlbXBsYXphXG4gICAqIGVsIGNvbnRlbmlkbyBjb24gbGEgZnVuY2lvbiByZXBsYWNlLlxuICAgKiB7Kn0gZXZlbnQgVmFsb3IgcXVlIHNlIG9idGllbmUgZGVsIGlucHV0LlxuICAgKiB7Kn0gYmFja1NwYWNlIEJhbmRlcmEgdmFsb3IgdHJ1ZSBzaSBlbCBldmVudG8gZXMgZGVzYXRhZG8gcG9yIGVzdGEgdGVjbGEuXG4gICAqIEBtZW1iZXJvZiBBbHBoYU14RGlyZWN0aXZlXG4gICAqL1xuICBvbklucHV0Q2hhbmdlKGV2ZW50LCBiYWNrU3BhY2UpIHtcbiAgICBsZXQgbmV3VmFsOiBzdHJpbmc7XG4gICAgaWYgKGJhY2tTcGFjZSkge1xuICAgICAgbmV3VmFsID0gZXZlbnQ7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUobmV3VmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCh0aGlzLnJlZ0V4cC50ZXN0KGV2ZW50KSkpIHtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1ZhbCA9IGV2ZW50LnJlcGxhY2UoL1teQS1aYS16w4PCocODwqnDg8Ktw4PCs8ODwrrDg8Kxw4PCvMODwoHDg8KJw4PCjcODwpPDg8Kaw4PCkcODwpxcXHNdL2csICcnKTtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKG5ld1ZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thbGhEaWdpdF0nXG59KVxuZXhwb3J0IGNsYXNzIERpZ2l0RGlyZWN0aXZlIHtcblxuICAvKiogRXhwcmVjacODwrNuIHJlZ3VsYXIgcXVlIHNlIGV2YWx1YSAqL1xuICBwdWJsaWMgRElHSVQgPSAnXlswLTldKiQnO1xuXG4gIC8qKiAgTnVldm8gb2JqZXRvIFJlZ0V4cCAqL1xuICByZWdFeHAgPSBuZXcgUmVnRXhwKHRoaXMuRElHSVQpO1xuXG4gIC8qKiBWYWxvciBpbmdyZXNhZG8gZW4gZWwgaW5wdXQgKi9cbiAgdmFsb3JBY3R1YWw6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nQ29udHJvbDogTmdDb250cm9sXG4gICkgeyB9XG5cbiAgLyoqXG4gICAqIE1hbmVqYSBldmVudG8gZGUgY2FtYmlvIGVuIGVsIGlucHV0IHkgc2UgZWplY3V0YSBsYSBmdW5jaW9uIG9uSW5wdXRDaGFuZ2UuXG4gICAqIHsqfSBldmVudCBWYWxvciBkZSBpbnB1dFxuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignbmdNb2RlbENoYW5nZScsIFsnJGV2ZW50J10pXG4gIG9uTW9kZWxDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMub25JbnB1dENoYW5nZShldmVudCwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3Iud3JpdGVWYWx1ZSh0aGlzLnZhbG9yQWN0dWFsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFuZWphIGVsIGV2ZW50byBkZSB0ZWNsYSBkZSByZXRyb2Nlc28gZW52aWFuZG8gdHJ1ZSBjb21vIHNlZ3VuZG8gcGFyYW1ldHJvLlxuICAgKiB7Kn0gZXZlbnQgRXZlbnRvIGRlIHRlY2xhIGRlIHJldHJvY2Vzb1xuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5iYWNrc3BhY2UnLCBbJyRldmVudCddKVxuICBrZXlkb3duQmFja3NwYWNlKGV2ZW50KSB7XG4gICAgdGhpcy5vbklucHV0Q2hhbmdlKGV2ZW50LnRhcmdldC52YWx1ZSwgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhIGxvcyBwYXJhbWV0cm9zIGNvbiBSZWdFeHAgeSBhY3R1YWxpemEgZWwgY29udGVuaWRvIGRlbCBpbnB1dFxuICAgKiBwb3IgbWVkaW8gZGUgbmdDb250cm9sLnZhbHVlQWNjZXNzb3IsIHNpIGVsIHZhbG9yIG5vIGVzIHZhbGlkbyBzZSByZW1wbGF6YVxuICAgKiBlbCBjb250ZW5pZG8gY29uIGxhIGZ1bmNpb24gcmVwbGFjZS5cbiAgICogeyp9IGV2ZW50IFZhbG9yIHF1ZSBzZSBvYnRpZW5lIGRlbCBpbnB1dC5cbiAgICogeyp9IGJhY2tTcGFjZSBCYW5kZXJhIHZhbG9yIHRydWUgc2kgZWwgZXZlbnRvIGVzIGRlc2F0YWRvIHBvciBlc3RhIHRlY2xhLlxuICAgKiBAbWVtYmVyb2YgQWxwaGFNeERpcmVjdGl2ZVxuICAgKi9cbiAgb25JbnB1dENoYW5nZShldmVudCwgYmFja1NwYWNlKSB7XG4gICAgbGV0IG5ld1ZhbDogc3RyaW5nO1xuICAgIGlmIChiYWNrU3BhY2UpIHtcbiAgICAgIG5ld1ZhbCA9IGV2ZW50O1xuICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKG5ld1ZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgodGhpcy5yZWdFeHAudGVzdChldmVudCkpKSB7XG4gICAgICAgIHRoaXMudmFsb3JBY3R1YWwgPSBldmVudDtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKHRoaXMudmFsb3JBY3R1YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3VmFsID0gZXZlbnQucmVwbGFjZSgvW14wLTldL2csICcnKTtcbiAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKG5ld1ZhbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpZ2l0RGlyZWN0aXZlIH0gZnJvbSAnLi9kaWdpdC9kaWdpdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQWxwaGFNeERpcmVjdGl2ZSB9IGZyb20gJy4vYWxwaGEtbXgvYWxwaGEtbXguZGlyZWN0aXZlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBBbHBoYU14RGlyZWN0aXZlLFxuICAgIERpZ2l0RGlyZWN0aXZlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgQWxwaGFNeERpcmVjdGl2ZSxcbiAgICBEaWdpdERpcmVjdGl2ZSxcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZzZUZXh0UmVzdHJpY3Rpb25zTW9kdWxlIHsgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtJQWNFLDBCQUNVO1FBQUEsY0FBUyxHQUFULFNBQVM7Ozs7d0JBTEQsOEJBQThCOzs7O3NCQUV2QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0tBSTdCOzs7Ozs7Ozs7Ozs7O0lBUUwsd0NBQWE7Ozs7Ozs7SUFEYixVQUNjLEtBQUs7UUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDbEM7Ozs7Ozs7Ozs7Ozs7SUFRRCwyQ0FBZ0I7Ozs7Ozs7SUFEaEIsVUFDaUIsS0FBSztRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzlDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQVVELHdDQUFhOzs7Ozs7Ozs7OztJQUFiLFVBQWMsS0FBSyxFQUFFLFNBQVM7O1FBQzVCLElBQUksTUFBTSxDQUFTO1FBQ25CLElBQUksU0FBUyxFQUFFO1lBQ2IsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNqRDthQUFNO1lBQ0wsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztnQkFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2hEO2lCQUFNO2dCQUNMLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLDRCQUE0QixFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDakQ7U0FDRjtLQUNGOztnQkF2REYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxjQUFjO2lCQUN6Qjs7OztnQkFKUSxTQUFTOzs7Z0NBcUJmLFlBQVksU0FBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7bUNBVXhDLFlBQVksU0FBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7MkJBakMvQzs7Ozs7OztBQ0FBO0lBaUJFLHdCQUNVO1FBQUEsY0FBUyxHQUFULFNBQVM7Ozs7cUJBVEosVUFBVTs7OztzQkFHaEIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQU8xQjs7Ozs7Ozs7Ozs7OztJQVFMLHNDQUFhOzs7Ozs7O0lBRGIsVUFDYyxLQUFLO1FBQ2pCLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtZQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNsQzthQUFNO1lBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM3RDtLQUNGOzs7Ozs7Ozs7Ozs7O0lBUUQseUNBQWdCOzs7Ozs7O0lBRGhCLFVBQ2lCLEtBQUs7UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFVRCxzQ0FBYTs7Ozs7Ozs7Ozs7SUFBYixVQUFjLEtBQUssRUFBRSxTQUFTOztRQUM1QixJQUFJLE1BQU0sQ0FBUztRQUNuQixJQUFJLFNBQVMsRUFBRTtZQUNiLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDZixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNMLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7Z0JBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzNEO2lCQUFNO2dCQUNMLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7S0FDRjs7Z0JBaEVGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtpQkFDdkI7Ozs7Z0JBSlEsU0FBUzs7O2dDQXlCZixZQUFZLFNBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO21DQWN4QyxZQUFZLFNBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3lCQXhDL0M7Ozs7Ozs7QUNBQTs7OztnQkFJQyxRQUFRLFNBQUM7b0JBQ1IsT0FBTyxFQUFFLEVBQ1I7b0JBQ0QsWUFBWSxFQUFFO3dCQUNaLGdCQUFnQjt3QkFDaEIsY0FBYztxQkFDZjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsZ0JBQWdCO3dCQUNoQixjQUFjO3FCQUNmO2lCQUNGOztvQ0FmRDs7Ozs7Ozs7Ozs7Ozs7OyJ9