PluginProbe
Squeeze – Image Optimization & Compression, WEBP Conversion / 1.7.12
Squeeze – Image Optimization & Compression, WEBP Conversion v1.7.12
1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 trunk 1.0 1.1 1.2 1.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5 1.5.1 1.5.2 1.6 All 42 releases
squeeze / assets / js / script.bundle.js

script.bundle.js in Squeeze – Image Optimization & Compression, WEBP Conversion 1.7.12, at assets/js/script.bundle.js

368 lines 199.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*
2 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
3 * This devtool is neither made for production nor for readable output files.
4 * It uses "eval()" calls to create a separate source file in the browser devtools.
5 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
6 * or disable the default devtool with "devtool: false".
7 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
8 */
9 /******/ (() => { // webpackBootstrap
10 /******/ "use strict";
11 /******/ var __webpack_modules__ = ({
12
13 /***/ "./assets/js/handlers.js":
14 /*!*******************************!*\
15 !*** ./assets/js/handlers.js ***!
16 \*******************************/
17 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
18
19 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"handleBulkButtonClick\": () => (/* binding */ handleBulkButtonClick),\n/* harmony export */ \"handleBulkFromPage\": () => (/* binding */ handleBulkFromPage),\n/* harmony export */ \"handleBulkToggle\": () => (/* binding */ handleBulkToggle),\n/* harmony export */ \"handleButtonsClick\": () => (/* binding */ handleButtonsClick),\n/* harmony export */ \"handleClosePathDialog\": () => (/* binding */ handleClosePathDialog),\n/* harmony export */ \"handleCompressAfterUpload\": () => (/* binding */ handleCompressAfterUpload),\n/* harmony export */ \"handleCompressBeforeUpload\": () => (/* binding */ handleCompressBeforeUpload),\n/* harmony export */ \"handleDirectoryCheck\": () => (/* binding */ handleDirectoryCheck),\n/* harmony export */ \"handleDirectoryClick\": () => (/* binding */ handleDirectoryClick),\n/* harmony export */ \"handleFetchImagesFromPage\": () => (/* binding */ handleFetchImagesFromPage),\n/* harmony export */ \"handleMultiFileFormUpload\": () => (/* binding */ handleMultiFileFormUpload),\n/* harmony export */ \"handleOnLeave\": () => (/* binding */ handleOnLeave),\n/* harmony export */ \"handleRecursiveUpload\": () => (/* binding */ handleRecursiveUpload),\n/* harmony export */ \"handleRestoreBtnClick\": () => (/* binding */ handleRestoreBtnClick),\n/* harmony export */ \"handleSingleBtnClick\": () => (/* binding */ handleSingleBtnClick)\n/* harmony export */ });\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n\r\n\r\n\r\n\r\n\r\nconst { __, sprintf } = wp.i18n; // Import __() from wp.i18n\r\n\r\nconst updateUI = (initId, response) => {\r\n const statusEl = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.postsFilterForm?.querySelector(`#post-${initId} .column-squeeze .squeeze_status`);\r\n if (statusEl) statusEl.innerHTML = response?.data?.message ?? response?.data ?? response;\r\n\r\n const gridItem = document.querySelector(`.media-frame.mode-grid .attachment[data-id=\"${initId}\"]`);\r\n if (gridItem) {\r\n const centered = gridItem.querySelector('.centered');\r\n const progress = gridItem.querySelector('.media-progress-bar');\r\n if (centered) centered.style.display = 'block';\r\n if (progress) progress.remove();\r\n gridItem.classList.remove('uploading');\r\n }\r\n};\r\n\r\nconst getTotalPages = (path) => {\r\n const selectors = {\r\n uncompressed: \"input[name='squeeze_bulk_uncompressed_pages']\",\r\n all: \"input[name='squeeze_bulk_total_pages']\"\r\n };\r\n const sel = selectors[path];\r\n const val = sel && document.querySelector(sel)?.value;\r\n return Number(val) || 1;\r\n};\r\n\r\nconst checkPaused = (data, page) => {\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.isPaused) return false;\r\n handleBulkPause(data, page);\r\n return true;\r\n};\r\n\r\nconst logAndThumbnail = async (filename, response, wrapper) => {\r\n const isSuccess = response?.success !== false;\r\n const message = response?.data?.message ?? response?.data;\r\n\r\n await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(message, {\r\n mediaLogWrapper: wrapper,\r\n iconId: isSuccess ? 'check-mark-circle-icon' : 'ban-sign-icon',\r\n isSuccess\r\n });\r\n\r\n if (!isSuccess) {\r\n await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(__('Skipped — continuing with next image.', 'squeeze'), {\r\n mediaLogWrapper: wrapper,\r\n iconId: 'ban-sign-icon',\r\n isWarning: true\r\n });\r\n }\r\n\r\n const titleEl = wrapper?.querySelector('h3');\r\n if (titleEl && response?.data?.filename) {\r\n titleEl.textContent = `${__('Media', 'squeeze')} ${filename} (${response.data.filename}):`;\r\n }\r\n\r\n const thumbUrl = response?.data?.sizes?.thumbnail?.url || response?.data?.url || response?.url;\r\n if (thumbUrl) {\r\n const thumb = document.createElement('div');\r\n thumb.classList.add('media-log-thumbnail');\r\n thumb.innerHTML = `<img src=\"${thumbUrl}\" alt=\"${filename}\"/>`;\r\n wrapper?.appendChild(thumb);\r\n }\r\n};\r\n\r\nconst handleDirectoryCheck = (event) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.savePathBtn.disabled = !_helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.dirContainer.querySelector(\"input[type='checkbox']:checked\");\r\n};\r\n\r\nconst handleClosePathDialog = (event) => {\r\n if (!event.target.contains(_helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.pathDialog)) return;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.pathDialog.close();\r\n};\r\n\r\nconst handleBulkToggle = (event, process, mediaIDs, page = 1) => {\r\n const isPaused = event.target.dataset.running === 'true';\r\n\r\n event.target.dataset.running = isPaused ? 'false' : 'true';\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateButtonText(event.target, isPaused ? __('Resume bulk squeezing', 'squeeze') : __('Pause bulk squeezing', 'squeeze'), isPaused ? '#play-button-round-icon' : '#pause-button-icon');\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.isPaused = isPaused;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.process = process;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.mediaIDs = mediaIDs;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.page = page;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target = event.target;\r\n\r\n //console.log('handleBulkToggle', cachedMediaData);\r\n\r\n return isPaused;\r\n};\r\n\r\n// Handle single compress button click\r\nconst handleSingleBtnClick = async (event, timeoutId) => {\r\n const attachmentID = event.target.dataset.attachment;\r\n const squeezeStatus = event.target.closest(\"td\").querySelector(\".squeeze_status\");\r\n\r\n try {\r\n wp.media.attachment(attachmentID).fetch().then(async (data) => {\r\n const attachment = { attributes: data };\r\n\r\n let squeezeResponse = null;\r\n try {\r\n const compressData = await Squeeze.handleCompress(attachment);\r\n squeezeResponse = await Squeeze.handleUpload({ attachment, base64: compressData });\r\n\r\n squeezeStatus.innerHTML = squeezeResponse?.data?.message ?? squeezeResponse?.data ?? squeezeResponse;\r\n\r\n if (event.target.closest(\"td.field\")) {\r\n const table = event.target.closest(\"td\")?.querySelector(\".squeeze_status .squeeze-comparison-table\");\r\n if (table) {\r\n const td = document.createElement(\"td\");\r\n td.classList.add(\"field\");\r\n td.style.width = \"100%\";\r\n td.appendChild(table);\r\n event.target.closest(\"tr\").appendChild(td);\r\n }\r\n }\r\n // TBD: add file size label to the attachment info\r\n /*\r\n if (event.target.closest('.attachment-info')) {\r\n const fileSizeLabel = event.target.closest('.attachment-info').querySelector('.file-size');\r\n if (fileSizeLabel) {\r\n const fileSize = squeezeResponse?.data?.sizes?.scaled?.compressed_size ?? squeezeResponse?.data?.sizes?.original?.compressed_size ?? null;\r\n if (fileSize) {\r\n const humanFileSize = SqueezeHelpers.humanFileSize(fileSize, true);\r\n fileSizeLabel.innerHTML = fileSizeLabel.innerHTML.replace(/(<\\/strong>\\s*)(.*)/, `$1${humanFileSize}`);\r\n }\r\n }\r\n }\r\n */\r\n } catch (error) {\r\n console.error(error);\r\n squeezeStatus.innerHTML = error?.message ?? error;\r\n } finally {\r\n // Always preserve the \"Restore original\" button so the user can still revert\r\n // after a failed squeeze (result larger than original) or a successful one.\r\n // The button is safe to keep visible: it only appears when a backup actually exists.\r\n event.target.closest(\"td\")\r\n ?.querySelectorAll('button:not([name=\"squeeze_restore\"])')\r\n .forEach(btn => btn.remove());\r\n window.onbeforeunload = null;\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n });\r\n } catch (error) {\r\n console.error(error);\r\n squeezeStatus.innerHTML = error?.message ?? error;\r\n event.target.remove();\r\n window.onbeforeunload = null;\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n};\r\n\r\nconst handleRestoreBtnClick = async (event) => {\r\n const attachmentID = event.target.dataset.attachment;\r\n const statusEl = event.target.closest(\"td\").querySelector(\".squeeze_status\");\r\n\r\n event.target.disabled = true;\r\n statusEl.innerHTML = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.squeezeLoadingAnimationHTML + __('Restoring the original image...', 'squeeze');\r\n\r\n // if still squeezing after 3 seconds, update the status message\r\n const timeoutId = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitMessage(_helpers_js__WEBPACK_IMPORTED_MODULE_0__.squeezeLoadingAnimationHTML + __('Still restoring... Just need to regenerate thumbnails, please wait a moment.', 'squeeze'), statusEl);\r\n\r\n try {\r\n const response = await Squeeze.handleRestore(attachmentID);\r\n statusEl.innerHTML = response?.data ?? response;\r\n } catch (error) {\r\n console.error(error);\r\n statusEl.innerHTML = error?.message ?? JSON.stringify(error, null, 2);\r\n } finally {\r\n // Re-enable whichever compress button is present (varies by prior state).\r\n event.target.closest('td')\r\n ?.querySelector(`[name='squeeze_compress_again'], [name='squeeze_compress_single']`)\r\n ?.removeAttribute('disabled');\r\n event.target.remove();\r\n window.onbeforeunload = null;\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n};\r\n\r\nconst handleBulkButtonClick = async (event, process, mediaIDs, currentPage) => {\r\n if (mediaIDs.length === 0) return;\r\n\r\n const totalPages = getTotalPages(process);\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.disableBulkButtons();\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.process === process) {\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.mediaIDs/*.length > 0*/) {\r\n mediaIDs = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.mediaIDs;\r\n }\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.page) {\r\n currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.page;\r\n }\r\n }\r\n\r\n const isPaused = handleBulkToggle(event, process, mediaIDs, currentPage);\r\n if (isPaused) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateButtonText(event.target, __('Pausing...', 'squeeze'), '#pause-button-icon');\r\n return;\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.hideBulkPausedBanner();\r\n event.target.disabled = false;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.focusBulkAction(event.target);\r\n\r\n try {\r\n const finalResponse = await handleRecursiveUpload(process, mediaIDs, currentPage, true);\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0 && finalResponse.page >= totalPages) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(__('All images have been processed!', 'squeeze'), { isEnd: true });\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.showPopupMessage( {\r\n title: __('Squeezing complete', 'squeeze'),\r\n message: __('All images have been processed!', 'squeeze'),\r\n type: 'success'\r\n });\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.restoreBulkButtons();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.restoreBulkButtons();\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n};\r\n\r\nconst handleButtonsClick = async (event) => {\r\n const singleBtnName = 'squeeze_compress_single';\r\n const compressAgainBtnName = 'squeeze_compress_again';\r\n const restoreBtnName = 'squeeze_restore';\r\n //console.log(Squeeze?.options?.webp_quality)\r\n\r\n if (event.target.getAttribute(\"name\") === singleBtnName || event.target.getAttribute(\"name\") === compressAgainBtnName) {\r\n //console.log('Clicked compress button, WebP quality:', Squeeze?.options?.webp_quality);\r\n \r\n const statusEl = event.target.closest(\"td\").querySelector(\".squeeze_status\");\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.disableAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n statusEl.innerHTML = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.squeezeLoadingAnimationHTML + __('Squeezing...', 'squeeze');\r\n\r\n // if still squeezing after 5 seconds, update the status message\r\n const timeoutId = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitMessage(\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.squeezeLoadingAnimationHTML + \r\n __('Still squeezing... This may take a while depending on the image size.', 'squeeze'), \r\n statusEl\r\n );\r\n\r\n window.onbeforeunload = handleOnLeave;\r\n handleSingleBtnClick(event, timeoutId);\r\n }\r\n\r\n if (event.target.getAttribute(\"name\") === restoreBtnName) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.disableAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n window.onbeforeunload = handleOnLeave;\r\n handleRestoreBtnClick(event);\r\n }\r\n}\r\n\r\nconst handleDirectoryClick = async (event) => {\r\n if (event.target !== event.currentTarget) return;\r\n\r\n const currentDir = event.target.closest(\".directory-item\");\r\n const currentPath = currentDir.dataset.path;\r\n const parentPath = currentDir.dataset.parent;\r\n\r\n if (parentPath === '/' || currentDir.classList.contains(\"loading\")) return;\r\n\r\n if (currentDir.classList.contains(\"loaded\")) {\r\n currentDir.classList.toggle(\"opened\");\r\n return;\r\n }\r\n\r\n currentDir.classList.add(\"loading\");\r\n\r\n const subDirs = await Squeeze.getDirectories(currentPath);\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.renderDirectories(subDirs, currentDir, {\r\n handleDirectoryClick,\r\n handleDirectoryCheck\r\n });\r\n\r\n currentDir.classList.remove(\"loading\");\r\n currentDir.classList.add(\"loaded\", \"opened\");\r\n}\r\n\r\n/**\r\n * Hadnle warning on page leave\r\n*/\r\nconst handleOnLeave = () => {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const page = urlParams.get('page');\r\n const isUploadPage = window.location.href.includes('upload.php');\r\n const isMediaNewPage = window.location.href.includes('media-new.php');\r\n const isAttachmentPage = window.location.href.includes('post.php') && urlParams.get('action') === 'edit';\r\n\r\n if (page === 'squeeze-bulk' || isMediaNewPage || isAttachmentPage) {\r\n return __('Are you sure you want to leave this page? The squeezing process will be terminated!', 'squeeze');\r\n }\r\n if (isUploadPage) {\r\n return __('Are you sure you want to leave this page? The settings will not be saved!', 'squeeze');\r\n }\r\n};\r\n\r\nconst handleBulkPause = (data, currentPage) => {\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.mediaIDs = data;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.page = currentPage;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target.dataset.running = 'false';\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target.disabled = false;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateButtonText(_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target, __('Resume bulk squeezing', 'squeeze'), '#play-button-round-icon');\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.enableBulkButtonsOnPause(_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.showBulkPausedBanner();\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(__('Bulk squeezing has been paused!', 'squeeze'), { isPause: true });\r\n};\r\n\r\nconst handleUpdateChart = (uncompressedImagesCount) => {\r\n const linearStats = document.querySelector(\".squeeze-bulk-media-stats--linear\");\r\n const squeezedImages = document.querySelector(\".squeeze-bulk-media-stats-item-value\");\r\n\r\n const imagesLeft = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.totalImages - uncompressedImagesCount;\r\n const percentage = parseFloat((imagesLeft / _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.totalImages) * 100).toFixed(2);\r\n\r\n if (linearStats) {\r\n const pctEl = linearStats.querySelector(\".squeeze-bulk-media-stats-chart-pct\");\r\n if (pctEl) {\r\n pctEl.textContent = `${percentage}%`;\r\n }\r\n linearStats.style.setProperty(\"--squeeze-progress-pct\", percentage);\r\n if (squeezedImages) {\r\n squeezedImages.textContent = `${imagesLeft} / ${_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.totalImages}`;\r\n }\r\n return;\r\n }\r\n\r\n const chartValue = document.querySelector(\".squeeze-bulk-media-stats-chart-value > text\");\r\n const chartBar = document.querySelector(\".squeeze-bulk-media-stats-chart\");\r\n\r\n if (!chartValue || !chartBar) return;\r\n\r\n const dasharray = percentage * 560 / 100;\r\n chartValue.textContent = `${percentage}%`;\r\n chartBar.style.setProperty(\"--squeeze-dasharray\", dasharray);\r\n\r\n if (squeezedImages) {\r\n squeezedImages.textContent = `${imagesLeft} / ${_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.totalImages}`;\r\n }\r\n};\r\n\r\nconst handleRecursiveUpload = async (path, data, currentPage, isUpdateChart = false) => {\r\n\r\n if (!Array.isArray(data)) return { success: false, data: 'No data provided!', mediaIDs: [] }; // when bulk directory path has no images\r\n\r\n const totalPages = getTotalPages(path);\r\n\r\n const noMoreImages = (page, message = __('No more images found!', 'squeeze')) => ({\r\n success: true,\r\n data: message,\r\n mediaIDs: [],\r\n page,\r\n });\r\n\r\n if (data.length === 0) {\r\n currentPage += 1;\r\n if (currentPage > totalPages || !_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.lastId) return noMoreImages(currentPage);\r\n\r\n const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path, _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.lastId);\r\n if (maybeGetNextMediaIDs.success && maybeGetNextMediaIDs.data.length > 0) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n } else {\r\n return noMoreImages(currentPage);\r\n }\r\n }\r\n\r\n const initData = [...data]; // initial data\r\n\r\n const filename = data[0]?.filename ? data[0].filename : `ID #${data[0]}`;\r\n const mediaLogWrapper = await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(\r\n `${__('Start squeezing...', 'squeeze')}`, \r\n { title: filename, isStart: true, iconId: 'lemon-dot-icon' }\r\n );\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.lastId = data[0] || 0; // update lastId to the last processed ID\r\n const stillWorkingTimeoutId = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitBulkMessage(mediaLogWrapper, filename);\r\n\r\n try {\r\n const response = await Squeeze.handleBulkUpload(path, data);\r\n\r\n clearTimeout(stillWorkingTimeoutId);\r\n\r\n //console.log('handleRecursiveUpload response', response);\r\n\r\n await logAndThumbnail(filename, response, mediaLogWrapper);\r\n\r\n if (isUpdateChart && path !== 'all') {\r\n let uncompressedImagesCount = 0;\r\n if (path === 'uncompressed') {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.uncompressedImages = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.uncompressedImages - 1 || 0;\r\n uncompressedImagesCount = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.uncompressedImages;\r\n } else if (path === 'path') {\r\n uncompressedImagesCount = response.mediaIDs.length;\r\n }\r\n handleUpdateChart(uncompressedImagesCount);\r\n }\r\n\r\n if (checkPaused(data, currentPage)) {\r\n return { success: false, data: 'Process has been paused!', mediaIDs: data, page: currentPage };\r\n }\r\n\r\n updateUI(initData[0], response);\r\n\r\n if (response.mediaIDs.length > 0) {\r\n return handleRecursiveUpload(path, response.mediaIDs, currentPage, isUpdateChart);\r\n } else {\r\n currentPage += 1;\r\n if (currentPage > totalPages) return { ...response, page: currentPage };\r\n\r\n const lastId = initData[initData.length - 1];\r\n const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path, lastId);\r\n if (maybeGetNextMediaIDs.success && maybeGetNextMediaIDs.data.length > 0) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n }\r\n }\r\n\r\n return response;\r\n\r\n } catch (error) {\r\n clearTimeout(stillWorkingTimeoutId);\r\n console.error(error);\r\n const errorMessage = error?.message ?? String(error);\r\n\r\n await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(errorMessage, { mediaLogWrapper, iconId: 'ban-sign-icon', isWarning: true });\r\n await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(__('Skipped — continuing with next image.', 'squeeze'), {\r\n mediaLogWrapper,\r\n iconId: 'ban-sign-icon',\r\n isWarning: true\r\n });\r\n\r\n const failedItem = initData[0];\r\n const remainingIDs = data.filter((item) => item !== failedItem);\r\n\r\n if (remainingIDs.length > 0) {\r\n return handleRecursiveUpload(path, remainingIDs, currentPage, isUpdateChart);\r\n } else {\r\n currentPage += 1;\r\n if (currentPage > totalPages) return { success: false, data: error, mediaIDs: [], page: currentPage };\r\n\r\n const lastId = initData[initData.length - 1];\r\n const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path, lastId);\r\n if (maybeGetNextMediaIDs.success && maybeGetNextMediaIDs.data.length > 0) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n/**\r\n * Handles the compression of image before upload using Squeeze.\r\n * It compresses only the original image, not the thumbnails.\r\n * \r\n * @param {object} up - The plupload instance\r\n * @param {object} pluploadFile - The file to be compressed\r\n * @param {object} compressOptions - The compression options object\r\n * @returns {boolean} - Returns false to prevent further processing of the file\r\n */\r\nconst handleCompressBeforeUpload = async (up, pluploadFile, compressOptions) => {\r\n //*\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.isSqueezeAvailable()) return;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.isFileAlreadyProcessed(pluploadFile)) return;\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.isImageFile(pluploadFile)) return;\r\n\r\n const file = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.getNativeFile(pluploadFile);\r\n const { type, subtype } = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.parseMimeType(file);\r\n\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeCompressAttachment(type, subtype, compressOptions)) return;\r\n\r\n up?.stop();\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n if (await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.isExcludedFile(pluploadFile, up)) return;\r\n //*/\r\n\r\n try {\r\n return await processCompression(up, pluploadFile, file, compressOptions);\r\n } catch (error) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.handleCompressionError(error, up, pluploadFile);\r\n return false;\r\n }\r\n}\r\n\r\nasync function processCompression(up, pluploadFile, file, compressOptions) {\r\n\r\n //*\r\n let originalFile = file;\r\n\r\n const base64Obj = await Squeeze.compressBeforeUpload(file);\r\n if (!base64Obj?.base64) {\r\n console.warn('Compression skipped or failed for:', file.name);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.markFileFailed(pluploadFile);\r\n if (up) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.restartUploader(up);\r\n }\r\n return;\r\n }\r\n\r\n if (compressOptions?.backup_original) {\r\n originalFile = await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeBackupOriginal(file, compressOptions);\r\n pluploadFile.originalFile = originalFile;\r\n }\r\n\r\n const compressedFile = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.base64ToFile(base64Obj.base64, file.name, file.type);\r\n const newSource = new mOxie.File(null, compressedFile);\r\n if (!newSource) {\r\n console.error('Failed to create new mOxie.File from base64 data');\r\n return;\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.markFileCompressed(pluploadFile, newSource, base64Obj);\r\n if (up) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.restartUploader(up);\r\n }\r\n\r\n //console.timeEnd('Compressing image:', pluploadFile.name);\r\n\r\n return true;\r\n //*/\r\n}\r\n\r\nconst handleMultiFileFormUpload = (compressOptions) => {\r\n if (typeof wpUploaderInit === 'undefined' || typeof plupload === 'undefined' || typeof uploader === 'undefined') return;\r\n\r\n const SqueezeUploader = uploader;\r\n\r\n SqueezeUploader.bind('BeforeUpload', async function (up, pluploadFile) {\r\n //console.log('BeforeUpload', up, pluploadFile.name, pluploadFile);\r\n handleCompressBeforeUpload(up, pluploadFile, compressOptions)\r\n });\r\n\r\n SqueezeUploader.bind('FileUploaded', function (up, file, response) {\r\n //console.log('FileUploaded', file, response);\r\n handleCompressAfterUpload(file, compressOptions, response);\r\n });\r\n}\r\n\r\nconst handleCompressAfterUpload = async (file, compressOptions, response = null) => {\r\n const fileID = file?.id;\r\n const attachmentID = response?.response;\r\n const mediaItem = document.getElementById(`media-item-${fileID}`);\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.isFileFailedAfterCompression(file)) {\r\n window.onbeforeunload = null;\r\n if (mediaItem) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitForItemLoad(mediaItem, false).then(() => {\r\n mediaItem.innerHTML += `<div class=\"squeeze_status\">\r\n ${file?._isExcluded ? __('File is excluded from compression:', 'squeeze') : __('File compression failed:', 'squeeze')}\r\n ${file.name}\r\n </div>`;\r\n });\r\n }\r\n return;\r\n }\r\n\r\n let attachment = file?.attachment;\r\n const type = attachment?.attributes?.type ?? file?.type?.split('/')[0];\r\n const subtype = attachment?.attributes?.subtype ?? file?.type?.split('/')[1];\r\n\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeCompressAttachment(type, subtype, compressOptions)) {\r\n //console.warn('Skipping compression for:', type, subtype);\r\n return; // Skip compression for this attachment\r\n }\r\n\r\n window.onbeforeunload = handleOnLeave;\r\n \r\n // set 'uploading' param to true, to pause the uploading process\r\n attachment?.set('uploading', true);\r\n attachment?.set('percent', 50);\r\n attachment?.set('status', 'Squeezing'); // Set status to 'Squeezing' to indicate compression is in progress\r\n\r\n if (mediaItem) {\r\n try {\r\n await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitForItemLoad(mediaItem);\r\n const data = await wp.media.attachment(attachmentID).fetch();\r\n //console.log('Fetched attachment data:', data);\r\n attachment = { attributes: data };\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateAttachmentUIFailed(mediaItem, error);\r\n window.onbeforeunload = null;\r\n }\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.extendAttachment(attachment, file);\r\n\r\n try {\r\n const compressData = await Squeeze.handleCompress(attachment);\r\n if (attachment && typeof attachment.set === 'function') {\r\n attachment.set('percent', 75); // Set percent to 75% to indicate compression is done\r\n }\r\n const uploadData = await Squeeze.handleUpload({ attachment, base64: compressData });\r\n\r\n if (uploadData.success) {\r\n if (mediaItem) {\r\n mediaItem.innerHTML += `<div class=\"squeeze_status\">${uploadData?.data?.message}</div>`;\r\n mediaItem.querySelector('.progress')?.remove();\r\n } else {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateAttachmentUI(attachment, uploadData);\r\n }\r\n \r\n } else {\r\n console.warn(uploadData.data);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateAttachmentUIFailed(mediaItem, uploadData?.data?.message ?? uploadData?.data ?? uploadData)\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateAttachmentUIFailed(mediaItem, error);\r\n } finally {\r\n if (attachment && typeof attachment.set === 'function') {\r\n attachment.set('uploading', false);\r\n }\r\n window.onbeforeunload = null;\r\n }\r\n}\r\n\n\n//# sourceURL=webpack:///./assets/js/handlers.js?");
20
21 /***/ }),
22
23 /***/ "./assets/js/helpers.js":
24 /*!******************************!*\
25 !*** ./assets/js/helpers.js ***!
26 \******************************/
27 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
28
29 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"base64SizeInBytes\": () => (/* binding */ base64SizeInBytes),\n/* harmony export */ \"base64ToBlob\": () => (/* binding */ base64ToBlob),\n/* harmony export */ \"base64ToFile\": () => (/* binding */ base64ToFile),\n/* harmony export */ \"cachedMediaData\": () => (/* binding */ cachedMediaData),\n/* harmony export */ \"disableAllButtons\": () => (/* binding */ disableAllButtons),\n/* harmony export */ \"disableBulkButtons\": () => (/* binding */ disableBulkButtons),\n/* harmony export */ \"elements\": () => (/* binding */ elements),\n/* harmony export */ \"enableBulkButtonsOnPause\": () => (/* binding */ enableBulkButtonsOnPause),\n/* harmony export */ \"extendAttachment\": () => (/* binding */ extendAttachment),\n/* harmony export */ \"fileToBase64\": () => (/* binding */ fileToBase64),\n/* harmony export */ \"focusBulkAction\": () => (/* binding */ focusBulkAction),\n/* harmony export */ \"getBulkButtonLabels\": () => (/* binding */ getBulkButtonLabels),\n/* harmony export */ \"getFileFromUrl\": () => (/* binding */ getFileFromUrl),\n/* harmony export */ \"getNativeFile\": () => (/* binding */ getNativeFile),\n/* harmony export */ \"handleCompressionError\": () => (/* binding */ handleCompressionError),\n/* harmony export */ \"handleRemovePathButton\": () => (/* binding */ handleRemovePathButton),\n/* harmony export */ \"hideBulkPausedBanner\": () => (/* binding */ hideBulkPausedBanner),\n/* harmony export */ \"humanFileSize\": () => (/* binding */ humanFileSize),\n/* harmony export */ \"isDocHidden\": () => (/* binding */ isDocHidden),\n/* harmony export */ \"isExcludedFile\": () => (/* binding */ isExcludedFile),\n/* harmony export */ \"isFileAlreadyProcessed\": () => (/* binding */ isFileAlreadyProcessed),\n/* harmony export */ \"isFileFailedAfterCompression\": () => (/* binding */ isFileFailedAfterCompression),\n/* harmony export */ \"isImageFile\": () => (/* binding */ isImageFile),\n/* harmony export */ \"isSqueezeAvailable\": () => (/* binding */ isSqueezeAvailable),\n/* harmony export */ \"logMessage\": () => (/* binding */ logMessage),\n/* harmony export */ \"markFileCompressed\": () => (/* binding */ markFileCompressed),\n/* harmony export */ \"markFileExcluded\": () => (/* binding */ markFileExcluded),\n/* harmony export */ \"markFileFailed\": () => (/* binding */ markFileFailed),\n/* harmony export */ \"maybeBackupOriginal\": () => (/* binding */ maybeBackupOriginal),\n/* harmony export */ \"maybeCompressAttachment\": () => (/* binding */ maybeCompressAttachment),\n/* harmony export */ \"objectToFormData\": () => (/* binding */ objectToFormData),\n/* harmony export */ \"parseMimeType\": () => (/* binding */ parseMimeType),\n/* harmony export */ \"populatePathInput\": () => (/* binding */ populatePathInput),\n/* harmony export */ \"removeAllButtons\": () => (/* binding */ removeAllButtons),\n/* harmony export */ \"renderDirectories\": () => (/* binding */ renderDirectories),\n/* harmony export */ \"renderTemplate\": () => (/* binding */ renderTemplate),\n/* harmony export */ \"restartUploader\": () => (/* binding */ restartUploader),\n/* harmony export */ \"restoreBulkActionItems\": () => (/* binding */ restoreBulkActionItems),\n/* harmony export */ \"restoreBulkButtons\": () => (/* binding */ restoreBulkButtons),\n/* harmony export */ \"showBulkPausedBanner\": () => (/* binding */ showBulkPausedBanner),\n/* harmony export */ \"showPopupMessage\": () => (/* binding */ showPopupMessage),\n/* harmony export */ \"squeezeLoadingAnimationHTML\": () => (/* binding */ squeezeLoadingAnimationHTML),\n/* harmony export */ \"syncDirectoryDialogCheckboxesFromPathInput\": () => (/* binding */ syncDirectoryDialogCheckboxesFromPathInput),\n/* harmony export */ \"updateAttachmentUI\": () => (/* binding */ updateAttachmentUI),\n/* harmony export */ \"updateAttachmentUIFailed\": () => (/* binding */ updateAttachmentUIFailed),\n/* harmony export */ \"updateButtonText\": () => (/* binding */ updateButtonText),\n/* harmony export */ \"waitBulkMessage\": () => (/* binding */ waitBulkMessage),\n/* harmony export */ \"waitForItemLoad\": () => (/* binding */ waitForItemLoad),\n/* harmony export */ \"waitMessage\": () => (/* binding */ waitMessage)\n/* harmony export */ });\n\r\n\r\nconst { __, sprintf } = wp.i18n; // Import __() from wp.i18n\r\n\r\nconst getBulkButtonLabels = () => ({\r\n newImages: __('Squeeze new images', 'squeeze'),\r\n reSqueezeAll: __('Re-squeeze all images', 'squeeze'),\r\n directorySqueeze: __('Run Directory Squeeze', 'squeeze'),\r\n});\r\n\r\n// move static helper functions here\r\nconst elements = {\r\n bulkBtn: document.querySelector(\"[name='squeeze_bulk']\"),\r\n bulkAgainBtn: document.querySelector(\"[name='squeeze_bulk_again']\"),\r\n bulkPathBtn: document.querySelector(\"[name='squeeze_bulk_path_button']\"),\r\n bulkPathRemoveBtns: document.querySelectorAll(\".squeeze-path-list__remove\"),\r\n selectPathBtn: document.querySelector(\"[name='squeeze_select_path_button']\"),\r\n savePathBtn: document.querySelector(\"[name='squeeze_save_path_button']\"),\r\n pathDialog: document.getElementById(\"squeeze-path-dialog\"),\r\n closePathDialogBtn: document.querySelector(\"[name='squeeze_close_path_dialog_button']\"),\r\n pathInput: document.querySelector(\"[name='squeeze_bulk_path']\"),\r\n pathList: document.querySelector(\".squeeze-path-list\"),\r\n postsFilterForm: document.querySelector(\"#posts-filter\"),\r\n dirContainer: document.getElementById(\"squeeze-bulk-directory-list\"),\r\n bulkLogInput: document.querySelector(\"#squeeze-log-data\"),\r\n pauseBulkBtn: document.querySelector(\"[name='squeeze_pause_page_bulk']\"),\r\n bulkPausedBanner: document.getElementById('squeeze-bulk-paused-banner'),\r\n bulkPausedBannerText: document.getElementById('squeeze-bulk-paused-banner-text'),\r\n}\r\n\r\nconst getBulkActionItem = (btn) => btn?.closest('.squeeze-bulk-media-actions__item');\r\n\r\nconst setBulkActionItemHidden = (btn, hidden) => {\r\n const item = getBulkActionItem(btn);\r\n if (item) {\r\n item.hidden = hidden;\r\n }\r\n};\r\n\r\nconst focusBulkAction = (activeBtn) => {\r\n [elements.bulkBtn, elements.bulkAgainBtn].forEach((btn) => {\r\n if (!btn) return;\r\n setBulkActionItemHidden(btn, btn !== activeBtn);\r\n });\r\n};\r\n\r\nconst restoreBulkActionItems = () => {\r\n [elements.bulkBtn, elements.bulkAgainBtn].forEach((btn) => {\r\n if (!btn) return;\r\n setBulkActionItemHidden(btn, false);\r\n });\r\n\r\n if (elements.bulkBtn?.dataset.defaultHidden === 'true') {\r\n setBulkActionItemHidden(elements.bulkBtn, true);\r\n }\r\n};\r\n\r\nconst cachedMediaData = {\r\n isPaused: false,\r\n page: 1,\r\n process: '',\r\n mediaIDs: [],\r\n lastId: 0,\r\n totalImages: document.querySelector(\"[name='squeeze_bulk_total_images']\")?.value || 0,\r\n uncompressedImages: document.querySelector(\"[name='squeeze_bulk_uncompressed_images']\")?.value || 0,\r\n target: null\r\n}\r\n\r\nconst loadTemplate = async (templatePath, data) => {\r\n const response = await fetch(templatePath);\r\n let template = await response.text();\r\n\r\n // Process sub-templates\r\n const subTemplateRegex = /\\{\\{\\>\\s*(.*?)\\s*\\}\\}/g;\r\n let match;\r\n while ((match = subTemplateRegex.exec(template)) !== null) {\r\n const subTemplatePath = `${squeezeOptions.templateBase}/${match[1].trim()}.html`;\r\n const subTemplate = await loadTemplate(subTemplatePath, data);\r\n template = template.replace(match[0], subTemplate);\r\n }\r\n\r\n // Function to safely evaluate conditions (supports boolean variables, expressions, AND/OR)\r\n const evaluateCondition = (condition, data) => {\r\n try {\r\n // Convert standalone boolean variables (e.g., webp_lossless) to data['webp_lossless']\r\n condition = condition.replace(/\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b/g, (match) =>\r\n match in data ? `data['${match}']` : match\r\n );\r\n\r\n return new Function(\"data\", `with(data) { return ${condition}; }`)(data);\r\n } catch (e) {\r\n console.error(\"Error evaluating condition:\", condition, e);\r\n return false;\r\n }\r\n };\r\n\r\n // Recursive function to process nested if-else conditions\r\n const processIfStatements = (template) => {\r\n return template.replace(/\\{\\{#if ([\\s\\S]*?)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (match, condition, content) => {\r\n condition = condition.trim();\r\n const conditionResult = evaluateCondition(condition, data);\r\n\r\n // Extract and split the if-else blocks\r\n const elseMatch = content.match(/\\{\\{#else\\}\\}([\\s\\S]*)/);\r\n const trueBlock = elseMatch ? content.replace(/\\{\\{#else\\}\\}([\\s\\S]*)/, \"\") : content;\r\n const falseBlock = elseMatch ? elseMatch[1] : \"\";\r\n\r\n // Process nested if statements recursively\r\n return processIfStatements(conditionResult ? trueBlock : falseBlock);\r\n });\r\n };\r\n\r\n // Apply recursive processing of if conditions\r\n template = processIfStatements(template);\r\n\r\n // Replace variables\r\n return template.replace(/\\{\\{(.*?)\\}\\}/g, (match, key) => data[key.trim()] || '');\r\n}\r\n\r\nconst renderTemplate = async (templatePath, data, target = null) => {\r\n const renderedHTML = await loadTemplate(templatePath, data);\r\n\r\n // Create a temporary container to parse HTML\r\n const tempContainer = document.createElement(\"template\");\r\n tempContainer.innerHTML = renderedHTML.trim();\r\n\r\n if (!target) {\r\n return tempContainer.content.firstChild;\r\n }\r\n\r\n target.appendChild(tempContainer.content.firstChild);\r\n\r\n // Return the last element of the rendered template\r\n return target.lastElementChild;\r\n}\r\n\r\nconst logMessage = async (msg, options = {}) => {\r\n const { mediaLogWrapper = null, isStart = false, isPause = false, isEnd = false, isSuccess = false, isProgress = false, isWarning = false } = options;\r\n let { title = '', iconId = 'check-mark-circle-icon' } = options;\r\n\r\n if (!elements.bulkLogInput) return;\r\n\r\n if (isStart || isPause || isEnd) {\r\n iconId = isPause ? 'pause-button-icon' : ( isEnd ? 'check-mark-circle-icon' : 'image-file-icon' );\r\n title = isPause ? __('Bulk squeezing has been paused!', 'squeeze') : ( isEnd ? __('Bulk squeezing has been completed!', 'squeeze') : `${__('Media', 'squeeze')} ${title}:` );\r\n return await renderTemplate(squeezeOptions.templates.logWrapper, { title: title, msg: msg, iconId: iconId, isStart: isStart, isPause: isPause, isEnd: isEnd }, elements.bulkLogInput);\r\n } else {\r\n if (mediaLogWrapper) {\r\n const process = mediaLogWrapper.querySelector(\".media-log-process\");\r\n const step = await renderTemplate(squeezeOptions.templates.logStep, { msg: msg, iconId: iconId }, process);\r\n\r\n if (isWarning) {\r\n step.classList.add('media-log-step--warning');\r\n }\r\n\r\n if (msg && msg.includes('squeeze-comparison-table')) {\r\n const comparisonTable = step.querySelector('.squeeze-comparison-table');\r\n const toggleBtn = await renderTemplate(squeezeOptions.templates.logDetailsButton, { buttonText: __('Show details', 'squeeze') }, mediaLogWrapper);\r\n\r\n toggleBtn.addEventListener(\"click\", () => {\r\n comparisonTable.classList.toggle(\"show\");\r\n toggleBtn.textContent = comparisonTable.classList.contains(\"show\") ? __('Hide details', 'squeeze') : __('Show details', 'squeeze');\r\n });\r\n step.closest(\".media-log-wrapper\").appendChild(comparisonTable);\r\n step.closest(\".media-log-wrapper\").appendChild(toggleBtn);\r\n }\r\n\r\n if (!isProgress) {\r\n mediaLogWrapper.classList.add('media-log-wrapper--done');\r\n }\r\n\r\n if (isSuccess) {\r\n mediaLogWrapper.classList.add('media-log-wrapper--success');\r\n }\r\n\r\n if (isWarning) {\r\n mediaLogWrapper.classList.add('media-log-wrapper--warning');\r\n }\r\n } else {\r\n elements.bulkLogInput.innerHTML += msg + `<br>`;\r\n }\r\n }\r\n}\r\n\r\nconst showPopupMessage = (args) => {\r\n const { title = '', message, type = 'info', onClose = null } = args;\r\n const popup = document.createElement('dialog');\r\n const popupCloseBtn = document.createElement('button');\r\n const popupCloseIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n const popupIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n const popupText = document.createElement('p');\r\n const popupTitle = document.createElement('h3');\r\n\r\n popupIcon.setAttributeNS(null, 'viewBox', '0 0 32 32');\r\n popupIcon.classList.add('squeeze-icon');\r\n switch (type) {\r\n case 'success':\r\n popupIcon.innerHTML = `<use xlink:href=\"#check-mark-circle-icon\"></use>`;\r\n break;\r\n case 'error':\r\n popupIcon.innerHTML = `<use xlink:href=\"#ban-sign-icon\"></use>`;\r\n break;\r\n case 'info':\r\n popupIcon.innerHTML = `<use xlink:href=\"#info-icon\"></use>`;\r\n break;\r\n }\r\n\r\n popup.appendChild(popupIcon);\r\n\r\n if (title) {\r\n popupTitle.innerText = title;\r\n popup.appendChild(popupTitle);\r\n }\r\n\r\n const closePopup = () => {\r\n popup.close();\r\n popup.remove();\r\n }\r\n popup.addEventListener('click', (event) => {\r\n const rect = popup.getBoundingClientRect();\r\n const isInDialog = (rect.top <= event.clientY && event.clientY <= rect.top + rect.height &&\r\n rect.left <= event.clientX && event.clientX <= rect.left + rect.width);\r\n \r\n if (!isInDialog) {\r\n popup.close();\r\n }\r\n })\r\n popupCloseBtn.addEventListener('click', closePopup);\r\n if (onClose) {\r\n popup.addEventListener('close', onClose);\r\n }\r\n popupCloseBtn.className = 'squeeze-popup-close-btn';\r\n popup.className = `squeeze-popup-message squeeze-popup-${type} squeeze-box`;\r\n popupText.innerHTML = message;\r\n popupCloseIcon.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n popupCloseIcon.classList.add('squeeze-icon');\r\n popupCloseIcon.innerHTML = `<use xlink:href=\"#close-round-icon\"></use>`;\r\n\r\n popupCloseBtn.appendChild(popupCloseIcon);\r\n popup.appendChild(popupText);\r\n popup.appendChild(popupCloseBtn);\r\n document.body.appendChild(popup);\r\n popup.showModal();\r\n}\r\n\r\nconst hideBulkPausedBanner = () => {\r\n if (!elements.bulkPausedBanner) return;\r\n elements.bulkPausedBanner.hidden = true;\r\n if (elements.bulkPausedBannerText) {\r\n elements.bulkPausedBannerText.textContent = '';\r\n }\r\n};\r\n\r\nconst showBulkPausedBanner = () => {\r\n if (!elements.bulkPausedBanner || !elements.bulkPausedBannerText) return;\r\n\r\n elements.bulkPausedBannerText.textContent = __('Paused. Click Resume to continue.', 'squeeze');\r\n elements.bulkPausedBanner.hidden = false;\r\n};\r\n\r\nconst enableBulkButtonsOnPause = (resumeTarget) => {\r\n if (resumeTarget) {\r\n resumeTarget.disabled = false;\r\n resumeTarget.dataset.running = 'false';\r\n }\r\n};\r\n\r\nconst restoreBulkButtons = () => {\r\n const labels = getBulkButtonLabels();\r\n\r\n hideBulkPausedBanner();\r\n elements.bulkBtn.disabled = false;\r\n elements.bulkAgainBtn.disabled = false;\r\n elements.bulkPathBtn.disabled = false;\r\n elements.selectPathBtn.disabled = false;\r\n updateButtonText(elements.bulkBtn, labels.newImages, '#play-button-round-icon');\r\n updateButtonText(elements.bulkAgainBtn, labels.reSqueezeAll, '#repeat-icon');\r\n updateButtonText(elements.bulkPathBtn, labels.directorySqueeze, '#play-button-round-icon');\r\n elements.bulkBtn.dataset.running = 'false';\r\n elements.bulkAgainBtn.dataset.running = 'false';\r\n elements.bulkPathBtn.dataset.running = 'false';\r\n elements.bulkPathRemoveBtns?.forEach((btn) => {\r\n btn.disabled = false;\r\n });\r\n\r\n restoreBulkActionItems();\r\n\r\n cachedMediaData.process = '';\r\n cachedMediaData.mediaIDs = [];\r\n cachedMediaData.page = 1;\r\n}\r\n\r\nconst disableBulkButtons = () => {\r\n elements.bulkBtn.disabled = true;\r\n elements.bulkAgainBtn.disabled = true;\r\n elements.bulkPathBtn.disabled = true;\r\n elements.selectPathBtn.disabled = true;\r\n elements.bulkPathRemoveBtns?.forEach((btn) => btn.disabled = true);\r\n}\r\n\r\nconst disableAllButtons = (buttons) => {\r\n if (!buttons) return;\r\n buttons.forEach((btn) => btn.disabled = true);\r\n}\r\n\r\nconst removeAllButtons = (buttons) => {\r\n if (!buttons) return;\r\n buttons.forEach((btn) => btn.remove());\r\n}\r\n\r\nconst updateButtonText = (button, text, svgAnchor = false) => {\r\n button.childNodes.forEach((node) => {\r\n if (node.nodeName === '#text' && node.textContent.trim() !== '') {\r\n node.textContent = text;\r\n }\r\n if (svgAnchor && node.nodeName === 'svg') {\r\n node.querySelector('use').setAttribute('xlink:href', svgAnchor);\r\n }\r\n });\r\n}\r\n\r\n// Function to render directories in the dialog\r\nconst renderDirectories = async (dirs, parentDir = null, listeners = {}) => {\r\n if (!dirs) return;\r\n if (typeof dirs === 'object') dirs = Object.values(dirs);\r\n if (!elements.dirContainer.classList.contains(\"loaded\")) elements.dirContainer.innerHTML = \"\";\r\n\r\n if (dirs.length === 0 && !parentDir) {\r\n const listItem = await renderTemplate(squeezeOptions.templates.directoryItemEmpty, { emptyText: __('No directories found!', 'squeeze') }, elements.dirContainer);\r\n return;\r\n }\r\n\r\n const selectedFolders = JSON.parse(elements.pathInput.value);\r\n let target;\r\n\r\n for (const dir of dirs) {\r\n const listItemClasses = [];\r\n\r\n if (dir.parent === '/') {\r\n listItemClasses.push(\"loaded\", \"opened\");\r\n }\r\n\r\n if (parentDir) {\r\n target = parentDir;\r\n } else if (dir.parent) {\r\n const parentElement = elements.dirContainer.querySelector(`[data-path=\"${dir.parent}\"]`);\r\n if (parentElement) {\r\n target = parentElement;\r\n } else {\r\n target = elements.dirContainer;\r\n }\r\n } else {\r\n target = elements.dirContainer;\r\n }\r\n\r\n const listItem = await renderTemplate(\r\n squeezeOptions.templates.directoryItem,\r\n {\r\n parent: dir.parent,\r\n path: dir.path,\r\n label: dir.name,\r\n classes: listItemClasses.join(\" \"),\r\n isWritable: dir.is_writeable && !(Array.isArray(selectedFolders) && selectedFolders.includes(dir.path)),\r\n isChecked: dir.is_writeable && Array.isArray(selectedFolders) && selectedFolders.includes(dir.path),\r\n },\r\n target\r\n )\r\n\r\n listItem.querySelector(\"label\").addEventListener(\"click\", listeners.handleDirectoryClick);\r\n listItem.querySelector(\"input[type='checkbox']\")?.addEventListener(\"change\", listeners.handleDirectoryCheck);\r\n }\r\n\r\n elements.dirContainer.classList.add(\"loaded\");\r\n}\r\n\r\n/**\r\n * Normalize directory path strings so checkbox values and hidden JSON compare reliably.\r\n */\r\nconst normalizeDirectoryPathKey = (p) => {\r\n let s = String(p ?? \"\").trim().replace(/\\\\/g, \"/\");\r\n s = s.replace(/\\/+/g, \"/\");\r\n if (!s) {\r\n return \"/\";\r\n }\r\n if (s !== \"/\" && !s.endsWith(\"/\")) {\r\n s += \"/\";\r\n }\r\n return s;\r\n};\r\n\r\n/**\r\n * Align checkboxes in #squeeze-bulk-directory-list with the hidden path JSON (e.g. after Clear path).\r\n */\r\nconst syncDirectoryDialogCheckboxesFromPathInput = () => {\r\n if (!elements.dirContainer) {\r\n return;\r\n }\r\n let selectedFolders = [];\r\n try {\r\n const raw = elements.pathInput?.value;\r\n if (raw) {\r\n selectedFolders = JSON.parse(raw);\r\n }\r\n } catch (e) {\r\n return;\r\n }\r\n if (!Array.isArray(selectedFolders)) {\r\n return;\r\n }\r\n const selectedSet = new Set(selectedFolders.map((p) => normalizeDirectoryPathKey(p)));\r\n elements.dirContainer.querySelectorAll(\"input[type='checkbox']\").forEach((cb) => {\r\n cb.checked = selectedSet.has(normalizeDirectoryPathKey(cb.value));\r\n });\r\n if (elements.savePathBtn) {\r\n elements.savePathBtn.disabled = !elements.dirContainer.querySelector(\"input[type='checkbox']:checked\");\r\n }\r\n};\r\n\r\nconst handleRemovePathButton = async (e) => {\r\n e.preventDefault();\r\n const item = e.target.closest(\".squeeze-path-list__item\");\r\n if (item) {\r\n item.remove();\r\n const currentPaths = Array.from(elements.pathList.querySelectorAll(\".squeeze-path-list__input\"))\r\n .map(input => input.value.trim())\r\n .filter(value => value !== '');\r\n elements.pathInput.value = JSON.stringify(currentPaths);\r\n await populatePathInput();\r\n }\r\n}\r\n\r\nconst populatePathInput = async () => {\r\n const path = elements.pathInput.value;\r\n if (!path) return;\r\n\r\n try {\r\n const selectedFolders = JSON.parse(path);\r\n const items = elements.pathList.querySelectorAll(\".squeeze-path-list__item\");\r\n\r\n items.forEach(item => item.remove());\r\n\r\n const showRemove = selectedFolders.length > 1;\r\n\r\n for (const folder of selectedFolders) {\r\n const item = await renderTemplate(squeezeOptions.templates.pathListItem, {\r\n folder: folder,\r\n showRemove: showRemove,\r\n clearLabel: __('Clear path', 'squeeze'),\r\n clearTitle: __('Clear the path field', 'squeeze'),\r\n }, elements.pathList);\r\n const removeButton = item.querySelector(\".squeeze-path-list__remove\");\r\n removeButton?.addEventListener(\"click\", handleRemovePathButton);\r\n }\r\n syncDirectoryDialogCheckboxesFromPathInput();\r\n } catch (error) {\r\n alert(__('Error parsing path input!', 'squeeze'));\r\n console.error('Error parsing path input:', error);\r\n }\r\n}\r\n\r\nconst getHiddenProp = () => {\r\n var prefixes = ['webkit', 'moz', 'ms', 'o'];\r\n\r\n // if 'hidden' is natively supported just return it\r\n if ('hidden' in document) return 'hidden';\r\n\r\n // otherwise loop over all the known prefixes until we find one\r\n for (let i = 0; i < prefixes.length; i++) {\r\n if ((prefixes[i] + 'Hidden') in document)\r\n return prefixes[i] + 'Hidden';\r\n }\r\n\r\n // otherwise it's not supported\r\n return null;\r\n}\r\n\r\nconst isDocHidden = () => {\r\n const prop = getHiddenProp();\r\n if (!prop) return false;\r\n\r\n return document[prop];\r\n}\r\n\r\n/**\r\n * @see https://stackoverflow.com/a/20732091\r\n */\r\nconst humanFileSize = (size) => {\r\n let i = size == 0 ? 0 : Math.floor(Math.log(size) / Math.log(1024));\r\n return +((size / Math.pow(1024, i)).toFixed(2)) * 1 + ' ' + ['B', 'KB', 'MB', 'GB', 'TB'][i];\r\n}\r\n\r\nconst base64SizeInBytes = (base64) => {\r\n // Remove data URL prefix if present\r\n const base64String = base64.split(',')[1] || base64; \r\n\r\n // Calculate padding characters ('=' at the end of Base64)\r\n const padding = (base64String.match(/=+$/) || [\"\"])[0].length;\r\n\r\n // Compute byte size\r\n return (base64String.length * 3) / 4 - padding;\r\n}\r\n\r\nconst maybeCompressAttachment = (attachmentType, attachmentSubType, compressOptions = null) => {\r\n const isAutoCompress = compressOptions?.auto_compress ?? true;\r\n const allowedMimeTypes = ['jpeg', 'png', 'webp', 'avif'];\r\n const isImage = attachmentType === 'image' && allowedMimeTypes.includes(attachmentSubType);\r\n\r\n return isImage && isAutoCompress;\r\n};\r\n\r\nconst base64ToBlob = (base64, type = 'image/jpeg') => {\r\n // Remove data URL prefix if present\r\n const base64String = base64.split(',')[1] || base64;\r\n\r\n // Decode Base64 string\r\n const byteCharacters = atob(base64String);\r\n const byteNumbers = new Array(byteCharacters.length);\r\n \r\n for (let i = 0; i < byteCharacters.length; i++) {\r\n byteNumbers[i] = byteCharacters.charCodeAt(i);\r\n }\r\n\r\n const byteArray = new Uint8Array(byteNumbers);\r\n return new Blob([byteArray], { type: type });\r\n}\r\n\r\nconst base64ToFile = (base64, fileName = 'image.jpg', type = 'image/jpeg') => {\r\n const blob = base64ToBlob(base64, type);\r\n return new File([blob], fileName, { type: type });\r\n}\r\n\r\nconst fileToBase64 = (file) => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => resolve(reader.result);\r\n reader.onerror = (error) => reject(error);\r\n reader.readAsDataURL(file);\r\n });\r\n}\r\n\r\nfunction objectToFormData(obj, fd = null, parentKey = null) {\r\n const formData = fd || new FormData();\r\n\r\n for (const key in obj) {\r\n if (!obj.hasOwnProperty(key)) continue;\r\n const value = obj[key];\r\n\r\n // build the form key: either \"foo\", \"parent[foo]\" or \"parent[]\" for arrays\r\n const formKey = parentKey\r\n ? Array.isArray(obj)\r\n ? `${parentKey}[]`\r\n : `${parentKey}[${key}]`\r\n : key;\r\n\r\n // Files or Blobs go straight in\r\n if (value instanceof File || value instanceof Blob) {\r\n formData.append(formKey, value, value.name);\r\n }\r\n // Arrays: recurse so they become key[]=val0, key[]=val1…\r\n else if (Array.isArray(value)) {\r\n objectToFormData(value, formData, formKey);\r\n }\r\n // Plain objects: recurse so they become key[subkey]=subval\r\n else if (\r\n value !== null &&\r\n typeof value === 'object' &&\r\n !(value instanceof Date)\r\n ) {\r\n objectToFormData(value, formData, formKey);\r\n }\r\n // Dates: convert to ISO string (or format as you like)\r\n else if (value instanceof Date) {\r\n formData.append(formKey, value.toISOString());\r\n }\r\n // Everything else (number, string, boolean, null, undefined)\r\n else {\r\n // Explicitly convert undefined to empty string so PHP sees it\r\n const stringVal =\r\n value === undefined || value === null ? '' : String(value);\r\n formData.append(formKey, stringVal);\r\n }\r\n }\r\n\r\n return formData;\r\n}\r\n\r\n/**\r\n * Extend the attachment object with additional data from the file.\r\n * @param {object} attachment \r\n * @param {object} file \r\n * @returns {object} — the extended attachment object.\r\n */\r\nconst extendAttachment = async (attachment, file) => {\r\n if (typeof attachment !== 'object' || !attachment.attributes) {\r\n console.warn('Invalid attachment object:', attachment);\r\n return;\r\n }\r\n\r\n const attributes = attachment.attributes;\r\n\r\n if (file?.base64) {\r\n attributes.base64Compressed = file.base64; // Use the base64 data from the attachment\r\n }\r\n\r\n if (file?.base64Webp) {\r\n attributes.base64WebpCompressed = file.base64Webp; // Use the WebP base64 data from the attachment\r\n }\r\n\r\n if (file?.originalFile) {\r\n attributes.originalFile = file.originalFile; // Use the original file from the attachment to be able to create a backup\r\n }\r\n\r\n return attachment;\r\n}\r\n\r\nconst getFileFromUrl = async (url, filename, format) => {\r\n const response = await fetch(url);\r\n const blob = await response.blob();\r\n const mimeType = format ? `image/${format}` : blob.type;\r\n return new File([blob], filename, { type: mimeType });\r\n}\r\n\r\nfunction isSqueezeAvailable() {\r\n if (typeof Squeeze === 'undefined') return false;\r\n if (typeof Squeeze.compressBeforeUpload !== 'function') {\r\n console.warn('Squeeze.compressBeforeUpload is not a function');\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction isFileAlreadyProcessed(file) {\r\n return file?._isSqueezed || file?._isExcluded || file?._isFailed;\r\n}\r\n\r\nfunction isFileFailedAfterCompression(file) {\r\n if (file?._isExcluded || file?._isFailed) {\r\n console.warn(`File is ${file?._isExcluded ? 'excluded' : 'failed'} from compression:`, file.name);\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nfunction isImageFile(file) {\r\n return file.type?.startsWith('image/');\r\n}\r\n\r\nfunction getNativeFile(pluploadFile) {\r\n return pluploadFile.getNative() || pluploadFile.getSource();\r\n}\r\n\r\nfunction parseMimeType(file) {\r\n const [type = '', subtype = ''] = file?.type?.split('/') ?? [];\r\n return { type, subtype };\r\n}\r\n\r\nasync function isExcludedFile(pluploadFile, up) {\r\n \r\n}\r\n\r\nfunction markFileExcluded(pluploadFile) {\r\n pluploadFile.status = plupload.QUEUED;\r\n pluploadFile.loaded = 0;\r\n pluploadFile._isExcluded = true;\r\n}\r\n\r\nfunction markFileFailed(pluploadFile) {\r\n pluploadFile.status = plupload.QUEUED;\r\n pluploadFile.loaded = 0;\r\n pluploadFile._isFailed = true;\r\n}\r\n\r\nfunction markFileCompressed(pluploadFile, newSource, base64Obj) {\r\n pluploadFile.getSource = () => newSource;\r\n pluploadFile.status = plupload.QUEUED;\r\n pluploadFile.loaded = 0;\r\n pluploadFile._isSqueezed = true;\r\n pluploadFile.base64 = base64Obj.base64;\r\n pluploadFile.base64Webp = base64Obj?.base64Webp;\r\n}\r\n\r\nfunction restartUploader(up) {\r\n if (!up) return;\r\n setTimeout(() => up.start(), 0);\r\n}\r\n\r\nasync function maybeBackupOriginal(file, compressOptions) {\r\n const isDirectWebp = compressOptions?.direct_webp && file.type !== 'image/webp';\r\n if (isDirectWebp) {\r\n return await Squeeze.convertFileToWebp(file);\r\n }\r\n return file;\r\n}\r\n\r\nfunction handleCompressionError(error, up, pluploadFile) {\r\n console.error('Error during compression before upload:', error);\r\n markFileFailed(pluploadFile);\r\n if (up) {\r\n restartUploader(up);\r\n }\r\n}\r\n\r\nfunction updateAttachmentUI(attachment, uploadData) {\r\n if (!attachment || !uploadData) return;\r\n if (uploadData.success === false) return;\r\n\r\n const compat = attachment.get('compat');\r\n const tempDiv = document.createElement('div');\r\n let compatItem = compat.item;\r\n\r\n tempDiv.innerHTML = compatItem;\r\n if (tempDiv.querySelector('.compat-field-squeeze_is_compressed .field')) {\r\n tempDiv.querySelector('.compat-field-squeeze_is_compressed .field').innerHTML = uploadData?.data?.message;\r\n }\r\n compat.item = tempDiv.innerHTML;\r\n\r\n attachment.set('compat', compat);\r\n}\r\n\r\nfunction updateAttachmentUIFailed(mediaItem, message) {\r\n if (!mediaItem) return;\r\n\r\n mediaItem.innerHTML += message;\r\n mediaItem.querySelector('.progress')?.remove();\r\n}\r\n\r\n/**\r\n * Wait for media item to load( 'async-upload.php' )\r\n * Ping every 1 second until the media item is loaded\r\n * @returns Promise\r\n*/\r\nconst waitForItemLoad = (mediaItem, addProgressBar = true) => {\r\n return new Promise((resolve) => {\r\n let interval = setInterval(() => {\r\n if (mediaItem.querySelector('.media-item-wrapper')) {\r\n if (addProgressBar) {\r\n mediaItem.querySelector('.media-item-wrapper').innerHTML += `\r\n <div class=\"progress\">\r\n <div class=\"percent\">${__('Squeezing...', 'squeeze')}</div>\r\n <div class=\"bar\" style=\"width: 200px;\"></div>\r\n </div>\r\n `;\r\n }\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 1000);\r\n });\r\n}\r\n\r\n/**\r\n * Show a message in the status element after a delay\r\n * Useful for long-running operations\r\n * @param {string} message \r\n * @param {HTMLElement} statusEl \r\n * @param {integer} delay - delay in milliseconds (default: 5000)\r\n * @returns {integer} - timeout ID\r\n */\r\nconst waitMessage = (message, statusEl, delay = 5000) => {\r\n const timeoutId = setTimeout(() => {\r\n statusEl.innerHTML = message;\r\n }, delay);\r\n\r\n return timeoutId;\r\n}\r\n\r\n/**\r\n * After a delay, append a \"still working\" step to an in-progress bulk log entry.\r\n */\r\nconst waitBulkMessage = (mediaLogWrapper, filename, delay = 30000) => {\r\n return setTimeout(async () => {\r\n if (!mediaLogWrapper || mediaLogWrapper.classList.contains('media-log-wrapper--done')) {\r\n return;\r\n }\r\n\r\n await logMessage(\r\n sprintf(__('Still processing %s… Large images can take several minutes.', 'squeeze'), filename),\r\n { mediaLogWrapper, iconId: 'lemon-dot-icon', isProgress: true }\r\n );\r\n }, delay);\r\n}\r\n\r\nconst squeezeLoadingAnimationHTML = `\r\n <div class=\"squeeze-loading-wrap\" aria-live=\"polite\" aria-label=\"Loading\">\r\n <span class=\"squeeze-loading-icon\">⌛</span>\r\n </div>\r\n`;\n\n//# sourceURL=webpack:///./assets/js/helpers.js?");
30
31 /***/ }),
32
33 /***/ "./assets/js/script.js":
34 /*!*****************************!*\
35 !*** ./assets/js/script.js ***!
36 \*****************************/
37 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
38
39 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _squeeze_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./squeeze.js */ \"./assets/js/squeeze.js\");\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n/* harmony import */ var _handlers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./handlers.js */ \"./assets/js/handlers.js\");\n/* harmony import */ var _voxel_upload_compat_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./voxel-upload-compat.js */ \"./assets/js/voxel-upload-compat.js\");\n\r\n\r\n\r\n\r\n\r\n\r\n\"use strict\";\r\n\r\nconst { sprintf, __ } = wp.i18n; // Import __() from wp.i18n\r\n\r\n//const Squeeze = new SQUEEZE(squeezeOptions);\r\nconst compressOptions = JSON.parse(squeezeOptions.options);\r\nwindow.Squeeze = window.Squeeze || new _squeeze_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](squeezeOptions); // make it globally accessible for other scripts\r\n\r\n(0,_voxel_upload_compat_js__WEBPACK_IMPORTED_MODULE_3__.initVoxelUploadCompat)(compressOptions);\r\n\r\ndocument.addEventListener(\"click\", (event) => {\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleButtonsClick(event);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkBtn?.addEventListener(\"click\", async (event) => {\r\n let uncompressedIDs = squeezeBulk.unCompressedImages ? squeezeBulk.unCompressedImages.split(\",\") : [];\r\n let currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page ?? 1;\r\n\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleBulkButtonClick(event, 'uncompressed', uncompressedIDs, currentPage);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkAgainBtn?.addEventListener(\"click\", async (event) => {\r\n let allIDs = squeezeBulk.allImages ? squeezeBulk.allImages.split(\",\") : [];\r\n let currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page ?? 1;\r\n\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleBulkButtonClick(event, 'all', allIDs, currentPage);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkPathBtn?.addEventListener(\"click\", async (event) => {\r\n const path = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput?.value ?? '';\r\n let bulkPathData;\r\n\r\n if (path.replace(/\\[\\]/g, '').split(',').length === 0 || !path.replace(/\\[\\]/g, '').split(',')[0] || !path) {\r\n alert(__('Please enter a valid path!', 'squeeze'));\r\n return;\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.disableBulkButtons();\r\n window.onbeforeunload = _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleOnLeave;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.process === 'path' && _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs.length > 0) {\r\n bulkPathData = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs;\r\n } else {\r\n const pathData = await Squeeze.getAttachmentsByPath(path);\r\n\r\n if (pathData.success) {\r\n bulkPathData = pathData.data;\r\n } else {\r\n console.error(pathData.data);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n window.onbeforeunload = null;\r\n }\r\n }\r\n\r\n const isPaused = _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleBulkToggle(event, 'path', bulkPathData);\r\n\r\n if (isPaused) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(event.target, __('Pausing...', 'squeeze'), '#pause-button-icon');\r\n return;\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.hideBulkPausedBanner();\r\n event.target.disabled = false;\r\n\r\n try {\r\n const finalResponse = await _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleRecursiveUpload('path', bulkPathData, 1);\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.logMessage(__('All images have been processed!', 'squeeze'), { isEnd: true });\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.showPopupMessage( {\r\n title: __('Squeezing complete', 'squeeze'),\r\n message: __('All images have been processed!', 'squeeze'),\r\n type: 'success'\r\n });\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n})\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkPathRemoveBtns?.forEach((btn) => {\r\n btn.addEventListener(\"click\", _helpers_js__WEBPACK_IMPORTED_MODULE_1__.handleRemovePathButton);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.selectPathBtn?.addEventListener(\"click\", async (event) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.showModal();\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.contains(\"loading\")) return;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.contains(\"loaded\")) {\r\n const selectedFolders = JSON.parse(_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput.value);\r\n\r\n if (Array.isArray(selectedFolders)) {\r\n selectedFolders.forEach((folder) => {\r\n const checkbox = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.querySelector(`input[value=\"${folder}\"]`);\r\n if (checkbox) {\r\n checkbox.checked = true;\r\n }\r\n });\r\n }\r\n\r\n return;\r\n\r\n } else {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.add(\"loading\");\r\n const folders = await Squeeze.getDirectories();\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.renderDirectories(folders, null, {\r\n handleDirectoryClick: _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleDirectoryClick,\r\n handleDirectoryCheck: _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleDirectoryCheck\r\n });\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.remove(\"loading\");\r\n }\r\n\r\n\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.savePathBtn?.addEventListener(\"click\", () => {\r\n const checkboxes = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.querySelectorAll(\"input[type='checkbox']\");\r\n const selectedFolders = Array.from(checkboxes)\r\n .filter(checkbox => checkbox.checked)\r\n .map(checkbox => checkbox.value);\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput.value = JSON.stringify(selectedFolders);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.populatePathInput();\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.close();\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.closePathDialogBtn?.addEventListener(\"click\", () => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.close();\r\n});\r\n\r\ndocument.addEventListener('click', _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleClosePathDialog);\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm?.addEventListener(\"submit\", async (event) => {\r\n const dataAction = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.dataset.action;\r\n const action = event.target.querySelector(\"select[name='action']\").value;\r\n const submitButtons = event.target.querySelectorAll(\"input[name='bulk_action']\");\r\n\r\n if (action === 'squeeze_bulk_compress' && dataAction !== 'squeeze_bulk_compressed') {\r\n event.preventDefault();\r\n const mediaList = document.querySelectorAll(\"input[name='media[]']:checked\");\r\n const uncompressedIDs = Array.from(mediaList).map((el) => el.value);\r\n\r\n if (uncompressedIDs.length === 0) return;\r\n\r\n window.onbeforeunload = _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleOnLeave;\r\n\r\n uncompressedIDs.forEach((id) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.querySelectorAll(`#post-${id} .column-squeeze button`).forEach((btn) => {\r\n btn.disabled = true;\r\n });\r\n const squeezeStatusElement = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.querySelector(`#post-${id} .column-squeeze .squeeze_status`);\r\n if (squeezeStatusElement) {\r\n squeezeStatusElement.innerText = '⏳ ' + __('Squeezing...', 'squeeze');\r\n }\r\n });\r\n\r\n submitButtons.forEach((btn) => {\r\n btn.disabled = true;\r\n btn.value = __('Squeezing...', 'squeeze');\r\n });\r\n\r\n try {\r\n const finalResponse = await _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleRecursiveUpload('uncompressed', uncompressedIDs, 1);\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0) {\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.dataset.action = 'squeeze_bulk_compressed';\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.submit();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n }\r\n});\r\n\r\n// https://wordpress.stackexchange.com/a/131295/186146 - override wp.Uploader.prototype.success\r\nwindow.wp.domReady(()=>{\r\n\r\n if (wp?.Uploader?.prototype) {\r\n const prevInit = wp.Uploader.prototype.init;\r\n\r\n wp.Uploader.prototype.init = function (...args) {\r\n // Call Filebird’s (or whoever’s) init first\r\n if (typeof prevInit === 'function') {\r\n prevInit.apply(this, args);\r\n }\r\n \r\n const uploader = this.uploader;\r\n\r\n // Now add *your* logic\r\n if (uploader) {\r\n\r\n uploader.bind('BeforeUpload', async function (up, pluploadFile) {\r\n //console.time('Compressing image:', pluploadFile.name);\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleCompressBeforeUpload(up, pluploadFile, compressOptions);\r\n });\r\n\r\n uploader.bind('FileUploaded', async function (up, file, response) {\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleCompressAfterUpload(file, compressOptions);\r\n //console.timeEnd('Compressing image:', file.name)\r\n })\r\n\r\n }\r\n }\r\n }\r\n});\r\n\r\ndocument.onreadystatechange = function () {\r\n if (document.readyState === \"complete\") { // equivalent to jQuery $(document).ready()\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleMultiFileFormUpload(compressOptions);\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Create the toggle preview checkbox\r\n * @param {Integer} attachmentId \r\n * @param {Boolean} isPlaceholder\r\n * @returns HTMLElement\r\n */\r\nconst createTogglePreview = (attachmentId, isPlaceholder = false) => {\r\n\r\n // Create the toggle\r\n const toggleWrap = document.createElement('span');\r\n const toggleInput = document.createElement('input');\r\n const toggleLabel = document.createElement('label');\r\n const toggleIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n\r\n toggleInput.type = 'checkbox';\r\n toggleInput.className = 'squeeze-ios8-switch';\r\n toggleInput.id = 'squeeze-ios8-switch-' + attachmentId;\r\n toggleLabel.textContent = __('Compare Squeeze', 'squeeze');\r\n toggleLabel.title = __('Image comparison with Squeeze', 'squeeze');\r\n toggleLabel.htmlFor = toggleInput.id;\r\n toggleWrap.style.marginInlineStart = '1em';\r\n toggleWrap.style.verticalAlign = 'sub';\r\n toggleIcon.style.display = 'inline-block';\r\n toggleIcon.style.verticalAlign = 'middle';\r\n toggleIcon.setAttributeNS(null, 'viewBox', '0 0 122.88 101.61');\r\n toggleIcon.classList.add('squeeze-icon');\r\n toggleIcon.innerHTML = `<g><path d=\"M15.28,46.33h30V4.44c0-2.45,1.99-4.44,4.44-4.44c2.45,0,4.44,1.99,4.44,4.44v92.72c0,2.45-1.99,4.44-4.44,4.44 c-2.45,0-4.44-1.99-4.44-4.44V55.21H15.07l15.15,15.28c1.72,1.73,1.72,4.54-0.02,6.26c-1.73,1.72-4.54,1.72-6.26-0.02L1.29,53.89 l0,0l-0.01-0.01c-0.05-0.05-0.09-0.09-0.13-0.14l-0.01-0.01l-0.06-0.07l-0.02-0.02l-0.05-0.06l-0.02-0.03l-0.02-0.02l-0.05-0.07 l0,0L0.87,53.4l-0.02-0.02l-0.01-0.02l-0.05-0.07l-0.01-0.02l-0.05-0.07l0,0l-0.04-0.07L0.66,53.1l-0.01-0.02l-0.04-0.07 l-0.01-0.02l-0.02-0.03l-0.04-0.06l0,0L0.5,52.82l-0.01-0.02l-0.04-0.08l0,0l-0.04-0.08L0.4,52.62l-0.03-0.06l-0.01-0.03L0.35,52.5 l-0.03-0.08L0.31,52.4l-0.03-0.08L0.27,52.3l-0.03-0.08l0-0.01c-0.02-0.06-0.04-0.13-0.06-0.19l0-0.01l-0.02-0.08l-0.01-0.02 l-0.01-0.02l-0.02-0.08l-0.02-0.1l0-0.01l-0.02-0.1l0-0.01l-0.01-0.07L0.06,51.5l0-0.02l-0.01-0.08l0-0.02l-0.01-0.08l0,0 L0.02,51.2l0-0.01l0-0.02l-0.01-0.08l0-0.01C0.01,51,0,50.93,0,50.87l0-0.01l0-0.09v-0.02l0-0.08l0-0.02l0-0.02l0-0.08l0-0.02 l0.01-0.08l0,0l0.01-0.09l0-0.01c0.01-0.1,0.02-0.21,0.04-0.31l0.02-0.09l0-0.02c0.02-0.1,0.04-0.2,0.07-0.3l0,0l0.02-0.08 l0.01-0.03l0.01-0.02l0.02-0.08l0.01-0.02l0.03-0.08l0.01-0.02l0.03-0.08l0-0.01c0.04-0.1,0.08-0.19,0.12-0.28l0.01-0.01 c0.03-0.06,0.06-0.12,0.09-0.17l0.01-0.02l0.01-0.02l0.04-0.07l0.01-0.02l0.04-0.07c0.03-0.05,0.06-0.11,0.1-0.16l0.02-0.03 l0.01-0.02l0.05-0.07l0-0.01c0.04-0.06,0.08-0.11,0.12-0.16l0.01-0.01L1,47.97v0l0.07-0.08l0.01-0.01l0.04-0.05l0.05-0.05l0,0 l0.06-0.06l0.02-0.02l0.06-0.06l0,0l0.01-0.01L23.97,25.4c1.74-1.71,4.55-1.69,6.26,0.05c1.71,1.74,1.69,4.55-0.05,6.26 L15.28,46.33L15.28,46.33z M67.86,4.44C67.86,1.99,69.85,0,72.3,0c2.45,0,4.44,1.99,4.44,4.44v41.89h30.86L92.7,31.72 c-1.74-1.71-1.77-4.52-0.05-6.26c1.71-1.74,4.52-1.77,6.26-0.05l22.65,22.21l0.01,0.01l0,0l0.06,0.06l0.02,0.02l0.06,0.06l0,0 l0.05,0.05l0.04,0.05l0.01,0.01l0.07,0.08v0l0.07,0.08l0.01,0.01c0.04,0.05,0.08,0.11,0.12,0.16l0,0.01l0.05,0.07l0.01,0.02 l0.02,0.03c0.03,0.05,0.07,0.11,0.1,0.16l0.04,0.07l0.01,0.02l0.04,0.07l0.01,0.02l0.01,0.02c0.03,0.06,0.06,0.12,0.09,0.17 l0.01,0.01c0.04,0.09,0.08,0.19,0.12,0.28l0,0.01l0.03,0.08l0.01,0.02l0.03,0.08l0.01,0.02l0.02,0.08l0.01,0.02l0.01,0.03 l0.02,0.08l0,0c0.03,0.1,0.05,0.2,0.07,0.3l0,0.02l0.02,0.09c0.02,0.1,0.03,0.21,0.04,0.31l0,0.01l0.01,0.09l0,0l0.01,0.08l0,0.02 l0,0.08l0,0.02l0,0.02l0,0.08v0.02l0,0.09l0,0.01c0,0.07,0,0.13-0.01,0.2l0,0.01l-0.01,0.08l0,0.02l0,0.01l-0.01,0.09l0,0 l-0.01,0.08l0,0.02l-0.01,0.08l0,0.02l-0.01,0.03l-0.01,0.07l0,0.01l-0.02,0.1l0,0.01l-0.02,0.1l-0.02,0.08l-0.01,0.02l-0.01,0.02 l-0.02,0.08l0,0.01c-0.02,0.06-0.04,0.13-0.06,0.19l0,0.01l-0.03,0.08l-0.01,0.02l-0.03,0.08l-0.01,0.02l-0.03,0.08l-0.01,0.02 l-0.01,0.03l-0.03,0.06l-0.01,0.02l-0.04,0.08l0,0l-0.04,0.08l-0.01,0.02l-0.04,0.07l0,0l-0.04,0.06l-0.02,0.03l-0.01,0.02 l-0.04,0.07l-0.01,0.02l-0.01,0.02l-0.04,0.07l0,0l-0.05,0.07l-0.01,0.02l-0.05,0.07l-0.01,0.02l-0.02,0.02l-0.05,0.06l0,0 l-0.05,0.07l-0.02,0.02l-0.02,0.03l-0.05,0.06l-0.02,0.02l-0.06,0.07l-0.01,0.01c-0.04,0.05-0.09,0.1-0.13,0.14l-0.01,0.01l0,0 L98.94,76.73c-1.72,1.73-4.53,1.74-6.26,0.02c-1.73-1.72-1.74-4.53-0.02-6.26l15.15-15.28H76.74v41.96c0,2.45-1.99,4.44-4.44,4.44 c-2.45,0-4.44-1.99-4.44-4.44V4.44L67.86,4.44z M122.16,48.35c0.03,0.05,0.07,0.11,0.1,0.16L122.16,48.35L122.16,48.35z\"></path></g>`;\r\n\r\n if (isPlaceholder) {\r\n toggleInput.disabled = true;\r\n toggleLabel.innerHTML += ' ' + sprintf(__('(<a href=\"%s\" target=\"_blank\">premium only</a>)', 'squeeze'), squeezeOptions.upgradeUrl);\r\n }\r\n\r\n toggleWrap.appendChild(toggleIcon);\r\n toggleWrap.appendChild(toggleInput);\r\n toggleWrap.appendChild(toggleLabel);\r\n\r\n return toggleWrap;\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./assets/js/script.js?");
40
41 /***/ }),
42
43 /***/ "./assets/js/squeeze.js":
44 /*!******************************!*\
45 !*** ./assets/js/squeeze.js ***!
46 \******************************/
47 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
48
49 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SQUEEZE)\n/* harmony export */ });\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n/* harmony import */ var browser_image_compression__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! browser-image-compression */ \"./node_modules/browser-image-compression/dist/browser-image-compression.mjs\");\n/* harmony import */ var _jsquash_webp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jsquash/webp */ \"./node_modules/@jsquash/webp/encode.js\");\n\n\n\n\n\n\nconst { __, sprintf } = wp.i18n; // Import __() from wp.i18n\n\nclass SQUEEZE {\n\n constructor(squeeze) {\n this.options = JSON.parse(squeeze.options); // plugin options\n this.nonce = squeeze.nonce; // nonce\n this.ajaxUrl = squeeze.ajaxUrl; // ajax url\n this.timeout = parseInt(this.options.timeout) * 1000; // convert to milliseconds\n this.poolSize = navigator.hardwareConcurrency || 1; // number of threads\n this.settingsPageUrl = squeeze.settingsPageUrl || ''; // settings page URL\n }\n\n /**\n * Returns true when `url` is on a different origin than the current page.\n * Used to detect images served from an external CDN (e.g. GCS, S3) so we can\n * proxy them through WordPress before passing to the Web Worker.\n */\n _isCrossOrigin = (url) => {\n if (!url) return false;\n try {\n return new URL(url, window.location.href).origin !== window.location.origin;\n } catch {\n return false;\n }\n }\n\n /**\n * Build a same-origin proxy URL for an attachment image.\n * The browser can fetch this without CORS errors; the PHP handler streams the\n * actual image (from local disk or from the provider) back to the browser.\n *\n * @param {number} attachmentId WordPress attachment post ID.\n * @param {string} size WP size name: 'original', 'full', or registered size.\n * @returns {string}\n */\n _buildProxyUrl = (attachmentId, size = 'original') => {\n return `${this.ajaxUrl}?action=squeeze_fetch_image` +\n `&attachment_id=${encodeURIComponent(attachmentId)}` +\n `&size=${encodeURIComponent(size)}` +\n `&_ajax_nonce=${encodeURIComponent(this.nonce)}`;\n }\n\n /**\n * For each size whose `url` is cross-origin, add a `fetchUrl` field pointing to\n * the same-origin proxy. The original `url` is kept so PHP can still derive the\n * correct filename. The worker will use `fetchUrl` for the actual fetch() call.\n *\n * @param {Object} sizes Sizes object from attachment data.\n * @param {number} attachmentId WordPress attachment post ID.\n * @returns {Object}\n */\n _proxySizes = (sizes, attachmentId) => {\n if (!sizes || !attachmentId) return sizes;\n const proxied = {};\n for (const [sizeName, sizeData] of Object.entries(sizes)) {\n proxied[sizeName] = { ...sizeData };\n if (sizeData?.url && this._isCrossOrigin(sizeData.url)) {\n proxied[sizeName].fetchUrl = this._buildProxyUrl(attachmentId, sizeName);\n }\n }\n return proxied;\n }\n\n handleCompress = async ( attachment, type = 'uncompressed' ) => {\n const attachmentData = attachment.attributes;\n const url = attachmentData?.originalImageURL ?? attachmentData.url;\n const mime = attachmentData.mime;\n const name = attachmentData.name;\n const filename = attachmentData?.originalImageName ?? attachmentData.filename;\n const attachmentID = attachmentData.id;\n const sizes = attachmentData.sizes;\n const format = mime.split(\"/\")[1];\n const sourceType = format;\n const outputType = format;\n const skipFull = attachmentData?.skipFull ?? attachmentData.originalImageName === undefined ? true : false;\n const timeout = this.timeout;\n const isPreview = attachmentData?.isPreview ?? false;\n const file = attachmentData?.file ?? null; // the original file, it passed for the newly uploaded attachment to compress it\n\n // the original compressed image base64, it passed when the attachment was already compressed and we need to compress thumbs only\n // we pass it in order to prevent re-compressing the original image when we need to compress thumbs only\n const base64Compressed = attachmentData?.base64Compressed ?? null; \n const base64WebpCompressed = attachmentData?.base64WebpCompressed ?? null; // the original compressed webp image base64\n\n // When the image is served from a cross-origin CDN (e.g. WP Offload Media → GCS/S3),\n // the worker's fetch() call would be blocked by CORS. We compute a same-origin proxy\n // URL and pass it alongside the original URL. The worker fetches from fetchUrl; the\n // original url is kept so PHP can still determine the correct filename.\n const fetchUrl = !file && this._isCrossOrigin(url) && attachmentID\n ? this._buildProxyUrl(attachmentID, 'original')\n : undefined;\n const workerSizes = this._proxySizes(sizes, attachmentID);\n\n const worker = new Worker(new URL(/* worker import */ __webpack_require__.p + __webpack_require__.u(\"assets_js_worker_js\"), __webpack_require__.b), {type: undefined}); // worker url\n const channel = new MessageChannel();\n worker.postMessage({\n action: 'compress',\n format,\n url,\n fetchUrl,\n name,\n sourceType,\n outputType,\n mime,\n sizes: workerSizes,\n skipFull,\n timeout,\n isPreview,\n file,\n base64Compressed,\n base64WebpCompressed,\n type,\n options: this.options,\n //urlOriginal: urlOriginal,\n }, [channel.port2]);\n\n // Listen for compression requests from the worker via port1\n channel.port1.onmessage = async (ev) => {\n //console.log(\"Worker received compression request:\", ev.data);\n const { id, action, fileOrArrayBuffer, mime, options } = ev.data;\n if (action !== 'imageCompression') return;\n\n try {\n // Accept ArrayBuffer or Blob\n const blob = (fileOrArrayBuffer instanceof ArrayBuffer)\n ? new Blob([this.toUint8Array(fileOrArrayBuffer)], { type: mime })\n : fileOrArrayBuffer;\n\n const compressedBlob = await (0,browser_image_compression__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(blob, { useWebWorker: true, ...(options || {}) });\n\n // quick checks\n //console.log('compressedBlob.type, size:', compressedBlob.type, compressedBlob.size);\n // normalize final binary\n const compressedArrayBuffer = await compressedBlob.arrayBuffer();\n\n // Reply with the compressed ArrayBuffer (transfer to avoid copy)\n channel.port1.postMessage({ id, ok: true, arrayBuffer: compressedArrayBuffer }, [compressedArrayBuffer]);\n } catch (err) {\n channel.port1.postMessage({ id, ok: false, error: err.message || String(err) });\n }\n }\n\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n worker.terminate();\n console.warn('Worker compress terminated', name, sourceType, outputType);\n reject(sprintf('😩 ' + __('Request timed out. Try to increase the timeout limit on the Squeeze <a target=\"_blank\" href=\"%s\">settings page</a>.', 'squeeze'), `${this.settingsPageUrl}#:~:text=Squeeze%20timeout`));\n }, timeout);\n\n worker.onmessage = (event) => {\n clearTimeout(timeoutId);\n if (event.data.error) {\n reject(event.data.error);\n } else {\n resolve(event.data);\n }\n worker.terminate();\n };\n\n worker.onerror = (error) => {\n clearTimeout(timeoutId);\n reject(`Worker error: ${error.message}`);\n };\n });\n\n }\n\n handleUpload = async ({ attachment, base64, type = 'uncompressed', mediaIDs = [] }) => {\n\n const attachmentData = attachment.attributes;\n const url = attachmentData?.originalImageURL ?? attachmentData.url;\n const mime = attachmentData.mime;\n const filename = attachmentData?.originalImageName ?? attachmentData.filename;\n const attachmentID = attachmentData.id;\n const format = base64?.isDirectWebp ? 'webp' : mime.split(\"/\")[1];\n const sizes = attachmentData.sizes;\n\n const isDirectWebp = base64?.isDirectWebp && mime !== 'image/webp';\n const isBackupOriginal = this.options?.backup_original ?? false; // check if backup original is enabled\n let originalFile = attachmentData?.originalFile ?? null; // the original file, used for creating backup\n \n // if originalFile is not provided, try to get it from the URL\n // used when the attachment needs to be converted to webp from jpg or png\n if (!originalFile && type !== 'path' && isBackupOriginal && isDirectWebp) {\n // Use proxy URL when the image is served from a cross-origin CDN (e.g. WP Offload Media).\n const fetchUrlForOriginal = this._isCrossOrigin(url) && attachmentID\n ? this._buildProxyUrl(attachmentID, 'original')\n : url;\n const file = await (0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.getFileFromUrl)(fetchUrlForOriginal, filename, mime.split(\"/\")[1])\n //console.log('conveting original file to webp', file);\n originalFile = await this.convertFileToWebp(file);\n }\n //console.log('handleUpload attachmentData', attachmentData)\n\n const data = {\n action: 'squeeze_update_attachment',\n _ajax_nonce: this.nonce,\n filename: filename,\n type: 'image',\n format: format,\n base64: base64.base64,\n base64Sizes: base64.base64Sizes,\n base64Webp: base64.base64Webp,\n base64SizesWebp: base64.base64SizesWebp,\n \n attachmentID: attachmentID,\n url: url,\n process: type,\n originalFile: originalFile,\n }\n\n const formData = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.objectToFormData)(data);\n\n //console.log('squeeze_update_attachment', JSON.stringify(data, null, 2));\n\n try {\n const uploadResponse = await jQuery.ajax({\n url: this.ajaxUrl, // + '111',\n type: 'POST',\n data: formData,\n processData: false, // very important!\n contentType: false, // very important!\n });\n\n //if (uploadResponse.success) {\n uploadResponse['mediaIDs'] = mediaIDs;\n //}\n\n if (!uploadResponse?.data?.url) {\n uploadResponse.url = url; // fallback to original URL if not provided\n }\n\n //console.log('uploadResponse', JSON.stringify(uploadResponse, null, 2));\n\n return uploadResponse;\n \n } catch (error) {\n // jQuery.ajax rejects with a jqXHR object on HTTP errors, not a plain Error.\n // Extract a human-readable message so callers never receive [object Object].\n let errorMessage;\n if (error && typeof error === 'object' && typeof error.status === 'number') {\n if (error.status === 413) {\n errorMessage = __('The compressed image payload is too large for the server to accept (HTTP 413). Please ask your host to raise the post_max_size PHP setting and, for nginx, the client_max_body_size directive.', 'squeeze');\n } else {\n errorMessage = sprintf(\n /* translators: 1: HTTP status code, 2: HTTP status text */\n __('Upload failed with HTTP %1$d: %2$s', 'squeeze'),\n error.status,\n error.statusText ?? ''\n );\n }\n } else {\n errorMessage = error?.message ?? String(error);\n }\n\n return {\n 'mediaIDs': mediaIDs,\n 'data': errorMessage,\n 'success': false\n };\n }\n\n }\n\n handleBulkUpload = async (type = 'uncompressed', mediaIDs = []) => {\n let currentID;\n let attachment;\n\n switch (type) {\n case 'all':\n case 'uncompressed':\n currentID = mediaIDs[0];\n break;\n case 'path':\n currentID = mediaIDs[0]?.filename;\n break;\n default:\n currentID = 0;\n break;\n }\n\n if (type === 'path') {\n\n \n\n attachment = {\n attributes: {\n url: mediaIDs[0].url,\n mime: mediaIDs[0].mime,\n name: mediaIDs[0].name,\n filename: mediaIDs[0].filename,\n id: mediaIDs[0].id,\n sizes: mediaIDs[0]?.sizes,\n }\n }\n\n } else {\n\n const attachmentResponse = await this.getAttachment(currentID); \n if (attachmentResponse.success === false) {\n if (Array.isArray(mediaIDs)) mediaIDs.shift();\n return {\n 'mediaIDs': mediaIDs,\n 'data': attachmentResponse.data\n }\n }\n const attachmentData = attachmentResponse.data;\n attachment = {\n attributes: {\n url: attachmentData.url,\n mime: attachmentData.mime,\n name: attachmentData.name,\n filename: attachmentData.filename,\n id: attachmentData.id,\n sizes: attachmentData.sizes,\n }\n }\n\n }\n\n if (Array.isArray(mediaIDs)) mediaIDs.shift();\n\n const mediaType = attachment.attributes.mime.split(\"/\")[0];\n const mediaSubType = attachment.attributes.mime.split(\"/\")[1];\n\n if (!(0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeCompressAttachment)(mediaType, mediaSubType)) {\n return {\n 'mediaIDs': mediaIDs,\n 'data': __('Skipped: the image is broken or its format is not supported or excluded from squeezing.', 'squeeze')\n }\n }\n\n try {\n const compressData = await this.handleCompress( attachment, type );\n const uploadData = await this.handleUpload({ attachment: attachment, base64: compressData, type: type, mediaIDs: mediaIDs })\n\n return uploadData;\n\n } catch (error) {\n return {\n 'mediaIDs': mediaIDs,\n 'data': error?.message ?? error,\n 'success': false\n }\n }\n\n }\n\n \n\n handleRestore = async (attachmentID) => {\n const data = {\n action: 'squeeze_restore_attachment',\n _ajax_nonce: this.nonce,\n attachmentID: attachmentID,\n };\n\n const response = await jQuery.ajax({\n url: this.ajaxUrl,\n type: 'POST',\n data: data,\n });\n\n return response;\n };\n\n // Get list of attachments by path\n getAttachmentsByPath = async (path) => {\n\n const data = {\n action: 'squeeze_get_attachment_by_path',\n path: path,\n _ajax_nonce: this.nonce,\n }\n\n const response = jQuery.ajax({\n url: this.ajaxUrl,\n type: 'POST',\n data: data,\n });\n\n return response;\n }\n\n getAttachment = async (attachmentID) => {\n const data = {\n action: 'squeeze_get_attachment',\n _ajax_nonce: this.nonce,\n attachmentID: attachmentID,\n }\n\n const response = jQuery.ajax({\n url: this.ajaxUrl,\n type: 'POST',\n data: data,\n });\n\n return response;\n }\n\n getNextAttachments = async (page = 1, type = 'uncompressed', lastId = 0) => {\n const data = {\n action: 'squeeze_get_next_attachments',\n _ajax_nonce: this.nonce,\n page: page,\n type: type,\n lastId: lastId,\n }\n\n const response = jQuery.ajax({\n url: this.ajaxUrl,\n type: 'POST',\n data: data,\n });\n\n return response;\n }\n\n getDirectories = async (parentDir = false) => {\n const data = {\n action: 'squeeze_get_directories',\n _ajax_nonce: this.nonce,\n }\n\n if (parentDir) {\n data['parentDir'] = parentDir;\n }\n\n const response = jQuery.ajax({\n url: this.ajaxUrl,\n type: 'POST',\n data: data,\n });\n\n return response;\n }\n\n \n\n setOptions = async (options) => {\n const data = {\n action: 'squeeze_set_options',\n _ajax_nonce: this.nonce,\n options: options,\n }\n\n const response = jQuery.ajax({\n url: this.ajaxUrl,\n type: 'POST',\n data: data,\n });\n\n return response;\n }\n\n /**\n * Compresses an image before upload.\n * If the compressSizes parameter is provided, it will compress the sizes specified along with the original image.\n * \n * @param {File} file - The file to be compressed\n * @param {object} compressSizes - Optional sizes for compression\n * @returns {Promise<object|boolean>} - Returns a Promise that resolves to the compressed file as a base64 object or false if the file is invalid\n */\n compressBeforeUpload = async (file, compressSizes = null) => {\n if (!(file instanceof Blob) && !(file instanceof File) && (file.constructor.name !== 'File')) {\n console.error('Invalid file type:', file);\n return false; // Return false if the file is not a Blob or File\n }\n\n const attachment = {\n attributes: {\n url: null,\n mime: file.type,\n name: file.name,\n filename: file.name,\n id: 0,\n sizes: compressSizes,\n file: file,\n skipFull: false,\n }\n }\n\n try {\n const base64Obj = await this.handleCompress(attachment);\n\n return base64Obj; // Return the compressed file as base64Obj\n } catch (error) {\n console.error(error);\n return error; // Return the error for further handling\n }\n }\n\n isWebpEncodingSupported = async () => {\n try {\n const canvas = document.createElement('canvas');\n if (!canvas.toDataURL) return false;\n const data = canvas.toDataURL('image/webp');\n // WebP signature starts with \"data:image/webp\"\n return data.indexOf('data:image/webp') === 0;\n } catch (e) {\n return false;\n }\n }\n\n handleConvertFileToWebp = async (args) => {\n const timeout = this.timeout;\n \n const { file, sourceType, name } = args;\n const fileBuffer = await file.arrayBuffer();\n const mime = sourceType === 'png' ? 'image/png' : 'image/jpeg';\n const inputBlob = new Blob([fileBuffer], { type: mime });\n // compression options you can tune\n const imageCompressionOptions = {\n useWebWorker: true,\n fileType: 'image/webp',\n };\n\n return new Promise(async (resolve, reject) => {\n const timeoutId = setTimeout(() => {\n console.warn('Worker convertToWebp terminated', name);\n reject(new Error(sprintf('😩 ' + __('Request timed out. Try to increase the timeout limit on the Squeeze <a target=\"_blank\" href=\"%s\">settings page</a>.', 'squeeze'), `${this.settingsPageUrl}#:~:text=Squeeze%20timeout`)));\n }, timeout);\n\n try {\n\n const compressedBlob = await (0,browser_image_compression__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(inputBlob, imageCompressionOptions);\n\n // quick checks\n //console.log('compressedBlob.type, size:', compressedBlob.type, compressedBlob.size);\n // normalize final binary\n const webpArrayBuffer = await compressedBlob.arrayBuffer();\n\n const webpName = name.replace(/\\.\\w+$/, '.webp');\n const webpFile = new File([webpArrayBuffer], webpName, { type: 'image/webp', lastModified: Date.now() });\n\n clearTimeout(timeoutId);\n resolve({ webpFile }); // must return object with webpFile prop\n } catch (error) {\n clearTimeout(timeoutId);\n console.error('Error during image processing:', error);\n reject(error);\n }\n });\n \n }\n\n // helper: normalize buffer-like inputs to Uint8Array\n toUint8Array = (bufferLike) => {\n if (bufferLike instanceof Uint8Array) return bufferLike;\n if (bufferLike instanceof ArrayBuffer) return new Uint8Array(bufferLike);\n if (ArrayBuffer.isView(bufferLike)) return new Uint8Array(bufferLike.buffer, bufferLike.byteOffset, bufferLike.byteLength);\n // Node Buffer (in some environments) has .buffer and .byteOffset\n if (bufferLike && typeof bufferLike === 'object' && bufferLike.buffer) {\n return new Uint8Array(bufferLike.buffer, bufferLike.byteOffset || 0, bufferLike.byteLength || bufferLike.length);\n }\n throw new Error('Unsupported buffer type: ' + Object.prototype.toString.call(bufferLike));\n }\n\n /**\n * Convert an image File to WebP.\n *\n * @param {File} inputFile — the original image File (e.g. JPEG, PNG).\n * @returns {Promise<File>} — a Promise that resolves to a WebP File.\n */\n convertFileToWebp = async (inputFile) => {\n // Ensure it’s an image\n if (!inputFile.type.startsWith('image/')) {\n throw new Error('Input must be an image File');\n }\n if (this.isCanvasExtractionBlocked()) {\n console.warn('Canvas extraction is blocked');\n // Handle the case where canvas extraction is blocked\n alert(__('Image conversion blocked by browser privacy setting', 'squeeze'));\n throw new Error('Canvas extraction is blocked');\n } else {\n console.log('Canvas extraction is allowed');\n }\n const args = {\n file: inputFile,\n sourceType: inputFile.type.split('/')[1], // e.g. 'jpeg', 'png'\n name: inputFile.name,\n }\n const webpSupported = await this.isWebpEncodingSupported();\n try {\n // Convert the image to WebP\n let webpData;\n if (webpSupported) {\n //console.log('WebP decoding is supported');\n webpData = await this.handleConvertFileToWebp(args);\n } else {\n console.warn('WebP encoding not supported on this device. Using original format instead.');\n const webpName = args.name.replace(/\\.\\w+$/, '.webp');\n webpData = await this.convertToWebpWithJsquash(inputFile, webpName);\n }\n if (!webpData || !webpData.webpFile) {\n throw new Error('Failed to convert image to WebP');\n }\n\n return webpData.webpFile; // Return the WebP File\n\n } catch (error) {\n console.error('Error converting image to WebP:', error);\n throw error; // Re-throw the error for further handling\n }\n\n }\n\n /**\n * Convert an input (File | Blob | ArrayBuffer | Uint8Array) to a WebP File using @jsquash/webp.\n * @param {File|Blob|ArrayBuffer|Uint8Array} input\n * @param {string} outputName - desired filename for the .webp output\n * @param {{quality?: number, lossless?: boolean, method?: number}} [opts] - encoder options (quality 0-100)\n * @returns {Promise<File>} - WebP File\n */\n convertToWebpWithJsquash = async (input, outputName = 'out.webp', opts = { quality: 100 }) => {\n // Normalize input to Blob\n let blob;\n if (input instanceof Blob) {\n blob = input;\n } else if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) {\n blob = new Blob([input]);\n } else {\n throw new Error('Unsupported input type. Provide File, Blob, ArrayBuffer or TypedArray.');\n }\n\n // Load image into <img>\n const dataURL = await new Promise((resolve, reject) => {\n const fr = new FileReader();\n fr.onload = () => resolve(fr.result);\n fr.onerror = reject;\n fr.readAsDataURL(blob);\n });\n\n const img = await new Promise((resolve, reject) => {\n const i = new Image();\n i.onload = () => resolve(i);\n i.onerror = () => reject(new Error('Failed to load image for conversion'));\n i.src = dataURL;\n // avoid cross-origin taint if data-url is used\n });\n\n // Draw to canvas and extract ImageData\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth || img.width;\n canvas.height = img.naturalHeight || img.height;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0);\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n\n // encode -> returns ArrayBuffer (WASM libwebp)\n // opts example: { quality: 75, lossless: false, method: 4 }\n const webpArrayBuffer = await (0,_jsquash_webp__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(imageData, opts);\n\n // Validate a little (size)\n if (!webpArrayBuffer || webpArrayBuffer.byteLength < 20) {\n throw new Error('jsquash produced an invalid WebP buffer');\n }\n\n // Wrap into File\n const webpFile = new File([webpArrayBuffer], outputName.replace(/\\.\\w+$/, '.webp'), {\n type: 'image/webp',\n lastModified: Date.now(),\n });\n\n return {webpFile};\n }\n\n isCanvasExtractionBlocked = () => {\n try {\n const c = document.createElement('canvas');\n c.width = 2;\n c.height = 2;\n const ctx = c.getContext('2d');\n if (!ctx) return false; // no ctx => treat as not-blocked here (or handle separately)\n\n // draw four known opaque pixels (no alpha surprise)\n ctx.fillStyle = 'rgb(255,0,0)'; // top-left\n ctx.fillRect(0, 0, 1, 1);\n\n ctx.fillStyle = 'rgb(0,255,0)'; // top-right\n ctx.fillRect(1, 0, 1, 1);\n\n ctx.fillStyle = 'rgb(0,0,255)'; // bottom-left\n ctx.fillRect(0, 1, 1, 1);\n\n ctx.fillStyle = 'rgb(1,2,3)'; // bottom-right (small values detect naive normalization)\n ctx.fillRect(1, 1, 1, 1);\n\n let data;\n try {\n data = ctx.getImageData(0, 0, 2, 2).data; // Uint8ClampedArray length 16 (4*2*2)\n } catch (err) {\n // thrown security/blocked error (Firefox/resistFingerprinting sometimes throws)\n if (err && (err.name === 'SecurityError' || /blocked/i.test(err.message))) return true;\n // other errors: be conservative and return false\n return false;\n }\n\n // Expected RGBA order for pixels (top-left, top-right, bottom-left, bottom-right)\n const expected = new Uint8ClampedArray([\n 255, 0, 0, 255, // top-left\n 0, 255, 0, 255, // top-right\n 0, 0, 255, 255, // bottom-left\n 1, 2, 3, 255 // bottom-right\n ]);\n\n // Compare each channel exactly. If ANY mismatch — canvas data was altered.\n for (let i = 0; i < expected.length; i++) {\n if (data[i] !== expected[i]) {\n // mismatch -> either fingerprint-protection normalized the canvas OR something else tainted it\n return true;\n }\n }\n\n // No thrown error and pixels match exactly => extraction works\n return false;\n } catch (e) {\n // If something unexpected goes wrong, assume not blocked so caller can handle fallback.\n return false;\n }\n }\n\n\n}\n\n//# sourceURL=webpack:///./assets/js/squeeze.js?");
50
51 /***/ }),
52
53 /***/ "./assets/js/voxel-upload-compat.js":
54 /*!******************************************!*\
55 !*** ./assets/js/voxel-upload-compat.js ***!
56 \******************************************/
57 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
58
59 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"initVoxelUploadCompat\": () => (/* binding */ initVoxelUploadCompat)\n/* harmony export */ });\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n\r\n\r\n\r\n\r\n/** One successful patch per JS realm (per window / iframe). */\r\nconst PATCHED_KEY = \"__squeezeVoxelCompatPatched\";\r\n\r\nconst LOG_PREFIX = \"[Squeeze · Voxel]\";\r\n\r\nfunction vxLog(...args) {\r\n\tconsole.info(LOG_PREFIX, ...args);\r\n}\r\n\r\nfunction vxWarn(...args) {\r\n\tconsole.warn(LOG_PREFIX, ...args);\r\n}\r\n\r\n/**\r\n * FormData from another window fails `instanceof FormData` in this window.\r\n *\r\n * @param {unknown} body\r\n * @returns {body is FormData}\r\n */\r\nfunction isFormDataLike(body) {\r\n\tif (body == null || typeof body !== \"object\") {\r\n\t\treturn false;\r\n\t}\r\n\tif (typeof FormData !== \"undefined\" && body instanceof FormData) {\r\n\t\treturn true;\r\n\t}\r\n\tconst o = /** @type {{ append?: unknown; entries?: unknown; delete?: unknown }} */ (body);\r\n\treturn (\r\n\t\ttypeof o.append === \"function\" &&\r\n\t\ttypeof o.entries === \"function\" &&\r\n\t\ttypeof o.delete === \"function\"\r\n\t);\r\n}\r\n\r\n/**\r\n * jQuery / some stacks pass a URL object to xhr.open(); we must not treat that as \"\".\r\n *\r\n * @param {unknown} url\r\n * @returns {string}\r\n */\r\nfunction normalizeOpenUrl(url) {\r\n\tif (typeof url === \"string\") {\r\n\t\treturn url;\r\n\t}\r\n\tif (url && typeof url === \"object\" && \"href\" in url) {\r\n\t\treturn String(/** @type {{ href: string }} */ (url).href);\r\n\t}\r\n\treturn String(url ?? \"\");\r\n}\r\n\r\n/**\r\n * URLs where Voxel may POST multipart `files[field][]` (create / edit post with uploads).\r\n * Do not match generic admin-ajax.php (heartbeat, etc.) — that only adds noise and work.\r\n *\r\n * @param {string} url\r\n * @returns {boolean}\r\n */\r\nfunction looksLikeVoxelMultipartTarget(url) {\r\n\tconst s = String(url || \"\");\r\n\tif (!s) {\r\n\t\treturn false;\r\n\t}\r\n\t// Primary Voxel front-end AJAX: …?vx=1&action=…\r\n\tif (/[?&]vx=1(?:&|$)/.test(s)) {\r\n\t\treturn true;\r\n\t}\r\n\ttry {\r\n\t\tif (new URL(s, window.location.href).searchParams.get(\"vx\") === \"1\") {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t} catch (e) {\r\n\t\t/* ignore */\r\n\t}\r\n\t// Rare: create_post via admin-ajax with multipart (not the usual Voxel ?vx=1 endpoint)\r\n\tif (s.includes(\"admin-ajax.php\") && /[?&]action=create_post/.test(s)) {\r\n\t\treturn true;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n/**\r\n * @param {FormData | { entries: () => IterableIterator<[string, FormDataEntryValue]> }} formData\r\n * @returns {Array<[string, FormDataEntryValue]>}\r\n */\r\nfunction snapshotFormDataEntries(formData) {\r\n\treturn [...formData.entries()];\r\n}\r\n\r\n/**\r\n * True for File/Blob-like values that look like images (cross-realm safe).\r\n *\r\n * @param {unknown} v\r\n * @returns {boolean}\r\n */\r\nfunction isImageFileLike(v) {\r\n\tif (v == null || typeof v !== \"object\") {\r\n\t\treturn false;\r\n\t}\r\n\tconst any = /** @type {{ name?: string; type?: string; size?: number }} */ (v);\r\n\tif (typeof any.size !== \"number\") {\r\n\t\treturn false;\r\n\t}\r\n\tconst type = typeof any.type === \"string\" ? any.type : \"\";\r\n\tif (type.startsWith(\"image/\")) {\r\n\t\treturn true;\r\n\t}\r\n\tif (type === \"\" && typeof any.name === \"string\" && /\\.(jpe?g|png|gif|webp|avif)$/i.test(any.name)) {\r\n\t\treturn true;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\n/**\r\n * @param {File | Blob} v\r\n * @param {string} key FormData key (for fallback filename)\r\n * @returns {File}\r\n */\r\nfunction ensureFileForCompression(v, key) {\r\n\tif (typeof File !== \"undefined\" && v instanceof File) {\r\n\t\treturn v;\r\n\t}\r\n\tconst name =\r\n\t\t(\"name\" in v && typeof /** @type {File} */ (v).name === \"string\" && /** @type {File} */ (v).name)\r\n\t\t\t? /** @type {File} */ (v).name\r\n\t\t\t: `upload-${key.replace(/[^\\w.-]+/g, \"_\")}.jpg`;\r\n\tconst type = v.type && v.type.length ? v.type : \"image/jpeg\";\r\n\treturn new File([v], name, { type });\r\n}\r\n\r\n/**\r\n * @param {Array<[string, FormDataEntryValue]>} entries\r\n */\r\nfunction formDataHasVoxelImageFiles(entries) {\r\n\treturn entries.some(([k, v]) => /^files\\[/i.test(k) && isImageFileLike(v));\r\n}\r\n\r\n/**\r\n * Compress a single image file when Squeeze on-upload rules allow it.\r\n *\r\n * @param {File} fileValue\r\n * @param {string} key FormData key or diagnostic label\r\n * @param {Record<string, unknown>} compressOptions\r\n * @param {object} squeeze window.Squeeze\r\n * @returns {Promise<{ out: File; metaSignal: boolean }>}\r\n */\r\nasync function compressOneVoxelImageIfNeeded(fileValue, key, compressOptions, squeeze) {\r\n\tconst { type, subtype } = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.parseMimeType)(fileValue);\r\n\tif (!(0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeCompressAttachment)(type, subtype, compressOptions)) {\r\n\t\tvxLog(\"file skipped (format/settings):\", fileValue.name, fileValue.type);\r\n\t\treturn { out: fileValue, metaSignal: false };\r\n\t}\r\n\r\n\tif (typeof squeeze.isExcludedByName === \"function\") {\r\n\t\ttry {\r\n\t\t\tif (await squeeze.isExcludedByName(fileValue.name)) {\r\n\t\t\t\tvxLog(\"file skipped (exclusion list):\", fileValue.name);\r\n\t\t\t\treturn { out: fileValue, metaSignal: false };\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tvxWarn(\"exclude check failed; continuing with compression:\", fileValue.name, e);\r\n\t\t}\r\n\t}\r\n\r\n\tconst inBytes = fileValue.size;\r\n\ttry {\r\n\t\tvxLog(\"compressing:\", fileValue.name, `(${inBytes} B in)`);\r\n\t\tconst t0 = performance.now();\r\n\t\tconst base64Obj = await squeeze.compressBeforeUpload(fileValue);\r\n\t\tif (!base64Obj?.base64) {\r\n\t\t\tvxWarn(\"compress returned no data; using original:\", fileValue.name);\r\n\t\t\treturn { out: fileValue, metaSignal: false };\r\n\t\t}\r\n\t\tconst outFile = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.base64ToFile)(base64Obj.base64, fileValue.name, fileValue.type);\r\n\t\tconst ms = Math.round(performance.now() - t0);\r\n\t\tif (outFile.size > inBytes) {\r\n\t\t\tvxLog(\"compressed larger than original; using original:\", fileValue.name, `(${inBytes} B vs ${outFile.size} B in ${ms} ms)`);\r\n\t\t\treturn { out: fileValue, metaSignal: false };\r\n\t\t}\r\n\t\tvxLog(\"compressed:\", fileValue.name, `(${inBytes} B → ${outFile.size} B in ${ms} ms)`);\r\n\t\treturn { out: outFile, metaSignal: true };\r\n\t} catch (e) {\r\n\t\tvxWarn(\"compress failed; using original:\", fileValue.name, e);\r\n\t\treturn { out: fileValue, metaSignal: false };\r\n\t}\r\n}\r\n\r\n/**\r\n * Append signed markers so PHP can set squeeze_is_compressed on new attachments (Voxel bypasses wp AJAX squeeze).\r\n *\r\n * @param {FormData} newFd\r\n * @param {boolean} metaSignal\r\n * @param {object | null} squeeze\r\n */\r\nfunction appendVoxelClientCompressedMarkers(newFd, metaSignal, squeeze) {\r\n\tif (!metaSignal || !squeeze?.nonce) {\r\n\t\treturn;\r\n\t}\r\n\tnewFd.append(\"_squeeze_voxel_client\", \"1\");\r\n\tnewFd.append(\"_squeeze_voxel_nonce\", String(squeeze.nonce));\r\n}\r\n\r\nfunction logFormDataDiag(reqUrl, entries) {\r\n\tconst rows = entries.map(([k, v]) => {\r\n\t\tif (v == null) {\r\n\t\t\treturn { key: k, kind: \"null\" };\r\n\t\t}\r\n\t\tif (typeof v === \"string\") {\r\n\t\t\treturn { key: k, kind: \"string\", len: v.length };\r\n\t\t}\r\n\t\tif (typeof File !== \"undefined\" && v instanceof File) {\r\n\t\t\treturn { key: k, kind: \"File\", name: v.name, type: v.type, size: v.size };\r\n\t\t}\r\n\t\tif (typeof Blob !== \"undefined\" && v instanceof Blob) {\r\n\t\t\treturn { key: k, kind: \"Blob\", type: v.type, size: v.size };\r\n\t\t}\r\n\t\treturn { key: k, kind: typeof v };\r\n\t});\r\n\tvxLog(\"FormData POST (diagnostic — no image entries under files[…] matched for squeeze)\", {\r\n\t\turl: reqUrl,\r\n\t\tentries: rows,\r\n\t});\r\n}\r\n\r\n/**\r\n * Observe jQuery AJAX (same path Voxel create-post uses) — helps if XHR prototype behaves unexpectedly.\r\n *\r\n * @param {typeof looksLikeVoxelMultipartTarget} urlTest\r\n */\r\nfunction installJQueryVoxelProbe(urlTest) {\r\n\tconst $ = window.jQuery;\r\n\tif (!$ || /** @type {{ __squeezeVoxelAjaxProbe?: boolean }} */ ($).__squeezeVoxelAjaxProbe) {\r\n\t\treturn;\r\n\t}\r\n\t/** @type {{ __squeezeVoxelAjaxProbe?: boolean }} */ ($).__squeezeVoxelAjaxProbe = true;\r\n\r\n\t$(document).ajaxSend((_event, _jqXHR, settings) => {\r\n\t\tconst u = String(settings.url || \"\");\r\n\t\tif (!urlTest(u)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst d = settings.data;\r\n\t\tconst formLike = isFormDataLike(d);\r\n\t\tvxLog(\"jQuery ajaxSend (Voxel multipart)\", {\r\n\t\t\turl: u,\r\n\t\t\tdataIsFormDataLike: formLike,\r\n\t\t\tdataType: d == null ? \"null\" : typeof d,\r\n\t\t\tconstructor: d && d.constructor && d.constructor.name,\r\n\t\t});\r\n\t\tif (formLike) {\r\n\t\t\ttry {\r\n\t\t\t\tconst snap = snapshotFormDataEntries(/** @type {FormData} */ (d));\r\n\t\t\t\tvxLog(\"jQuery FormData snapshot\", snap.map(([k, v]) => ({\r\n\t\t\t\t\tkey: k,\r\n\t\t\t\t\tkind: v instanceof File ? \"File\" : v instanceof Blob ? \"Blob\" : typeof v,\r\n\t\t\t\t\tname: v && /** @type {File} */ (v).name,\r\n\t\t\t\t\ttype: v && /** @type {Blob} */ (v).type,\r\n\t\t\t\t\tsize: v && /** @type {Blob} */ (v).size,\r\n\t\t\t\t})));\r\n\t\t\t} catch (e) {\r\n\t\t\t\tvxWarn(\"jQuery FormData snapshot failed\", e);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\tvxLog(\"jQuery ajaxSend probe installed (Voxel multipart URLs only).\");\r\n}\r\n\r\n/**\r\n * Voxel file/gallery fields POST multipart FormData (files[field_key][]) to the Voxel AJAX URL,\r\n * bypassing wp.Uploader. Mirror Squeeze \"on upload\" behaviour by compressing image Files\r\n * before the request body is sent.\r\n *\r\n * @param {Record<string, unknown>} compressOptions Parsed squeezeOptions.options\r\n */\r\nfunction initVoxelUploadCompat(compressOptions) {\r\n\tif (typeof window === \"undefined\") {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst protoEarly = window.XMLHttpRequest?.prototype;\r\n\tif (protoEarly && /** @type {{ [k: string]: boolean }} */ (protoEarly)[PATCHED_KEY]) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (typeof Voxel_Config === \"undefined\") {\r\n\t\tvxLog(\"compat skipped: Voxel_Config is undefined (not a Voxel page or config not printed yet).\");\r\n\t\treturn;\r\n\t}\r\n\tif (!compressOptions?.auto_compress) {\r\n\t\tvxLog(\"compat skipped: Squeeze on upload (auto_compress) is off in settings.\");\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst XHR = window.XMLHttpRequest;\r\n\tconst proto = XHR && XHR.prototype;\r\n\tif (!proto) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst ajaxUrl = Voxel_Config.ajax_url || \"\";\r\n\tvxLog(\"init\", { auto_compress: !!compressOptions.auto_compress, voxel_ajax_url: ajaxUrl });\r\n\r\n\tconst origOpen = proto.open;\r\n\tconst origSend = proto.send;\r\n\r\n\t/** @type {{ [k: string]: boolean }} */ (proto)[PATCHED_KEY] = true;\r\n\r\n\tproto.open = function (method, url, ...rest) {\r\n\t\tthis.__squeezeRequestUrl = normalizeOpenUrl(url);\r\n\t\treturn origOpen.call(this, method, url, ...rest);\r\n\t};\r\n\r\n\tproto.send = function (body) {\r\n\t\tconst xhr = this;\r\n\t\tconst reqUrl = xhr.__squeezeRequestUrl || \"\";\r\n\r\n\t\tif (!isFormDataLike(body)) {\r\n\t\t\treturn origSend.call(xhr, body);\r\n\t\t}\r\n\r\n\t\tif (!looksLikeVoxelMultipartTarget(reqUrl)) {\r\n\t\t\treturn origSend.call(xhr, body);\r\n\t\t}\r\n\r\n\t\tconst squeeze = window.Squeeze;\r\n\t\tif (!squeeze || typeof squeeze.compressBeforeUpload !== \"function\") {\r\n\t\t\tvxWarn(\"XHR FormData-like body to Voxel AJAX but window.Squeeze.compressBeforeUpload missing; upload unchanged.\");\r\n\t\t\treturn origSend.call(xhr, body);\r\n\t\t}\r\n\r\n\t\tlet snapshot;\r\n\t\ttry {\r\n\t\t\tsnapshot = snapshotFormDataEntries(/** @type {FormData} */ (body));\r\n\t\t} catch (e) {\r\n\t\t\tvxWarn(\"FormData.entries() failed; upload unchanged.\", e);\r\n\t\t\treturn origSend.call(xhr, body);\r\n\t\t}\r\n\r\n\t\tif (!formDataHasVoxelImageFiles(snapshot)) {\r\n\t\t\tif (looksLikeVoxelMultipartTarget(reqUrl)) {\r\n\t\t\t\tlogFormDataDiag(reqUrl, snapshot);\r\n\t\t\t}\r\n\t\t\treturn origSend.call(xhr, body);\r\n\t\t}\r\n\r\n\t\tvxLog(\"XHR intercept: compressing image file(s) before upload.\", {\r\n\t\t\tmethod: \"POST\",\r\n\t\t\turl: reqUrl,\r\n\t\t\tfile_keys: snapshot\r\n\t\t\t\t.filter(([k, v]) => /^files\\[/i.test(k) && isImageFileLike(v))\r\n\t\t\t\t.map(([k, v]) => ({\r\n\t\t\t\t\tkey: k,\r\n\t\t\t\t\tname: \"name\" in v ? /** @type {File} */ (v).name : \"(blob)\",\r\n\t\t\t\t\ttype: /** @type {Blob} */ (v).type,\r\n\t\t\t\t\tsize: /** @type {Blob} */ (v).size,\r\n\t\t\t\t})),\r\n\t\t});\r\n\r\n\t\tvoid (async () => {\r\n\t\t\tconst t0 = performance.now();\r\n\t\t\ttry {\r\n\t\t\t\tconst newFd = await buildFormDataFromSnapshot(snapshot, compressOptions, squeeze);\r\n\t\t\t\tvxLog(\"XHR intercept: compression pass done in\", Math.round(performance.now() - t0), \"ms; sending request.\");\r\n\t\t\t\torigSend.call(xhr, newFd);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tvxWarn(\"XHR intercept failed; sending original FormData.\", e);\r\n\t\t\t\torigSend.call(xhr, body);\r\n\t\t\t}\r\n\t\t})();\r\n\t};\r\n\r\n\tvxLog(\"XMLHttpRequest.send hook installed (Voxel multipart: ?vx=1 or admin-ajax create_post).\");\r\n\r\n\tif (typeof window.fetch === \"function\") {\r\n\t\tconst origFetch = window.fetch.bind(window);\r\n\r\n\t\twindow.fetch = async function (input, init) {\r\n\t\t\tconst url =\r\n\t\t\t\ttypeof input === \"string\"\r\n\t\t\t\t\t? input\r\n\t\t\t\t\t: input instanceof Request\r\n\t\t\t\t\t\t? input.url\r\n\t\t\t\t\t\t: normalizeOpenUrl(input);\r\n\r\n\t\t\tconst rawBody = init?.body;\r\n\t\t\tconst body = isFormDataLike(rawBody) ? /** @type {FormData} */ (rawBody) : null;\r\n\t\t\tif (!body || !looksLikeVoxelMultipartTarget(url)) {\r\n\t\t\t\treturn origFetch(input, init);\r\n\t\t\t}\r\n\r\n\t\t\tconst squeeze = window.Squeeze;\r\n\t\t\tif (!squeeze || typeof squeeze.compressBeforeUpload !== \"function\") {\r\n\t\t\t\treturn origFetch(input, init);\r\n\t\t\t}\r\n\r\n\t\t\tlet snapshot;\r\n\t\t\ttry {\r\n\t\t\t\tsnapshot = snapshotFormDataEntries(body);\r\n\t\t\t} catch (e) {\r\n\t\t\t\treturn origFetch(input, init);\r\n\t\t\t}\r\n\r\n\t\t\tif (!formDataHasVoxelImageFiles(snapshot)) {\r\n\t\t\t\tif (looksLikeVoxelMultipartTarget(String(url))) {\r\n\t\t\t\t\tlogFormDataDiag(String(url), snapshot);\r\n\t\t\t\t}\r\n\t\t\t\treturn origFetch(input, init);\r\n\t\t\t}\r\n\r\n\t\t\tvxLog(\"fetch intercept: compressing image file(s) before upload.\", { url });\r\n\r\n\t\t\tconst t0 = performance.now();\r\n\t\t\ttry {\r\n\t\t\t\tconst newFd = await buildFormDataFromSnapshot(snapshot, compressOptions, squeeze);\r\n\t\t\t\tvxLog(\"fetch intercept: compression pass done in\", Math.round(performance.now() - t0), \"ms.\");\r\n\t\t\t\tconst nextInit = init ? { ...init, body: newFd } : { body: newFd };\r\n\t\t\t\treturn origFetch(input, nextInit);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tvxWarn(\"fetch intercept failed; using original body.\", e);\r\n\t\t\t\treturn origFetch(input, init);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvxLog(\"window.fetch hook installed for Voxel-style AJAX URLs.\");\r\n\t}\r\n\r\n\tscheduleJQueryProbe(looksLikeVoxelMultipartTarget);\r\n}\r\n\r\n/**\r\n * jQuery may register after Squeeze (script order); retry briefly.\r\n *\r\n * @param {typeof looksLikeVoxelMultipartTarget} urlTest\r\n */\r\nfunction scheduleJQueryProbe(urlTest) {\r\n\tif (window.jQuery) {\r\n\t\tinstallJQueryVoxelProbe(urlTest);\r\n\t\treturn;\r\n\t}\r\n\tlet tries = 0;\r\n\tconst id = window.setInterval(() => {\r\n\t\ttries += 1;\r\n\t\tif (window.jQuery) {\r\n\t\t\twindow.clearInterval(id);\r\n\t\t\tinstallJQueryVoxelProbe(urlTest);\r\n\t\t} else if (tries > 200) {\r\n\t\t\twindow.clearInterval(id);\r\n\t\t}\r\n\t}, 50);\r\n}\r\n\r\n/**\r\n * @param {Array<[string, FormDataEntryValue]>} entries\r\n * @param {Record<string, unknown>} compressOptions\r\n * @param {object} squeeze Squeeze instance (window.Squeeze)\r\n */\r\nasync function buildFormDataFromSnapshot(entries, compressOptions, squeeze) {\r\n\tconst newFd = new FormData();\r\n\tlet metaSignal = false;\r\n\r\n\tfor (const [key, value] of entries) {\r\n\t\tif (/^files\\[/i.test(key) && isImageFileLike(value)) {\r\n\t\t\tconst fileValue = ensureFileForCompression(/** @type {File | Blob} */ (value), key);\r\n\t\t\tconst { out, metaSignal: m } = await compressOneVoxelImageIfNeeded(fileValue, key, compressOptions, squeeze);\r\n\t\t\tif (m) {\r\n\t\t\t\tmetaSignal = true;\r\n\t\t\t}\r\n\t\t\tnewFd.append(key, out, out.name);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif (typeof File !== \"undefined\" && value instanceof File) {\r\n\t\t\tnewFd.append(key, value, value.name);\r\n\t\t} else if (typeof Blob !== \"undefined\" && value instanceof Blob) {\r\n\t\t\tnewFd.append(key, value);\r\n\t\t} else {\r\n\t\t\tnewFd.append(key, value);\r\n\t\t}\r\n\t}\r\n\r\n\tappendVoxelClientCompressedMarkers(newFd, metaSignal, squeeze);\r\n\treturn newFd;\r\n}\r\n\n\n//# sourceURL=webpack:///./assets/js/voxel-upload-compat.js?");
60
61 /***/ }),
62
63 /***/ "./node_modules/@jsquash/webp/encode.js":
64 /*!**********************************************!*\
65 !*** ./node_modules/@jsquash/webp/encode.js ***!
66 \**********************************************/
67 /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
68
69 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ encode),\n/* harmony export */ \"init\": () => (/* binding */ init)\n/* harmony export */ });\n/* harmony import */ var _meta_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./meta.js */ \"./node_modules/@jsquash/webp/meta.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ \"./node_modules/@jsquash/webp/utils.js\");\n/* harmony import */ var wasm_feature_detect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! wasm-feature-detect */ \"./node_modules/wasm-feature-detect/dist/esm/index.js\");\n/**\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\nlet emscriptenModule;\nasync function init(module, moduleOptionOverrides) {\n if (await (0,wasm_feature_detect__WEBPACK_IMPORTED_MODULE_0__.simd)()) {\n const webpEncoder = await __webpack_require__.e(/*! import() */ \"vendors-node_modules_jsquash_webp_codec_enc_webp_enc_simd_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./codec/enc/webp_enc_simd.js */ \"./node_modules/@jsquash/webp/codec/enc/webp_enc_simd.js\"));\n emscriptenModule = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.initEmscriptenModule)(webpEncoder.default, module, moduleOptionOverrides);\n return emscriptenModule;\n }\n const webpEncoder = await __webpack_require__.e(/*! import() */ \"vendors-node_modules_jsquash_webp_codec_enc_webp_enc_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./codec/enc/webp_enc.js */ \"./node_modules/@jsquash/webp/codec/enc/webp_enc.js\"));\n emscriptenModule = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.initEmscriptenModule)(webpEncoder.default, module, moduleOptionOverrides);\n return emscriptenModule;\n}\nasync function encode(data, options = {}) {\n if (!emscriptenModule)\n emscriptenModule = init();\n const _options = { ..._meta_js__WEBPACK_IMPORTED_MODULE_2__.defaultOptions, ...options };\n const module = await emscriptenModule;\n const result = module.encode(data.data, data.width, data.height, _options);\n if (!result)\n throw new Error('Encoding error.');\n return result.buffer;\n}\n\n\n//# sourceURL=webpack:///./node_modules/@jsquash/webp/encode.js?");
70
71 /***/ }),
72
73 /***/ "./node_modules/@jsquash/webp/meta.js":
74 /*!********************************************!*\
75 !*** ./node_modules/@jsquash/webp/meta.js ***!
76 \********************************************/
77 /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
78
79 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"defaultOptions\": () => (/* binding */ defaultOptions),\n/* harmony export */ \"extension\": () => (/* binding */ extension),\n/* harmony export */ \"label\": () => (/* binding */ label),\n/* harmony export */ \"mimeType\": () => (/* binding */ mimeType)\n/* harmony export */ });\nconst label = 'WebP';\nconst mimeType = 'image/webp';\nconst extension = 'webp';\n// These come from struct WebPConfig in encode.h.\nconst defaultOptions = {\n quality: 75,\n target_size: 0,\n target_PSNR: 0,\n method: 4,\n sns_strength: 50,\n filter_strength: 60,\n filter_sharpness: 0,\n filter_type: 1,\n partitions: 0,\n segments: 4,\n pass: 1,\n show_compressed: 0,\n preprocessing: 0,\n autofilter: 0,\n partition_limit: 0,\n alpha_compression: 1,\n alpha_filtering: 1,\n alpha_quality: 100,\n lossless: 0,\n exact: 0,\n image_hint: 0,\n emulate_jpeg_size: 0,\n thread_level: 0,\n low_memory: 0,\n near_lossless: 100,\n use_delta_palette: 0,\n use_sharp_yuv: 0,\n};\n\n\n//# sourceURL=webpack:///./node_modules/@jsquash/webp/meta.js?");
80
81 /***/ }),
82
83 /***/ "./node_modules/@jsquash/webp/utils.js":
84 /*!*********************************************!*\
85 !*** ./node_modules/@jsquash/webp/utils.js ***!
86 \*********************************************/
87 /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
88
89 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"initEmscriptenModule\": () => (/* binding */ initEmscriptenModule)\n/* harmony export */ });\n/**\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Notice: I (Jamie Sinclair) have modified this file to allow manual instantiation of the Wasm Module.\n */\nfunction initEmscriptenModule(moduleFactory, wasmModule, moduleOptionOverrides = {}) {\n let instantiateWasm;\n if (wasmModule) {\n instantiateWasm = (imports, callback) => {\n const instance = new WebAssembly.Instance(wasmModule, imports);\n callback(instance);\n return instance.exports;\n };\n }\n return moduleFactory({\n // Just to be safe, don't automatically invoke any wasm functions\n noInitialRun: true,\n instantiateWasm,\n ...moduleOptionOverrides,\n });\n}\n\n\n//# sourceURL=webpack:///./node_modules/@jsquash/webp/utils.js?");
90
91 /***/ }),
92
93 /***/ "./node_modules/browser-image-compression/dist/browser-image-compression.mjs":
94 /*!***********************************************************************************!*\
95 !*** ./node_modules/browser-image-compression/dist/browser-image-compression.mjs ***!
96 \***********************************************************************************/
97 /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
98
99 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ imageCompression)\n/* harmony export */ });\n/**\n * Browser Image Compression\n * v2.0.2\n * by Donald <donaldcwl@gmail.com>\n * https://github.com/Donaldcwl/browser-image-compression\n */\n\nfunction _mergeNamespaces(e,t){return t.forEach((function(t){t&&\"string\"!=typeof t&&!Array.isArray(t)&&Object.keys(t).forEach((function(r){if(\"default\"!==r&&!(r in e)){var i=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,i.get?i:{enumerable:!0,get:function(){return t[r]}})}}))})),Object.freeze(e)}function copyExifWithoutOrientation(e,t){return new Promise((function(r,i){let o;return getApp1Segment(e).then((function(e){try{return o=e,r(new Blob([t.slice(0,2),o,t.slice(2)],{type:\"image/jpeg\"}))}catch(e){return i(e)}}),i)}))}const getApp1Segment=e=>new Promise(((t,r)=>{const i=new FileReader;i.addEventListener(\"load\",(({target:{result:e}})=>{const i=new DataView(e);let o=0;if(65496!==i.getUint16(o))return r(\"not a valid JPEG\");for(o+=2;;){const a=i.getUint16(o);if(65498===a)break;const s=i.getUint16(o+2);if(65505===a&&1165519206===i.getUint32(o+4)){const a=o+10;let f;switch(i.getUint16(a)){case 18761:f=!0;break;case 19789:f=!1;break;default:return r(\"TIFF header contains invalid endian\")}if(42!==i.getUint16(a+2,f))return r(\"TIFF header contains invalid version\");const l=i.getUint32(a+4,f),c=a+l+2+12*i.getUint16(a+l,f);for(let e=a+l+2;e<c;e+=12){if(274==i.getUint16(e,f)){if(3!==i.getUint16(e+2,f))return r(\"Orientation data type is invalid\");if(1!==i.getUint32(e+4,f))return r(\"Orientation data count is invalid\");i.setUint16(e+8,1,f);break}}return t(e.slice(o,o+2+s))}o+=2+s}return t(new Blob)})),i.readAsArrayBuffer(e)}));var e={},t={get exports(){return e},set exports(t){e=t}};!function(e){var r,i,UZIP={};t.exports=UZIP,UZIP.parse=function(e,t){for(var r=UZIP.bin.readUshort,i=UZIP.bin.readUint,o=0,a={},s=new Uint8Array(e),f=s.length-4;101010256!=i(s,f);)f--;o=f;o+=4;var l=r(s,o+=4);r(s,o+=2);var c=i(s,o+=2),u=i(s,o+=4);o+=4,o=u;for(var h=0;h<l;h++){i(s,o),o+=4,o+=4,o+=4,i(s,o+=4);c=i(s,o+=4);var d=i(s,o+=4),A=r(s,o+=4),g=r(s,o+2),p=r(s,o+4);o+=6;var m=i(s,o+=8);o+=4,o+=A+g+p,UZIP._readLocal(s,m,a,c,d,t)}return a},UZIP._readLocal=function(e,t,r,i,o,a){var s=UZIP.bin.readUshort,f=UZIP.bin.readUint;f(e,t),s(e,t+=4),s(e,t+=2);var l=s(e,t+=2);f(e,t+=2),f(e,t+=4),t+=4;var c=s(e,t+=8),u=s(e,t+=2);t+=2;var h=UZIP.bin.readUTF8(e,t,c);if(t+=c,t+=u,a)r[h]={size:o,csize:i};else{var d=new Uint8Array(e.buffer,t);if(0==l)r[h]=new Uint8Array(d.buffer.slice(t,t+i));else{if(8!=l)throw\"unknown compression method: \"+l;var A=new Uint8Array(o);UZIP.inflateRaw(d,A),r[h]=A}}},UZIP.inflateRaw=function(e,t){return UZIP.F.inflate(e,t)},UZIP.inflate=function(e,t){return e[0],e[1],UZIP.inflateRaw(new Uint8Array(e.buffer,e.byteOffset+2,e.length-6),t)},UZIP.deflate=function(e,t){null==t&&(t={level:6});var r=0,i=new Uint8Array(50+Math.floor(1.1*e.length));i[r]=120,i[r+1]=156,r+=2,r=UZIP.F.deflateRaw(e,i,r,t.level);var o=UZIP.adler(e,0,e.length);return i[r+0]=o>>>24&255,i[r+1]=o>>>16&255,i[r+2]=o>>>8&255,i[r+3]=o>>>0&255,new Uint8Array(i.buffer,0,r+4)},UZIP.deflateRaw=function(e,t){null==t&&(t={level:6});var r=new Uint8Array(50+Math.floor(1.1*e.length)),i=UZIP.F.deflateRaw(e,r,i,t.level);return new Uint8Array(r.buffer,0,i)},UZIP.encode=function(e,t){null==t&&(t=!1);var r=0,i=UZIP.bin.writeUint,o=UZIP.bin.writeUshort,a={};for(var s in e){var f=!UZIP._noNeed(s)&&!t,l=e[s],c=UZIP.crc.crc(l,0,l.length);a[s]={cpr:f,usize:l.length,crc:c,file:f?UZIP.deflateRaw(l):l}}for(var s in a)r+=a[s].file.length+30+46+2*UZIP.bin.sizeUTF8(s);r+=22;var u=new Uint8Array(r),h=0,d=[];for(var s in a){var A=a[s];d.push(h),h=UZIP._writeHeader(u,h,s,A,0)}var g=0,p=h;for(var s in a){A=a[s];d.push(h),h=UZIP._writeHeader(u,h,s,A,1,d[g++])}var m=h-p;return i(u,h,101010256),h+=4,o(u,h+=4,g),o(u,h+=2,g),i(u,h+=2,m),i(u,h+=4,p),h+=4,h+=2,u.buffer},UZIP._noNeed=function(e){var t=e.split(\".\").pop().toLowerCase();return-1!=\"png,jpg,jpeg,zip\".indexOf(t)},UZIP._writeHeader=function(e,t,r,i,o,a){var s=UZIP.bin.writeUint,f=UZIP.bin.writeUshort,l=i.file;return s(e,t,0==o?67324752:33639248),t+=4,1==o&&(t+=2),f(e,t,20),f(e,t+=2,0),f(e,t+=2,i.cpr?8:0),s(e,t+=2,0),s(e,t+=4,i.crc),s(e,t+=4,l.length),s(e,t+=4,i.usize),f(e,t+=4,UZIP.bin.sizeUTF8(r)),f(e,t+=2,0),t+=2,1==o&&(t+=2,t+=2,s(e,t+=6,a),t+=4),t+=UZIP.bin.writeUTF8(e,t,r),0==o&&(e.set(l,t),t+=l.length),t},UZIP.crc={table:function(){for(var e=new Uint32Array(256),t=0;t<256;t++){for(var r=t,i=0;i<8;i++)1&r?r=3988292384^r>>>1:r>>>=1;e[t]=r}return e}(),update:function(e,t,r,i){for(var o=0;o<i;o++)e=UZIP.crc.table[255&(e^t[r+o])]^e>>>8;return e},crc:function(e,t,r){return 4294967295^UZIP.crc.update(4294967295,e,t,r)}},UZIP.adler=function(e,t,r){for(var i=1,o=0,a=t,s=t+r;a<s;){for(var f=Math.min(a+5552,s);a<f;)o+=i+=e[a++];i%=65521,o%=65521}return o<<16|i},UZIP.bin={readUshort:function(e,t){return e[t]|e[t+1]<<8},writeUshort:function(e,t,r){e[t]=255&r,e[t+1]=r>>8&255},readUint:function(e,t){return 16777216*e[t+3]+(e[t+2]<<16|e[t+1]<<8|e[t])},writeUint:function(e,t,r){e[t]=255&r,e[t+1]=r>>8&255,e[t+2]=r>>16&255,e[t+3]=r>>24&255},readASCII:function(e,t,r){for(var i=\"\",o=0;o<r;o++)i+=String.fromCharCode(e[t+o]);return i},writeASCII:function(e,t,r){for(var i=0;i<r.length;i++)e[t+i]=r.charCodeAt(i)},pad:function(e){return e.length<2?\"0\"+e:e},readUTF8:function(e,t,r){for(var i,o=\"\",a=0;a<r;a++)o+=\"%\"+UZIP.bin.pad(e[t+a].toString(16));try{i=decodeURIComponent(o)}catch(i){return UZIP.bin.readASCII(e,t,r)}return i},writeUTF8:function(e,t,r){for(var i=r.length,o=0,a=0;a<i;a++){var s=r.charCodeAt(a);if(0==(4294967168&s))e[t+o]=s,o++;else if(0==(4294965248&s))e[t+o]=192|s>>6,e[t+o+1]=128|s>>0&63,o+=2;else if(0==(4294901760&s))e[t+o]=224|s>>12,e[t+o+1]=128|s>>6&63,e[t+o+2]=128|s>>0&63,o+=3;else{if(0!=(4292870144&s))throw\"e\";e[t+o]=240|s>>18,e[t+o+1]=128|s>>12&63,e[t+o+2]=128|s>>6&63,e[t+o+3]=128|s>>0&63,o+=4}}return o},sizeUTF8:function(e){for(var t=e.length,r=0,i=0;i<t;i++){var o=e.charCodeAt(i);if(0==(4294967168&o))r++;else if(0==(4294965248&o))r+=2;else if(0==(4294901760&o))r+=3;else{if(0!=(4292870144&o))throw\"e\";r+=4}}return r}},UZIP.F={},UZIP.F.deflateRaw=function(e,t,r,i){var o=[[0,0,0,0,0],[4,4,8,4,0],[4,5,16,8,0],[4,6,16,16,0],[4,10,16,32,0],[8,16,32,32,0],[8,16,128,128,0],[8,32,128,256,0],[32,128,258,1024,1],[32,258,258,4096,1]][i],a=UZIP.F.U,s=UZIP.F._goodIndex;UZIP.F._hash;var f=UZIP.F._putsE,l=0,c=r<<3,u=0,h=e.length;if(0==i){for(;l<h;){f(t,c,l+(_=Math.min(65535,h-l))==h?1:0),c=UZIP.F._copyExact(e,l,_,t,c+8),l+=_}return c>>>3}var d=a.lits,A=a.strt,g=a.prev,p=0,m=0,w=0,v=0,b=0,y=0;for(h>2&&(A[y=UZIP.F._hash(e,0)]=0),l=0;l<h;l++){if(b=y,l+1<h-2){y=UZIP.F._hash(e,l+1);var E=l+1&32767;g[E]=A[y],A[y]=E}if(u<=l){(p>14e3||m>26697)&&h-l>100&&(u<l&&(d[p]=l-u,p+=2,u=l),c=UZIP.F._writeBlock(l==h-1||u==h?1:0,d,p,v,e,w,l-w,t,c),p=m=v=0,w=l);var F=0;l<h-2&&(F=UZIP.F._bestMatch(e,l,g,b,Math.min(o[2],h-l),o[3]));var _=F>>>16,B=65535&F;if(0!=F){B=65535&F;var U=s(_=F>>>16,a.of0);a.lhst[257+U]++;var C=s(B,a.df0);a.dhst[C]++,v+=a.exb[U]+a.dxb[C],d[p]=_<<23|l-u,d[p+1]=B<<16|U<<8|C,p+=2,u=l+_}else a.lhst[e[l]]++;m++}}for(w==l&&0!=e.length||(u<l&&(d[p]=l-u,p+=2,u=l),c=UZIP.F._writeBlock(1,d,p,v,e,w,l-w,t,c),p=0,m=0,p=m=v=0,w=l);0!=(7&c);)c++;return c>>>3},UZIP.F._bestMatch=function(e,t,r,i,o,a){var s=32767&t,f=r[s],l=s-f+32768&32767;if(f==s||i!=UZIP.F._hash(e,t-l))return 0;for(var c=0,u=0,h=Math.min(32767,t);l<=h&&0!=--a&&f!=s;){if(0==c||e[t+c]==e[t+c-l]){var d=UZIP.F._howLong(e,t,l);if(d>c){if(u=l,(c=d)>=o)break;l+2<d&&(d=l+2);for(var A=0,g=0;g<d-2;g++){var p=t-l+g+32768&32767,m=p-r[p]+32768&32767;m>A&&(A=m,f=p)}}}l+=(s=f)-(f=r[s])+32768&32767}return c<<16|u},UZIP.F._howLong=function(e,t,r){if(e[t]!=e[t-r]||e[t+1]!=e[t+1-r]||e[t+2]!=e[t+2-r])return 0;var i=t,o=Math.min(e.length,t+258);for(t+=3;t<o&&e[t]==e[t-r];)t++;return t-i},UZIP.F._hash=function(e,t){return(e[t]<<8|e[t+1])+(e[t+2]<<4)&65535},UZIP.saved=0,UZIP.F._writeBlock=function(e,t,r,i,o,a,s,f,l){var c,u,h,d,A,g,p,m,w,v=UZIP.F.U,b=UZIP.F._putsF,y=UZIP.F._putsE;v.lhst[256]++,u=(c=UZIP.F.getTrees())[0],h=c[1],d=c[2],A=c[3],g=c[4],p=c[5],m=c[6],w=c[7];var E=32+(0==(l+3&7)?0:8-(l+3&7))+(s<<3),F=i+UZIP.F.contSize(v.fltree,v.lhst)+UZIP.F.contSize(v.fdtree,v.dhst),_=i+UZIP.F.contSize(v.ltree,v.lhst)+UZIP.F.contSize(v.dtree,v.dhst);_+=14+3*p+UZIP.F.contSize(v.itree,v.ihst)+(2*v.ihst[16]+3*v.ihst[17]+7*v.ihst[18]);for(var B=0;B<286;B++)v.lhst[B]=0;for(B=0;B<30;B++)v.dhst[B]=0;for(B=0;B<19;B++)v.ihst[B]=0;var U=E<F&&E<_?0:F<_?1:2;if(b(f,l,e),b(f,l+1,U),l+=3,0==U){for(;0!=(7&l);)l++;l=UZIP.F._copyExact(o,a,s,f,l)}else{var C,I;if(1==U&&(C=v.fltree,I=v.fdtree),2==U){UZIP.F.makeCodes(v.ltree,u),UZIP.F.revCodes(v.ltree,u),UZIP.F.makeCodes(v.dtree,h),UZIP.F.revCodes(v.dtree,h),UZIP.F.makeCodes(v.itree,d),UZIP.F.revCodes(v.itree,d),C=v.ltree,I=v.dtree,y(f,l,A-257),y(f,l+=5,g-1),y(f,l+=5,p-4),l+=4;for(var Q=0;Q<p;Q++)y(f,l+3*Q,v.itree[1+(v.ordr[Q]<<1)]);l+=3*p,l=UZIP.F._codeTiny(m,v.itree,f,l),l=UZIP.F._codeTiny(w,v.itree,f,l)}for(var M=a,x=0;x<r;x+=2){for(var S=t[x],R=S>>>23,T=M+(8388607&S);M<T;)l=UZIP.F._writeLit(o[M++],C,f,l);if(0!=R){var O=t[x+1],P=O>>16,H=O>>8&255,L=255&O;y(f,l=UZIP.F._writeLit(257+H,C,f,l),R-v.of0[H]),l+=v.exb[H],b(f,l=UZIP.F._writeLit(L,I,f,l),P-v.df0[L]),l+=v.dxb[L],M+=R}}l=UZIP.F._writeLit(256,C,f,l)}return l},UZIP.F._copyExact=function(e,t,r,i,o){var a=o>>>3;return i[a]=r,i[a+1]=r>>>8,i[a+2]=255-i[a],i[a+3]=255-i[a+1],a+=4,i.set(new Uint8Array(e.buffer,t,r),a),o+(r+4<<3)},UZIP.F.getTrees=function(){for(var e=UZIP.F.U,t=UZIP.F._hufTree(e.lhst,e.ltree,15),r=UZIP.F._hufTree(e.dhst,e.dtree,15),i=[],o=UZIP.F._lenCodes(e.ltree,i),a=[],s=UZIP.F._lenCodes(e.dtree,a),f=0;f<i.length;f+=2)e.ihst[i[f]]++;for(f=0;f<a.length;f+=2)e.ihst[a[f]]++;for(var l=UZIP.F._hufTree(e.ihst,e.itree,7),c=19;c>4&&0==e.itree[1+(e.ordr[c-1]<<1)];)c--;return[t,r,l,o,s,c,i,a]},UZIP.F.getSecond=function(e){for(var t=[],r=0;r<e.length;r+=2)t.push(e[r+1]);return t},UZIP.F.nonZero=function(e){for(var t=\"\",r=0;r<e.length;r+=2)0!=e[r+1]&&(t+=(r>>1)+\",\");return t},UZIP.F.contSize=function(e,t){for(var r=0,i=0;i<t.length;i++)r+=t[i]*e[1+(i<<1)];return r},UZIP.F._codeTiny=function(e,t,r,i){for(var o=0;o<e.length;o+=2){var a=e[o],s=e[o+1];i=UZIP.F._writeLit(a,t,r,i);var f=16==a?2:17==a?3:7;a>15&&(UZIP.F._putsE(r,i,s,f),i+=f)}return i},UZIP.F._lenCodes=function(e,t){for(var r=e.length;2!=r&&0==e[r-1];)r-=2;for(var i=0;i<r;i+=2){var o=e[i+1],a=i+3<r?e[i+3]:-1,s=i+5<r?e[i+5]:-1,f=0==i?-1:e[i-1];if(0==o&&a==o&&s==o){for(var l=i+5;l+2<r&&e[l+2]==o;)l+=2;(c=Math.min(l+1-i>>>1,138))<11?t.push(17,c-3):t.push(18,c-11),i+=2*c-2}else if(o==f&&a==o&&s==o){for(l=i+5;l+2<r&&e[l+2]==o;)l+=2;var c=Math.min(l+1-i>>>1,6);t.push(16,c-3),i+=2*c-2}else t.push(o,0)}return r>>>1},UZIP.F._hufTree=function(e,t,r){var i=[],o=e.length,a=t.length,s=0;for(s=0;s<a;s+=2)t[s]=0,t[s+1]=0;for(s=0;s<o;s++)0!=e[s]&&i.push({lit:s,f:e[s]});var f=i.length,l=i.slice(0);if(0==f)return 0;if(1==f){var c=i[0].lit;l=0==c?1:0;return t[1+(c<<1)]=1,t[1+(l<<1)]=1,1}i.sort((function(e,t){return e.f-t.f}));var u=i[0],h=i[1],d=0,A=1,g=2;for(i[0]={lit:-1,f:u.f+h.f,l:u,r:h,d:0};A!=f-1;)u=d!=A&&(g==f||i[d].f<i[g].f)?i[d++]:i[g++],h=d!=A&&(g==f||i[d].f<i[g].f)?i[d++]:i[g++],i[A++]={lit:-1,f:u.f+h.f,l:u,r:h};var p=UZIP.F.setDepth(i[A-1],0);for(p>r&&(UZIP.F.restrictDepth(l,r,p),p=r),s=0;s<f;s++)t[1+(l[s].lit<<1)]=l[s].d;return p},UZIP.F.setDepth=function(e,t){return-1!=e.lit?(e.d=t,t):Math.max(UZIP.F.setDepth(e.l,t+1),UZIP.F.setDepth(e.r,t+1))},UZIP.F.restrictDepth=function(e,t,r){var i=0,o=1<<r-t,a=0;for(e.sort((function(e,t){return t.d==e.d?e.f-t.f:t.d-e.d})),i=0;i<e.length&&e[i].d>t;i++){var s=e[i].d;e[i].d=t,a+=o-(1<<r-s)}for(a>>>=r-t;a>0;){(s=e[i].d)<t?(e[i].d++,a-=1<<t-s-1):i++}for(;i>=0;i--)e[i].d==t&&a<0&&(e[i].d--,a++);0!=a&&console.log(\"debt left\")},UZIP.F._goodIndex=function(e,t){var r=0;return t[16|r]<=e&&(r|=16),t[8|r]<=e&&(r|=8),t[4|r]<=e&&(r|=4),t[2|r]<=e&&(r|=2),t[1|r]<=e&&(r|=1),r},UZIP.F._writeLit=function(e,t,r,i){return UZIP.F._putsF(r,i,t[e<<1]),i+t[1+(e<<1)]},UZIP.F.inflate=function(e,t){var r=Uint8Array;if(3==e[0]&&0==e[1])return t||new r(0);var i=UZIP.F,o=i._bitsF,a=i._bitsE,s=i._decodeTiny,f=i.makeCodes,l=i.codes2map,c=i._get17,u=i.U,h=null==t;h&&(t=new r(e.length>>>2<<3));for(var d,A,g=0,p=0,m=0,w=0,v=0,b=0,y=0,E=0,F=0;0==g;)if(g=o(e,F,1),p=o(e,F+1,2),F+=3,0!=p){if(h&&(t=UZIP.F._check(t,E+(1<<17))),1==p&&(d=u.flmap,A=u.fdmap,b=511,y=31),2==p){m=a(e,F,5)+257,w=a(e,F+5,5)+1,v=a(e,F+10,4)+4,F+=14;for(var _=0;_<38;_+=2)u.itree[_]=0,u.itree[_+1]=0;var B=1;for(_=0;_<v;_++){var U=a(e,F+3*_,3);u.itree[1+(u.ordr[_]<<1)]=U,U>B&&(B=U)}F+=3*v,f(u.itree,B),l(u.itree,B,u.imap),d=u.lmap,A=u.dmap,F=s(u.imap,(1<<B)-1,m+w,e,F,u.ttree);var C=i._copyOut(u.ttree,0,m,u.ltree);b=(1<<C)-1;var I=i._copyOut(u.ttree,m,w,u.dtree);y=(1<<I)-1,f(u.ltree,C),l(u.ltree,C,d),f(u.dtree,I),l(u.dtree,I,A)}for(;;){var Q=d[c(e,F)&b];F+=15&Q;var M=Q>>>4;if(M>>>8==0)t[E++]=M;else{if(256==M)break;var x=E+M-254;if(M>264){var S=u.ldef[M-257];x=E+(S>>>3)+a(e,F,7&S),F+=7&S}var R=A[c(e,F)&y];F+=15&R;var T=R>>>4,O=u.ddef[T],P=(O>>>4)+o(e,F,15&O);for(F+=15&O,h&&(t=UZIP.F._check(t,E+(1<<17)));E<x;)t[E]=t[E++-P],t[E]=t[E++-P],t[E]=t[E++-P],t[E]=t[E++-P];E=x}}}else{0!=(7&F)&&(F+=8-(7&F));var H=4+(F>>>3),L=e[H-4]|e[H-3]<<8;h&&(t=UZIP.F._check(t,E+L)),t.set(new r(e.buffer,e.byteOffset+H,L),E),F=H+L<<3,E+=L}return t.length==E?t:t.slice(0,E)},UZIP.F._check=function(e,t){var r=e.length;if(t<=r)return e;var i=new Uint8Array(Math.max(r<<1,t));return i.set(e,0),i},UZIP.F._decodeTiny=function(e,t,r,i,o,a){for(var s=UZIP.F._bitsE,f=UZIP.F._get17,l=0;l<r;){var c=e[f(i,o)&t];o+=15&c;var u=c>>>4;if(u<=15)a[l]=u,l++;else{var h=0,d=0;16==u?(d=3+s(i,o,2),o+=2,h=a[l-1]):17==u?(d=3+s(i,o,3),o+=3):18==u&&(d=11+s(i,o,7),o+=7);for(var A=l+d;l<A;)a[l]=h,l++}}return o},UZIP.F._copyOut=function(e,t,r,i){for(var o=0,a=0,s=i.length>>>1;a<r;){var f=e[a+t];i[a<<1]=0,i[1+(a<<1)]=f,f>o&&(o=f),a++}for(;a<s;)i[a<<1]=0,i[1+(a<<1)]=0,a++;return o},UZIP.F.makeCodes=function(e,t){for(var r,i,o,a,s=UZIP.F.U,f=e.length,l=s.bl_count,c=0;c<=t;c++)l[c]=0;for(c=1;c<f;c+=2)l[e[c]]++;var u=s.next_code;for(r=0,l[0]=0,i=1;i<=t;i++)r=r+l[i-1]<<1,u[i]=r;for(o=0;o<f;o+=2)0!=(a=e[o+1])&&(e[o]=u[a],u[a]++)},UZIP.F.codes2map=function(e,t,r){for(var i=e.length,o=UZIP.F.U.rev15,a=0;a<i;a+=2)if(0!=e[a+1])for(var s=a>>1,f=e[a+1],l=s<<4|f,c=t-f,u=e[a]<<c,h=u+(1<<c);u!=h;){r[o[u]>>>15-t]=l,u++}},UZIP.F.revCodes=function(e,t){for(var r=UZIP.F.U.rev15,i=15-t,o=0;o<e.length;o+=2){var a=e[o]<<t-e[o+1];e[o]=r[a]>>>i}},UZIP.F._putsE=function(e,t,r){r<<=7&t;var i=t>>>3;e[i]|=r,e[i+1]|=r>>>8},UZIP.F._putsF=function(e,t,r){r<<=7&t;var i=t>>>3;e[i]|=r,e[i+1]|=r>>>8,e[i+2]|=r>>>16},UZIP.F._bitsE=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8)>>>(7&t)&(1<<r)-1},UZIP.F._bitsF=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)&(1<<r)-1},UZIP.F._get17=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)},UZIP.F._get25=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16|e[3+(t>>>3)]<<24)>>>(7&t)},UZIP.F.U=(r=Uint16Array,i=Uint32Array,{next_code:new r(16),bl_count:new r(16),ordr:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],of0:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],exb:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],ldef:new r(32),df0:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],dxb:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],ddef:new i(32),flmap:new r(512),fltree:[],fdmap:new r(32),fdtree:[],lmap:new r(32768),ltree:[],ttree:[],dmap:new r(32768),dtree:[],imap:new r(512),itree:[],rev15:new r(32768),lhst:new i(286),dhst:new i(30),ihst:new i(19),lits:new i(15e3),strt:new r(65536),prev:new r(32768)}),function(){for(var e=UZIP.F.U,t=0;t<32768;t++){var r=t;r=(4278255360&(r=(4042322160&(r=(3435973836&(r=(2863311530&r)>>>1|(1431655765&r)<<1))>>>2|(858993459&r)<<2))>>>4|(252645135&r)<<4))>>>8|(16711935&r)<<8,e.rev15[t]=(r>>>16|r<<16)>>>17}function pushV(e,t,r){for(;0!=t--;)e.push(0,r)}for(t=0;t<32;t++)e.ldef[t]=e.of0[t]<<3|e.exb[t],e.ddef[t]=e.df0[t]<<4|e.dxb[t];pushV(e.fltree,144,8),pushV(e.fltree,112,9),pushV(e.fltree,24,7),pushV(e.fltree,8,8),UZIP.F.makeCodes(e.fltree,9),UZIP.F.codes2map(e.fltree,9,e.flmap),UZIP.F.revCodes(e.fltree,9),pushV(e.fdtree,32,5),UZIP.F.makeCodes(e.fdtree,5),UZIP.F.codes2map(e.fdtree,5,e.fdmap),UZIP.F.revCodes(e.fdtree,5),pushV(e.itree,19,0),pushV(e.ltree,286,0),pushV(e.dtree,30,0),pushV(e.ttree,320,0)}()}();var UZIP=_mergeNamespaces({__proto__:null,default:e},[e]);const UPNG=function(){var e={nextZero(e,t){for(;0!=e[t];)t++;return t},readUshort:(e,t)=>e[t]<<8|e[t+1],writeUshort(e,t,r){e[t]=r>>8&255,e[t+1]=255&r},readUint:(e,t)=>16777216*e[t]+(e[t+1]<<16|e[t+2]<<8|e[t+3]),writeUint(e,t,r){e[t]=r>>24&255,e[t+1]=r>>16&255,e[t+2]=r>>8&255,e[t+3]=255&r},readASCII(e,t,r){let i=\"\";for(let o=0;o<r;o++)i+=String.fromCharCode(e[t+o]);return i},writeASCII(e,t,r){for(let i=0;i<r.length;i++)e[t+i]=r.charCodeAt(i)},readBytes(e,t,r){const i=[];for(let o=0;o<r;o++)i.push(e[t+o]);return i},pad:e=>e.length<2?`0${e}`:e,readUTF8(t,r,i){let o,a=\"\";for(let o=0;o<i;o++)a+=`%${e.pad(t[r+o].toString(16))}`;try{o=decodeURIComponent(a)}catch(o){return e.readASCII(t,r,i)}return o}};function decodeImage(t,r,i,o){const a=r*i,s=_getBPP(o),f=Math.ceil(r*s/8),l=new Uint8Array(4*a),c=new Uint32Array(l.buffer),{ctype:u}=o,{depth:h}=o,d=e.readUshort;if(6==u){const e=a<<2;if(8==h)for(var A=0;A<e;A+=4)l[A]=t[A],l[A+1]=t[A+1],l[A+2]=t[A+2],l[A+3]=t[A+3];if(16==h)for(A=0;A<e;A++)l[A]=t[A<<1]}else if(2==u){const e=o.tabs.tRNS;if(null==e){if(8==h)for(A=0;A<a;A++){var g=3*A;c[A]=255<<24|t[g+2]<<16|t[g+1]<<8|t[g]}if(16==h)for(A=0;A<a;A++){g=6*A;c[A]=255<<24|t[g+4]<<16|t[g+2]<<8|t[g]}}else{var p=e[0];const r=e[1],i=e[2];if(8==h)for(A=0;A<a;A++){var m=A<<2;g=3*A;c[A]=255<<24|t[g+2]<<16|t[g+1]<<8|t[g],t[g]==p&&t[g+1]==r&&t[g+2]==i&&(l[m+3]=0)}if(16==h)for(A=0;A<a;A++){m=A<<2,g=6*A;c[A]=255<<24|t[g+4]<<16|t[g+2]<<8|t[g],d(t,g)==p&&d(t,g+2)==r&&d(t,g+4)==i&&(l[m+3]=0)}}}else if(3==u){const e=o.tabs.PLTE,s=o.tabs.tRNS,c=s?s.length:0;if(1==h)for(var w=0;w<i;w++){var v=w*f,b=w*r;for(A=0;A<r;A++){m=b+A<<2;var y=3*(E=t[v+(A>>3)]>>7-((7&A)<<0)&1);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E<c?s[E]:255}}if(2==h)for(w=0;w<i;w++)for(v=w*f,b=w*r,A=0;A<r;A++){m=b+A<<2,y=3*(E=t[v+(A>>2)]>>6-((3&A)<<1)&3);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E<c?s[E]:255}if(4==h)for(w=0;w<i;w++)for(v=w*f,b=w*r,A=0;A<r;A++){m=b+A<<2,y=3*(E=t[v+(A>>1)]>>4-((1&A)<<2)&15);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E<c?s[E]:255}if(8==h)for(A=0;A<a;A++){var E;m=A<<2,y=3*(E=t[A]);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E<c?s[E]:255}}else if(4==u){if(8==h)for(A=0;A<a;A++){m=A<<2;var F=t[_=A<<1];l[m]=F,l[m+1]=F,l[m+2]=F,l[m+3]=t[_+1]}if(16==h)for(A=0;A<a;A++){var _;m=A<<2,F=t[_=A<<2];l[m]=F,l[m+1]=F,l[m+2]=F,l[m+3]=t[_+2]}}else if(0==u)for(p=o.tabs.tRNS?o.tabs.tRNS:-1,w=0;w<i;w++){const e=w*f,i=w*r;if(1==h)for(var B=0;B<r;B++){var U=(F=255*(t[e+(B>>>3)]>>>7-(7&B)&1))==255*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(2==h)for(B=0;B<r;B++){U=(F=85*(t[e+(B>>>2)]>>>6-((3&B)<<1)&3))==85*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(4==h)for(B=0;B<r;B++){U=(F=17*(t[e+(B>>>1)]>>>4-((1&B)<<2)&15))==17*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(8==h)for(B=0;B<r;B++){U=(F=t[e+B])==p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(16==h)for(B=0;B<r;B++){F=t[e+(B<<1)],U=d(t,e+(B<<1))==p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}}return l}function _decompress(e,r,i,o){const a=_getBPP(e),s=Math.ceil(i*a/8),f=new Uint8Array((s+1+e.interlace)*o);return r=e.tabs.CgBI?t(r,f):_inflate(r,f),0==e.interlace?r=_filterZero(r,e,0,i,o):1==e.interlace&&(r=function _readInterlace(e,t){const r=t.width,i=t.height,o=_getBPP(t),a=o>>3,s=Math.ceil(r*o/8),f=new Uint8Array(i*s);let l=0;const c=[0,0,4,0,2,0,1],u=[0,4,0,2,0,1,0],h=[8,8,8,4,4,2,2],d=[8,8,4,4,2,2,1];let A=0;for(;A<7;){const p=h[A],m=d[A];let w=0,v=0,b=c[A];for(;b<i;)b+=p,v++;let y=u[A];for(;y<r;)y+=m,w++;const E=Math.ceil(w*o/8);_filterZero(e,t,l,w,v);let F=0,_=c[A];for(;_<i;){let t=u[A],i=l+F*E<<3;for(;t<r;){var g;if(1==o)g=(g=e[i>>3])>>7-(7&i)&1,f[_*s+(t>>3)]|=g<<7-((7&t)<<0);if(2==o)g=(g=e[i>>3])>>6-(7&i)&3,f[_*s+(t>>2)]|=g<<6-((3&t)<<1);if(4==o)g=(g=e[i>>3])>>4-(7&i)&15,f[_*s+(t>>1)]|=g<<4-((1&t)<<2);if(o>=8){const r=_*s+t*a;for(let t=0;t<a;t++)f[r+t]=e[(i>>3)+t]}i+=o,t+=m}F++,_+=p}w*v!=0&&(l+=v*(1+E)),A+=1}return f}(r,e)),r}function _inflate(e,r){return t(new Uint8Array(e.buffer,2,e.length-6),r)}var t=function(){const e={H:{}};return e.H.N=function(t,r){const i=Uint8Array;let o,a,s=0,f=0,l=0,c=0,u=0,h=0,d=0,A=0,g=0;if(3==t[0]&&0==t[1])return r||new i(0);const p=e.H,m=p.b,w=p.e,v=p.R,b=p.n,y=p.A,E=p.Z,F=p.m,_=null==r;for(_&&(r=new i(t.length>>>2<<5));0==s;)if(s=m(t,g,1),f=m(t,g+1,2),g+=3,0!=f){if(_&&(r=e.H.W(r,A+(1<<17))),1==f&&(o=F.J,a=F.h,h=511,d=31),2==f){l=w(t,g,5)+257,c=w(t,g+5,5)+1,u=w(t,g+10,4)+4,g+=14;let e=1;for(var B=0;B<38;B+=2)F.Q[B]=0,F.Q[B+1]=0;for(B=0;B<u;B++){const r=w(t,g+3*B,3);F.Q[1+(F.X[B]<<1)]=r,r>e&&(e=r)}g+=3*u,b(F.Q,e),y(F.Q,e,F.u),o=F.w,a=F.d,g=v(F.u,(1<<e)-1,l+c,t,g,F.v);const r=p.V(F.v,0,l,F.C);h=(1<<r)-1;const i=p.V(F.v,l,c,F.D);d=(1<<i)-1,b(F.C,r),y(F.C,r,o),b(F.D,i),y(F.D,i,a)}for(;;){const e=o[E(t,g)&h];g+=15&e;const i=e>>>4;if(i>>>8==0)r[A++]=i;else{if(256==i)break;{let e=A+i-254;if(i>264){const r=F.q[i-257];e=A+(r>>>3)+w(t,g,7&r),g+=7&r}const o=a[E(t,g)&d];g+=15&o;const s=o>>>4,f=F.c[s],l=(f>>>4)+m(t,g,15&f);for(g+=15&f;A<e;)r[A]=r[A++-l],r[A]=r[A++-l],r[A]=r[A++-l],r[A]=r[A++-l];A=e}}}}else{0!=(7&g)&&(g+=8-(7&g));const o=4+(g>>>3),a=t[o-4]|t[o-3]<<8;_&&(r=e.H.W(r,A+a)),r.set(new i(t.buffer,t.byteOffset+o,a),A),g=o+a<<3,A+=a}return r.length==A?r:r.slice(0,A)},e.H.W=function(e,t){const r=e.length;if(t<=r)return e;const i=new Uint8Array(r<<1);return i.set(e,0),i},e.H.R=function(t,r,i,o,a,s){const f=e.H.e,l=e.H.Z;let c=0;for(;c<i;){const e=t[l(o,a)&r];a+=15&e;const i=e>>>4;if(i<=15)s[c]=i,c++;else{let e=0,t=0;16==i?(t=3+f(o,a,2),a+=2,e=s[c-1]):17==i?(t=3+f(o,a,3),a+=3):18==i&&(t=11+f(o,a,7),a+=7);const r=c+t;for(;c<r;)s[c]=e,c++}}return a},e.H.V=function(e,t,r,i){let o=0,a=0;const s=i.length>>>1;for(;a<r;){const r=e[a+t];i[a<<1]=0,i[1+(a<<1)]=r,r>o&&(o=r),a++}for(;a<s;)i[a<<1]=0,i[1+(a<<1)]=0,a++;return o},e.H.n=function(t,r){const i=e.H.m,o=t.length;let a,s,f;let l;const c=i.j;for(var u=0;u<=r;u++)c[u]=0;for(u=1;u<o;u+=2)c[t[u]]++;const h=i.K;for(a=0,c[0]=0,s=1;s<=r;s++)a=a+c[s-1]<<1,h[s]=a;for(f=0;f<o;f+=2)l=t[f+1],0!=l&&(t[f]=h[l],h[l]++)},e.H.A=function(t,r,i){const o=t.length,a=e.H.m.r;for(let e=0;e<o;e+=2)if(0!=t[e+1]){const o=e>>1,s=t[e+1],f=o<<4|s,l=r-s;let c=t[e]<<l;const u=c+(1<<l);for(;c!=u;){i[a[c]>>>15-r]=f,c++}}},e.H.l=function(t,r){const i=e.H.m.r,o=15-r;for(let e=0;e<t.length;e+=2){const a=t[e]<<r-t[e+1];t[e]=i[a]>>>o}},e.H.M=function(e,t,r){r<<=7&t;const i=t>>>3;e[i]|=r,e[i+1]|=r>>>8},e.H.I=function(e,t,r){r<<=7&t;const i=t>>>3;e[i]|=r,e[i+1]|=r>>>8,e[i+2]|=r>>>16},e.H.e=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8)>>>(7&t)&(1<<r)-1},e.H.b=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)&(1<<r)-1},e.H.Z=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)},e.H.i=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16|e[3+(t>>>3)]<<24)>>>(7&t)},e.H.m=function(){const e=Uint16Array,t=Uint32Array;return{K:new e(16),j:new e(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new e(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],c:new t(32),J:new e(512),_:[],h:new e(32),$:[],w:new e(32768),C:[],v:[],d:new e(32768),D:[],u:new e(512),Q:[],r:new e(32768),s:new t(286),Y:new t(30),a:new t(19),t:new t(15e3),k:new e(65536),g:new e(32768)}}(),function(){const t=e.H.m;for(var r=0;r<32768;r++){let e=r;e=(2863311530&e)>>>1|(1431655765&e)<<1,e=(3435973836&e)>>>2|(858993459&e)<<2,e=(4042322160&e)>>>4|(252645135&e)<<4,e=(4278255360&e)>>>8|(16711935&e)<<8,t.r[r]=(e>>>16|e<<16)>>>17}function n(e,t,r){for(;0!=t--;)e.push(0,r)}for(r=0;r<32;r++)t.q[r]=t.S[r]<<3|t.T[r],t.c[r]=t.p[r]<<4|t.z[r];n(t._,144,8),n(t._,112,9),n(t._,24,7),n(t._,8,8),e.H.n(t._,9),e.H.A(t._,9,t.J),e.H.l(t._,9),n(t.$,32,5),e.H.n(t.$,5),e.H.A(t.$,5,t.h),e.H.l(t.$,5),n(t.Q,19,0),n(t.C,286,0),n(t.D,30,0),n(t.v,320,0)}(),e.H.N}();function _getBPP(e){return[1,null,3,1,2,null,4][e.ctype]*e.depth}function _filterZero(e,t,r,i,o){let a=_getBPP(t);const s=Math.ceil(i*a/8);let f,l;a=Math.ceil(a/8);let c=e[r],u=0;if(c>1&&(e[r]=[0,0,1][c-2]),3==c)for(u=a;u<s;u++)e[u+1]=e[u+1]+(e[u+1-a]>>>1)&255;for(let t=0;t<o;t++)if(f=r+t*s,l=f+t+1,c=e[l-1],u=0,0==c)for(;u<s;u++)e[f+u]=e[l+u];else if(1==c){for(;u<a;u++)e[f+u]=e[l+u];for(;u<s;u++)e[f+u]=e[l+u]+e[f+u-a]}else if(2==c)for(;u<s;u++)e[f+u]=e[l+u]+e[f+u-s];else if(3==c){for(;u<a;u++)e[f+u]=e[l+u]+(e[f+u-s]>>>1);for(;u<s;u++)e[f+u]=e[l+u]+(e[f+u-s]+e[f+u-a]>>>1)}else{for(;u<a;u++)e[f+u]=e[l+u]+_paeth(0,e[f+u-s],0);for(;u<s;u++)e[f+u]=e[l+u]+_paeth(e[f+u-a],e[f+u-s],e[f+u-a-s])}return e}function _paeth(e,t,r){const i=e+t-r,o=i-e,a=i-t,s=i-r;return o*o<=a*a&&o*o<=s*s?e:a*a<=s*s?t:r}function _IHDR(t,r,i){i.width=e.readUint(t,r),r+=4,i.height=e.readUint(t,r),r+=4,i.depth=t[r],r++,i.ctype=t[r],r++,i.compress=t[r],r++,i.filter=t[r],r++,i.interlace=t[r],r++}function _copyTile(e,t,r,i,o,a,s,f,l){const c=Math.min(t,o),u=Math.min(r,a);let h=0,d=0;for(let r=0;r<u;r++)for(let a=0;a<c;a++)if(s>=0&&f>=0?(h=r*t+a<<2,d=(f+r)*o+s+a<<2):(h=(-f+r)*t-s+a<<2,d=r*o+a<<2),0==l)i[d]=e[h],i[d+1]=e[h+1],i[d+2]=e[h+2],i[d+3]=e[h+3];else if(1==l){var A=e[h+3]*(1/255),g=e[h]*A,p=e[h+1]*A,m=e[h+2]*A,w=i[d+3]*(1/255),v=i[d]*w,b=i[d+1]*w,y=i[d+2]*w;const t=1-A,r=A+w*t,o=0==r?0:1/r;i[d+3]=255*r,i[d+0]=(g+v*t)*o,i[d+1]=(p+b*t)*o,i[d+2]=(m+y*t)*o}else if(2==l){A=e[h+3],g=e[h],p=e[h+1],m=e[h+2],w=i[d+3],v=i[d],b=i[d+1],y=i[d+2];A==w&&g==v&&p==b&&m==y?(i[d]=0,i[d+1]=0,i[d+2]=0,i[d+3]=0):(i[d]=g,i[d+1]=p,i[d+2]=m,i[d+3]=A)}else if(3==l){A=e[h+3],g=e[h],p=e[h+1],m=e[h+2],w=i[d+3],v=i[d],b=i[d+1],y=i[d+2];if(A==w&&g==v&&p==b&&m==y)continue;if(A<220&&w>20)return!1}return!0}return{decode:function decode(r){const i=new Uint8Array(r);let o=8;const a=e,s=a.readUshort,f=a.readUint,l={tabs:{},frames:[]},c=new Uint8Array(i.length);let u,h=0,d=0;const A=[137,80,78,71,13,10,26,10];for(var g=0;g<8;g++)if(i[g]!=A[g])throw\"The input is not a PNG file!\";for(;o<i.length;){const e=a.readUint(i,o);o+=4;const r=a.readASCII(i,o,4);if(o+=4,\"IHDR\"==r)_IHDR(i,o,l);else if(\"iCCP\"==r){for(var p=o;0!=i[p];)p++;a.readASCII(i,o,p-o),i[p+1];const s=i.slice(p+2,o+e);let f=null;try{f=_inflate(s)}catch(e){f=t(s)}l.tabs[r]=f}else if(\"CgBI\"==r)l.tabs[r]=i.slice(o,o+4);else if(\"IDAT\"==r){for(g=0;g<e;g++)c[h+g]=i[o+g];h+=e}else if(\"acTL\"==r)l.tabs[r]={num_frames:f(i,o),num_plays:f(i,o+4)},u=new Uint8Array(i.length);else if(\"fcTL\"==r){if(0!=d)(E=l.frames[l.frames.length-1]).data=_decompress(l,u.slice(0,d),E.rect.width,E.rect.height),d=0;const e={x:f(i,o+12),y:f(i,o+16),width:f(i,o+4),height:f(i,o+8)};let t=s(i,o+22);t=s(i,o+20)/(0==t?100:t);const r={rect:e,delay:Math.round(1e3*t),dispose:i[o+24],blend:i[o+25]};l.frames.push(r)}else if(\"fdAT\"==r){for(g=0;g<e-4;g++)u[d+g]=i[o+g+4];d+=e-4}else if(\"pHYs\"==r)l.tabs[r]=[a.readUint(i,o),a.readUint(i,o+4),i[o+8]];else if(\"cHRM\"==r){l.tabs[r]=[];for(g=0;g<8;g++)l.tabs[r].push(a.readUint(i,o+4*g))}else if(\"tEXt\"==r||\"zTXt\"==r){null==l.tabs[r]&&(l.tabs[r]={});var m=a.nextZero(i,o),w=a.readASCII(i,o,m-o),v=o+e-m-1;if(\"tEXt\"==r)y=a.readASCII(i,m+1,v);else{var b=_inflate(i.slice(m+2,m+2+v));y=a.readUTF8(b,0,b.length)}l.tabs[r][w]=y}else if(\"iTXt\"==r){null==l.tabs[r]&&(l.tabs[r]={});m=0,p=o;m=a.nextZero(i,p);w=a.readASCII(i,p,m-p);const t=i[p=m+1];var y;i[p+1],p+=2,m=a.nextZero(i,p),a.readASCII(i,p,m-p),p=m+1,m=a.nextZero(i,p),a.readUTF8(i,p,m-p);v=e-((p=m+1)-o);if(0==t)y=a.readUTF8(i,p,v);else{b=_inflate(i.slice(p,p+v));y=a.readUTF8(b,0,b.length)}l.tabs[r][w]=y}else if(\"PLTE\"==r)l.tabs[r]=a.readBytes(i,o,e);else if(\"hIST\"==r){const e=l.tabs.PLTE.length/3;l.tabs[r]=[];for(g=0;g<e;g++)l.tabs[r].push(s(i,o+2*g))}else if(\"tRNS\"==r)3==l.ctype?l.tabs[r]=a.readBytes(i,o,e):0==l.ctype?l.tabs[r]=s(i,o):2==l.ctype&&(l.tabs[r]=[s(i,o),s(i,o+2),s(i,o+4)]);else if(\"gAMA\"==r)l.tabs[r]=a.readUint(i,o)/1e5;else if(\"sRGB\"==r)l.tabs[r]=i[o];else if(\"bKGD\"==r)0==l.ctype||4==l.ctype?l.tabs[r]=[s(i,o)]:2==l.ctype||6==l.ctype?l.tabs[r]=[s(i,o),s(i,o+2),s(i,o+4)]:3==l.ctype&&(l.tabs[r]=i[o]);else if(\"IEND\"==r)break;o+=e,a.readUint(i,o),o+=4}var E;return 0!=d&&((E=l.frames[l.frames.length-1]).data=_decompress(l,u.slice(0,d),E.rect.width,E.rect.height)),l.data=_decompress(l,c,l.width,l.height),delete l.compress,delete l.interlace,delete l.filter,l},toRGBA8:function toRGBA8(e){const t=e.width,r=e.height;if(null==e.tabs.acTL)return[decodeImage(e.data,t,r,e).buffer];const i=[];null==e.frames[0].data&&(e.frames[0].data=e.data);const o=t*r*4,a=new Uint8Array(o),s=new Uint8Array(o),f=new Uint8Array(o);for(let c=0;c<e.frames.length;c++){const u=e.frames[c],h=u.rect.x,d=u.rect.y,A=u.rect.width,g=u.rect.height,p=decodeImage(u.data,A,g,e);if(0!=c)for(var l=0;l<o;l++)f[l]=a[l];if(0==u.blend?_copyTile(p,A,g,a,t,r,h,d,0):1==u.blend&&_copyTile(p,A,g,a,t,r,h,d,1),i.push(a.buffer.slice(0)),0==u.dispose);else if(1==u.dispose)_copyTile(s,A,g,a,t,r,h,d,0);else if(2==u.dispose)for(l=0;l<o;l++)a[l]=f[l]}return i},_paeth:_paeth,_copyTile:_copyTile,_bin:e}}();!function(){const{_copyTile:e}=UPNG,{_bin:t}=UPNG,r=UPNG._paeth;var i={table:function(){const e=new Uint32Array(256);for(let t=0;t<256;t++){let r=t;for(let e=0;e<8;e++)1&r?r=3988292384^r>>>1:r>>>=1;e[t]=r}return e}(),update(e,t,r,o){for(let a=0;a<o;a++)e=i.table[255&(e^t[r+a])]^e>>>8;return e},crc:(e,t,r)=>4294967295^i.update(4294967295,e,t,r)};function addErr(e,t,r,i){t[r]+=e[0]*i>>4,t[r+1]+=e[1]*i>>4,t[r+2]+=e[2]*i>>4,t[r+3]+=e[3]*i>>4}function N(e){return Math.max(0,Math.min(255,e))}function D(e,t){const r=e[0]-t[0],i=e[1]-t[1],o=e[2]-t[2],a=e[3]-t[3];return r*r+i*i+o*o+a*a}function dither(e,t,r,i,o,a,s){null==s&&(s=1);const f=i.length,l=[];for(var c=0;c<f;c++){const e=i[c];l.push([e>>>0&255,e>>>8&255,e>>>16&255,e>>>24&255])}for(c=0;c<f;c++){let e=4294967295;for(var u=0,h=0;h<f;h++){var d=D(l[c],l[h]);h!=c&&d<e&&(e=d,u=h)}}const A=new Uint32Array(o.buffer),g=new Int16Array(t*r*4),p=[0,8,2,10,12,4,14,6,3,11,1,9,15,7,13,5];for(c=0;c<p.length;c++)p[c]=255*((p[c]+.5)/16-.5);for(let o=0;o<r;o++)for(let w=0;w<t;w++){var m;c=4*(o*t+w);if(2!=s)m=[N(e[c]+g[c]),N(e[c+1]+g[c+1]),N(e[c+2]+g[c+2]),N(e[c+3]+g[c+3])];else{d=p[4*(3&o)+(3&w)];m=[N(e[c]+d),N(e[c+1]+d),N(e[c+2]+d),N(e[c+3]+d)]}u=0;let v=16777215;for(h=0;h<f;h++){const e=D(m,l[h]);e<v&&(v=e,u=h)}const b=l[u],y=[m[0]-b[0],m[1]-b[1],m[2]-b[2],m[3]-b[3]];1==s&&(w!=t-1&&addErr(y,g,c+4,7),o!=r-1&&(0!=w&&addErr(y,g,c+4*t-4,3),addErr(y,g,c+4*t,5),w!=t-1&&addErr(y,g,c+4*t+4,1))),a[c>>2]=u,A[c>>2]=i[u]}}function _main(e,r,o,a,s){null==s&&(s={});const{crc:f}=i,l=t.writeUint,c=t.writeUshort,u=t.writeASCII;let h=8;const d=e.frames.length>1;let A,g=!1,p=33+(d?20:0);if(null!=s.sRGB&&(p+=13),null!=s.pHYs&&(p+=21),null!=s.iCCP&&(A=pako.deflate(s.iCCP),p+=21+A.length+4),3==e.ctype){for(var m=e.plte.length,w=0;w<m;w++)e.plte[w]>>>24!=255&&(g=!0);p+=8+3*m+4+(g?8+1*m+4:0)}for(var v=0;v<e.frames.length;v++){d&&(p+=38),p+=(F=e.frames[v]).cimg.length+12,0!=v&&(p+=4)}p+=12;const b=new Uint8Array(p),y=[137,80,78,71,13,10,26,10];for(w=0;w<8;w++)b[w]=y[w];if(l(b,h,13),h+=4,u(b,h,\"IHDR\"),h+=4,l(b,h,r),h+=4,l(b,h,o),h+=4,b[h]=e.depth,h++,b[h]=e.ctype,h++,b[h]=0,h++,b[h]=0,h++,b[h]=0,h++,l(b,h,f(b,h-17,17)),h+=4,null!=s.sRGB&&(l(b,h,1),h+=4,u(b,h,\"sRGB\"),h+=4,b[h]=s.sRGB,h++,l(b,h,f(b,h-5,5)),h+=4),null!=s.iCCP){const e=13+A.length;l(b,h,e),h+=4,u(b,h,\"iCCP\"),h+=4,u(b,h,\"ICC profile\"),h+=11,h+=2,b.set(A,h),h+=A.length,l(b,h,f(b,h-(e+4),e+4)),h+=4}if(null!=s.pHYs&&(l(b,h,9),h+=4,u(b,h,\"pHYs\"),h+=4,l(b,h,s.pHYs[0]),h+=4,l(b,h,s.pHYs[1]),h+=4,b[h]=s.pHYs[2],h++,l(b,h,f(b,h-13,13)),h+=4),d&&(l(b,h,8),h+=4,u(b,h,\"acTL\"),h+=4,l(b,h,e.frames.length),h+=4,l(b,h,null!=s.loop?s.loop:0),h+=4,l(b,h,f(b,h-12,12)),h+=4),3==e.ctype){l(b,h,3*(m=e.plte.length)),h+=4,u(b,h,\"PLTE\"),h+=4;for(w=0;w<m;w++){const t=3*w,r=e.plte[w],i=255&r,o=r>>>8&255,a=r>>>16&255;b[h+t+0]=i,b[h+t+1]=o,b[h+t+2]=a}if(h+=3*m,l(b,h,f(b,h-3*m-4,3*m+4)),h+=4,g){l(b,h,m),h+=4,u(b,h,\"tRNS\"),h+=4;for(w=0;w<m;w++)b[h+w]=e.plte[w]>>>24&255;h+=m,l(b,h,f(b,h-m-4,m+4)),h+=4}}let E=0;for(v=0;v<e.frames.length;v++){var F=e.frames[v];d&&(l(b,h,26),h+=4,u(b,h,\"fcTL\"),h+=4,l(b,h,E++),h+=4,l(b,h,F.rect.width),h+=4,l(b,h,F.rect.height),h+=4,l(b,h,F.rect.x),h+=4,l(b,h,F.rect.y),h+=4,c(b,h,a[v]),h+=2,c(b,h,1e3),h+=2,b[h]=F.dispose,h++,b[h]=F.blend,h++,l(b,h,f(b,h-30,30)),h+=4);const t=F.cimg;l(b,h,(m=t.length)+(0==v?0:4)),h+=4;const r=h;u(b,h,0==v?\"IDAT\":\"fdAT\"),h+=4,0!=v&&(l(b,h,E++),h+=4),b.set(t,h),h+=m,l(b,h,f(b,r,h-r)),h+=4}return l(b,h,0),h+=4,u(b,h,\"IEND\"),h+=4,l(b,h,f(b,h-4,4)),h+=4,b.buffer}function compressPNG(e,t,r){for(let i=0;i<e.frames.length;i++){const o=e.frames[i];o.rect.width;const a=o.rect.height,s=new Uint8Array(a*o.bpl+a);o.cimg=_filterZero(o.img,a,o.bpp,o.bpl,s,t,r)}}function compress(t,r,i,o,a){const s=a[0],f=a[1],l=a[2],c=a[3],u=a[4],h=a[5];let d=6,A=8,g=255;for(var p=0;p<t.length;p++){const e=new Uint8Array(t[p]);for(var m=e.length,w=0;w<m;w+=4)g&=e[w+3]}const v=255!=g,b=function framize(t,r,i,o,a,s){const f=[];for(var l=0;l<t.length;l++){const h=new Uint8Array(t[l]),A=new Uint32Array(h.buffer);var c;let g=0,p=0,m=r,w=i,v=o?1:0;if(0!=l){const b=s||o||1==l||0!=f[l-2].dispose?1:2;let y=0,E=1e9;for(let e=0;e<b;e++){var u=new Uint8Array(t[l-1-e]);const o=new Uint32Array(t[l-1-e]);let s=r,f=i,c=-1,h=-1;for(let e=0;e<i;e++)for(let t=0;t<r;t++){A[d=e*r+t]!=o[d]&&(t<s&&(s=t),t>c&&(c=t),e<f&&(f=e),e>h&&(h=e))}-1==c&&(s=f=c=h=0),a&&(1==(1&s)&&s--,1==(1&f)&&f--);const v=(c-s+1)*(h-f+1);v<E&&(E=v,y=e,g=s,p=f,m=c-s+1,w=h-f+1)}u=new Uint8Array(t[l-1-y]);1==y&&(f[l-1].dispose=2),c=new Uint8Array(m*w*4),e(u,r,i,c,m,w,-g,-p,0),v=e(h,r,i,c,m,w,-g,-p,3)?1:0,1==v?_prepareDiff(h,r,i,c,{x:g,y:p,width:m,height:w}):e(h,r,i,c,m,w,-g,-p,0)}else c=h.slice(0);f.push({rect:{x:g,y:p,width:m,height:w},img:c,blend:v,dispose:0})}if(o)for(l=0;l<f.length;l++){if(1==(A=f[l]).blend)continue;const e=A.rect,o=f[l-1].rect,s=Math.min(e.x,o.x),c=Math.min(e.y,o.y),u={x:s,y:c,width:Math.max(e.x+e.width,o.x+o.width)-s,height:Math.max(e.y+e.height,o.y+o.height)-c};f[l-1].dispose=1,l-1!=0&&_updateFrame(t,r,i,f,l-1,u,a),_updateFrame(t,r,i,f,l,u,a)}let h=0;if(1!=t.length)for(var d=0;d<f.length;d++){var A;h+=(A=f[d]).rect.width*A.rect.height}return f}(t,r,i,s,f,l),y={},E=[],F=[];if(0!=o){const e=[];for(w=0;w<b.length;w++)e.push(b[w].img.buffer);const t=function concatRGBA(e){let t=0;for(var r=0;r<e.length;r++)t+=e[r].byteLength;const i=new Uint8Array(t);let o=0;for(r=0;r<e.length;r++){const t=new Uint8Array(e[r]),a=t.length;for(let e=0;e<a;e+=4){let r=t[e],a=t[e+1],s=t[e+2];const f=t[e+3];0==f&&(r=a=s=0),i[o+e]=r,i[o+e+1]=a,i[o+e+2]=s,i[o+e+3]=f}o+=a}return i.buffer}(e),r=quantize(t,o);for(w=0;w<r.plte.length;w++)E.push(r.plte[w].est.rgba);let i=0;for(w=0;w<b.length;w++){const e=(B=b[w]).img.length;var _=new Uint8Array(r.inds.buffer,i>>2,e>>2);F.push(_);const t=new Uint8Array(r.abuf,i,e);h&&dither(B.img,B.rect.width,B.rect.height,E,t,_),B.img.set(t),i+=e}}else for(p=0;p<b.length;p++){var B=b[p];const e=new Uint32Array(B.img.buffer);var U=B.rect.width;m=e.length,_=new Uint8Array(m);F.push(_);for(w=0;w<m;w++){const t=e[w];if(0!=w&&t==e[w-1])_[w]=_[w-1];else if(w>U&&t==e[w-U])_[w]=_[w-U];else{let e=y[t];if(null==e&&(y[t]=e=E.length,E.push(t),E.length>=300))break;_[w]=e}}}const C=E.length;C<=256&&0==u&&(A=C<=2?1:C<=4?2:C<=16?4:8,A=Math.max(A,c));for(p=0;p<b.length;p++){(B=b[p]).rect.x,B.rect.y;U=B.rect.width;const e=B.rect.height;let t=B.img;new Uint32Array(t.buffer);let r=4*U,i=4;if(C<=256&&0==u){r=Math.ceil(A*U/8);var I=new Uint8Array(r*e);const o=F[p];for(let t=0;t<e;t++){w=t*r;const e=t*U;if(8==A)for(var Q=0;Q<U;Q++)I[w+Q]=o[e+Q];else if(4==A)for(Q=0;Q<U;Q++)I[w+(Q>>1)]|=o[e+Q]<<4-4*(1&Q);else if(2==A)for(Q=0;Q<U;Q++)I[w+(Q>>2)]|=o[e+Q]<<6-2*(3&Q);else if(1==A)for(Q=0;Q<U;Q++)I[w+(Q>>3)]|=o[e+Q]<<7-1*(7&Q)}t=I,d=3,i=1}else if(0==v&&1==b.length){I=new Uint8Array(U*e*3);const o=U*e;for(w=0;w<o;w++){const e=3*w,r=4*w;I[e]=t[r],I[e+1]=t[r+1],I[e+2]=t[r+2]}t=I,d=2,i=3,r=3*U}B.img=t,B.bpl=r,B.bpp=i}return{ctype:d,depth:A,plte:E,frames:b}}function _updateFrame(t,r,i,o,a,s,f){const l=Uint8Array,c=Uint32Array,u=new l(t[a-1]),h=new c(t[a-1]),d=a+1<t.length?new l(t[a+1]):null,A=new l(t[a]),g=new c(A.buffer);let p=r,m=i,w=-1,v=-1;for(let e=0;e<s.height;e++)for(let t=0;t<s.width;t++){const i=s.x+t,f=s.y+e,l=f*r+i,c=g[l];0==c||0==o[a-1].dispose&&h[l]==c&&(null==d||0!=d[4*l+3])||(i<p&&(p=i),i>w&&(w=i),f<m&&(m=f),f>v&&(v=f))}-1==w&&(p=m=w=v=0),f&&(1==(1&p)&&p--,1==(1&m)&&m--),s={x:p,y:m,width:w-p+1,height:v-m+1};const b=o[a];b.rect=s,b.blend=1,b.img=new Uint8Array(s.width*s.height*4),0==o[a-1].dispose?(e(u,r,i,b.img,s.width,s.height,-s.x,-s.y,0),_prepareDiff(A,r,i,b.img,s)):e(A,r,i,b.img,s.width,s.height,-s.x,-s.y,0)}function _prepareDiff(t,r,i,o,a){e(t,r,i,o,a.width,a.height,-a.x,-a.y,2)}function _filterZero(e,t,r,i,o,a,s){const f=[];let l,c=[0,1,2,3,4];-1!=a?c=[a]:(t*i>5e5||1==r)&&(c=[0]),s&&(l={level:0});const u=UZIP;for(var h=0;h<c.length;h++){for(let a=0;a<t;a++)_filterLine(o,e,a,i,r,c[h]);f.push(u.deflate(o,l))}let d,A=1e9;for(h=0;h<f.length;h++)f[h].length<A&&(d=h,A=f[h].length);return f[d]}function _filterLine(e,t,i,o,a,s){const f=i*o;let l=f+i;if(e[l]=s,l++,0==s)if(o<500)for(var c=0;c<o;c++)e[l+c]=t[f+c];else e.set(new Uint8Array(t.buffer,f,o),l);else if(1==s){for(c=0;c<a;c++)e[l+c]=t[f+c];for(c=a;c<o;c++)e[l+c]=t[f+c]-t[f+c-a]+256&255}else if(0==i){for(c=0;c<a;c++)e[l+c]=t[f+c];if(2==s)for(c=a;c<o;c++)e[l+c]=t[f+c];if(3==s)for(c=a;c<o;c++)e[l+c]=t[f+c]-(t[f+c-a]>>1)+256&255;if(4==s)for(c=a;c<o;c++)e[l+c]=t[f+c]-r(t[f+c-a],0,0)+256&255}else{if(2==s)for(c=0;c<o;c++)e[l+c]=t[f+c]+256-t[f+c-o]&255;if(3==s){for(c=0;c<a;c++)e[l+c]=t[f+c]+256-(t[f+c-o]>>1)&255;for(c=a;c<o;c++)e[l+c]=t[f+c]+256-(t[f+c-o]+t[f+c-a]>>1)&255}if(4==s){for(c=0;c<a;c++)e[l+c]=t[f+c]+256-r(0,t[f+c-o],0)&255;for(c=a;c<o;c++)e[l+c]=t[f+c]+256-r(t[f+c-a],t[f+c-o],t[f+c-a-o])&255}}}function quantize(e,t){const r=new Uint8Array(e),i=r.slice(0),o=new Uint32Array(i.buffer),a=getKDtree(i,t),s=a[0],f=a[1],l=r.length,c=new Uint8Array(l>>2);let u;if(r.length<2e7)for(var h=0;h<l;h+=4){u=getNearest(s,d=r[h]*(1/255),A=r[h+1]*(1/255),g=r[h+2]*(1/255),p=r[h+3]*(1/255)),c[h>>2]=u.ind,o[h>>2]=u.est.rgba}else for(h=0;h<l;h+=4){var d=r[h]*(1/255),A=r[h+1]*(1/255),g=r[h+2]*(1/255),p=r[h+3]*(1/255);for(u=s;u.left;)u=planeDst(u.est,d,A,g,p)<=0?u.left:u.right;c[h>>2]=u.ind,o[h>>2]=u.est.rgba}return{abuf:i.buffer,inds:c,plte:f}}function getKDtree(e,t,r){null==r&&(r=1e-4);const i=new Uint32Array(e.buffer),o={i0:0,i1:e.length,bst:null,est:null,tdst:0,left:null,right:null};o.bst=stats(e,o.i0,o.i1),o.est=estats(o.bst);const a=[o];for(;a.length<t;){let t=0,o=0;for(var s=0;s<a.length;s++)a[s].est.L>t&&(t=a[s].est.L,o=s);if(t<r)break;const f=a[o],l=splitPixels(e,i,f.i0,f.i1,f.est.e,f.est.eMq255);if(f.i0>=l||f.i1<=l){f.est.L=0;continue}const c={i0:f.i0,i1:l,bst:null,est:null,tdst:0,left:null,right:null};c.bst=stats(e,c.i0,c.i1),c.est=estats(c.bst);const u={i0:l,i1:f.i1,bst:null,est:null,tdst:0,left:null,right:null};u.bst={R:[],m:[],N:f.bst.N-c.bst.N};for(s=0;s<16;s++)u.bst.R[s]=f.bst.R[s]-c.bst.R[s];for(s=0;s<4;s++)u.bst.m[s]=f.bst.m[s]-c.bst.m[s];u.est=estats(u.bst),f.left=c,f.right=u,a[o]=c,a.push(u)}a.sort(((e,t)=>t.bst.N-e.bst.N));for(s=0;s<a.length;s++)a[s].ind=s;return[o,a]}function getNearest(e,t,r,i,o){if(null==e.left)return e.tdst=function dist(e,t,r,i,o){const a=t-e[0],s=r-e[1],f=i-e[2],l=o-e[3];return a*a+s*s+f*f+l*l}(e.est.q,t,r,i,o),e;const a=planeDst(e.est,t,r,i,o);let s=e.left,f=e.right;a>0&&(s=e.right,f=e.left);const l=getNearest(s,t,r,i,o);if(l.tdst<=a*a)return l;const c=getNearest(f,t,r,i,o);return c.tdst<l.tdst?c:l}function planeDst(e,t,r,i,o){const{e:a}=e;return a[0]*t+a[1]*r+a[2]*i+a[3]*o-e.eMq}function splitPixels(e,t,r,i,o,a){for(i-=4;r<i;){for(;vecDot(e,r,o)<=a;)r+=4;for(;vecDot(e,i,o)>a;)i-=4;if(r>=i)break;const s=t[r>>2];t[r>>2]=t[i>>2],t[i>>2]=s,r+=4,i-=4}for(;vecDot(e,r,o)>a;)r-=4;return r+4}function vecDot(e,t,r){return e[t]*r[0]+e[t+1]*r[1]+e[t+2]*r[2]+e[t+3]*r[3]}function stats(e,t,r){const i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],o=[0,0,0,0],a=r-t>>2;for(let a=t;a<r;a+=4){const t=e[a]*(1/255),r=e[a+1]*(1/255),s=e[a+2]*(1/255),f=e[a+3]*(1/255);o[0]+=t,o[1]+=r,o[2]+=s,o[3]+=f,i[0]+=t*t,i[1]+=t*r,i[2]+=t*s,i[3]+=t*f,i[5]+=r*r,i[6]+=r*s,i[7]+=r*f,i[10]+=s*s,i[11]+=s*f,i[15]+=f*f}return i[4]=i[1],i[8]=i[2],i[9]=i[6],i[12]=i[3],i[13]=i[7],i[14]=i[11],{R:i,m:o,N:a}}function estats(e){const{R:t}=e,{m:r}=e,{N:i}=e,a=r[0],s=r[1],f=r[2],l=r[3],c=0==i?0:1/i,u=[t[0]-a*a*c,t[1]-a*s*c,t[2]-a*f*c,t[3]-a*l*c,t[4]-s*a*c,t[5]-s*s*c,t[6]-s*f*c,t[7]-s*l*c,t[8]-f*a*c,t[9]-f*s*c,t[10]-f*f*c,t[11]-f*l*c,t[12]-l*a*c,t[13]-l*s*c,t[14]-l*f*c,t[15]-l*l*c],h=u,d=o;let A=[Math.random(),Math.random(),Math.random(),Math.random()],g=0,p=0;if(0!=i)for(let e=0;e<16&&(A=d.multVec(h,A),p=Math.sqrt(d.dot(A,A)),A=d.sml(1/p,A),!(0!=e&&Math.abs(p-g)<1e-9));e++)g=p;const m=[a*c,s*c,f*c,l*c];return{Cov:u,q:m,e:A,L:g,eMq255:d.dot(d.sml(255,m),A),eMq:d.dot(A,m),rgba:(Math.round(255*m[3])<<24|Math.round(255*m[2])<<16|Math.round(255*m[1])<<8|Math.round(255*m[0])<<0)>>>0}}var o={multVec:(e,t)=>[e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],e[4]*t[0]+e[5]*t[1]+e[6]*t[2]+e[7]*t[3],e[8]*t[0]+e[9]*t[1]+e[10]*t[2]+e[11]*t[3],e[12]*t[0]+e[13]*t[1]+e[14]*t[2]+e[15]*t[3]],dot:(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],sml:(e,t)=>[e*t[0],e*t[1],e*t[2],e*t[3]]};UPNG.encode=function encode(e,t,r,i,o,a,s){null==i&&(i=0),null==s&&(s=!1);const f=compress(e,t,r,i,[!1,!1,!1,0,s,!1]);return compressPNG(f,-1),_main(f,t,r,o,a)},UPNG.encodeLL=function encodeLL(e,t,r,i,o,a,s,f){const l={ctype:0+(1==i?0:2)+(0==o?0:4),depth:a,frames:[]},c=(i+o)*a,u=c*t;for(let i=0;i<e.length;i++)l.frames.push({rect:{x:0,y:0,width:t,height:r},img:new Uint8Array(e[i]),blend:0,dispose:1,bpp:Math.ceil(c/8),bpl:Math.ceil(u/8)});return compressPNG(l,0,!0),_main(l,t,r,s,f)},UPNG.encode.compress=compress,UPNG.encode.dither=dither,UPNG.quantize=quantize,UPNG.quantize.getKDtree=getKDtree,UPNG.quantize.getNearest=getNearest}();const r={toArrayBuffer(e,t){const i=e.width,o=e.height,a=i<<2,s=e.getContext(\"2d\").getImageData(0,0,i,o),f=new Uint32Array(s.data.buffer),l=(32*i+31)/32<<2,c=l*o,u=122+c,h=new ArrayBuffer(u),d=new DataView(h),A=1<<20;let g,p,m,w,v=A,b=0,y=0,E=0;function set16(e){d.setUint16(y,e,!0),y+=2}function set32(e){d.setUint32(y,e,!0),y+=4}function seek(e){y+=e}set16(19778),set32(u),seek(4),set32(122),set32(108),set32(i),set32(-o>>>0),set16(1),set16(32),set32(3),set32(c),set32(2835),set32(2835),seek(8),set32(16711680),set32(65280),set32(255),set32(4278190080),set32(1466527264),function convert(){for(;b<o&&v>0;){for(w=122+b*l,g=0;g<a;)v--,p=f[E++],m=p>>>24,d.setUint32(w+g,p<<8|m),g+=4;b++}E<f.length?(v=A,setTimeout(convert,r._dly)):t(h)}()},toBlob(e,t){this.toArrayBuffer(e,(e=>{t(new Blob([e],{type:\"image/bmp\"}))}))},_dly:9};var i={CHROME:\"CHROME\",FIREFOX:\"FIREFOX\",DESKTOP_SAFARI:\"DESKTOP_SAFARI\",IE:\"IE\",IOS:\"IOS\",ETC:\"ETC\"},o={[i.CHROME]:16384,[i.FIREFOX]:11180,[i.DESKTOP_SAFARI]:16384,[i.IE]:8192,[i.IOS]:4096,[i.ETC]:8192};const a=\"undefined\"!=typeof window,s=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,f=a&&window.cordova&&window.cordova.require&&window.cordova.require(\"cordova/modulemapper\"),CustomFile=(a||s)&&(f&&f.getOriginalSymbol(window,\"File\")||\"undefined\"!=typeof File&&File),CustomFileReader=(a||s)&&(f&&f.getOriginalSymbol(window,\"FileReader\")||\"undefined\"!=typeof FileReader&&FileReader);function getFilefromDataUrl(e,t,r=Date.now()){return new Promise((i=>{const o=e.split(\",\"),a=o[0].match(/:(.*?);/)[1],s=globalThis.atob(o[1]);let f=s.length;const l=new Uint8Array(f);for(;f--;)l[f]=s.charCodeAt(f);const c=new Blob([l],{type:a});c.name=t,c.lastModified=r,i(c)}))}function getDataUrlFromFile(e){return new Promise(((t,r)=>{const i=new CustomFileReader;i.onload=()=>t(i.result),i.onerror=e=>r(e),i.readAsDataURL(e)}))}function loadImage(e){return new Promise(((t,r)=>{const i=new Image;i.onload=()=>t(i),i.onerror=e=>r(e),i.src=e}))}function getBrowserName(){if(void 0!==getBrowserName.cachedResult)return getBrowserName.cachedResult;let e=i.ETC;const{userAgent:t}=navigator;return/Chrom(e|ium)/i.test(t)?e=i.CHROME:/iP(ad|od|hone)/i.test(t)&&/WebKit/i.test(t)?e=i.IOS:/Safari/i.test(t)?e=i.DESKTOP_SAFARI:/Firefox/i.test(t)?e=i.FIREFOX:(/MSIE/i.test(t)||!0==!!document.documentMode)&&(e=i.IE),getBrowserName.cachedResult=e,getBrowserName.cachedResult}function approximateBelowMaximumCanvasSizeOfBrowser(e,t){const r=getBrowserName(),i=o[r];let a=e,s=t,f=a*s;const l=a>s?s/a:a/s;for(;f>i*i;){const e=(i+a)/2,t=(i+s)/2;e<t?(s=t,a=t*l):(s=e*l,a=e),f=a*s}return{width:a,height:s}}function getNewCanvasAndCtx(e,t){let r,i;try{if(r=new OffscreenCanvas(e,t),i=r.getContext(\"2d\"),null===i)throw new Error(\"getContext of OffscreenCanvas returns null\")}catch(e){r=document.createElement(\"canvas\"),i=r.getContext(\"2d\")}return r.width=e,r.height=t,[r,i]}function drawImageInCanvas(e,t){const{width:r,height:i}=approximateBelowMaximumCanvasSizeOfBrowser(e.width,e.height),[o,a]=getNewCanvasAndCtx(r,i);return t&&/jpe?g/.test(t)&&(a.fillStyle=\"white\",a.fillRect(0,0,o.width,o.height)),a.drawImage(e,0,0,o.width,o.height),o}function isIOS(){return void 0!==isIOS.cachedResult||(isIOS.cachedResult=[\"iPad Simulator\",\"iPhone Simulator\",\"iPod Simulator\",\"iPad\",\"iPhone\",\"iPod\"].includes(navigator.platform)||navigator.userAgent.includes(\"Mac\")&&\"undefined\"!=typeof document&&\"ontouchend\"in document),isIOS.cachedResult}function drawFileInCanvas(e,t={}){return new Promise((function(r,o){let a,s;var $Try_2_Post=function(){try{return s=drawImageInCanvas(a,t.fileType||e.type),r([a,s])}catch(e){return o(e)}},$Try_2_Catch=function(t){try{0;var $Try_3_Catch=function(e){try{throw e}catch(e){return o(e)}};try{let t;return getDataUrlFromFile(e).then((function(e){try{return t=e,loadImage(t).then((function(e){try{return a=e,function(){try{return $Try_2_Post()}catch(e){return o(e)}}()}catch(e){return $Try_3_Catch(e)}}),$Try_3_Catch)}catch(e){return $Try_3_Catch(e)}}),$Try_3_Catch)}catch(e){$Try_3_Catch(e)}}catch(e){return o(e)}};try{if(isIOS()||[i.DESKTOP_SAFARI,i.MOBILE_SAFARI].includes(getBrowserName()))throw new Error(\"Skip createImageBitmap on IOS and Safari\");return createImageBitmap(e).then((function(e){try{return a=e,$Try_2_Post()}catch(e){return $Try_2_Catch()}}),$Try_2_Catch)}catch(e){$Try_2_Catch()}}))}function canvasToFile(e,t,i,o,a=1){return new Promise((function(s,f){let l;if(\"image/png\"===t){let c,u,h;return c=e.getContext(\"2d\"),({data:u}=c.getImageData(0,0,e.width,e.height)),h=UPNG.encode([u.buffer],e.width,e.height,4096*a),l=new Blob([h],{type:t}),l.name=i,l.lastModified=o,$If_4.call(this)}{if(\"image/bmp\"===t)return new Promise((t=>r.toBlob(e,t))).then(function(e){try{return l=e,l.name=i,l.lastModified=o,$If_5.call(this)}catch(e){return f(e)}}.bind(this),f);{if(\"function\"==typeof OffscreenCanvas&&e instanceof OffscreenCanvas)return e.convertToBlob({type:t,quality:a}).then(function(e){try{return l=e,l.name=i,l.lastModified=o,$If_6.call(this)}catch(e){return f(e)}}.bind(this),f);{let d;return d=e.toDataURL(t,a),getFilefromDataUrl(d,i,o).then(function(e){try{return l=e,$If_6.call(this)}catch(e){return f(e)}}.bind(this),f)}function $If_6(){return $If_5.call(this)}}function $If_5(){return $If_4.call(this)}}function $If_4(){return s(l)}}))}function cleanupCanvasMemory(e){e.width=0,e.height=0}function isAutoOrientationInBrowser(){return new Promise((function(e,t){let r,i,o,a,s;return void 0!==isAutoOrientationInBrowser.cachedResult?e(isAutoOrientationInBrowser.cachedResult):(r=\"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==\",getFilefromDataUrl(\"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==\",\"test.jpg\",Date.now()).then((function(r){try{return i=r,drawFileInCanvas(i).then((function(r){try{return o=r[1],canvasToFile(o,i.type,i.name,i.lastModified).then((function(r){try{return a=r,cleanupCanvasMemory(o),drawFileInCanvas(a).then((function(r){try{return s=r[0],isAutoOrientationInBrowser.cachedResult=1===s.width&&2===s.height,e(isAutoOrientationInBrowser.cachedResult)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t))}))}function getExifOrientation(e){return new Promise(((t,r)=>{const i=new CustomFileReader;i.onload=e=>{const r=new DataView(e.target.result);if(65496!=r.getUint16(0,!1))return t(-2);const i=r.byteLength;let o=2;for(;o<i;){if(r.getUint16(o+2,!1)<=8)return t(-1);const e=r.getUint16(o,!1);if(o+=2,65505==e){if(1165519206!=r.getUint32(o+=2,!1))return t(-1);const e=18761==r.getUint16(o+=6,!1);o+=r.getUint32(o+4,e);const i=r.getUint16(o,e);o+=2;for(let a=0;a<i;a++)if(274==r.getUint16(o+12*a,e))return t(r.getUint16(o+12*a+8,e))}else{if(65280!=(65280&e))break;o+=r.getUint16(o,!1)}}return t(-1)},i.onerror=e=>r(e),i.readAsArrayBuffer(e)}))}function handleMaxWidthOrHeight(e,t){const{width:r}=e,{height:i}=e,{maxWidthOrHeight:o}=t;let a,s=e;return isFinite(o)&&(r>o||i>o)&&([s,a]=getNewCanvasAndCtx(r,i),r>i?(s.width=o,s.height=i/r*o):(s.width=r/i*o,s.height=o),a.drawImage(e,0,0,s.width,s.height),cleanupCanvasMemory(e)),s}function followExifOrientation(e,t){const{width:r}=e,{height:i}=e,[o,a]=getNewCanvasAndCtx(r,i);switch(t>4&&t<9?(o.width=i,o.height=r):(o.width=r,o.height=i),t){case 2:a.transform(-1,0,0,1,r,0);break;case 3:a.transform(-1,0,0,-1,r,i);break;case 4:a.transform(1,0,0,-1,0,i);break;case 5:a.transform(0,1,1,0,0,0);break;case 6:a.transform(0,1,-1,0,i,0);break;case 7:a.transform(0,-1,-1,0,i,r);break;case 8:a.transform(0,-1,1,0,0,r)}return a.drawImage(e,0,0,r,i),cleanupCanvasMemory(e),o}function compress(e,t,r=0){return new Promise((function(i,o){let a,s,f,l,c,u,h,d,A,g,p,m,w,v,b,y,E,F,_,B;function incProgress(e=5){if(t.signal&&t.signal.aborted)throw t.signal.reason;a+=e,t.onProgress(Math.min(a,100))}function setProgress(e){if(t.signal&&t.signal.aborted)throw t.signal.reason;a=Math.min(Math.max(e,a),100),t.onProgress(a)}return a=r,s=t.maxIteration||10,f=1024*t.maxSizeMB*1024,incProgress(),drawFileInCanvas(e,t).then(function(r){try{return[,l]=r,incProgress(),c=handleMaxWidthOrHeight(l,t),incProgress(),new Promise((function(r,i){var o;if(!(o=t.exifOrientation))return getExifOrientation(e).then(function(e){try{return o=e,$If_2.call(this)}catch(e){return i(e)}}.bind(this),i);function $If_2(){return r(o)}return $If_2.call(this)})).then(function(r){try{return u=r,incProgress(),isAutoOrientationInBrowser().then(function(r){try{return h=r?c:followExifOrientation(c,u),incProgress(),d=t.initialQuality||1,A=t.fileType||e.type,canvasToFile(h,A,e.name,e.lastModified,d).then(function(r){try{{if(g=r,incProgress(),p=g.size>f,m=g.size>e.size,!p&&!m)return setProgress(100),i(g);var a;function $Loop_3(){if(s--&&(b>f||b>w)){let t,r;return t=B?.95*_.width:_.width,r=B?.95*_.height:_.height,[E,F]=getNewCanvasAndCtx(t,r),F.drawImage(_,0,0,t,r),d*=\"image/png\"===A?.85:.95,canvasToFile(E,A,e.name,e.lastModified,d).then((function(e){try{return y=e,cleanupCanvasMemory(_),_=E,b=y.size,setProgress(Math.min(99,Math.floor((v-b)/(v-f)*100))),$Loop_3}catch(e){return o(e)}}),o)}return[1]}return w=e.size,v=g.size,b=v,_=h,B=!t.alwaysKeepResolution&&p,(a=function(e){for(;e;){if(e.then)return void e.then(a,o);try{if(e.pop){if(e.length)return e.pop()?$Loop_3_exit.call(this):e;e=$Loop_3}else e=e.call(this)}catch(e){return o(e)}}}.bind(this))($Loop_3);function $Loop_3_exit(){return cleanupCanvasMemory(_),cleanupCanvasMemory(E),cleanupCanvasMemory(c),cleanupCanvasMemory(h),cleanupCanvasMemory(l),setProgress(100),i(y)}}}catch(u){return o(u)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}))}const l=\"\\nlet scriptImported = false\\nself.addEventListener('message', async (e) => {\\n const { file, id, imageCompressionLibUrl, options } = e.data\\n options.onProgress = (progress) => self.postMessage({ progress, id })\\n try {\\n if (!scriptImported) {\\n // console.log('[worker] importScripts', imageCompressionLibUrl)\\n self.importScripts(imageCompressionLibUrl)\\n scriptImported = true\\n }\\n // console.log('[worker] self', self)\\n const compressedFile = await imageCompression(file, options)\\n self.postMessage({ file: compressedFile, id })\\n } catch (e) {\\n // console.error('[worker] error', e)\\n self.postMessage({ error: e.message + '\\\\n' + e.stack, id })\\n }\\n})\\n\";let c;function compressOnWebWorker(e,t){return new Promise(((r,i)=>{c||(c=function createWorkerScriptURL(e){const t=[];return\"function\"==typeof e?t.push(`(${e})()`):t.push(e),URL.createObjectURL(new Blob(t))}(l));const o=new Worker(c);o.addEventListener(\"message\",(function handler(e){if(t.signal&&t.signal.aborted)o.terminate();else if(void 0===e.data.progress){if(e.data.error)return i(new Error(e.data.error)),void o.terminate();r(e.data.file),o.terminate()}else t.onProgress(e.data.progress)})),o.addEventListener(\"error\",i),t.signal&&t.signal.addEventListener(\"abort\",(()=>{i(t.signal.reason),o.terminate()})),o.postMessage({file:e,imageCompressionLibUrl:t.libURL,options:{...t,onProgress:void 0,signal:void 0}})}))}function imageCompression(e,t){return new Promise((function(r,i){let o,a,s,f,l,c;if(o={...t},s=0,({onProgress:f}=o),o.maxSizeMB=o.maxSizeMB||Number.POSITIVE_INFINITY,l=\"boolean\"!=typeof o.useWebWorker||o.useWebWorker,delete o.useWebWorker,o.onProgress=e=>{s=e,\"function\"==typeof f&&f(s)},!(e instanceof Blob||e instanceof CustomFile))return i(new Error(\"The file given is not an instance of Blob or File\"));if(!/^image/.test(e.type))return i(new Error(\"The file given is not an image\"));if(c=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,!l||\"function\"!=typeof Worker||c)return compress(e,o).then(function(e){try{return a=e,$If_4.call(this)}catch(e){return i(e)}}.bind(this),i);var u=function(){try{return $If_4.call(this)}catch(e){return i(e)}}.bind(this),$Try_1_Catch=function(t){try{return compress(e,o).then((function(e){try{return a=e,u()}catch(e){return i(e)}}),i)}catch(e){return i(e)}};try{return o.libURL=o.libURL||\"https://cdn.jsdelivr.net/npm/browser-image-compression@2.0.2/dist/browser-image-compression.js\",compressOnWebWorker(e,o).then((function(e){try{return a=e,u()}catch(e){return $Try_1_Catch()}}),$Try_1_Catch)}catch(e){$Try_1_Catch()}function $If_4(){try{a.name=e.name,a.lastModified=e.lastModified}catch(e){}try{o.preserveExif&&\"image/jpeg\"===e.type&&(!o.fileType||o.fileType&&o.fileType===e.type)&&(a=copyExifWithoutOrientation(e,a))}catch(e){}return r(a)}}))}imageCompression.getDataUrlFromFile=getDataUrlFromFile,imageCompression.getFilefromDataUrl=getFilefromDataUrl,imageCompression.loadImage=loadImage,imageCompression.drawImageInCanvas=drawImageInCanvas,imageCompression.drawFileInCanvas=drawFileInCanvas,imageCompression.canvasToFile=canvasToFile,imageCompression.getExifOrientation=getExifOrientation,imageCompression.handleMaxWidthOrHeight=handleMaxWidthOrHeight,imageCompression.followExifOrientation=followExifOrientation,imageCompression.cleanupCanvasMemory=cleanupCanvasMemory,imageCompression.isAutoOrientationInBrowser=isAutoOrientationInBrowser,imageCompression.approximateBelowMaximumCanvasSizeOfBrowser=approximateBelowMaximumCanvasSizeOfBrowser,imageCompression.copyExifWithoutOrientation=copyExifWithoutOrientation,imageCompression.getBrowserName=getBrowserName,imageCompression.version=\"2.0.2\";\n//# sourceMappingURL=browser-image-compression.mjs.map\n\n\n//# sourceURL=webpack:///./node_modules/browser-image-compression/dist/browser-image-compression.mjs?");
100
101 /***/ }),
102
103 /***/ "./node_modules/wasm-feature-detect/dist/esm/index.js":
104 /*!************************************************************!*\
105 !*** ./node_modules/wasm-feature-detect/dist/esm/index.js ***!
106 \************************************************************/
107 /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
108
109 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bigInt\": () => (/* binding */ bigInt),\n/* harmony export */ \"bulkMemory\": () => (/* binding */ bulkMemory),\n/* harmony export */ \"exceptions\": () => (/* binding */ exceptions),\n/* harmony export */ \"extendedConst\": () => (/* binding */ extendedConst),\n/* harmony export */ \"gc\": () => (/* binding */ gc),\n/* harmony export */ \"memory64\": () => (/* binding */ memory64),\n/* harmony export */ \"multiValue\": () => (/* binding */ multiValue),\n/* harmony export */ \"mutableGlobals\": () => (/* binding */ mutableGlobals),\n/* harmony export */ \"referenceTypes\": () => (/* binding */ referenceTypes),\n/* harmony export */ \"relaxedSimd\": () => (/* binding */ relaxedSimd),\n/* harmony export */ \"saturatedFloatToInt\": () => (/* binding */ saturatedFloatToInt),\n/* harmony export */ \"signExtensions\": () => (/* binding */ signExtensions),\n/* harmony export */ \"simd\": () => (/* binding */ simd),\n/* harmony export */ \"streamingCompilation\": () => (/* binding */ streamingCompilation),\n/* harmony export */ \"tailCall\": () => (/* binding */ tailCall),\n/* harmony export */ \"threads\": () => (/* binding */ threads)\n/* harmony export */ });\nconst bigInt=()=>(async e=>{try{return(await WebAssembly.instantiate(e)).instance.exports.b(BigInt(0))===BigInt(0)}catch(e){return!1}})(new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,1,126,1,126,3,2,1,0,7,5,1,1,98,0,0,10,6,1,4,0,32,0,11])),bulkMemory=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,3,1,0,1,10,14,1,12,0,65,0,65,0,65,0,252,10,0,0,11])),exceptions=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,6,64,25,11,11])),extendedConst=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,5,3,1,0,1,11,9,1,0,65,1,65,2,106,11,0])),gc=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,10,2,95,1,125,0,96,0,1,107,0,3,2,1,1,10,12,1,10,0,67,0,0,0,0,251,7,0,11])),memory64=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,5,3,1,4,1])),multiValue=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,0,2,127,127,3,2,1,0,10,8,1,6,0,65,0,65,0,11])),mutableGlobals=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,2,8,1,1,97,1,98,3,127,1,6,6,1,127,1,65,0,11,7,5,1,1,97,3,1])),referenceTypes=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,7,1,5,0,208,112,26,11])),relaxedSimd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,15,1,13,0,65,1,253,15,65,2,253,15,253,128,2,11])),saturatedFloatToInt=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,12,1,10,0,67,0,0,0,0,252,0,26,11])),signExtensions=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,65,0,192,26,11])),simd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11])),streamingCompilation=()=>(async()=>\"compileStreaming\"in WebAssembly)(),tailCall=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,6,1,4,0,18,0,11])),threads=()=>(async e=>{try{return\"undefined\"!=typeof MessageChannel&&(new MessageChannel).port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(e)}catch(e){return!1}})(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]));\n\n\n//# sourceURL=webpack:///./node_modules/wasm-feature-detect/dist/esm/index.js?");
110
111 /***/ })
112
113 /******/ });
114 /************************************************************************/
115 /******/ // The module cache
116 /******/ var __webpack_module_cache__ = {};
117 /******/
118 /******/ // The require function
119 /******/ function __webpack_require__(moduleId) {
120 /******/ // Check if module is in cache
121 /******/ var cachedModule = __webpack_module_cache__[moduleId];
122 /******/ if (cachedModule !== undefined) {
123 /******/ return cachedModule.exports;
124 /******/ }
125 /******/ // Create a new module (and put it into the cache)
126 /******/ var module = __webpack_module_cache__[moduleId] = {
127 /******/ // no module.id needed
128 /******/ // no module.loaded needed
129 /******/ exports: {}
130 /******/ };
131 /******/
132 /******/ // Execute the module function
133 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
134 /******/
135 /******/ // Return the exports of the module
136 /******/ return module.exports;
137 /******/ }
138 /******/
139 /******/ // expose the modules object (__webpack_modules__)
140 /******/ __webpack_require__.m = __webpack_modules__;
141 /******/
142 /************************************************************************/
143 /******/ /* webpack/runtime/define property getters */
144 /******/ (() => {
145 /******/ // define getter functions for harmony exports
146 /******/ __webpack_require__.d = (exports, definition) => {
147 /******/ for(var key in definition) {
148 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
149 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
150 /******/ }
151 /******/ }
152 /******/ };
153 /******/ })();
154 /******/
155 /******/ /* webpack/runtime/ensure chunk */
156 /******/ (() => {
157 /******/ __webpack_require__.f = {};
158 /******/ // This file contains only the entry chunk.
159 /******/ // The chunk loading function for additional chunks
160 /******/ __webpack_require__.e = (chunkId) => {
161 /******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
162 /******/ __webpack_require__.f[key](chunkId, promises);
163 /******/ return promises;
164 /******/ }, []));
165 /******/ };
166 /******/ })();
167 /******/
168 /******/ /* webpack/runtime/get javascript chunk filename */
169 /******/ (() => {
170 /******/ // This function allow to reference async chunks
171 /******/ __webpack_require__.u = (chunkId) => {
172 /******/ // return url for filenames based on template
173 /******/ return "" + chunkId + ".bundle.js";
174 /******/ };
175 /******/ })();
176 /******/
177 /******/ /* webpack/runtime/global */
178 /******/ (() => {
179 /******/ __webpack_require__.g = (function() {
180 /******/ if (typeof globalThis === 'object') return globalThis;
181 /******/ try {
182 /******/ return this || new Function('return this')();
183 /******/ } catch (e) {
184 /******/ if (typeof window === 'object') return window;
185 /******/ }
186 /******/ })();
187 /******/ })();
188 /******/
189 /******/ /* webpack/runtime/hasOwnProperty shorthand */
190 /******/ (() => {
191 /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
192 /******/ })();
193 /******/
194 /******/ /* webpack/runtime/load script */
195 /******/ (() => {
196 /******/ var inProgress = {};
197 /******/ // data-webpack is not used as build has no uniqueName
198 /******/ // loadScript function to load a script via script tag
199 /******/ __webpack_require__.l = (url, done, key, chunkId) => {
200 /******/ if(inProgress[url]) { inProgress[url].push(done); return; }
201 /******/ var script, needAttach;
202 /******/ if(key !== undefined) {
203 /******/ var scripts = document.getElementsByTagName("script");
204 /******/ for(var i = 0; i < scripts.length; i++) {
205 /******/ var s = scripts[i];
206 /******/ if(s.getAttribute("src") == url) { script = s; break; }
207 /******/ }
208 /******/ }
209 /******/ if(!script) {
210 /******/ needAttach = true;
211 /******/ script = document.createElement('script');
212 /******/
213 /******/ script.charset = 'utf-8';
214 /******/ script.timeout = 120;
215 /******/ if (__webpack_require__.nc) {
216 /******/ script.setAttribute("nonce", __webpack_require__.nc);
217 /******/ }
218 /******/
219 /******/ script.src = url;
220 /******/ }
221 /******/ inProgress[url] = [done];
222 /******/ var onScriptComplete = (prev, event) => {
223 /******/ // avoid mem leaks in IE.
224 /******/ script.onerror = script.onload = null;
225 /******/ clearTimeout(timeout);
226 /******/ var doneFns = inProgress[url];
227 /******/ delete inProgress[url];
228 /******/ script.parentNode && script.parentNode.removeChild(script);
229 /******/ doneFns && doneFns.forEach((fn) => (fn(event)));
230 /******/ if(prev) return prev(event);
231 /******/ }
232 /******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);
233 /******/ script.onerror = onScriptComplete.bind(null, script.onerror);
234 /******/ script.onload = onScriptComplete.bind(null, script.onload);
235 /******/ needAttach && document.head.appendChild(script);
236 /******/ };
237 /******/ })();
238 /******/
239 /******/ /* webpack/runtime/make namespace object */
240 /******/ (() => {
241 /******/ // define __esModule on exports
242 /******/ __webpack_require__.r = (exports) => {
243 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
244 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
245 /******/ }
246 /******/ Object.defineProperty(exports, '__esModule', { value: true });
247 /******/ };
248 /******/ })();
249 /******/
250 /******/ /* webpack/runtime/publicPath */
251 /******/ (() => {
252 /******/ var scriptUrl;
253 /******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + "";
254 /******/ var document = __webpack_require__.g.document;
255 /******/ if (!scriptUrl && document) {
256 /******/ if (document.currentScript)
257 /******/ scriptUrl = document.currentScript.src;
258 /******/ if (!scriptUrl) {
259 /******/ var scripts = document.getElementsByTagName("script");
260 /******/ if(scripts.length) scriptUrl = scripts[scripts.length - 1].src
261 /******/ }
262 /******/ }
263 /******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration
264 /******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic.
265 /******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser");
266 /******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/");
267 /******/ __webpack_require__.p = scriptUrl;
268 /******/ })();
269 /******/
270 /******/ /* webpack/runtime/jsonp chunk loading */
271 /******/ (() => {
272 /******/ __webpack_require__.b = document.baseURI || self.location.href;
273 /******/
274 /******/ // object to store loaded and loading chunks
275 /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
276 /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
277 /******/ var installedChunks = {
278 /******/ "script": 0
279 /******/ };
280 /******/
281 /******/ __webpack_require__.f.j = (chunkId, promises) => {
282 /******/ // JSONP chunk loading for javascript
283 /******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;
284 /******/ if(installedChunkData !== 0) { // 0 means "already installed".
285 /******/
286 /******/ // a Promise means "currently loading".
287 /******/ if(installedChunkData) {
288 /******/ promises.push(installedChunkData[2]);
289 /******/ } else {
290 /******/ if(true) { // all chunks have JS
291 /******/ // setup Promise in chunk cache
292 /******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));
293 /******/ promises.push(installedChunkData[2] = promise);
294 /******/
295 /******/ // start chunk loading
296 /******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId);
297 /******/ // create error before stack unwound to get useful stacktrace later
298 /******/ var error = new Error();
299 /******/ var loadingEnded = (event) => {
300 /******/ if(__webpack_require__.o(installedChunks, chunkId)) {
301 /******/ installedChunkData = installedChunks[chunkId];
302 /******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined;
303 /******/ if(installedChunkData) {
304 /******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type);
305 /******/ var realSrc = event && event.target && event.target.src;
306 /******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
307 /******/ error.name = 'ChunkLoadError';
308 /******/ error.type = errorType;
309 /******/ error.request = realSrc;
310 /******/ installedChunkData[1](error);
311 /******/ }
312 /******/ }
313 /******/ };
314 /******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId);
315 /******/ } else installedChunks[chunkId] = 0;
316 /******/ }
317 /******/ }
318 /******/ };
319 /******/
320 /******/ // no prefetching
321 /******/
322 /******/ // no preloaded
323 /******/
324 /******/ // no HMR
325 /******/
326 /******/ // no HMR manifest
327 /******/
328 /******/ // no on chunks loaded
329 /******/
330 /******/ // install a JSONP callback for chunk loading
331 /******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
332 /******/ var [chunkIds, moreModules, runtime] = data;
333 /******/ // add "moreModules" to the modules object,
334 /******/ // then flag all "chunkIds" as loaded and fire callback
335 /******/ var moduleId, chunkId, i = 0;
336 /******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
337 /******/ for(moduleId in moreModules) {
338 /******/ if(__webpack_require__.o(moreModules, moduleId)) {
339 /******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
340 /******/ }
341 /******/ }
342 /******/ if(runtime) var result = runtime(__webpack_require__);
343 /******/ }
344 /******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
345 /******/ for(;i < chunkIds.length; i++) {
346 /******/ chunkId = chunkIds[i];
347 /******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
348 /******/ installedChunks[chunkId][0]();
349 /******/ }
350 /******/ installedChunks[chunkId] = 0;
351 /******/ }
352 /******/
353 /******/ }
354 /******/
355 /******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || [];
356 /******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
357 /******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
358 /******/ })();
359 /******/
360 /************************************************************************/
361 /******/
362 /******/ // startup
363 /******/ // Load entry module and return exports
364 /******/ // This entry module can't be inlined because the eval devtool is used.
365 /******/ var __webpack_exports__ = __webpack_require__("./assets/js/script.js");
366 /******/
367 /******/ })()
368 ;