{"version":3,"file":"asoftwareworld-form-builder-pro-image-crop.mjs","sources":["../../src/components/image-crop/services/crop.service.ts","../../src/components/image-crop/services/cropper-position.service.ts","../../src/components/image-crop/services/load-image.service.ts","../../src/components/image-crop/image-crop.component.ts","../../src/components/image-crop/image-crop.component.html","../../src/components/image-crop/image-crop.module.ts","../../src/components/image-crop/public_api.ts","../../src/components/image-crop/asoftwareworld-form-builder-pro-image-crop.ts"],"sourcesContent":["/**\n * @license\n * Copyright ASW (A Software World) All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file\n */\n\nimport { ElementRef, Injectable } from '@angular/core';\nimport { CropperPosition, Dimensions, CropperSettings, ImageCroppedEvent, LoadedImage, OutputType } from '@asoftwareworld/form-builder-pro/api';\nimport { percentage, resizeCanvas } from '@asoftwareworld/form-builder-pro/utils';\n\n@Injectable({ providedIn: 'root' })\nexport class CropService {\n    crop(loadedImage: LoadedImage, cropper: CropperPosition, settings: CropperSettings, output: 'blob', maxSize: Dimensions): Promise<ImageCroppedEvent> | null;\n    crop(loadedImage: LoadedImage, cropper: CropperPosition, settings: CropperSettings, output: 'base64', maxSize: Dimensions): ImageCroppedEvent | null;\n    crop(loadedImage: LoadedImage, cropper: CropperPosition, settings: CropperSettings, output: OutputType, maxSize: Dimensions): Promise<ImageCroppedEvent> | ImageCroppedEvent | null {\n        const imagePosition = this.getImagePosition(loadedImage, cropper, settings, maxSize);\n        const width = imagePosition.x2 - imagePosition.x1;\n        const height = imagePosition.y2 - imagePosition.y1;\n        const cropCanvas = document.createElement('canvas') as HTMLCanvasElement;\n        cropCanvas.width = width;\n        cropCanvas.height = height;\n\n        const ctx = cropCanvas.getContext('2d');\n        if (!ctx) {\n            return null;\n        }\n        if (settings.backgroundColor != null) {\n            ctx.fillStyle = settings.backgroundColor;\n            ctx.fillRect(0, 0, width, height);\n        }\n\n        const scaleX = (settings.transform.scale || 1) * (settings.transform.flipH ? -1 : 1);\n        const scaleY = (settings.transform.scale || 1) * (settings.transform.flipV ? -1 : 1);\n        const { translateH, translateV } = this.getCanvasTranslate(loadedImage, settings, maxSize);\n\n        const transformedImage = loadedImage.transformed;\n        ctx.setTransform(scaleX, 0, 0, scaleY, transformedImage.size.width / 2 + translateH, transformedImage.size.height / 2 + translateV);\n        ctx.translate(-imagePosition.x1 / scaleX, -imagePosition.y1 / scaleY);\n        ctx.rotate(((settings.transform.rotate || 0) * Math.PI) / 180);\n\n        ctx.drawImage(transformedImage.image, -transformedImage.size.width / 2, -transformedImage.size.height / 2);\n\n        const result: ImageCroppedEvent = {\n            width,\n            height,\n            imagePosition,\n            cropperPosition: { ...cropper }\n        };\n        if (settings.containWithinAspectRatio) {\n            result.offsetImagePosition = this.getOffsetImagePosition(loadedImage, cropper, settings, maxSize);\n        }\n        const resizeRatio = this.getResizeRatio(width, height, settings);\n        if (resizeRatio !== 1) {\n            result.width = Math.round(width * resizeRatio);\n            result.height = settings.maintainAspectRatio ? Math.round(result.width / settings.aspectRatio) : Math.round(height * resizeRatio);\n            resizeCanvas(cropCanvas, result.width, result.height);\n        }\n        if (output === 'blob') {\n            return this.cropToBlob(result, cropCanvas, settings);\n        } else {\n            result.base64 = cropCanvas.toDataURL('image/' + settings.format, this.getQuality(settings));\n            return result;\n        }\n    }\n\n    private async cropToBlob(output: ImageCroppedEvent, cropCanvas: HTMLCanvasElement, settings: CropperSettings): Promise<ImageCroppedEvent> {\n        output.blob = await new Promise<Blob | null>((resolve) => cropCanvas.toBlob(resolve, 'image/' + settings.format, this.getQuality(settings)));\n        if (output.blob) {\n            output.objectUrl = URL.createObjectURL(output.blob);\n        }\n        return output;\n    }\n\n    private getCanvasTranslate(loadedImage: LoadedImage, settings: CropperSettings, maxSize: Dimensions): { translateH: number; translateV: number } {\n        if (settings.transform.translateUnit === 'px') {\n            const ratio = this.getRatio(loadedImage, maxSize);\n            return {\n                translateH: (settings.transform.translateH || 0) * ratio,\n                translateV: (settings.transform.translateV || 0) * ratio\n            };\n        } else {\n            return {\n                translateH: settings.transform.translateH ? percentage(settings.transform.translateH, loadedImage.transformed.size.width) : 0,\n                translateV: settings.transform.translateV ? percentage(settings.transform.translateV, loadedImage.transformed.size.height) : 0\n            };\n        }\n    }\n\n    private getRatio(loadedImage: LoadedImage, maxSize: Dimensions): number {\n        return loadedImage.transformed.size.width / maxSize.width;\n    }\n\n    private getImagePosition(loadedImage: LoadedImage, cropper: CropperPosition, settings: CropperSettings, maxSize: Dimensions): CropperPosition {\n        const ratio = this.getRatio(loadedImage, maxSize);\n        const out: CropperPosition = {\n            x1: Math.round(cropper.x1 * ratio),\n            y1: Math.round(cropper.y1 * ratio),\n            x2: Math.round(cropper.x2 * ratio),\n            y2: Math.round(cropper.y2 * ratio)\n        };\n\n        if (!settings.containWithinAspectRatio) {\n            out.x1 = Math.max(out.x1, 0);\n            out.y1 = Math.max(out.y1, 0);\n            out.x2 = Math.min(out.x2, loadedImage.transformed.size.width);\n            out.y2 = Math.min(out.y2, loadedImage.transformed.size.height);\n        }\n\n        return out;\n    }\n\n    private getOffsetImagePosition(loadedImage: LoadedImage, cropper: CropperPosition, settings: CropperSettings, maxSize: Dimensions): CropperPosition {\n        const canvasRotation = settings.canvasRotation + loadedImage.exifTransform.rotate;\n        const ratio = this.getRatio(loadedImage, maxSize);\n        let offsetX: number;\n        let offsetY: number;\n\n        if (canvasRotation % 2) {\n            offsetX = (loadedImage.transformed.size.width - loadedImage.original.size.height) / 2;\n            offsetY = (loadedImage.transformed.size.height - loadedImage.original.size.width) / 2;\n        } else {\n            offsetX = (loadedImage.transformed.size.width - loadedImage.original.size.width) / 2;\n            offsetY = (loadedImage.transformed.size.height - loadedImage.original.size.height) / 2;\n        }\n\n        const out: CropperPosition = {\n            x1: Math.round(cropper.x1 * ratio) - offsetX,\n            y1: Math.round(cropper.y1 * ratio) - offsetY,\n            x2: Math.round(cropper.x2 * ratio) - offsetX,\n            y2: Math.round(cropper.y2 * ratio) - offsetY\n        };\n\n        if (!settings.containWithinAspectRatio) {\n            out.x1 = Math.max(out.x1, 0);\n            out.y1 = Math.max(out.y1, 0);\n            out.x2 = Math.min(out.x2, loadedImage.transformed.size.width);\n            out.y2 = Math.min(out.y2, loadedImage.transformed.size.height);\n        }\n\n        return out;\n    }\n\n    getResizeRatio(width: number, height: number, settings: CropperSettings): number {\n        const ratioWidth = settings.resizeToWidth / width;\n        const ratioHeight = settings.resizeToHeight / height;\n        const ratios = new Array<number>();\n\n        if (settings.resizeToWidth > 0) {\n            ratios.push(ratioWidth);\n        }\n        if (settings.resizeToHeight > 0) {\n            ratios.push(ratioHeight);\n        }\n\n        const result = ratios.length === 0 ? 1 : Math.min(...ratios);\n\n        if (result > 1 && !settings.onlyScaleDown) {\n            return result;\n        }\n        return Math.min(result, 1);\n    }\n\n    getQuality(settings: CropperSettings): number {\n        return Math.min(1, Math.max(0, settings.imageQuality / 100));\n    }\n}\n","/**\n * @license\n * Copyright ASW (A Software World) All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file\n */\n\nimport { ElementRef, Injectable } from '@angular/core';\nimport { CropperPosition, CropperSettings, Dimensions, MoveStart } from '@asoftwareworld/form-builder-pro/api';\n\n@Injectable({ providedIn: 'root' })\nexport class CropperPositionService {\n    resetCropperPosition(sourceImage: ElementRef, cropperPosition: CropperPosition, settings: CropperSettings, maxSize: Dimensions): void {\n        if (!sourceImage?.nativeElement) {\n            return;\n        }\n        if (settings.cropperStaticHeight && settings.cropperStaticWidth) {\n            cropperPosition.x1 = 0;\n            cropperPosition.x2 = maxSize.width > settings.cropperStaticWidth ? settings.cropperStaticWidth : maxSize.width;\n            cropperPosition.y1 = 0;\n            cropperPosition.y2 = maxSize.height > settings.cropperStaticHeight ? settings.cropperStaticHeight : maxSize.height;\n        } else {\n            const cropperWidth = Math.min(settings.cropperScaledMaxWidth, maxSize.width);\n            const cropperHeight = Math.min(settings.cropperScaledMaxHeight, maxSize.height);\n            if (!settings.maintainAspectRatio) {\n                cropperPosition.x1 = 0;\n                cropperPosition.x2 = cropperWidth;\n                cropperPosition.y1 = 0;\n                cropperPosition.y2 = cropperHeight;\n            } else if (maxSize.width / settings.aspectRatio < maxSize.height) {\n                cropperPosition.x1 = 0;\n                cropperPosition.x2 = cropperWidth;\n                const cropperHeightWithAspectRatio = cropperWidth / settings.aspectRatio;\n                cropperPosition.y1 = (maxSize.height - cropperHeightWithAspectRatio) / 2;\n                cropperPosition.y2 = cropperPosition.y1 + cropperHeightWithAspectRatio;\n            } else {\n                cropperPosition.y1 = 0;\n                cropperPosition.y2 = cropperHeight;\n                const cropperWidthWithAspectRatio = cropperHeight * settings.aspectRatio;\n                cropperPosition.x1 = (maxSize.width - cropperWidthWithAspectRatio) / 2;\n                cropperPosition.x2 = cropperPosition.x1 + cropperWidthWithAspectRatio;\n            }\n        }\n    }\n\n    move(event: any, moveStart: MoveStart, cropperPosition: CropperPosition) {\n        const diffX = this.getClientX(event) - moveStart.clientX;\n        const diffY = this.getClientY(event) - moveStart.clientY;\n\n        cropperPosition.x1 = moveStart.x1 + diffX;\n        cropperPosition.y1 = moveStart.y1 + diffY;\n        cropperPosition.x2 = moveStart.x2 + diffX;\n        cropperPosition.y2 = moveStart.y2 + diffY;\n    }\n\n    resize(event: any, moveStart: MoveStart, cropperPosition: CropperPosition, maxSize: Dimensions, settings: CropperSettings): void {\n        const moveX = this.getClientX(event) - moveStart.clientX;\n        const moveY = this.getClientY(event) - moveStart.clientY;\n        switch (moveStart.position) {\n            case 'left':\n                cropperPosition.x1 = Math.min(Math.max(moveStart.x1 + moveX, cropperPosition.x2 - settings.cropperScaledMaxWidth), cropperPosition.x2 - settings.cropperScaledMinWidth);\n                break;\n            case 'topleft':\n                cropperPosition.x1 = Math.min(Math.max(moveStart.x1 + moveX, cropperPosition.x2 - settings.cropperScaledMaxWidth), cropperPosition.x2 - settings.cropperScaledMinWidth);\n                cropperPosition.y1 = Math.min(Math.max(moveStart.y1 + moveY, cropperPosition.y2 - settings.cropperScaledMaxHeight), cropperPosition.y2 - settings.cropperScaledMinHeight);\n                break;\n            case 'top':\n                cropperPosition.y1 = Math.min(Math.max(moveStart.y1 + moveY, cropperPosition.y2 - settings.cropperScaledMaxHeight), cropperPosition.y2 - settings.cropperScaledMinHeight);\n                break;\n            case 'topright':\n                cropperPosition.x2 = Math.max(Math.min(moveStart.x2 + moveX, cropperPosition.x1 + settings.cropperScaledMaxWidth), cropperPosition.x1 + settings.cropperScaledMinWidth);\n                cropperPosition.y1 = Math.min(Math.max(moveStart.y1 + moveY, cropperPosition.y2 - settings.cropperScaledMaxHeight), cropperPosition.y2 - settings.cropperScaledMinHeight);\n                break;\n            case 'right':\n                cropperPosition.x2 = Math.max(Math.min(moveStart.x2 + moveX, cropperPosition.x1 + settings.cropperScaledMaxWidth), cropperPosition.x1 + settings.cropperScaledMinWidth);\n                break;\n            case 'bottomright':\n                cropperPosition.x2 = Math.max(Math.min(moveStart.x2 + moveX, cropperPosition.x1 + settings.cropperScaledMaxWidth), cropperPosition.x1 + settings.cropperScaledMinWidth);\n                cropperPosition.y2 = Math.max(Math.min(moveStart.y2 + moveY, cropperPosition.y1 + settings.cropperScaledMaxHeight), cropperPosition.y1 + settings.cropperScaledMinHeight);\n                break;\n            case 'bottom':\n                cropperPosition.y2 = Math.max(Math.min(moveStart.y2 + moveY, cropperPosition.y1 + settings.cropperScaledMaxHeight), cropperPosition.y1 + settings.cropperScaledMinHeight);\n                break;\n            case 'bottomleft':\n                cropperPosition.x1 = Math.min(Math.max(moveStart.x1 + moveX, cropperPosition.x2 - settings.cropperScaledMaxWidth), cropperPosition.x2 - settings.cropperScaledMinWidth);\n                cropperPosition.y2 = Math.max(Math.min(moveStart.y2 + moveY, cropperPosition.y1 + settings.cropperScaledMaxHeight), cropperPosition.y1 + settings.cropperScaledMinHeight);\n                break;\n            case 'center':\n                const scale = event.scale;\n                const newWidth = Math.min(Math.max(settings.cropperScaledMinWidth, Math.abs(moveStart.x2 - moveStart.x1) * scale), settings.cropperScaledMaxWidth);\n                const newHeight = Math.min(Math.max(settings.cropperScaledMinHeight, Math.abs(moveStart.y2 - moveStart.y1) * scale), settings.cropperScaledMaxHeight);\n                cropperPosition.x1 = moveStart.clientX - newWidth / 2;\n                cropperPosition.x2 = moveStart.clientX + newWidth / 2;\n                cropperPosition.y1 = moveStart.clientY - newHeight / 2;\n                cropperPosition.y2 = moveStart.clientY + newHeight / 2;\n                if (cropperPosition.x1 < 0) {\n                    cropperPosition.x2 -= cropperPosition.x1;\n                    cropperPosition.x1 = 0;\n                } else if (cropperPosition.x2 > maxSize.width) {\n                    cropperPosition.x1 -= cropperPosition.x2 - maxSize.width;\n                    cropperPosition.x2 = maxSize.width;\n                }\n                if (cropperPosition.y1 < 0) {\n                    cropperPosition.y2 -= cropperPosition.y1;\n                    cropperPosition.y1 = 0;\n                } else if (cropperPosition.y2 > maxSize.height) {\n                    cropperPosition.y1 -= cropperPosition.y2 - maxSize.height;\n                    cropperPosition.y2 = maxSize.height;\n                }\n                break;\n        }\n\n        if (settings.maintainAspectRatio) {\n            this.checkAspectRatio(moveStart.position!, cropperPosition, maxSize, settings);\n        }\n    }\n\n    checkAspectRatio(position: string, cropperPosition: CropperPosition, maxSize: Dimensions, settings: CropperSettings): void {\n        let overflowX = 0;\n        let overflowY = 0;\n\n        switch (position) {\n            case 'top':\n                cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * settings.aspectRatio;\n                overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);\n                overflowY = Math.max(0 - cropperPosition.y1, 0);\n                if (overflowX > 0 || overflowY > 0) {\n                    cropperPosition.x2 -= overflowY * settings.aspectRatio > overflowX ? overflowY * settings.aspectRatio : overflowX;\n                    cropperPosition.y1 += overflowY * settings.aspectRatio > overflowX ? overflowY : overflowX / settings.aspectRatio;\n                }\n                break;\n            case 'bottom':\n                cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * settings.aspectRatio;\n                overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);\n                overflowY = Math.max(cropperPosition.y2 - maxSize.height, 0);\n                if (overflowX > 0 || overflowY > 0) {\n                    cropperPosition.x2 -= overflowY * settings.aspectRatio > overflowX ? overflowY * settings.aspectRatio : overflowX;\n                    cropperPosition.y2 -= overflowY * settings.aspectRatio > overflowX ? overflowY : overflowX / settings.aspectRatio;\n                }\n                break;\n            case 'topleft':\n                cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\n                overflowX = Math.max(0 - cropperPosition.x1, 0);\n                overflowY = Math.max(0 - cropperPosition.y1, 0);\n                if (overflowX > 0 || overflowY > 0) {\n                    cropperPosition.x1 += overflowY * settings.aspectRatio > overflowX ? overflowY * settings.aspectRatio : overflowX;\n                    cropperPosition.y1 += overflowY * settings.aspectRatio > overflowX ? overflowY : overflowX / settings.aspectRatio;\n                }\n                break;\n            case 'topright':\n                cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\n                overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);\n                overflowY = Math.max(0 - cropperPosition.y1, 0);\n                if (overflowX > 0 || overflowY > 0) {\n                    cropperPosition.x2 -= overflowY * settings.aspectRatio > overflowX ? overflowY * settings.aspectRatio : overflowX;\n                    cropperPosition.y1 += overflowY * settings.aspectRatio > overflowX ? overflowY : overflowX / settings.aspectRatio;\n                }\n                break;\n            case 'right':\n            case 'bottomright':\n                cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\n                overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);\n                overflowY = Math.max(cropperPosition.y2 - maxSize.height, 0);\n                if (overflowX > 0 || overflowY > 0) {\n                    cropperPosition.x2 -= overflowY * settings.aspectRatio > overflowX ? overflowY * settings.aspectRatio : overflowX;\n                    cropperPosition.y2 -= overflowY * settings.aspectRatio > overflowX ? overflowY : overflowX / settings.aspectRatio;\n                }\n                break;\n            case 'left':\n            case 'bottomleft':\n                cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\n                overflowX = Math.max(0 - cropperPosition.x1, 0);\n                overflowY = Math.max(cropperPosition.y2 - maxSize.height, 0);\n                if (overflowX > 0 || overflowY > 0) {\n                    cropperPosition.x1 += overflowY * settings.aspectRatio > overflowX ? overflowY * settings.aspectRatio : overflowX;\n                    cropperPosition.y2 -= overflowY * settings.aspectRatio > overflowX ? overflowY : overflowX / settings.aspectRatio;\n                }\n                break;\n            case 'center':\n                cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * settings.aspectRatio;\n                cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\n                const overflowX1 = Math.max(0 - cropperPosition.x1, 0);\n                const overflowX2 = Math.max(cropperPosition.x2 - maxSize.width, 0);\n                const overflowY1 = Math.max(cropperPosition.y2 - maxSize.height, 0);\n                const overflowY2 = Math.max(0 - cropperPosition.y1, 0);\n                if (overflowX1 > 0 || overflowX2 > 0 || overflowY1 > 0 || overflowY2 > 0) {\n                    cropperPosition.x1 += overflowY1 * settings.aspectRatio > overflowX1 ? overflowY1 * settings.aspectRatio : overflowX1;\n                    cropperPosition.x2 -= overflowY2 * settings.aspectRatio > overflowX2 ? overflowY2 * settings.aspectRatio : overflowX2;\n                    cropperPosition.y1 += overflowY2 * settings.aspectRatio > overflowX2 ? overflowY2 : overflowX2 / settings.aspectRatio;\n                    cropperPosition.y2 -= overflowY1 * settings.aspectRatio > overflowX1 ? overflowY1 : overflowX1 / settings.aspectRatio;\n                }\n                break;\n        }\n    }\n\n    getClientX(event: any): number {\n        return event.touches?.[0].clientX || event.clientX || 0;\n    }\n\n    getClientY(event: any): number {\n        return event.touches?.[0].clientY || event.clientY || 0;\n    }\n}\n","/**\n * @license\n * Copyright ASW (A Software World) All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file\n */\n\nimport { Injectable } from '@angular/core';\nimport { CropperSettings, Dimensions, ExifTransform, LoadedImage } from '@asoftwareworld/form-builder-pro/api';\nimport { getTransformationsFromExifData, supportsAutomaticRotation } from '@asoftwareworld/form-builder-pro/utils';\n\ninterface LoadImageArrayBuffer {\n    originalImage: HTMLImageElement;\n    originalArrayBuffer: ArrayBufferLike;\n    originalObjectUrl: string;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LoadImageService {\n    private autoRotateSupported: Promise<boolean> = supportsAutomaticRotation();\n\n    loadImageFile(file: File, cropperSettings: CropperSettings): Promise<LoadedImage> {\n        return file.arrayBuffer().then((arrayBuffer) => this.checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, file.type, cropperSettings));\n    }\n\n    private checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer: ArrayBufferLike, imageType: string, cropperSettings: CropperSettings): Promise<LoadedImage> {\n        if (!this.isValidImageType(imageType)) {\n            return Promise.reject(new Error('Invalid image type'));\n        }\n        return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);\n    }\n\n    private isValidImageType(type: string): boolean {\n        return /image\\/(png|jpg|jpeg|bmp|gif|tiff|webp|x-icon|vnd.microsoft.icon)/.test(type);\n    }\n\n    loadImageFromURL(url: string, cropperSettings: CropperSettings): Promise<LoadedImage> {\n        return fetch(url)\n            .then((res) => res.arrayBuffer())\n            .then((buffer) => this.loadImageFromArrayBuffer(buffer, cropperSettings));\n    }\n\n    loadBase64Image(imageBase64: string, cropperSettings: CropperSettings): Promise<LoadedImage> {\n        const arrayBuffer = this.base64ToArrayBuffer(imageBase64);\n        return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);\n    }\n\n    private base64ToArrayBuffer(imageBase64: string): ArrayBufferLike {\n        imageBase64 = imageBase64.replace(/^data\\:([^\\;]+)\\;base64,/gim, '');\n        const binaryString = atob(imageBase64);\n        const len = binaryString.length;\n        const bytes = new Uint8Array(len);\n        for (let i = 0; i < len; i++) {\n            bytes[i] = binaryString.charCodeAt(i);\n        }\n        return bytes.buffer;\n    }\n\n    private loadImageFromArrayBuffer(arrayBuffer: ArrayBufferLike, cropperSettings: CropperSettings): Promise<LoadedImage> {\n        return new Promise<LoadImageArrayBuffer>((resolve, reject) => {\n            const blob = new Blob([arrayBuffer]);\n            const objectUrl = URL.createObjectURL(blob);\n            const originalImage = new Image();\n            originalImage.onload = () =>\n                resolve({\n                    originalImage,\n                    originalObjectUrl: objectUrl,\n                    originalArrayBuffer: arrayBuffer\n                });\n            originalImage.onerror = reject;\n            originalImage.src = objectUrl;\n        }).then((res: LoadImageArrayBuffer) => this.transformImageFromArrayBuffer(res, cropperSettings));\n    }\n\n    private async transformImageFromArrayBuffer(res: LoadImageArrayBuffer, cropperSettings: CropperSettings): Promise<LoadedImage> {\n        const autoRotate = await this.autoRotateSupported;\n        const exifTransform = await getTransformationsFromExifData(autoRotate ? -1 : res.originalArrayBuffer);\n        if (!res.originalImage || !res.originalImage.complete) {\n            return Promise.reject(new Error('No image loaded'));\n        }\n        const loadedImage = {\n            original: {\n                objectUrl: res.originalObjectUrl,\n                image: res.originalImage,\n                size: {\n                    width: res.originalImage.naturalWidth,\n                    height: res.originalImage.naturalHeight\n                }\n            },\n            exifTransform\n        };\n        return this.transformLoadedImage(loadedImage, cropperSettings);\n    }\n\n    async transformLoadedImage(loadedImage: Partial<LoadedImage>, cropperSettings: CropperSettings): Promise<LoadedImage> {\n        const canvasRotation = cropperSettings.canvasRotation + loadedImage.exifTransform!.rotate;\n        const originalSize = {\n            width: loadedImage.original!.image.naturalWidth,\n            height: loadedImage.original!.image.naturalHeight\n        };\n        if (canvasRotation === 0 && !loadedImage.exifTransform!.flip && !cropperSettings.containWithinAspectRatio) {\n            return {\n                original: {\n                    objectUrl: loadedImage.original!.objectUrl,\n                    image: loadedImage.original!.image,\n                    size: { ...originalSize }\n                },\n                transformed: {\n                    objectUrl: loadedImage.original!.objectUrl,\n                    image: loadedImage.original!.image,\n                    size: { ...originalSize }\n                },\n                exifTransform: loadedImage.exifTransform!\n            };\n        }\n\n        const transformedSize = this.getTransformedSize(originalSize, loadedImage.exifTransform!, cropperSettings);\n        const canvas = document.createElement('canvas');\n        canvas.width = transformedSize.width;\n        canvas.height = transformedSize.height;\n        const ctx = canvas.getContext('2d');\n        ctx?.setTransform(loadedImage.exifTransform!.flip ? -1 : 1, 0, 0, 1, canvas.width / 2, canvas.height / 2);\n        ctx?.rotate(Math.PI * (canvasRotation / 2));\n        ctx?.drawImage(loadedImage.original!.image, -originalSize.width / 2, -originalSize.height / 2);\n        const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, cropperSettings.format));\n        if (!blob) {\n            throw new Error('Failed to get Blob for transformed image.');\n        }\n        const objectUrl = URL.createObjectURL(blob);\n        const transformedImage = await this.loadImageFromObjectUrl(objectUrl);\n        return {\n            original: {\n                objectUrl: loadedImage.original!.objectUrl,\n                image: loadedImage.original!.image,\n                size: { ...originalSize }\n            },\n            transformed: {\n                objectUrl: objectUrl,\n                image: transformedImage,\n                size: {\n                    width: transformedImage.width,\n                    height: transformedImage.height\n                }\n            },\n            exifTransform: loadedImage.exifTransform!\n        };\n    }\n\n    private loadImageFromObjectUrl(objectUrl: string): Promise<HTMLImageElement> {\n        return new Promise<HTMLImageElement>((resolve, reject) => {\n            const image = new Image();\n            image.onload = () => resolve(image);\n            image.onerror = reject;\n            image.src = objectUrl;\n        });\n    }\n\n    private getTransformedSize(originalSize: { width: number; height: number }, exifTransform: ExifTransform, cropperSettings: CropperSettings): Dimensions {\n        const canvasRotation = cropperSettings.canvasRotation + exifTransform.rotate;\n        if (cropperSettings.containWithinAspectRatio) {\n            if (canvasRotation % 2) {\n                const minWidthToContain = originalSize.width * cropperSettings.aspectRatio;\n                const minHeightToContain = originalSize.height / cropperSettings.aspectRatio;\n                return {\n                    width: Math.max(originalSize.height, minWidthToContain),\n                    height: Math.max(originalSize.width, minHeightToContain)\n                };\n            } else {\n                const minWidthToContain = originalSize.height * cropperSettings.aspectRatio;\n                const minHeightToContain = originalSize.width / cropperSettings.aspectRatio;\n                return {\n                    width: Math.max(originalSize.width, minWidthToContain),\n                    height: Math.max(originalSize.height, minHeightToContain)\n                };\n            }\n        }\n\n        if (canvasRotation % 2) {\n            return {\n                height: originalSize.width,\n                width: originalSize.height\n            };\n        }\n        return {\n            width: originalSize.width,\n            height: originalSize.height\n        };\n    }\n}\n","/**\n * @license\n * Copyright ASW (A Software World) All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file\n */\n\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Inject, Input, isDevMode, NgZone, OnChanges, OnInit, Optional, Output, SimpleChanges, ViewChild } from '@angular/core';\nimport { DomSanitizer, HAMMER_LOADER, HammerLoader, SafeStyle, SafeUrl } from '@angular/platform-browser';\nimport { CropperPosition, CropperSettings, Dimensions, ImageCroppedEvent, ImageTransform, LoadedImage, MoveStart, MoveTypes, OutputFormat, OutputType } from '@asoftwareworld/form-builder-pro/api';\nimport { getEventForKey, getInvertedPositionForKey, getPositionForKey, HammerStatic } from '@asoftwareworld/form-builder-pro/utils';\nimport { first, fromEvent, merge, takeUntil } from 'rxjs';\nimport { CropService } from './services/crop.service';\nimport { CropperPositionService } from './services/cropper-position.service';\nimport { LoadImageService } from './services/load-image.service';\n\n@Component({\n    selector: 'asw-image-crop',\n    templateUrl: './image-crop.component.html',\n    styleUrls: ['./image-crop.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AswImageCropComponent implements OnChanges, OnInit {\n    private settings = new CropperSettings();\n    private setImageMaxSizeRetries = 0;\n    private moveStart?: MoveStart;\n    private loadedImage?: LoadedImage;\n    private resizedWhileHidden = false;\n\n    safeImgDataUrl?: SafeUrl | string;\n    safeTransformStyle?: SafeStyle | string;\n    marginLeft: SafeStyle | string = '0px';\n    maxSize: Dimensions = {\n        width: 0,\n        height: 0\n    };\n    moveTypes = MoveTypes;\n    imageVisible = false;\n\n    @ViewChild('wrapper', { static: true }) wrapper!: ElementRef<HTMLDivElement>;\n    @ViewChild('sourceImage', { static: false }) sourceImage!: ElementRef<HTMLDivElement>;\n\n    @Input() imageChangedEvent?: any;\n    @Input() imageURL?: string;\n    @Input() imageBase64?: string;\n    @Input() imageFile?: File;\n    @Input() imageAltText?: string;\n    @Input() cropperFrameAriaLabel = this.settings.cropperFrameAriaLabel;\n    @Input() output: 'blob' | 'base64' = this.settings.output;\n    @Input() format: OutputFormat = this.settings.format;\n    @Input() transform: ImageTransform = {};\n    @Input() maintainAspectRatio = this.settings.maintainAspectRatio;\n    @Input() aspectRatio = this.settings.aspectRatio;\n    @Input() resetCropOnAspectRatioChange = this.settings.resetCropOnAspectRatioChange;\n    @Input() resizeToWidth = this.settings.resizeToWidth;\n    @Input() resizeToHeight = this.settings.resizeToHeight;\n    @Input() cropperMinWidth = this.settings.cropperMinWidth;\n    @Input() cropperMinHeight = this.settings.cropperMinHeight;\n    @Input() cropperMaxHeight = this.settings.cropperMaxHeight;\n    @Input() cropperMaxWidth = this.settings.cropperMaxWidth;\n    @Input() cropperStaticWidth = this.settings.cropperStaticWidth;\n    @Input() cropperStaticHeight = this.settings.cropperStaticHeight;\n    @Input() canvasRotation = this.settings.canvasRotation;\n    @Input() initialStepSize = this.settings.initialStepSize;\n    @Input() roundCropper = this.settings.roundCropper;\n    @Input() onlyScaleDown = this.settings.onlyScaleDown;\n    @Input() imageQuality = this.settings.imageQuality;\n    @Input() autoCrop = this.settings.autoCrop;\n    @Input() backgroundColor = this.settings.backgroundColor;\n    @Input() containWithinAspectRatio = this.settings.containWithinAspectRatio;\n    @Input() hideResizeSquares = this.settings.hideResizeSquares;\n    @Input() allowMoveImage = false;\n    @Input() cropper: CropperPosition = {\n        x1: -100,\n        y1: -100,\n        x2: 10000,\n        y2: 10000\n    };\n    @HostBinding('style.text-align')\n    @Input()\n    alignImage: 'left' | 'center' = this.settings.alignImage;\n    @HostBinding('class.disabled')\n    @Input()\n    disabled = false;\n    @HostBinding('class.asw-ix-hidden')\n    @Input()\n    hidden = false;\n\n    @Output() imageCropped = new EventEmitter<ImageCroppedEvent>();\n    @Output() startCropImage = new EventEmitter<void>();\n    @Output() imageLoaded = new EventEmitter<LoadedImage>();\n    @Output() cropperReady = new EventEmitter<Dimensions>();\n    @Output() loadImageFailed = new EventEmitter<void>();\n    @Output() transformChange = new EventEmitter<ImageTransform>();\n\n    constructor(\n        private cropService: CropService,\n        private cropperPositionService: CropperPositionService,\n        private loadImageService: LoadImageService,\n        private sanitizer: DomSanitizer,\n        private cd: ChangeDetectorRef,\n        private zone: NgZone,\n        @Optional() @Inject(HAMMER_LOADER) private readonly hammerLoader: HammerLoader | null\n    ) {\n        this.reset();\n    }\n\n    ngOnChanges(changes: SimpleChanges): void {\n        this.onChangesUpdateSettings(changes);\n        this.onChangesInputImage(changes);\n\n        if (this.loadedImage?.original.image.complete && (changes['containWithinAspectRatio'] || changes['canvasRotation'])) {\n            this.loadImageService\n                .transformLoadedImage(this.loadedImage, this.settings)\n                .then((res) => this.setLoadedImage(res))\n                .catch((err) => this.loadImageError(err));\n        }\n        if (changes['cropper'] || changes['maintainAspectRatio'] || changes['aspectRatio']) {\n            this.setMaxSize();\n            this.setCropperScaledMinSize();\n            this.setCropperScaledMaxSize();\n            if (this.maintainAspectRatio && (this.resetCropOnAspectRatioChange || !this.aspectRatioIsCorrect()) && (changes['maintainAspectRatio'] || changes['aspectRatio'])) {\n                this.resetCropperPosition();\n            } else if (changes['cropper']) {\n                this.checkCropperPosition(false);\n                this.doAutoCrop();\n            }\n        }\n        if (changes['transform']) {\n            this.transform = this.transform || {};\n            this.setCssTransform();\n            this.doAutoCrop();\n        }\n        if (changes['hidden'] && this.resizedWhileHidden && !this.hidden) {\n            setTimeout(() => {\n                this.onResize();\n                this.resizedWhileHidden = false;\n            });\n        }\n    }\n\n    private onChangesUpdateSettings(changes: SimpleChanges) {\n        this.settings.setOptionsFromChanges(changes);\n\n        if (this.settings.cropperStaticHeight && this.settings.cropperStaticWidth) {\n            this.hideResizeSquares = true;\n            this.settings.setOptions({\n                hideResizeSquares: true,\n                cropperMinWidth: this.settings.cropperStaticWidth,\n                cropperMinHeight: this.settings.cropperStaticHeight,\n                cropperMaxHeight: this.settings.cropperStaticHeight,\n                cropperMaxWidth: this.settings.cropperStaticWidth,\n                maintainAspectRatio: false\n            });\n        }\n    }\n\n    private onChangesInputImage(changes: SimpleChanges): void {\n        if (changes['imageChangedEvent'] || changes['imageURL'] || changes['imageBase64'] || changes['imageFile']) {\n            this.reset();\n        }\n        if (changes['imageChangedEvent'] && this.isValidImageChangedEvent()) {\n            this.loadImageFile(this.imageChangedEvent.target.files[0]);\n        }\n        if (changes['imageURL'] && this.imageURL) {\n            this.loadImageFromURL(this.imageURL);\n        }\n        if (changes['imageBase64'] && this.imageBase64) {\n            this.loadBase64Image(this.imageBase64);\n        }\n        if (changes['imageFile'] && this.imageFile) {\n            this.loadImageFile(this.imageFile);\n        }\n    }\n\n    private isValidImageChangedEvent(): boolean {\n        return this.imageChangedEvent?.target?.files?.length > 0;\n    }\n\n    private setCssTransform() {\n        const translateUnit = this.transform?.translateUnit || '%';\n        this.safeTransformStyle = this.sanitizer.bypassSecurityTrustStyle(\n            `translate(${this.transform.translateH || 0}${translateUnit}, ${this.transform.translateV || 0}${translateUnit})` +\n                ' scaleX(' +\n                (this.transform.scale || 1) * (this.transform.flipH ? -1 : 1) +\n                ')' +\n                ' scaleY(' +\n                (this.transform.scale || 1) * (this.transform.flipV ? -1 : 1) +\n                ')' +\n                ' rotate(' +\n                (this.transform.rotate || 0) +\n                'deg)'\n        );\n    }\n\n    ngOnInit(): void {\n        this.settings.stepSize = this.initialStepSize;\n        this.activatePinchGesture();\n    }\n\n    private reset(): void {\n        this.imageVisible = false;\n        this.loadedImage = undefined;\n        this.safeImgDataUrl = 'data:image/png;base64,iVBORw0KGg' + 'oAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAU' + 'AAarVyFEAAAAASUVORK5CYII=';\n        this.moveStart = {\n            active: false,\n            type: null,\n            position: null,\n            x1: 0,\n            y1: 0,\n            x2: 0,\n            y2: 0,\n            clientX: 0,\n            clientY: 0\n        };\n        this.maxSize = {\n            width: 0,\n            height: 0\n        };\n        this.cropper.x1 = -100;\n        this.cropper.y1 = -100;\n        this.cropper.x2 = 10000;\n        this.cropper.y2 = 10000;\n    }\n\n    private loadImageFile(file: File): void {\n        this.loadImageService\n            .loadImageFile(file, this.settings)\n            .then((res) => this.setLoadedImage(res))\n            .catch((err) => this.loadImageError(err));\n    }\n\n    private loadBase64Image(imageBase64: string): void {\n        this.loadImageService\n            .loadBase64Image(imageBase64, this.settings)\n            .then((res) => this.setLoadedImage(res))\n            .catch((err) => this.loadImageError(err));\n    }\n\n    private loadImageFromURL(url: string): void {\n        this.loadImageService\n            .loadImageFromURL(url, this.settings)\n            .then((res) => this.setLoadedImage(res))\n            .catch((err) => this.loadImageError(err));\n    }\n\n    private setLoadedImage(loadedImage: LoadedImage): void {\n        this.loadedImage = loadedImage;\n        this.safeImgDataUrl = this.sanitizer.bypassSecurityTrustResourceUrl(loadedImage.transformed.objectUrl);\n        this.cd.markForCheck();\n    }\n\n    public loadImageError(error: any): void {\n        console.log(error);\n        this.loadImageFailed.emit();\n    }\n\n    imageLoadedInView(): void {\n        if (this.loadedImage != null) {\n            this.imageLoaded.emit(this.loadedImage);\n            this.setImageMaxSizeRetries = 0;\n            setTimeout(() => this.checkImageMaxSizeRecursively());\n        }\n    }\n\n    private checkImageMaxSizeRecursively(): void {\n        if (this.setImageMaxSizeRetries > 40) {\n            this.loadImageFailed.emit();\n        } else if (this.sourceImageLoaded()) {\n            this.setMaxSize();\n            this.setCropperScaledMinSize();\n            this.setCropperScaledMaxSize();\n            this.resetCropperPosition();\n            this.cropperReady.emit({ ...this.maxSize });\n            this.cd.markForCheck();\n        } else {\n            this.setImageMaxSizeRetries++;\n            setTimeout(() => this.checkImageMaxSizeRecursively(), 50);\n        }\n    }\n\n    private sourceImageLoaded(): boolean {\n        return this.sourceImage?.nativeElement?.offsetWidth > 0;\n    }\n\n    @HostListener('window:resize')\n    onResize(): void {\n        if (!this.loadedImage) {\n            return;\n        }\n        if (this.hidden) {\n            this.resizedWhileHidden = true;\n        } else {\n            const oldMaxSize = { ...this.maxSize };\n            this.setMaxSize();\n            this.resizeCropperPosition(oldMaxSize);\n            this.setCropperScaledMinSize();\n            this.setCropperScaledMaxSize();\n        }\n    }\n\n    private async activatePinchGesture() {\n        // Loads HammerJS via angular APIs if configured\n        await this.hammerLoader?.();\n\n        const Hammer = (window as unknown as Window & { Hammer?: HammerStatic })?.['Hammer'] || null;\n\n        if (Hammer) {\n            const hammer = new Hammer(this.wrapper.nativeElement);\n            hammer.get('pinch').set({ enable: true });\n            hammer.on('pinchmove', this.onPinch.bind(this));\n            hammer.on('pinchend', this.pinchStop.bind(this));\n            hammer.on('pinchstart', this.startPinch.bind(this));\n        } else if (isDevMode()) {\n            console.warn(\"[AswImageCropper] Could not find HammerJS - Pinch Gesture won't work\");\n        }\n    }\n\n    private resizeCropperPosition(oldMaxSize: Dimensions): void {\n        if (oldMaxSize.width !== this.maxSize.width || oldMaxSize.height !== this.maxSize.height) {\n            this.cropper.x1 = (this.cropper.x1 * this.maxSize.width) / oldMaxSize.width;\n            this.cropper.x2 = (this.cropper.x2 * this.maxSize.width) / oldMaxSize.width;\n            this.cropper.y1 = (this.cropper.y1 * this.maxSize.height) / oldMaxSize.height;\n            this.cropper.y2 = (this.cropper.y2 * this.maxSize.height) / oldMaxSize.height;\n        }\n    }\n\n    resetCropperPosition(): void {\n        this.cropperPositionService.resetCropperPosition(this.sourceImage, this.cropper, this.settings, this.maxSize);\n        this.doAutoCrop();\n        this.imageVisible = true;\n    }\n\n    keyboardAccess(event: KeyboardEvent) {\n        this.changeKeyboardStepSize(event);\n        this.keyboardMoveCropper(event);\n    }\n\n    private changeKeyboardStepSize(event: KeyboardEvent): void {\n        const key = +event.key;\n        if (key >= 1 && key <= 9) {\n            this.settings.stepSize = key;\n        }\n    }\n\n    private keyboardMoveCropper(event: any) {\n        const keyboardWhiteList: string[] = ['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft'];\n        if (!keyboardWhiteList.includes(event.key)) {\n            return;\n        }\n        const moveType = event.shiftKey ? MoveTypes.Resize : MoveTypes.Move;\n        const position = event.altKey ? getInvertedPositionForKey(event.key) : getPositionForKey(event.key);\n        const moveEvent = getEventForKey(event.key, this.settings.stepSize);\n        event.preventDefault();\n        event.stopPropagation();\n        this.startMove({ clientX: 0, clientY: 0 }, moveType, position);\n        this.handleMouseMove(moveEvent);\n        this.handleMouseUp();\n    }\n\n    startMove(event: any, moveType: MoveTypes, position: string | null = null): void {\n        if (this.disabled || (this.moveStart?.active && this.moveStart?.type === MoveTypes.Pinch) || (moveType === MoveTypes.Drag && !this.allowMoveImage)) {\n            return;\n        }\n        if (event.preventDefault) {\n            event.preventDefault();\n        }\n        this.moveStart = {\n            active: true,\n            type: moveType,\n            position,\n            transform: { ...this.transform },\n            clientX: this.cropperPositionService.getClientX(event),\n            clientY: this.cropperPositionService.getClientY(event),\n            ...this.cropper\n        };\n        this.initMouseMove();\n    }\n\n    private initMouseMove(): void {\n        merge(fromEvent(document, 'mousemove'), fromEvent(document, 'touchmove'))\n            .pipe(takeUntil(merge(fromEvent(document, 'mouseup'), fromEvent(document, 'touchend')).pipe(first())))\n            .subscribe({\n                next: (event) =>\n                    this.zone.run(() => {\n                        this.handleMouseMove(event);\n                        this.cd.markForCheck();\n                    }),\n                complete: () =>\n                    this.zone.run(() => {\n                        this.handleMouseUp();\n                        this.cd.markForCheck();\n                    })\n            });\n    }\n\n    startPinch(event: any) {\n        if (!this.safeImgDataUrl) {\n            return;\n        }\n        if (event.preventDefault) {\n            event.preventDefault();\n        }\n        this.moveStart = {\n            active: true,\n            type: MoveTypes.Pinch,\n            position: 'center',\n            clientX: this.cropper.x1 + (this.cropper.x2 - this.cropper.x1) / 2,\n            clientY: this.cropper.y1 + (this.cropper.y2 - this.cropper.y1) / 2,\n            ...this.cropper\n        };\n    }\n\n    private handleMouseMove(event: any): void {\n        if (this.moveStart!.active) {\n            if (event.stopPropagation) {\n                event.stopPropagation();\n            }\n            if (event.preventDefault) {\n                event.preventDefault();\n            }\n            if (this.moveStart!.type === MoveTypes.Move) {\n                this.cropperPositionService.move(event, this.moveStart!, this.cropper);\n                this.checkCropperPosition(true);\n            } else if (this.moveStart!.type === MoveTypes.Resize) {\n                if (!this.cropperStaticWidth && !this.cropperStaticHeight) {\n                    this.cropperPositionService.resize(event, this.moveStart!, this.cropper, this.maxSize, this.settings);\n                }\n                this.checkCropperPosition(false);\n            } else if (this.moveStart!.type === MoveTypes.Drag) {\n                const diffX = this.cropperPositionService.getClientX(event) - this.moveStart!.clientX;\n                const diffY = this.cropperPositionService.getClientY(event) - this.moveStart!.clientY;\n                this.transform = {\n                    ...this.transform,\n                    translateH: (this.moveStart!.transform?.translateH || 0) + diffX,\n                    translateV: (this.moveStart!.transform?.translateV || 0) + diffY\n                };\n                this.setCssTransform();\n            }\n        }\n    }\n\n    onPinch(event: any) {\n        if (this.moveStart!.active) {\n            if (event.stopPropagation) {\n                event.stopPropagation();\n            }\n            if (event.preventDefault) {\n                event.preventDefault();\n            }\n            if (this.moveStart!.type === MoveTypes.Pinch) {\n                this.cropperPositionService.resize(event, this.moveStart!, this.cropper, this.maxSize, this.settings);\n                this.checkCropperPosition(false);\n            }\n            this.cd.markForCheck();\n        }\n    }\n\n    private setMaxSize(): void {\n        if (this.sourceImage) {\n            const sourceImageStyle = getComputedStyle(this.sourceImage.nativeElement);\n            this.maxSize.width = parseFloat(sourceImageStyle.width);\n            this.maxSize.height = parseFloat(sourceImageStyle.height);\n            this.marginLeft = this.sanitizer.bypassSecurityTrustStyle('calc(50% - ' + this.maxSize.width / 2 + 'px)');\n        }\n    }\n\n    private setCropperScaledMinSize(): void {\n        if (this.loadedImage?.transformed?.image) {\n            this.setCropperScaledMinWidth();\n            this.setCropperScaledMinHeight();\n        } else {\n            this.settings.cropperScaledMinWidth = 20;\n            this.settings.cropperScaledMinHeight = 20;\n        }\n    }\n\n    private setCropperScaledMinWidth(): void {\n        this.settings.cropperScaledMinWidth = this.cropperMinWidth > 0 ? Math.max(20, (this.cropperMinWidth / this.loadedImage!.transformed.image.width) * this.maxSize.width) : 20;\n    }\n\n    private setCropperScaledMinHeight(): void {\n        if (this.maintainAspectRatio) {\n            this.settings.cropperScaledMinHeight = Math.max(20, this.settings.cropperScaledMinWidth / this.aspectRatio);\n        } else if (this.cropperMinHeight > 0) {\n            this.settings.cropperScaledMinHeight = Math.max(20, (this.cropperMinHeight / this.loadedImage!.transformed.image.height) * this.maxSize.height);\n        } else {\n            this.settings.cropperScaledMinHeight = 20;\n        }\n    }\n\n    private setCropperScaledMaxSize(): void {\n        if (this.loadedImage?.transformed?.image) {\n            const ratio = this.loadedImage.transformed.size.width / this.maxSize.width;\n            this.settings.cropperScaledMaxWidth = this.cropperMaxWidth > 20 ? this.cropperMaxWidth / ratio : this.maxSize.width;\n            this.settings.cropperScaledMaxHeight = this.cropperMaxHeight > 20 ? this.cropperMaxHeight / ratio : this.maxSize.height;\n            if (this.maintainAspectRatio) {\n                if (this.settings.cropperScaledMaxWidth > this.settings.cropperScaledMaxHeight * this.aspectRatio) {\n                    this.settings.cropperScaledMaxWidth = this.settings.cropperScaledMaxHeight * this.aspectRatio;\n                } else if (this.settings.cropperScaledMaxWidth < this.settings.cropperScaledMaxHeight * this.aspectRatio) {\n                    this.settings.cropperScaledMaxHeight = this.settings.cropperScaledMaxWidth / this.aspectRatio;\n                }\n            }\n        } else {\n            this.settings.cropperScaledMaxWidth = this.maxSize.width;\n            this.settings.cropperScaledMaxHeight = this.maxSize.height;\n        }\n    }\n\n    private checkCropperPosition(maintainSize = false): void {\n        if (this.cropper.x1 < 0) {\n            this.cropper.x2 -= maintainSize ? this.cropper.x1 : 0;\n            this.cropper.x1 = 0;\n        }\n        if (this.cropper.y1 < 0) {\n            this.cropper.y2 -= maintainSize ? this.cropper.y1 : 0;\n            this.cropper.y1 = 0;\n        }\n        if (this.cropper.x2 > this.maxSize.width) {\n            this.cropper.x1 -= maintainSize ? this.cropper.x2 - this.maxSize.width : 0;\n            this.cropper.x2 = this.maxSize.width;\n        }\n        if (this.cropper.y2 > this.maxSize.height) {\n            this.cropper.y1 -= maintainSize ? this.cropper.y2 - this.maxSize.height : 0;\n            this.cropper.y2 = this.maxSize.height;\n        }\n    }\n\n    private handleMouseUp(): void {\n        if (this.moveStart!.active) {\n            this.moveStart!.active = false;\n            if (this.moveStart?.type === MoveTypes.Drag) {\n                this.transformChange.emit(this.transform);\n            } else {\n                this.doAutoCrop();\n            }\n        }\n    }\n\n    pinchStop(): void {\n        if (this.moveStart!.active) {\n            this.moveStart!.active = false;\n            this.doAutoCrop();\n        }\n    }\n\n    private doAutoCrop(): void {\n        if (this.autoCrop) {\n            void this.crop();\n        }\n    }\n\n    crop(): ImageCroppedEvent | null;\n    crop(output: 'base64'): ImageCroppedEvent | null;\n    crop(output: 'blob'): Promise<ImageCroppedEvent> | null;\n    crop(output: OutputType = this.settings.output): Promise<ImageCroppedEvent> | ImageCroppedEvent | null {\n        if (this.loadedImage?.transformed?.image != null) {\n            this.startCropImage.emit();\n            if (output === 'blob') {\n                return this.cropToBlob();\n            } else if (output === 'base64') {\n                return this.cropToBase64();\n            }\n        }\n        return null;\n    }\n\n    private cropToBlob(): Promise<ImageCroppedEvent> | null {\n        return new Promise((resolve, reject) =>\n            this.zone.run(async () => {\n                const result = await this.cropService.crop(this.loadedImage!, this.cropper, this.settings, 'blob', this.maxSize);\n                if (result) {\n                    this.imageCropped.emit(result);\n                    resolve(result);\n                } else {\n                    reject('Crop image failed');\n                }\n            })\n        );\n    }\n\n    private cropToBase64(): ImageCroppedEvent | null {\n        const result = this.cropService.crop(this.loadedImage!, this.cropper, this.settings, 'base64', this.maxSize);\n        if (result) {\n            this.imageCropped.emit(result);\n            return result;\n        }\n        return null;\n    }\n\n    private aspectRatioIsCorrect(): boolean {\n        const currentCropAspectRatio = (this.cropper.x2 - this.cropper.x1) / (this.cropper.y2 - this.cropper.y1);\n        return currentCropAspectRatio === this.aspectRatio;\n    }\n}\n","<div [style.background]=\"imageVisible && backgroundColor\" #wrapper>\r\n    <img #sourceImage class=\"asw-ic-source-image\" role=\"presentation\" *ngIf=\"safeImgDataUrl\" [src]=\"safeImgDataUrl\"\r\n        [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\" [style.transform]=\"safeTransformStyle\"\r\n        [class.asw-ic-draggable]=\"!disabled && allowMoveImage\" [attr.alt]=\"imageAltText\" (load)=\"imageLoadedInView()\"\r\n        (mousedown)=\"startMove($event, moveTypes.Drag)\" (touchstart)=\"startMove($event, moveTypes.Drag)\"\r\n        (error)=\"loadImageError($event)\">\r\n    <div class=\"asw-ic-overlay\" [style.width.px]=\"maxSize.width\" [style.height.px]=\"maxSize.height\"\r\n        [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"></div>\r\n    <div class=\"asw-ic-cropper\" *ngIf=\"imageVisible\" [class.asw-ic-round]=\"roundCropper\"\r\n        [attr.aria-label]=\"cropperFrameAriaLabel\" [style.top.px]=\"cropper.y1\" [style.left.px]=\"cropper.x1\"\r\n        [style.width.px]=\"cropper.x2 - cropper.x1\" [style.height.px]=\"cropper.y2 - cropper.y1\"\r\n        [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"\r\n        [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\" (keydown)=\"keyboardAccess($event)\" tabindex=\"0\">\r\n        <div (mousedown)=\"startMove($event, moveTypes.Move)\" (touchstart)=\"startMove($event, moveTypes.Move)\"\r\n            class=\"asw-ic-move\" role=\"presentation\">\r\n        </div>\r\n        <ng-container *ngIf=\"!hideResizeSquares\">\r\n            <span class=\"asw-ic-resize asw-ic-topleft\" role=\"presentation\"\r\n                (mousedown)=\"startMove($event, moveTypes.Resize, 'topleft')\"\r\n                (touchstart)=\"startMove($event, moveTypes.Resize, 'topleft')\">\r\n                <span class=\"asw-ic-square\"></span>\r\n            </span>\r\n            <span class=\"asw-ic-resize asw-ic-top\">\r\n                <span class=\"asw-ic-square\"></span>\r\n            </span>\r\n            <span class=\"asw-ic-resize asw-ic-topright\" role=\"presentation\"\r\n                (mousedown)=\"startMove($event, moveTypes.Resize, 'topright')\"\r\n                (touchstart)=\"startMove($event, moveTypes.Resize, 'topright')\">\r\n                <span class=\"asw-ic-square\"></span>\r\n            </span>\r\n            <span class=\"asw-ic-resize asw-ic-right\">\r\n                <span class=\"asw-ic-square\"></span>\r\n            </span>\r\n            <span class=\"asw-ic-resize asw-ic-bottomright\" role=\"presentation\"\r\n                (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomright')\"\r\n                (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomright')\">\r\n                <span class=\"asw-ic-square\"></span>\r\n            </span>\r\n            <span class=\"asw-ic-resize asw-ic-bottom\">\r\n                <span class=\"asw-ic-square\"></span>\r\n            </span>\r\n            <span class=\"asw-ic-resize asw-ic-bottomleft\" role=\"presentation\"\r\n                (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomleft')\"\r\n                (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomleft')\">\r\n                <span class=\"asw-ic-square\"></span>\r\n            </span>\r\n            <span class=\"asw-ic-resize asw-ic-left\">\r\n                <span class=\"asw-ic-square\"></span>\r\n            </span>\r\n            <span class=\"asw-ic-resize-bar asw-ic-top\" role=\"presentation\"\r\n                (mousedown)=\"startMove($event, moveTypes.Resize, 'top')\"\r\n                (touchstart)=\"startMove($event, moveTypes.Resize, 'top')\">\r\n            </span>\r\n            <span class=\"asw-ic-resize-bar asw-ic-right\" role=\"presentation\"\r\n                (mousedown)=\"startMove($event, moveTypes.Resize, 'right')\"\r\n                (touchstart)=\"startMove($event, moveTypes.Resize, 'right')\">\r\n            </span>\r\n            <span class=\"asw-ic-resize-bar asw-ic-bottom\" role=\"presentation\"\r\n                (mousedown)=\"startMove($event, moveTypes.Resize, 'bottom')\"\r\n                (touchstart)=\"startMove($event, moveTypes.Resize, 'bottom')\">\r\n            </span>\r\n            <span class=\"asw-ic-resize-bar asw-ic-left\" role=\"presentation\"\r\n                (mousedown)=\"startMove($event, moveTypes.Resize, 'left')\"\r\n                (touchstart)=\"startMove($event, moveTypes.Resize, 'left')\">\r\n            </span>\r\n        </ng-container>\r\n    </div>\r\n</div>","/**\n * @license\n * Copyright ASW (A Software World) All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file\n */\n\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { AswImageCropComponent } from './image-crop.component';\n\n@NgModule({\n    imports: [CommonModule, FormsModule, ReactiveFormsModule],\n    declarations: [AswImageCropComponent],\n    exports: [AswImageCropComponent]\n})\nexport class AswImageCropModule {}\n","/**\n * @license\n * Copyright ASW (A Software World) All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file\n */\n\nexport * from './image-crop.module';\nexport * from './image-crop.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}