UNPKG

ngx-edu-components

Version:
202 lines 18.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core'; import { CropperComponent } from 'angular-cropperjs'; import { NgxEduCropperOptions } from './ngx-edu-cropper-options'; /** * INSTRUCCIONES DE USO * * Instalar: * npm install angular-cropperjs --save * npm install cropperjs --save * * Configurar en angular.json * en styles > "node_modules/cropperjs/dist/cropper.css" * en scripts > "node_modules/cropperjs/dist/cropper.js" * * Importar en módulo ImageToolsModule en tu módulo * * INPUTS * imageUrl: Url de la imagen a recortar. * minContainerHeight: Alto mínimo del contenedor (No puede ser inferior a 325). Valor por defecto: 325. * * OUTPUTS * onChange(EventEmitter<ImageCropperToolResponse>): Cuando se aplican los cambios devuelve un canvas * con la imagen recortada para mostrar dentro de un div y blob que se puede utilizar para subir el archivo * utilizando FormData, cuando se realiza algun cambio devuelve null hasta que se apliquen nuevamente los cambios. * * EXAMPLE * <ngx-edu-cropper [imageUrl]="imageUrl" [minContainerHeight]="325" (onChange)="onChange($event)"></ngx-edu-cropper> */ export class NgxEduCropperComponent { constructor() { this.ngxEduCropperOptions = new NgxEduCropperOptions(); this.imageUrl = ''; this.minContainerHeight = 325; this.onChange = new EventEmitter(); this.setImageCropperToolEvents(); } /** * @return {?} */ ngOnInit() { if (this.minContainerHeight < 325) { this.minContainerHeight = 325; } this.ngxEduCropperOptions.minContainerHeight = this.minContainerHeight; } /** * @return {?} */ ngOnChanges() { } /** * @return {?} */ ngOnDestroy() { } /** * @return {?} */ setImageCropperToolEvents() { this.ngxEduCropperOptions.cropstart = (/** * @param {?} e * @return {?} */ (e) => { this.onChange.emit(null); }); this.ngxEduCropperOptions.cropmove = (/** * @param {?} e * @return {?} */ (e) => { this.onChange.emit(null); }); this.ngxEduCropperOptions.cropend = (/** * @param {?} e * @return {?} */ (e) => { this.onChange.emit(null); }); this.ngxEduCropperOptions.zoom = (/** * @param {?} e * @return {?} */ (e) => { this.onChange.emit(null); }); } /** * @param {?} dragMode * @return {?} */ setDragMode(dragMode) { /** @type {?} */ const cropperDragMode = (/** @type {?} */ (dragMode)); this.angularCropper.cropper.setDragMode(cropperDragMode); } /** * @param {?} ratio * @return {?} */ zoom(ratio) { this.angularCropper.cropper.zoom(ratio); this.onChange.emit(null); } /** * @param {?} degree * @return {?} */ rotate(degree) { this.angularCropper.cropper.rotate(degree); this.onChange.emit(null); } /** * @param {?} offsetX * @param {?} offsetY * @return {?} */ move(offsetX, offsetY) { this.angularCropper.cropper.move(offsetX, offsetY); this.onChange.emit(null); } /** * @return {?} */ disable() { this.angularCropper.cropper.disable(); this.onChange.emit(null); } /** * @return {?} */ enable() { this.angularCropper.cropper.enable(); this.onChange.emit(null); } /** * @return {?} */ reset() { this.angularCropper.cropper.reset(); this.onChange.emit(null); } /** * @return {?} */ clear() { this.angularCropper.cropper.clear(); this.onChange.emit(null); } /** * @return {?} */ crop() { this.angularCropper.cropper.crop(); /** @type {?} */ const canvas = this.angularCropper.cropper.getCroppedCanvas(); canvas.toBlob((/** * @param {?} blob * @return {?} */ (blob) => { console.log('NgxEduCropperComponent > crop > blob', blob); this.onChange.emit({ canvas: canvas, blob: blob }); })); } } NgxEduCropperComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-edu-cropper', template: "<div fxLayout=\"row\">\r\n <div fxFlex=\"80px\">\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Modo mover\" (click)=\"setDragMode('move')\">\r\n <mat-icon>open_with</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Modo recorte\" (click)=\"setDragMode('crop')\">\r\n <mat-icon>crop</mat-icon>\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Acercarse\" (click)=\"zoom(0.1)\">\r\n <mat-icon>zoom_in</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Alejarse\" (click)=\"zoom(-0.1)\">\r\n <mat-icon>zoom_out</mat-icon>\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Rotar a la izquierda\" (click)=\"rotate(-90)\">\r\n <mat-icon>rotate_left</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Rotar a la derecha\" (click)=\"rotate(90)\">\r\n <mat-icon>rotate_right</mat-icon>\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Mover a la izquierda\" (click)=\"move(-10, 0)\">\r\n <mat-icon>arrow_back</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Mover a la derecha\" (click)=\"move(10, 0)\">\r\n <mat-icon>arrow_forward</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Mover arriba\" (click)=\"move(0, -10)\">\r\n <mat-icon>arrow_upward</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Mover abajo\" (click)=\"move(0, 10)\">\r\n <mat-icon>arrow_downward</mat-icon>\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Bloquear\" (click)=\"disable()\">\r\n <mat-icon>lock</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Desbloquear\" (click)=\"enable()\">\r\n <mat-icon>lock_open</mat-icon>\r\n </button>\r\n <mat-divider></mat-divider>\r\n <button mat-icon-button aria-label=\"rotate left\" matTooltip=\"Reiniciar\" (click)=\"reset()\">\r\n <mat-icon>cached</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Limpiar\" (click)=\"clear()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <button mat-icon-button aria-label=\"rotate right\" matTooltip=\"Aplicar cambios\" (click)=\"crop()\">\r\n <mat-icon>check</mat-icon>\r\n </button>\r\n </div>\r\n <div fxFlex>\r\n <angular-cropper #angularCropper [cropperOptions]=\"ngxEduCropperOptions\" [imageUrl]=\"imageUrl\">\r\n </angular-cropper>\r\n </div>\r\n</div>", styles: [""] }] } ]; /** @nocollapse */ NgxEduCropperComponent.ctorParameters = () => []; NgxEduCropperComponent.propDecorators = { angularCropper: [{ type: ViewChild, args: ['angularCropper',] }], imageUrl: [{ type: Input }], minContainerHeight: [{ type: Input }], onChange: [{ type: Output }] }; if (false) { /** @type {?} */ NgxEduCropperComponent.prototype.angularCropper; /** @type {?} */ NgxEduCropperComponent.prototype.ngxEduCropperOptions; /** @type {?} */ NgxEduCropperComponent.prototype.imageUrl; /** @type {?} */ NgxEduCropperComponent.prototype.minContainerHeight; /** @type {?} */ NgxEduCropperComponent.prototype.onChange; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWVkdS1jcm9wcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1lZHUtY29tcG9uZW50cy8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtZWR1LWNyb3BwZXIvbmd4LWVkdS1jcm9wcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBZ0MsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlDakUsTUFBTSxPQUFPLHNCQUFzQjtJQU8vQjtRQUNJLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO1FBQzFELElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ3JDLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ0osSUFBSSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxFQUFFO1lBQy9CLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUM7U0FDakM7UUFDRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQzNFLENBQUM7Ozs7SUFFRCxXQUFXO0lBRVgsQ0FBQzs7OztJQUVELFdBQVc7SUFFWCxDQUFDOzs7O0lBRUQseUJBQXlCO1FBQ3JCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTOzs7O1FBQUcsQ0FBQyxD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QUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFDZixNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJLEVBQUUsSUFBSTthQUNiLENBQUMsQ0FBQztRQUNQLENBQUMsRUFBQyxDQUFDO0lBQ1AsQ0FBQzs7O1lBcEdKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQix5bkdBQTZDOzthQUVoRDs7Ozs7NkJBRUksU0FBUyxTQUFDLGdCQUFnQjt1QkFFMUIsS0FBSztpQ0FDTCxLQUFLO3VCQUNMLE1BQU07Ozs7SUFKUCxnREFBcUU7O0lBQ3JFLHNEQUEyQzs7SUFDM0MsMENBQTBCOztJQUMxQixvREFBb0M7O0lBQ3BDLDBDQUF3RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ3JvcHBlckNvbXBvbmVudCB9IGZyb20gJ2FuZ3VsYXItY3JvcHBlcmpzJztcclxuaW1wb3J0IHsgTmd4RWR1Q3JvcHBlck9wdGlvbnMgfSBmcm9tICcuL25neC1lZHUtY3JvcHBlci1vcHRpb25zJztcclxuaW1wb3J0IHsgTmd4RWR1Q3JvcHBlclJlc3BvbnNlIH0gZnJvbSAnLi9uZ3gtZWR1LWNyb3BwZXItcmVzcG9uc2UnO1xyXG5cclxuLyoqXHJcbiAqIElOU1RSVUNDSU9ORVMgREUgVVNPXHJcbiAqIFxyXG4gKiBJbnN0YWxhcjpcclxuICogIG5wbSBpbnN0YWxsIGFuZ3VsYXItY3JvcHBlcmpzIC0tc2F2ZVxyXG4gKiAgbnBtIGluc3RhbGwgY3JvcHBlcmpzIC0tc2F2ZVxyXG4gKiBcclxuICogQ29uZmlndXJhciBlbiBhbmd1bGFyLmpzb25cclxuICogIGVuIHN0eWxlcyA+IFwibm9kZV9tb2R1bGVzL2Nyb3BwZXJqcy9kaXN0L2Nyb3BwZXIuY3NzXCJcclxuICogIGVuIHNjcmlwdHMgPiBcIm5vZGVfbW9kdWxlcy9jcm9wcGVyanMvZGlzdC9jcm9wcGVyLmpzXCJcclxuICogXHJcbiAqIEltcG9ydGFyIGVuIG3Ds2R1bG8gSW1hZ2VUb29sc01vZHVsZSBlbiB0dSBtw7NkdWxvXHJcbiAqIFxyXG4gKiBJTlBVVFNcclxuICogaW1hZ2VVcmw6IFVybCBkZSBsYSBpbWFnZW4gYSByZWNvcnRhci5cclxuICogbWluQ29udGFpbmVySGVpZ2h0OiBBbHRvIG3DrW5pbW8gZGVsIGNvbnRlbmVkb3IgKE5vIHB1ZWRlIHNlciBpbmZlcmlvciBhIDMyNSkuIFZhbG9yIHBvciBkZWZlY3RvOiAzMjUuXHJcbiAqIFxyXG4gKiBPVVRQVVRTXHJcbiAqIG9uQ2hhbmdlKEV2ZW50RW1pdHRlcjxJbWFnZUNyb3BwZXJUb29sUmVzcG9uc2U+KTogQ3VhbmRvIHNlIGFwbGljYW4gbG9zIGNhbWJpb3MgZGV2dWVsdmUgdW4gY2FudmFzXHJcbiAqIGNvbiBsYSBpbWFnZW4gcmVjb3J0YWRhIHBhcmEgbW9zdHJhciBkZW50cm8gZGUgdW4gZGl2IHkgYmxvYiBxdWUgc2UgcHVlZGUgdXRpbGl6YXIgcGFyYSBzdWJpciBlbCBhcmNoaXZvXHJcbiAqIHV0aWxpemFuZG8gRm9ybURhdGEsIGN1YW5kbyBzZSByZWFsaXphIGFsZ3VuIGNhbWJpbyBkZXZ1ZWx2ZSBudWxsIGhhc3RhIHF1ZSBzZSBhcGxpcXVlbiBudWV2YW1lbnRlIGxvcyBjYW1iaW9zLlxyXG4gKiBcclxuICogRVhBTVBMRVxyXG4gKiA8bmd4LWVkdS1jcm9wcGVyIFtpbWFnZVVybF09XCJpbWFnZVVybFwiIFttaW5Db250YWluZXJIZWlnaHRdPVwiMzI1XCIgKG9uQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIj48L25neC1lZHUtY3JvcHBlcj5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICduZ3gtZWR1LWNyb3BwZXInLFxyXG4gICAgdGVtcGxhdGVVcmw6ICduZ3gtZWR1LWNyb3BwZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJ25neC1lZHUtY3JvcHBlci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hFZHVDcm9wcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgICBAVmlld0NoaWxkKCdhbmd1bGFyQ3JvcHBlcicpIHB1YmxpYyBhbmd1bGFyQ3JvcHBlcjogQ3JvcHBlckNvbXBvbmVudDtcclxuICAgIG5neEVkdUNyb3BwZXJPcHRpb25zOiBOZ3hFZHVDcm9wcGVyT3B0aW9ucztcclxuICAgIEBJbnB1dCgpIGltYWdlVXJsOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBtaW5Db250YWluZXJIZWlnaHQ6IG51bWJlcjtcclxuICAgIEBPdXRwdXQoKSBvbkNoYW5nZTogRXZlbnRFbWl0dGVyPE5neEVkdUNyb3BwZXJSZXNwb25zZT47XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5uZ3hFZHVDcm9wcGVyT3B0aW9ucyA9IG5ldyBOZ3hFZHVDcm9wcGVyT3B0aW9ucygpO1xyXG4gICAgICAgIHRoaXMuaW1hZ2VVcmwgPSAnJztcclxuICAgICAgICB0aGlzLm1pbkNvbnRhaW5lckhlaWdodCA9IDMyNTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxOZ3hFZHVDcm9wcGVyUmVzcG9uc2U+KCk7XHJcbiAgICAgICAgdGhpcy5zZXRJbWFnZUNyb3BwZXJUb29sRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWluQ29udGFpbmVySGVpZ2h0IDwgMzI1KSB7XHJcbiAgICAgICAgICAgIHRoaXMubWluQ29udGFpbmVySGVpZ2h0ID0gMzI1O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5neEVkdUNyb3BwZXJPcHRpb25zLm1pbkNvbnRhaW5lckhlaWdodCA9IHRoaXMubWluQ29udGFpbmVySGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW1hZ2VDcm9wcGVyVG9vbEV2ZW50cygpIHtcclxuICAgICAgICB0aGlzLm5neEVkdUNyb3BwZXJPcHRpb25zLmNyb3BzdGFydCA9IChlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChudWxsKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMubmd4RWR1Q3JvcHBlck9wdGlvbnMuY3JvcG1vdmUgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm5neEVkdUNyb3BwZXJPcHRpb25zLmNyb3BlbmQgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm5neEVkdUNyb3BwZXJPcHRpb25zLnpvb20gPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzZXREcmFnTW9kZShkcmFnTW9kZTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgY3JvcHBlckRyYWdNb2RlID0gPENyb3BwZXIuRHJhZ01vZGU+IGRyYWdNb2RlO1xyXG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5zZXREcmFnTW9kZShjcm9wcGVyRHJhZ01vZGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHpvb20ocmF0aW86IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci56b29tKHJhdGlvKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcm90YXRlKGRlZ3JlZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5hbmd1bGFyQ3JvcHBlci5jcm9wcGVyLnJvdGF0ZShkZWdyZWUpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBtb3ZlKG9mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyLCkge1xyXG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5tb3ZlKG9mZnNldFgsIG9mZnNldFkpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCkge1xyXG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5kaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZSgpIHtcclxuICAgICAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIuZW5hYmxlKCk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlc2V0KCkge1xyXG4gICAgICAgIHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhcigpIHtcclxuICAgICAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JvcCgpIHtcclxuICAgICAgICB0aGlzLmFuZ3VsYXJDcm9wcGVyLmNyb3BwZXIuY3JvcCgpO1xyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuYW5ndWxhckNyb3BwZXIuY3JvcHBlci5nZXRDcm9wcGVkQ2FudmFzKCk7XHJcbiAgICAgICAgY2FudmFzLnRvQmxvYigoYmxvYikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTmd4RWR1Q3JvcHBlckNvbXBvbmVudCA+IGNyb3AgPiBibG9iJywgYmxvYik7XHJcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7XHJcbiAgICAgICAgICAgICAgICBjYW52YXM6IGNhbnZhcyxcclxuICAgICAgICAgICAgICAgIGJsb2I6IGJsb2JcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIl19