@pictx/gemini-veo-watermark-remover 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +313 -0
- package/assets/masks/bg_48.png +0 -0
- package/assets/masks/bg_96.png +0 -0
- package/assets/masks/bg_b_36.png +0 -0
- package/assets/masks/bg_b_96.png +0 -0
- package/assets/masks/veo_legacy_68x30.png +0 -0
- package/assets/masks/veo_legacy_99x43.png +0 -0
- package/bin/pictx.mjs +4 -0
- package/dist/browser.d.ts +65 -0
- package/dist/browser.js +1211 -0
- package/dist/browser.js.map +7 -0
- package/dist/cli.js +10633 -0
- package/dist/cli.js.map +7 -0
- package/dist/gemini.d.ts +1 -0
- package/dist/gemini.js +596 -0
- package/dist/gemini.js.map +7 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +9610 -0
- package/dist/index.js.map +7 -0
- package/dist/node.d.ts +1 -0
- package/dist/node.js +853 -0
- package/dist/node.js.map +7 -0
- package/dist/pictx-extension-v0.2.1.zip +0 -0
- package/package.json +82 -0
- package/skills/gemini-veo-watermark-remover/SKILL.md +76 -0
- package/skills/gemini-veo-watermark-remover/scripts/run.mjs +36 -0
- package/src/extension/background.js +57 -0
- package/src/extension/content.js +569 -0
- package/src/extension/icons/icon128.png +0 -0
- package/src/extension/icons/icon16.png +0 -0
- package/src/extension/icons/icon48.png +0 -0
- package/src/extension/manifest.json +37 -0
- package/src/extension/popup.html +266 -0
- package/src/extension/popup.js +31 -0
- package/src/userscript/gemini-veo-watermark-remover.user.js +594 -0
package/dist/node.js.map
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/video/videoDecoder.base.js", "../src/video/videoDecoder.ffmpeg.js", "../src/video/videoEncoder.base.js", "../src/video/videoEncoder.ffmpeg.js", "../src/sdk/node.js", "../src/video/videoDecoder.webcodecs.js", "../src/video/videoDecoder.js", "../src/video/videoEncoder.webcodecs.js", "../src/video/videoEncoder.js", "../src/core/blendModes.js", "../src/core/veoConfig.js", "../src/core/calibratedAlphaData.js", "../src/core/embeddedAlphaMaps.js", "../src/core/frameProcessor.js", "../src/video/pipeline.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * Shared video decoder types and base class.\n */\n\n/**\n * @typedef {Object} VideoInfo\n * @property {number} width\n * @property {number} height\n * @property {number} frameCount\n * @property {number} duration\n * @property {number} fps\n * @property {string} codec\n */\n\n/**\n * @typedef {Object} DecodedFrame\n * @property {ImageData} imageData\n * @property {number} timestamp\n * @property {number} frameIndex\n */\n\nexport class VideoDecoderBase {\n async open(/* source */) {\n throw new Error('Not implemented');\n }\n\n async *decodeFrames() {\n throw new Error('Not implemented');\n }\n\n async extractAudio() {\n return null;\n }\n\n async close() {}\n}\n", "/**\n * ffmpeg.wasm-based video decoder (Node.js / fallback).\n */\n\nimport { VideoDecoderBase } from './videoDecoder.base.js';\n\nexport class FfmpegDecoder extends VideoDecoderBase {\n #ffmpeg = null;\n #videoInfo = null;\n #inputName = 'input.mp4';\n\n async open(source) {\n const { FFmpeg } = await import('@ffmpeg/ffmpeg');\n const { fetchFile } = await import('@ffmpeg/util');\n\n this.#ffmpeg = new FFmpeg();\n await this.#ffmpeg.load();\n\n const data =\n source instanceof Uint8Array\n ? source\n : new Uint8Array(await fetchFile(source));\n await this.#ffmpeg.writeFile(this.#inputName, data);\n\n let probeOutput = '';\n this.#ffmpeg.on('log', ({ message }) => {\n probeOutput += `${message}\\n`;\n });\n\n await this.#ffmpeg.exec(['-i', this.#inputName, '-f', 'null', '-frames:v', '0', '-']);\n\n const sizeMatch = probeOutput.match(/(\\d{3,5})x(\\d{3,5})/);\n const fpsMatch = probeOutput.match(/([\\d.]+)\\s*fps/);\n const durMatch = probeOutput.match(/Duration:\\s*([\\d:.]+)/);\n\n const width = sizeMatch ? Number.parseInt(sizeMatch[1], 10) : 0;\n const height = sizeMatch ? Number.parseInt(sizeMatch[2], 10) : 0;\n const fps = fpsMatch ? Number.parseFloat(fpsMatch[1]) : 30;\n\n let duration = 0;\n if (durMatch) {\n const parts = durMatch[1].split(':').map(Number);\n duration = parts[0] * 3600 + parts[1] * 60 + parts[2];\n }\n\n this.#videoInfo = {\n width,\n height,\n frameCount: Math.round(duration * fps),\n duration,\n fps,\n codec: 'unknown',\n };\n\n return this.#videoInfo;\n }\n\n async *decodeFrames() {\n if (!this.#ffmpeg || !this.#videoInfo) {\n throw new Error('Call open() first');\n }\n\n const { width, height, fps } = this.#videoInfo;\n const rawName = 'frames.raw';\n\n await this.#ffmpeg.exec([\n '-i',\n this.#inputName,\n '-f',\n 'rawvideo',\n '-pix_fmt',\n 'rgba',\n rawName,\n ]);\n\n const rawData = await this.#ffmpeg.readFile(rawName);\n const frameSize = width * height * 4;\n const totalFrames = Math.floor(rawData.length / frameSize);\n\n for (let i = 0; i < totalFrames; i++) {\n const offset = i * frameSize;\n const pixels = new Uint8ClampedArray(\n rawData.buffer,\n rawData.byteOffset + offset,\n frameSize,\n );\n const imageData = new ImageData(pixels, width, height);\n\n yield {\n imageData,\n timestamp: (i / fps) * 1_000_000,\n frameIndex: i,\n };\n }\n\n await this.#ffmpeg.deleteFile(rawName);\n }\n\n async extractAudio() {\n if (!this.#ffmpeg) return null;\n\n try {\n const audioName = 'audio.aac';\n await this.#ffmpeg.exec(['-i', this.#inputName, '-vn', '-acodec', 'copy', audioName]);\n const audioData = await this.#ffmpeg.readFile(audioName);\n await this.#ffmpeg.deleteFile(audioName);\n return audioData;\n } catch {\n return null;\n }\n }\n\n async close() {\n if (this.#ffmpeg) {\n try {\n await this.#ffmpeg.deleteFile(this.#inputName);\n } catch {}\n this.#ffmpeg = null;\n }\n this.#videoInfo = null;\n }\n}\n", "/**\n * Shared video encoder types and base class.\n */\n\n/**\n * @typedef {Object} EncoderConfig\n * @property {number} width\n * @property {number} height\n * @property {number} fps\n * @property {number} [bitrate]\n * @property {string} [codec]\n */\n\nexport class VideoEncoderBase {\n async init(/* config */) {\n throw new Error('Not implemented');\n }\n\n async encodeFrame(/* imageData, timestamp */) {\n throw new Error('Not implemented');\n }\n\n async setAudioTrack(/* audioData */) {\n throw new Error('Not implemented');\n }\n\n async finalize() {\n throw new Error('Not implemented');\n }\n}\n", "/**\n * ffmpeg.wasm encoder (Node.js / fallback).\n */\n\nimport { VideoEncoderBase } from './videoEncoder.base.js';\n\nexport class FfmpegEncoder extends VideoEncoderBase {\n #ffmpeg = null;\n #config = null;\n #frameIndex = 0;\n #audioData = null;\n\n async init(config) {\n const { FFmpeg } = await import('@ffmpeg/ffmpeg');\n this.#ffmpeg = new FFmpeg();\n await this.#ffmpeg.load();\n this.#config = config;\n this.#frameIndex = 0;\n }\n\n async encodeFrame(imageData) {\n const frameName = `frame_${String(this.#frameIndex).padStart(6, '0')}.raw`;\n await this.#ffmpeg.writeFile(frameName, new Uint8Array(imageData.data.buffer));\n this.#frameIndex++;\n }\n\n async setAudioTrack(audioData) {\n if (audioData) {\n await this.#ffmpeg.writeFile('audio.aac', audioData);\n this.#audioData = true;\n }\n }\n\n async finalize() {\n const { width, height, fps, bitrate } = this.#config;\n\n const args = [\n '-f',\n 'rawvideo',\n '-pix_fmt',\n 'rgba',\n '-s',\n `${width}x${height}`,\n '-r',\n String(fps),\n '-i',\n 'frame_%06d.raw',\n ];\n\n if (this.#audioData) {\n args.push('-i', 'audio.aac', '-c:a', 'copy');\n }\n\n args.push(\n '-c:v',\n 'libx264',\n '-b:v',\n String(bitrate || 5_000_000),\n '-pix_fmt',\n 'yuv420p',\n '-movflags',\n '+faststart',\n 'output.mp4',\n );\n\n await this.#ffmpeg.exec(args);\n const data = await this.#ffmpeg.readFile('output.mp4');\n\n for (let i = 0; i < this.#frameIndex; i++) {\n const name = `frame_${String(i).padStart(6, '0')}.raw`;\n try {\n await this.#ffmpeg.deleteFile(name);\n } catch {}\n }\n try {\n await this.#ffmpeg.deleteFile('output.mp4');\n } catch {}\n if (this.#audioData) {\n try {\n await this.#ffmpeg.deleteFile('audio.aac');\n } catch {}\n }\n\n return data;\n }\n}\n", "/**\n * Node.js SDK entry point.\n * Provides file-system based APIs using ffmpeg.wasm backend.\n */\n\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { processVideo } from '../video/pipeline.js';\n\nexport { removeWatermark } from '../core/blendModes.js';\nexport { processFrame, createFrameProcessor } from '../core/frameProcessor.js';\nexport {\n getVeoWatermarkInfo,\n detectVeoWatermarkConfig,\n calculateWatermarkPosition,\n normalizeVideoWatermarkProfile,\n GEMINI_DIAMOND_VIDEO_CATALOG,\n LEGACY_VEO_TEXT_CATALOG,\n VIDEO_WATERMARK_PROFILES,\n VEO_WATERMARK_CATALOG,\n} from '../core/veoConfig.js';\nexport { getEmbeddedAlphaMap, registerAlphaMap } from '../core/embeddedAlphaMaps.js';\nexport { processVideo } from '../video/pipeline.js';\n\n/**\n * Process a video file from disk and write result to output path.\n *\n * @param {string} inputPath - Source video file path\n * @param {string} outputPath - Destination file path\n * @param {{ onProgress?: (current: number, total: number) => void, videoProfile?: 'diamond'|'legacy' }} options\n */\nexport async function processVideoFile(inputPath, outputPath, options = {}) {\n const inputData = await readFile(inputPath);\n const result = await processVideo(new Uint8Array(inputData), {\n environment: 'node',\n ...options,\n });\n\n const output = result instanceof Blob\n ? new Uint8Array(await result.arrayBuffer())\n : result;\n\n await writeFile(outputPath, output);\n return {\n inputPath,\n outputPath,\n size: output.length,\n profile: result.videoProfile,\n processedFrames: result.processedFrames,\n skippedFrames: result.skippedFrames,\n skipped: result.skipped,\n reason: result.reason,\n };\n}\n", "/**\n * WebCodecs-based video decoder (browser only).\n */\n\nimport { VideoDecoderBase } from './videoDecoder.base.js';\n\nexport class WebCodecsDecoder extends VideoDecoderBase {\n #videoInfo = null;\n #videoMp4 = null;\n #sourceBuffer = null;\n #frameIndex = 0;\n #audioData = null;\n\n async open(source) {\n if (typeof VideoDecoder === 'undefined') {\n throw new Error('WebCodecs API not available. Use Chrome 94+ or a fallback decoder.');\n }\n\n this.#sourceBuffer = await source.arrayBuffer();\n const { createFile } = await import('mp4box');\n\n const probeFile = createFile();\n const info = await new Promise((resolve, reject) => {\n probeFile.onReady = resolve;\n probeFile.onError = reject;\n this.#sourceBuffer.fileStart = 0;\n probeFile.appendBuffer(this.#sourceBuffer);\n probeFile.flush();\n });\n\n const videoTrack = info.videoTracks[0];\n if (!videoTrack) {\n throw new Error('No video track found');\n }\n\n this.#videoInfo = {\n width: videoTrack.video.width,\n height: videoTrack.video.height,\n frameCount: videoTrack.nb_samples,\n duration: videoTrack.duration / videoTrack.timescale,\n fps: videoTrack.nb_samples / (videoTrack.duration / videoTrack.timescale),\n codec: videoTrack.codec,\n videoTrackId: videoTrack.id,\n };\n\n const audioTrack = info.audioTracks?.[0] ?? null;\n if (audioTrack) {\n this.#audioData = await this.#readTrackSamples(createFile, audioTrack);\n }\n\n this.#videoMp4 = createFile();\n await new Promise((resolve, reject) => {\n this.#videoMp4.onReady = resolve;\n this.#videoMp4.onError = reject;\n const buffer = this.#sourceBuffer.slice(0);\n buffer.fileStart = 0;\n this.#videoMp4.appendBuffer(buffer);\n this.#videoMp4.flush();\n });\n\n return this.#videoInfo;\n }\n\n /**\n * @param {typeof import('mp4box').createFile} createFile\n * @param {object} track\n */\n async #readTrackSamples(createFile, track) {\n const mp4 = createFile();\n const samples = [];\n\n await new Promise((resolve, reject) => {\n mp4.onReady = () => {\n mp4.onSamples = (_trackId, _user, trackSamples) => {\n for (const sample of trackSamples) {\n samples.push({\n data: sample.data,\n timestamp: Math.round((sample.cts * 1_000_000) / sample.timescale),\n duration: Math.round((sample.duration * 1_000_000) / sample.timescale),\n type: sample.is_sync ? 'key' : 'delta',\n });\n }\n };\n mp4.setExtractionOptions(track.id);\n mp4.start();\n mp4.flush();\n queueMicrotask(resolve);\n };\n mp4.onError = reject;\n const buffer = this.#sourceBuffer.slice(0);\n buffer.fileStart = 0;\n mp4.appendBuffer(buffer);\n mp4.flush();\n });\n\n return {\n codec: 'aac',\n sampleRate: track.audio?.sample_rate ?? 48000,\n numberOfChannels: track.audio?.channel_count ?? 2,\n samples,\n };\n }\n\n async extractAudio() {\n return this.#audioData;\n }\n\n async *decodeFrames() {\n if (!this.#videoMp4 || !this.#videoInfo) {\n throw new Error('Call open() first');\n }\n\n const { width, height, videoTrackId } = this.#videoInfo;\n const pendingFrames = [];\n let resolveNext = null;\n let done = false;\n\n const decoder = new VideoDecoder({\n output: (frame) => {\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext('2d');\n ctx.drawImage(frame, 0, 0);\n const imageData = ctx.getImageData(0, 0, width, height);\n\n const decoded = {\n imageData,\n timestamp: frame.timestamp,\n frameIndex: this.#frameIndex++,\n };\n\n frame.close();\n\n if (resolveNext) {\n const r = resolveNext;\n resolveNext = null;\n r(decoded);\n } else {\n pendingFrames.push(decoded);\n }\n },\n error: (e) => {\n console.error('Decoder error:', e);\n done = true;\n },\n });\n\n decoder.configure({\n codec: this.#videoInfo.codec,\n codedWidth: width,\n codedHeight: height,\n });\n\n this.#videoMp4.onSamples = (_trackId, _user, trackSamples) => {\n for (const sample of trackSamples) {\n const chunk = new EncodedVideoChunk({\n type: sample.is_sync ? 'key' : 'delta',\n timestamp: (sample.cts * 1_000_000) / sample.timescale,\n duration: (sample.duration * 1_000_000) / sample.timescale,\n data: sample.data,\n });\n decoder.decode(chunk);\n }\n };\n\n this.#videoMp4.setExtractionOptions(videoTrackId);\n this.#videoMp4.start();\n\n while (!done) {\n if (pendingFrames.length > 0) {\n yield pendingFrames.shift();\n } else {\n const frame = await new Promise((resolve) => {\n resolveNext = resolve;\n if (decoder.decodeQueueSize === 0) {\n decoder.flush().then(() => {\n done = true;\n resolve(null);\n });\n }\n });\n if (frame) yield frame;\n else break;\n }\n }\n\n decoder.close();\n }\n\n async close() {\n this.#videoMp4 = null;\n this.#videoInfo = null;\n this.#audioData = null;\n this.#sourceBuffer = null;\n this.#frameIndex = 0;\n }\n}\n", "/**\n * Video decoder factory \u2014 selects WebCodecs or ffmpeg based on environment.\n */\n\nimport { WebCodecsDecoder } from './videoDecoder.webcodecs.js';\n\nexport { VideoDecoderBase } from './videoDecoder.base.js';\nexport { WebCodecsDecoder } from './videoDecoder.webcodecs.js';\n\n/**\n * @param {'browser' | 'node' | 'auto'} [environment]\n */\nexport function createDecoder(environment = 'auto') {\n if (\n environment === 'browser' ||\n (environment === 'auto' && typeof VideoDecoder !== 'undefined')\n ) {\n return new WebCodecsDecoder();\n }\n\n throw new Error(\n 'Node.js decoding requires createNodeDecoder() from videoDecoder.ffmpeg.js',\n );\n}\n\n/** Lazy-load ffmpeg decoder for Node.js CLI usage. */\nexport async function createNodeDecoder() {\n const { FfmpegDecoder } = await import('./videoDecoder.ffmpeg.js');\n return new FfmpegDecoder();\n}\n", "/**\n * WebCodecs + mp4-muxer encoder (browser).\n */\n\nimport { VideoEncoderBase } from './videoEncoder.base.js';\n\nexport class WebCodecsEncoder extends VideoEncoderBase {\n #muxer = null;\n #encoder = null;\n #frameCount = 0;\n #audioSamples = null;\n _target = null;\n\n async init(config) {\n if (typeof VideoEncoder === 'undefined') {\n throw new Error('WebCodecs API not available');\n }\n\n const { Muxer, ArrayBufferTarget } = await import('mp4-muxer');\n\n const target = new ArrayBufferTarget();\n\n const muxerConfig = {\n target,\n video: {\n codec: 'avc',\n width: config.width,\n height: config.height,\n },\n fastStart: 'in-memory',\n };\n\n if (config.audio) {\n muxerConfig.audio = {\n codec: config.audio.codec || 'aac',\n numberOfChannels: config.audio.numberOfChannels || 2,\n sampleRate: config.audio.sampleRate || 48000,\n };\n }\n\n this.#muxer = new Muxer(muxerConfig);\n\n this.#encoder = new VideoEncoder({\n output: (chunk, meta) => {\n this.#muxer.addVideoChunk(chunk, meta);\n },\n error: (e) => {\n console.error('Encoder error:', e);\n },\n });\n\n this.#encoder.configure({\n codec: config.codec || 'avc1.42001f',\n width: config.width,\n height: config.height,\n bitrate: config.bitrate || 5_000_000,\n framerate: config.fps,\n });\n\n this._target = target;\n }\n\n async encodeFrame(imageData, timestamp) {\n const frame = new VideoFrame(imageData.data.buffer, {\n format: 'RGBA',\n codedWidth: imageData.width,\n codedHeight: imageData.height,\n timestamp,\n });\n\n const isKey = this.#frameCount % 30 === 0;\n this.#encoder.encode(frame, { keyFrame: isKey });\n frame.close();\n this.#frameCount++;\n }\n\n /**\n * Queue encoded audio samples for passthrough muxing after video finalize.\n * @param {{ codec?: string, sampleRate: number, numberOfChannels: number, samples: Array<{ data: Uint8Array, timestamp: number, duration: number, type: 'key'|'delta' }> }} audioData\n */\n async setAudioTrack(audioData) {\n this.#audioSamples = audioData;\n }\n\n async finalize() {\n await this.#encoder.flush();\n this.#encoder.close();\n\n if (this.#audioSamples?.samples?.length) {\n for (const sample of this.#audioSamples.samples) {\n this.#muxer.addAudioChunkRaw(\n sample.data,\n sample.type,\n sample.timestamp,\n sample.duration,\n );\n }\n }\n\n this.#muxer.finalize();\n return new Blob([this._target.buffer], { type: 'video/mp4' });\n }\n}\n", "/**\n * Video encoder factory.\n */\n\nimport { WebCodecsEncoder } from './videoEncoder.webcodecs.js';\n\nexport { VideoEncoderBase } from './videoEncoder.base.js';\nexport { WebCodecsEncoder } from './videoEncoder.webcodecs.js';\n\nexport function createEncoder(environment = 'auto') {\n if (\n environment === 'browser' ||\n (environment === 'auto' && typeof VideoEncoder !== 'undefined')\n ) {\n return new WebCodecsEncoder();\n }\n\n throw new Error(\n 'Node.js encoding requires createNodeEncoder() from videoEncoder.ffmpeg.js',\n );\n}\n\nexport async function createNodeEncoder() {\n const { FfmpegEncoder } = await import('./videoEncoder.ffmpeg.js');\n return new FfmpegEncoder();\n}\n", "/**\n * Core reverse alpha blending algorithm.\n * Formula: original = (watermarked - \u03B1 \u00D7 255) / (1 - \u03B1)\n */\n\nconst ALPHA_NOISE_FLOOR = 3 / 255;\nconst ALPHA_THRESHOLD = 0.002;\nconst MAX_ALPHA = 0.99;\n\n/**\n * Remove watermark from an ImageData region using a pre-calibrated alpha map.\n *\n * @param {ImageData} imageData - The watermarked image data\n * @param {Float32Array} alphaMap - Alpha map (width \u00D7 height float values 0-1)\n * @param {{ x: number, y: number, width: number, height: number }} position - Watermark region\n * @param {{ clampOutput?: boolean }} options\n * @returns {ImageData} Modified imageData (mutated in place and returned)\n */\nexport function removeWatermark(imageData, alphaMap, position, options = {}) {\n const { clampOutput = true } = options;\n const { data, width } = imageData;\n const { x: ox, y: oy, width: mw, height: mh } = position;\n\n for (let my = 0; my < mh; my++) {\n for (let mx = 0; mx < mw; mx++) {\n const alpha = alphaMap[my * mw + mx];\n\n // Skip pixels below noise floor\n if (alpha < ALPHA_THRESHOLD) continue;\n\n const effectiveAlpha = Math.min(alpha, MAX_ALPHA);\n const px = ox + mx;\n const py = oy + my;\n\n if (px < 0 || px >= width || py < 0 || py >= imageData.height) continue;\n\n const idx = (py * width + px) * 4;\n\n for (let c = 0; c < 3; c++) {\n const watermarked = data[idx + c];\n // Reverse alpha blend: original = (watermarked - alpha * 255) / (1 - alpha)\n let original = (watermarked - effectiveAlpha * 255) / (1 - effectiveAlpha);\n\n if (clampOutput) {\n original = Math.max(0, Math.min(255, Math.round(original)));\n }\n data[idx + c] = original;\n }\n // Alpha channel unchanged\n }\n }\n\n return imageData;\n}\n\n/**\n * Apply a synthetic watermark to imageData (for testing/demo).\n */\nexport function applySyntheticWatermark(imageData, alphaMap, position) {\n const { data, width } = imageData;\n const { x: ox, y: oy, width: mw, height: mh } = position;\n\n for (let my = 0; my < mh; my++) {\n for (let mx = 0; mx < mw; mx++) {\n const alpha = alphaMap[my * mw + mx];\n if (alpha < ALPHA_NOISE_FLOOR) continue;\n\n const px = ox + mx;\n const py = oy + my;\n if (px < 0 || px >= width || py < 0 || py >= imageData.height) continue;\n\n const idx = (py * width + px) * 4;\n\n for (let c = 0; c < 3; c++) {\n // Forward alpha blend: result = original * (1 - alpha) + watermarkColor * alpha\n // Watermark color is white (255)\n data[idx + c] = Math.round(data[idx + c] * (1 - alpha) + 255 * alpha);\n }\n }\n }\n\n return imageData;\n}\n\n/**\n * Compute spatial correlation of a region to validate it contains a watermark.\n */\nexport function computeRegionSpatialCorrelation(imageData, position) {\n const { data, width } = imageData;\n const { x: ox, y: oy, width: mw, height: mh } = position;\n\n let sumDiff = 0;\n let count = 0;\n\n for (let my = 1; my < mh - 1; my++) {\n for (let mx = 1; mx < mw - 1; mx++) {\n const px = ox + mx;\n const py = oy + my;\n const idx = (py * width + px) * 4;\n const idxRight = (py * width + px + 1) * 4;\n const idxBelow = ((py + 1) * width + px) * 4;\n\n for (let c = 0; c < 3; c++) {\n sumDiff += Math.abs(data[idx + c] - data[idxRight + c]);\n sumDiff += Math.abs(data[idx + c] - data[idxBelow + c]);\n }\n count += 6;\n }\n }\n\n return count > 0 ? sumDiff / count : 0;\n}\n", "/**\n * Veo/Gemini video watermark position/size detection for known resolutions.\n */\n\n/** @typedef {'diamond'|'legacy'} VideoWatermarkProfile */\n\n/**\n * Legacy pre-Gemini-3.5 videos carry the \"Veo\" text watermark.\n * The short keys are kept for backwards compatibility with existing alpha maps.\n */\nconst LEGACY_VEO_TEXT_CATALOG = {\n '1280x720': {\n key: '720p-landscape',\n profile: 'legacy',\n watermark: { width: 80, height: 28 },\n position: { x: 1180, y: 684 },\n },\n '720x1280': {\n key: '720p-portrait',\n profile: 'legacy',\n watermark: { width: 80, height: 28 },\n position: { x: 620, y: 1244 },\n },\n '1920x1080': {\n key: '1080p-landscape',\n profile: 'legacy',\n watermark: { width: 120, height: 42 },\n position: { x: 1772, y: 1028 },\n },\n '1080x1920': {\n key: '1080p-portrait',\n profile: 'legacy',\n watermark: { width: 120, height: 42 },\n position: { x: 932, y: 1868 },\n },\n};\n\n/**\n * Gemini 3.5+ videos carry the Gemini diamond logo. Upstream v0.5.0-demo\n * currently validates only 1080p landscape and portrait.\n */\nconst GEMINI_DIAMOND_VIDEO_CATALOG = {\n '1920x1080': {\n key: 'veo-diamond-1080p-landscape',\n profile: 'diamond',\n watermark: { width: 96, height: 96 },\n position: { x: 1632, y: 792 },\n },\n '1080x1920': {\n key: 'veo-diamond-1080p-portrait',\n profile: 'diamond',\n watermark: { width: 96, height: 96 },\n position: { x: 792, y: 1632 },\n },\n};\n\nconst VIDEO_WATERMARK_PROFILES = {\n diamond: GEMINI_DIAMOND_VIDEO_CATALOG,\n legacy: LEGACY_VEO_TEXT_CATALOG,\n};\n\n/**\n * Normalize profile aliases used by CLI and SDK options.\n * @param {string|{ videoProfile?: string, profile?: string }|undefined} profile\n * @returns {VideoWatermarkProfile|null}\n */\nexport function normalizeVideoWatermarkProfile(profile) {\n const value = typeof profile === 'object' && profile\n ? profile.videoProfile ?? profile.profile\n : profile;\n\n if (!value || value === 'diamond' || value === 'current' || value === 'v2' || value === 'gemini') {\n return 'diamond';\n }\n if (value === 'legacy' || value === 'veo' || value === 'text' || value === 'v1') {\n return 'legacy';\n }\n return null;\n}\n\n/**\n * Detect watermark config for a given video resolution and profile.\n * @param {number} width\n * @param {number} height\n * @param {string|{ videoProfile?: string, profile?: string }} [profile='diamond']\n * @returns {object|null} Config or null if resolution unknown\n */\nexport function detectVeoWatermarkConfig(width, height, profile = 'diamond') {\n const normalizedProfile = normalizeVideoWatermarkProfile(profile);\n if (!normalizedProfile) return null;\n\n const key = `${width}x${height}`;\n return VIDEO_WATERMARK_PROFILES[normalizedProfile][key] || null;\n}\n\n/**\n * Calculate watermark bounding box for a given resolution.\n * @param {number} width\n * @param {number} height\n * @param {string|{ videoProfile?: string, profile?: string }} [profile='diamond']\n * @returns {{ x: number, y: number, width: number, height: number }|null}\n */\nexport function calculateWatermarkPosition(width, height, profile = 'diamond') {\n const config = detectVeoWatermarkConfig(width, height, profile);\n if (!config) return null;\n\n return {\n x: config.position.x,\n y: config.position.y,\n width: config.watermark.width,\n height: config.watermark.height,\n };\n}\n\n/**\n * Get full watermark info including alpha map key.\n * @param {number} width\n * @param {number} height\n * @param {string|{ videoProfile?: string, profile?: string }} [profile='diamond']\n */\nexport function getVeoWatermarkInfo(width, height, profile = 'diamond') {\n const normalizedProfile = normalizeVideoWatermarkProfile(profile);\n if (!normalizedProfile) return null;\n\n const config = detectVeoWatermarkConfig(width, height, normalizedProfile);\n if (!config) return null;\n\n return {\n profile: normalizedProfile,\n alphaMapKey: config.key,\n position: {\n x: config.position.x,\n y: config.position.y,\n width: config.watermark.width,\n height: config.watermark.height,\n },\n };\n}\n\nconst VEO_WATERMARK_CATALOG = LEGACY_VEO_TEXT_CATALOG;\n\nexport {\n GEMINI_DIAMOND_VIDEO_CATALOG,\n LEGACY_VEO_TEXT_CATALOG,\n VIDEO_WATERMARK_PROFILES,\n VEO_WATERMARK_CATALOG,\n};\n", "/**\n * Auto-generated by scripts/embed-alpha-maps.mjs \u2014 do not edit manually.\n * Sources: GeminiWatermarkTool v0.3.1 embedded_assets.hpp +\n * VeoWatermarkRemover v0.5.0-demo binary (legacy Veo text captures).\n */\n\n/** @typedef {{ width: number, height: number, source: string, dataBase64: string }} CalibratedAlphaEntry */\n\n/** @type {Record<string, CalibratedAlphaEntry>} */\nexport const CALIBRATED_ALPHA_ENTRIES = {\n 'gemini-v2-36': { width: 36, height: 36, source: 'GeminiWatermarkTool/bg_b_36', dataBase64: 'AgICAgICAgICAgICAgICAwI0OAICAwICAgICAgIDAgICAgICAgICAgICAgICAgMCAgIDAAtMTAsBAwIDAgIDAgICAgICAgICAgICAgICAgICAgICAgMDABxSURwAAwICAgICAgICAgICAgECAgICAgICAgICAgICAgICAjVSUjUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMBD0pSUUwWAAICAQECAgICAQECAgECAgICAgICAgMCAgICAgMBLVJPTlM1AgICAgMCAgIBAgICAgIBAgICAgICAwMDAgICAwERS1JOTlFNFgADAgICAgICAgIBAQECAgICAgICAgICAgIDAQI7VE5OTk5TNwECAQICAQICAQEBAgECAgICAgICAgICAgMDACRQUE1OTk1QUCYAAwMCAQICAgICAgEBAgICAgICAgICAgMAGk5QTU5OT09NUU4bAAICAgECAgIDAgICAgICAgICAgMDAwAUR1NPTk5OTk9OTVJHEwACAgICAgECAgICAgICAwMCAwMDABNGU05NTk5OTk5NTk5SRRMAAgIBAgICAgICAgICAgICAwIBG0dTTk5OTk5OTk5OTk5OU0caAQEDAgICAgICAgICAgIDAAIoTlJOTk5OTk5OTk5OTU9OTlJOJAIAAgMCAQICAgMCAgABFjhPUU5NTk5OTk9OTk5NTk9OTk5RUDsRAQECAwQCAgAAARU1TFNPTU5OTk5OTk5OTk5NTk5OTk5NUFRLLQ8CAAACAgscNExTUU5OTk1OTk1OTk1OTk5OTk1NTk5OTU1SUUo0GwoBN0xRUlFOTU5NTk5NTk5NTk5NTU5NTk5NTk5NTk9NTlFRUUwzNExSUlJPTU5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTlBSUUw3AQocNEpSUk5NTk5OTk5OTk5OTk1OTk5OTk5OTU5RUkw0HAoCAgAAAg8tS1RQTU5OTk5NTk5OTk5NTk5OTU5NUFNMNRYCAAACAgMDAgABETtQUU5OTk5OTk5OTk1OTk5OTk1RUDgVAQACAgICAgICAwMDAAMkTVNOTk5OTk1OTk1OTk5OTlFOJwIBAQICAgIBAgICAgIBAwEBG0hTTk1OTk5OTk5NTk5OU0gaAAICAgICAgICAwICAgICAgMDABRHU05OTk5OTk5OTk1TRhMAAgICAgICAgICAgICAgICAgICAgATSFJOTk5OT05OTVJHEwADAgECAwICAgIDAgICAgICAgIBAgMAGk5RTU5NTk5NUE4aAAMCAgIBAgMDAwMDAgICAgICAgICAgMDASdQT05OTk1QUSUAAwMDAgICAgICAgICAgICAgICAQEBAgIDAQI5Uk5OTk1TOwICAgICAgIDAgIDAgIDAgICAgICAgIBAgICAgAVTVJNTlJLEQACAgIBAgICAgICAgMCAgICAgICAgICAgICAgIBNVNOT1EtAQICAgICAgICAgICAgICAgICAgICAgICAgICAgMBFk1RUUoPAAMDAgICAgIDAgIDAgICAgICAgICAgICAgICAgICAjVSUjUCAwMCAgIDAwMDAgICAgIDAgICAgICAgICAgICAgICABxSUhwAAwMCAgMCAgICAgMCAgIDAgIDAgMCAgICAgICAgIDAQtMTAoBAgICAgICAQECAQEDAgICAgICAgICAgICAgICAgICAgI2MwEBAgICAgICAgICAgICAgIB' },\n 'gemini-v2-96': { width: 96, height: 96, source: 'GeminiWatermarkTool/bg_b_96', dataBase64: 'AgMCAgICAgMCAwICAgICAgIDAgICAgICAgMCAgMCAgICAwICAQICAgIEAwIBDis+QjIQAQICAgICAwICAwICAwMDAwICAgICAgQBAgMDAwMDAwICAgICAgIDAgICAgICAgIDAgIDAgIDAgICAgMCAgICAgICAwICAgECAgIDAgICAwICAQMBAgMDAgIEFTFFRzcXBQMEAwMDAgMCAgMCAwICAgMCAwIDAgIBAQIDAgMDAgEBAwQCAgICAgICAwICAgICAgICAwICAgECAgECAgICAgMCAgICAgICAgICAgICAgICAgICAgICAQMJHDlPUDweCQICAgICAwIDAwICAgICAgICAwICAwICAgEBAgICAQICAgIAAgMBAgIDAgICAwICAgICAwICAgICAgMCAgMCAQICAgICAgICAgMCAgICAwIDAgICAgIDAgIPKURZWUYqEAMDAgIDAgICAgMCAwICAgIDAgIBAgICAwEBAwIBAQICAgIBAgMCAQIDAgICAgICAgIDAgICAgICAgQCAwICAgICAwICAgICAwMDAgICAgICAgMCAgICAgIZNE1dXkwzGQMEAQMCAwIDAwMDAgMCAgICAwIDAgIDAgICAgICAgIDAwMCAgICAgICAwICAgICAgIDAgICAwIDAgMCAgIDAgICAwICAgMCAgQDAgIDAwIDAgMCAgICAgUeN01cXE02HgUCAgMCAwIBAQMCAgIDAQECAwIDAwICAgIDAgICAwICAgMCAgIDAgICAwICAgICAgICAgMCAgICAwMDAwMDAgICAQICAgMCAgMCAwICAgIDAgIDAwIBBA8oO0tZWUo8KA4FAQMCAwMDAgMDAgICAgMCAgICAgIBAgICAgICAgECAgMBAQICAQECAgICAgIDAgICAgICAgICAwICAwICAwMCAgICAwMDAgIDAgIDAgIDAgMCAwIBCBg1Q0xWVkxCNhgHAQMCAgIDAgICAwICAgICAwICAgMCAwICAgICAgICAgIBAQICAQECAgICAQICAgMCAwMCAwICAgICAwEDAwIDAgICAgMCAgICAwICAwMCAgICAgICBh49SE1VVU5HPh0HAQIBBAMCAgICAgIDAgICAgICAgMCAwICAgIDAwICAgICAgIEAgMCAgICAgICAgIDAgIDAwICAwMDAgICAwICAgICAgICAgIDAgICAgICAgMCAwICDSlIT09SUk1OSCkPAgIDAgICAgMCAgICAgICAwIDAgICAgIDAgICAgICAgMCAgIBAgICAwIDAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgIDAgICAgICAgIEGDRRU05QUE5SUTYaBQICAgEDAgICAgICAAECAgICAgICAgMDAgICAgABAgICAgICAAECAwECAQICAgICAgICAgICAwICAgICAgICAgIBAgICAgICAgICAgEDAQMCAgIJJD1VVU9PT05UUz8pEAICAgICAgICAgICAAECAgICAgICAgICAgICAgABAgICAwICAAECAwECAgICAgEEAQICAgECAgMCAgICAgICAwICAgICAgIDAgICAgICAgMCAgMYMEZWVk9OTk9UVUg5IwsDAgIBAgMCAgICAgICAwEBAgICAgEDAgICAgICAgMCAgICAQICAwICAgMCAwIDAgICAwIDAgQCAgIDAgICAwICAgICAgIDAgICAwICAgQCAwkkOEhVVE9OTk9SVEtCLxEDAwECAgMCAgIDAgICAwEBAgMCAgIDAgICAwICAgMCAgIEAgICAwICAgMCAgICAgIDAgICAwICAwIDAgMDAwICAgMCAgMCAgICAgICAwMDBRMyQktTUk5OTk9RUkxJPBgGAgMCAgICAgIDAgIDAwICAwMBAgICAQECAgICAgMBAQICAgICAgEBAgICAgICAgIDAwICAgMCAwMDAgICAwIDAgICAgMCAgIDAgMDAgMCDCREUE1QUE9OTk5PT09TSigQAgIDAgICAgMCAwMCAgICAwICAgICAAECAgIDAwIAAAICAgICAgABAgMCAgICAgMCAwICAgIDAgIEAwMDAwMDAgQCAgIEAgIDAwMCAwICEi9MVlBQUE5PTk9OTk9VTzQbBQIDAgICAgICAgIDAgEBAgMCAgICAgICAwICAgIBAQECAQECAgICAgICAgIDAgICAgICAwMCAgMCAwMCAwMCAgICAgIDAgICAgICAQMLJj5TV1FOT09OTk9OTlBXU0AuFAUCAgMCAgICAgICAwEBAwIDAgIDAgMCAgICAgMBAQEBAgEBAgMBAwICAgIDAgICAgECAgMCAgICAgIDAgICAgICAgICAgIBAwACAQgfOEhVVFBPT05OTk9OTlBUUkc8JAkBAgICAQICAQACAgICAgIAAQMCAgICAgABAgIBAgICAAECAgACAgICAgIDAgICAgEDAgIDAgICAgIDAgICAgIBAgICAgIBAgEBAg8wSExQUU5OTk9OTk5OTk9RUEtGLwwAAgICAQICAAECAgICAgIAAQICAgICAgABAgICAgICAQECAgECAgIDAgIDAgICAwICAgMCAwMCAgIDBAICAgICAgIDAgICAgICCSFFWFNOUE5OT05OTk5PTk5QT1BSQB0IAgMCAgEBAgECAgICAgICAgECAgICAgICAQIBAQICAQECAwIBAgMDAgIDAgMCAwMDAgQCAgIDAgICAwICAgMCAgICAgICAwIDFzFKWVNPTk1OT05PTk9OT05PTlFVSC8ZBAICAgECAgIDAwICAgMCAgECAgICAwICAQIBAQIDAQECAwECAgICAgMCAgIDAgICAgICAgICAgICAgICAgMCAgMCAgICAQUSLz9MVVFPTk5OTk5OTk9NTk5OTlBTTEEyFgYBAgMCAgMDAgICAQECAgICAgICAgECAgICAgICAQECAgEBAwICAgMCAgIDAgICAgIBAgMDAgIDAgIDAwICAgMCAgICBRQsREtOUU9OTk5OTk5OTk9NTU9PTk9RUE1HMBUDAwMDAwICAgICAQECAgICAgICAgICAgIBAgICAQECAgEBAgICAgMCAwICAwICAgMCAgIDAgICAgMCAwMCAwICAgICDSQ5TlFNTlBPTU1OTk5PTk9OT05OTk9PUFJPOyYMAQMDAAECAgECAgMBAQEBAgMCAwIDAgIDAwEDAQECAwICAgICAgIDAgICAgICAgMCAgICAgIBAwICAgIDAgIDAgQLIjhIVlRNTU5OTU1PT05OT05PT05PTk5OT1RVRzkiCwQCAQACAwEBAwIAAQECAgMCAwICAgQDAwIDAQECBAMDAgMCAgICAgICAgICAgICAgICAgICAgIDAgIBAgICAgsdNUdPVlNPTU5OTU5OTk5OT05OT05PTk9NT1JVT0c2HAsCAQICAgACAgIBAQICAgMCAgABAgICAgICAQICAgECAgMCAgICAwICAgICAgICAgICAgIDAwIEAgICAgICBBgtRU9OUVBPT05PTk5OTk5OTk5OT09PTk5OTlBRTk9ELBgEAgICAgIBAgMBAQMCAgIBAQABAgMDAgMCAAECAgABAgMDAgIDAgICAgICAgQDAgICAwMCBAMCAwICAgMJGDFCUlVQT09OTk9OTk5OTk1OTk9OTk5PTU1OTk5OUFZRQDAXBwICAwEAAQECAgIEAQEDAwMCAgMBAQECAQECAwIDAwICAgIEAgICBAMDAgMDAgIDAwMCAgMCAgQCAggZLUJLUlNQTk9OTk9PTk5OT05OTk9OTk5PTU1OT05OUFRRSkItGAcCAwEBAQICAgIDAQECAwMCAgMBAQIDAQECAwECAgICAgIDAgICAgICAgMCAgICAgIDAwMDAwEBAxktQVBPT1BOTk5NTU5OTU1OTk5PTk5OTk5OTU1OT01OTlBOT1BBLBgDAQABAwICAwEBAgACAgEBAgICAgICAAECAgECAgICAgICAgIDAwIDAwICAgMDAgICAgIDAgQLGTBCUVdTTk5OTk5NTU5OTk5OTk1OTk5OTk5NTU5OTk5OTk5OUldQQjAXCwMBAgICAgIBAAEDAgIBAgICAgICAQECAwECAgMCAgICAgMCAwICAgMCAgMEAgECAgICAg0cLUJMUFRRT05OTk5OTk5PTk5OTk5OTk9OTk5OTk5OT05OTk9OUVNQS0IsHgsCAgMCAgIBAgICAwICAgICAgIDAgMDAwICAgICAgIDAgICAgMDAgMCAgICAgMCAwEFDCI2RlFTT1BPTk5OTk9OTk5OTk5OT05OT09OTk5PTk5OTk5OTk5OTk9PUlJENyIMBQECAgIDAgICAQICAgQBAgECAgICAwICAgICAgICAQICAgEBAwICAwICAQIDAQYXJDhGT1VTT05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTU1NTU1NTk9NTk5QUlRPRzgkFQUBAQICAgICAgICAgIAAQICAAECAgICAgICAwICAgICAgEBAgIDAwMDAQIBBRYwO0hOTVBQTk5OTk5PTk5PTk5OTk5OT05OTk5OTk5OTU1NTU1NTk5OTk5OUFBOT0g5LRMDAQICAgECAgICAgIAAQICAAECAgICAwICAgIDAgIBAgICAgMCAgICAgIJGjRIUFZUUE5PTk5PTk5OTk9OTk5PTk5OT05OTk5OTk5PTk5OTk5PTk9OTk5OT05RVVRORDAXCQIDAAICAgEBAgQBAQIDAgICAwICAgMCAgIDAgICAwICAgMCAgIFCg4eMUJPUlVSUE5PTk5OT09PTk9PTk5PTk9OT05PTk9OTk5PTk5OT05PTk9OT05PTk9QVFVSTEAxIBAJAAICAwEBAwMCAQMDAgIDBAICAgMCAwICAQECAgECAgIBAQQWJC8/R0pPT09PT05OTU1OTk5OTk5NTU5OTk5PT01OTk5OTk5OTU1OT05PT05NTU5PTk5OT09PT0xLRjIgCwICAgIDAgMBAgMDAgMDAgEBAgICAgICAAECAgICBAMFDhstPEdSVVJPUE9NT05NTU1OTk5OTk5NTU9OTk5PTk1NT05PTk5PTU1OTk9PT09NTU5OT05PTU1OT1RYWEg6JRMLBAQCAwQBAQQCAgMDAwABAgMCAgICAwECAwICCxIYKDRAR0tQUVBPT09OTk5OTk5OT05OTk9PTk5PTk5OT05OTk9OTk5OTU1OTk5OTk5OT05PT05OTk5PT1JTU0xIPS4kFAoDAgIDAwECAgICAgICAwIBAgICAQEBAgYQIy88Sk5RUlBQT05OTk5OTk5OTk5OTk5OTk9OTk5OTk5OT05OTk9OTk5OTU1OTk5OTk9OTk5OTk5OT05OT09NTlBVUkxFMiMYCAUCAQAAAQIDAwICAgMAAQICBAYHDRgoOEFJU1RWU1FPTk5OTk5NTU5OTU5OTk1NTk5OTk5OTU1OTU5OTk5NTU5OTU5OTk1NTU1NTU5OTU1OTk5OTk5NTVFUV1NPQjcwIxcOBwYEAAECAgICAwIAAQIGDhkdKTQ+SEtMT05QT09OTk5OTk5NTU5OTk5OTk1NTk5OTk5OTU1NTU5OTk5NTU5PTk5OTk1NTU1NTU5OTU1OTk5NTk5NTU5PUE5OSkdFPDQpHRgOBAECAgICAgMIDxkfKDU8SFFTVVRST05OT09OT05PTk5OTk5PTk5OTk1NTk9OTk5OTU1OTk5OTk5NTU5PTk5OTk1NTU1NTU1OTk5OT05OTk9NTU9PTk9QUlRVVVJIPDUoHhkQCQMBDxceKjM3O0JHT1JUVVNRT05PTk9PT05OTk9OTk5PTk5OT01NTk9OTk5PTU1OT05OTk9NTU5PTk5OTk1NTU1NTU1OTk9OT05OTk9NTU5PT09QU1JUVVROR0M8NzQqHBMMMDY9RkxMSktNTk5PT1BNTU5PTk5PTk1NTk5OTk5OTU1OT05OTk5NTU5OTU5OTk1NTU1OTk5OTU1OTk5OTk9NTU5PTk9NTk1NTk5OT05PTU1PTk5OT05NTEtMTExEOTApQEdQWV1cWFVVUlBPTk9NTU5OT05OTk1NTk5OTk5OTU1OTk5OTk5NTU5OTk5OTk1NTU1OTk5OTU1OTk5OTk5NTU9PT05NTk1NT05PTk9OTU1OTk1NT1BRU1VYXFxZTkQ9PkZNWV1cWVdUU09PTk9PTk1PTk5OT05OTk9OTk5PTk5OT05OT01OTk5PTk5PTk5OTk9NTU5OTU1OT05OTU5OTk9PTU5OTk9OTk9OTk9PTk5OT01NT1FSVFZZXF1ZUEhAKjE5RE1OS0xNTk5PUFBOT05OTk5OT05OTk5OTk5PTk5OTk5OTk5OTk5NTk5OT05OT05NTU9PTU1OTk5OTU5PTk9OTU5OT05OT09OTk5PTk5PTU5OT09OTUxLTE1FPTYxDBMbKTQ2O0RHTlJUVVNSUU9OTk5OTk5OTk5OTk1OTU9OTk5OT05NTk9OTU5OTk5OTk9NTU5OTk5OTk1NTk5NTk5OTU5OTk5OTk1NTk5OTU1PUVJUVFNOR0I8NTMqHhYPAwQHDxkeKDU8SFBUVlVSUE9OTk5OTk5OTk5OTk5PTk5OTk5OTk9OTk9PTU1OTk5PTk5NTU5OTk5OTk1OTk5OTk5OTU1OT05OTk1NTU9OTk1PUlNVU1FIPjUoHRgQCAQCAgIAAQIGDxgdKTM8RklJT09RUE9OT05OTk5OTk5PTk5OTk5PTk9OT09OTU1OT09OTk1OTk5PTk5OTk9OTk9OTk5OTk5OT05OT05NT09RUE9OTEtIPzYoHBgOBgIBAgMCAgMBAQICBAYHEBciMThCT1RYVVFOT05OTk9OTk5OT05OT05OTk9OTk9PTU1OT05OTU5OTk5PTk5NT05OTk5OTk5PTk5OT05OTk9OT1NVVlZUSkI4KRsNBwcFAgMBAQICAgMCAgIBAAABAgQIGCMyREpUVFBOTk5OTk5OTk5PTk5OTk5PTk5NTU9OTk5OTk9OTk5OTk5OTU1OT05PTk9OTU1NTk5OTk1NTk5OT1BSUE1KOy4jDwgDAQACAQICAwICAgMDAgICAAEDAwICAwsSIi49R0xTU1FPT05OTk5OTk5OTk5OTk5NTU5OTk9OTk5OTk5OTk5OTU1OTk9OTk5NTU1NTk5OTk1OUFFSUUtIPzMoFxELAgMCAgICAQICAgICAwMBAgICAwMCBAECAgMFDBMnOUlYWVVQT09NTk5OTk5OT01NTk5OTk5PTk5OTk5OTk5OTk1NTk5PT01NT05OTk5PTU5OTU5QUFRVU0c8LBkQBgMDAgIBAQIDAQECAgIDAgIDAgIDAgICAgICAgMCAgILIDJGTExOT09QTk5OTk5OTk1NTk9OTk5OTU5OT05OT05OTk1OTk5PTk1PTk9OTk5OTk5OUE9PT0tIQC8kEwMCAgICAgMAAQICAQECAwICAgICAgICAgICAgICAgIDAgEBCA8hMj9LUVRTUU5OTk5OTk5PT05NTk5OTU1OTk1OTk5NTU5OTk5OTk1NTk5NTk5OTU1PUVRSTkEvHg4KBQICAgABAgICAgICAgICAgEBAgIBAgICAQMCAwICAwMCAgMCAgIJGC9DTVVVUU9OT05PT01PT05OTk5OTU1OTk5OTk5NTU5OTk5OTk1NT05OTk9OTU1PU1VPSDMYCAICAgICAgABAgICAgICAgMCAgEBAgICAgIDAgIDAwMCAgMCAgICAwMDBhIsOUdPT1BRTk5OTk5OTk9NTk5OTU1OT05OTk5OTk5PTU1OTk5OTU5OTk5OUFBOUEY7MBYFAQIDAgIBAQICAgMCAgMCAgICAwICAgMCAgICAwICBAIDAgMCAgIDAgICAwUUJDlIUFZVT05PT05OTk9NTU5PTU1OTk5OTk5OT05OTU5OT05OTU5OTk9QU1ZQSDckFQcBAgIDAgIBAgICAgMCAwIDAgICAwICAgICAgICAgECAwICAgIBAQIDAQICAwIFCyM2RlNUT09OTk1NTk5NTU5OTU1OT01NTU5OTk5OTU1OT05OTk5NTU9PUlJGNiELBAECAgICAQECAwIDAgIBAQEDAgICAgICAgICAwMDAAECAgICAgICAAIDAQECAgICAgseLkJLUFRRTk1NTk5NTU5OTU1OTk1NTk5OT05OTU1OTk9OTk5OUVNQS0ItHQkBAQECAgEBAAECAgMDAgIAAgICAgICAgEDAgMDAwICAgICAwIDAgICAgIDAgICAgICAgQLGTFDUldTT05OTk1OTk5PTk5OTk5OTU5OTk9PTk5OT05NTk9OU1dSQjAZCwQCAgMCAgICAgICAwICAgICAgIDAgICAgICAgIDAgIDAgIDAgICAgQCAgMCAgICAwECAgEBAxkuQlJQT1BPT09OTk5PTk5OT05OTU1OTk5PT05PT05NTlBPUFFCLBgEAgEDAgICAgIDAwICAgIDAgMCAgICAgMCAwICAwMCAgIDAgICAgIDAgICAwEDAwMCAgICAgIBAQgYLUNNU1NRT09NTk5OTU1PTk5OT09OTk5PTk5OTk1NUFNTSkMtGAgCAgICAgIAAQICAgICBAIBAwIBAAICAQECAgICAwMCAgICAgICAwICAgICAgIDAgICAgICAQIBAQMIGDFDU1VQTk9OT05OTU1OTk5OT09OTU5OTU5OTk5OUFVUQzEYCAMDAgMCAwIBAQICAwEDAwABAgIBAgMCAAECAwMCAgICAgICAwICAQICAwICAwMCAQICAgABAQECAgICAhgtRk9OUVBOT05OTk5OT05OTk5NTk5OTk9OTlBRT1BELBgCAgICAwMCAwICAgEBAgICAwIDAgICAgICAgMBAwICAgMCAgICAgICAgICAgICAgICAgICAgABAQECAgICAQkdN0dPVVRPTU5OTk1OT05OTk5OTk5OTk5NT1NWT0g1GwsCAgICAgICAgICAgEAAgIDAwICBAMCAgMDAwMDAwMDAgIDAgICAgICAgICAgECAgICAQICAgAAAQIBAQIBAQMLIjdGVVROTU5OTU5OTk1NTk5OTk5OTU1OTlNVSDgiCgQCAgIDAgIBAwMBAgMCAQEBAwIDAwMDAgMDAgMCAwMDAgICAgICAgICAgICAgICAgICAgICAgACAgIBAQICAAACCyM6UFJOTk9OTk5OTk1NTk5OTk5OTU5PT1FOOSQLAgICAgMDAgABAwMCAwICAAABAgIDAwMCAwMDAgIDAwICAgMCAgICAgICAwICAgMCAgIDAgICAgICAgMDAgICAgICBRUwSE9PUU9PTk9OTk5PTk5OTk5PTk9QUExELRUEAgIDAgIDAgMDAgMCAgIDAgIBAwECBAMBAgMDAgEEAwMCAgICAgIDAgICAwICAgMCAgICAgICAwICAgIDAgMEAgICAQYVNENMU1FOTk5OT05OTk5PTk5PT1FVTEAwEwYBAgIDAwIDBAICAgICAgIDAgMCAgEBAwQBAQICAQECAwICAgICAgICAgICAgICAgICAgICAAECAgABAgICAgICAgICAwEEGjFIVlFOTU1PTk5OTk5NTU5OTVNZSzAYBAICAgIDAAECAwICAgMBAQICAgICAwICAwICAgIDAAECAgIBAgICAgICAgICAgICAgICAgECAAECAgEBAgICAgMEAgICAgICCR5BU1BPTk1OT05PTk5NTU5OTlJYRiAIAwICAgICAAEDAwICAgMBAQICAwMDAwEDAgIDAgIDAQEDAgMDAgICAgIDAgICAgICAgICAgICAgICAwICAgEBAQIDAgIBAgICAQ8wR0tQUFBOT05PTk5NTU9RUExJMQ4DAgMCAQICAgECAwICAgIEAwIDAgMDAgICAgMDAgMDAgIDBAMCAgMCAgIDAgICAwICAgMCAgIDAgICAwICAgMBAAICAgIBAwIBAgwkO0hTVFBOT05OT09NTVFVVEc5IAgBAwMCAQEDAgICAgEBAwMCAgIDAwICAwICAgMCAwIDAgMDAwMDAgMCAgICAgICAwICAgMCAgICAQICAgEBAgICAgIDAQECAgABAQUTLD9TVlFOTk1NTk5OTlFXUjwlDAIBAgIBAQMDAwICAgEBAgICAwICAgEDAwIDAgIBAQIDAgMDAgMCAgICAgICAgICAwICAwMCAgMCAgICAgABAgICAgICAAECAgIBAQECGTNOVlBOTU1OT05PUE9USy0UBAMCAgIAAQIDAgICAwABAgICAgECAQEDAgMCAgMAAQICBAICAgECAgQCAwMCAwICAwIDAgMDAgIDAgIBAgICAgMCAgIDAgICAwICAgIBEChMU09PT09OTk9PT01QRCMMAwEBAgICAgIDAgICAgMCAgMCAgICAgIDAwEBAgICAgMDAgICAwEBAgICAgMDAwMDAgICAwMCAgICAgMDAwICAgICAgIDAgICAgICAgMCBhg8SUxRUk5OTk9RUkpDMhMFAgEBAQQCAgMCAgIDAwICAgMCAgIEAgIDAgECAgMDAwICAgMDAwEBAgICAgICAQICAgICAwICAgMCAgICAgICAgICAgICAgIDAgIDAgICAxEwQEtTUk5OT05SVUk5IwoDAgICAgMCAgMCAAECAwABAgIBAQMDAgECAwICAgICAgMDAgICAgECAgICAgICAQICAwIDAgICAgICAgICAgICAgICAgICAwICAgIDAgMDBAojOEhWVE9OTlBVVkcwGAMCAgIDAwMDAwICAQECAwECAwICAgMDAgECAgICAgMCAwIBAAEBAgEBAgICAgIDAgICAgICAgMCAwIDAgMCAwICAgICAgIDAgICAgICAgQCAwMPKT9UVU5PTk1VVD0lCAECAgMDAgQCAwICAwICAwIDAwMCAgIDAwMDAQICAgQCAgICAgMDBAICAgMDAgICAgICAwMCAgICAgIDAgICAwICAgMCAgIDAgMCAwMCAgMCAgIGGjVRU05RT05TUTUYAwICAwICAwMCAwIEAgMDAwMDAgQDAwIDAwICAgIDAwMDAgIEAgMDAwMDAgICAgICAgIDAgECAgMDAQICAgICAgICAgMCAwICAwICAwICAgICAgICDipIT01SUk5OSCoOAwMDAgIDAwIDAgICAgIDAwMDAwMCAgIDBAIDBAECAwIBAQICAgICBAICAgICAgICAQMCAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIBBx08R0xVVU5HPh4IAQMDAgMCAgMBAwMCAgICAwIDAgIDAwMCAgMCAgECAgIBAQICAgMCAgICAgMCAgICAgICAwICAgICAgMDAgECAgICAgMCAgIDAgICAwICAgICAgICBxg1Q0xWVUxDNRgHAgMDAwMCAwICAwICAgMCAwICAwMDAgMDAwICAwIDAwMDAwEDAQIDAgMDAgICAgMDAgMCAgICAgIDAgMCAgICAwICAgICAgIDAgICAgIDAgICAgIBBA4oPUxZWUw7KQ4EAQICAgIDAgQDAwIDAwIEAgICAwICAwIDAgICAgMCAwQCAgEBAQICAwIDAgMBAgICAgMDAgMDAgICAgICAgICAgICAgIBAgICAQICAgICAgICAgIBAgYeNkxdXU01HgUCAQICAgEDAgICAwIDAQEDAgEBAgIAAQICAgIDAwEBAwMDAwIDAAEDAgICAgIBAQMEAgMCAgIDAgMCAgMCAgMCAgICAgIBAgICAgICAgICAgICAgMCAgMaM0tdXk0zGAICAgICAQABAgMCAwMDAgECAgEBAgIAAQICAgICAgABAgICAwIDAAICAgICAgMCAgMDAwMCAwIDAgMCAwECAgEDBAICAgICAgIDAgICAwICAgMCAgICAwMQK0VZWUQpDwIDAgICAwICAgMCAgMCAgICAgICAgICAgEDAgICAgEBAgMCAgMCAgICAwICAwMCAgIDAgIDAwICAwIDAgMDAgMCBAICAgMCAgIDAgICAwICAgMCAgIDAgMIHzxPTjocCAICAgICAgICAgMCAQMDAgICAgICAgICAgIDAgICAgAAAgICAgIDAgICAwICAQICAgMCAgICAgICAgICAgIDAgICAgMCAgICAgICAgICAgIDAgMCAgIDAgIEFTZHRTETBAECAQECAgICAwICAgICAgICAgEBAgMAAQIDAgICAgICAgIBAQIDAgICAgEBAgICAgICAgMCAgICAgICAgICAQMCAwICAgICAgICAQIDAgICAgICAgICAgMBDzBAPioNAgICAAEDAgICAgMCAgICAgICAgEBAwIBAQIBAgICAgICAgMBAQICAgICAgAB' },\n 'gemini-48': { width: 48, height: 48, source: 'GeminiWatermarkTool/bg_48', dataBase64: 'AgEBAAAAAAEAAAAAAQEAAAEBAQAAAQBxcAEBAQEBAgEBAgEBAgMBAQEBAgEDAgEBAAAAAAAAAQEAAAAAAAEBAQAAAAEAASGAgCAAAgABAQEBAQECAgIBAQEBAQICAwEBAQAAAAAAAAEAAQICAQAAAgEAAAEAAUiAgEgAAQABAQECAgACAwMBAQICAgMBAQEBAQIAAAEAAAEAAQEBAQEBAQECAQEAAXCAgHgAAQEBAgECAwEBAgIBAQICAgEBAQICAAAAAAAAAAEAAAEBAAABAAAAAAEAIICAgIAgAAABAgACAgEBAQADAwICAQEBAQEBAAIAAAEAAQEBAQAAAQAAAAABAAABUICAgIBgAAABAAECAgABAQECAwMDAQEAAAEBAQAAAAEAAwEBAQAAAQEBAgIAAAIRgICAgICAEAABAAAAAQICAQEBAQEBAQEBAQEBAAAAAAIAAQIBAQAAAQMBAQEAAQFQgICAgICAUQECAAEBAQMCAQECAgEBAQEBAQEBAgAAAQIBAgEBAgIBAQECAQICARGAgICBgICAgCACAQIAAQIBAwICAwMDAgIBAQICAQAAAQEBAAIBAAEBAAEAAQABAXCAgICAgICAgGABAQEBAQEBAQEDAwMCAwIBAQICAgEAAAECAAEBAAAAAgEBAgABQICAgICAgICAgIA4AAACAgMBAgIBAgICAQECAgEBAAABAAABAQMAAQIAAgACAQAQgICAgICAgICAgIB4GAECAwICAgIAAQEBAQICAgEBAQABAQAAAAEAAQEBAAMCARBwgICAgICAgICAgICAcAgBAQABAQECAgEBAgICAgECAQABAAABAAEAAQABAQEBAWmAgICAgICAgICAgICAgGACAQEBAQECAgEBAgICAgECAQEBAAABAAAAAAEAAgEBUYCAgICAgICAgICAgICAgIBQAQABAQEDAQEBAQICAgEBAAAAAQEAAAEAAQAAAQFQgICAgICAgICAgICAgICAgICAUAABAQEDAQEBAQECAgEBAAIAAQEAAAEAAAABCGCAgICAgYCAgICAgICAgICAgICAgGgQAgIBAQEBAwQDAgABAQABAQABAQEBAAAYcICAgICAgYCAgICAgICAgICAgICAgIBwEQQCAQEBAgECAgEBAQAAAQEAAAEAADh4gICAgICAgICAgICAgICAgICAgICAgICAgEIBAQIDAgMDAQEAAgEAAQAAAgEgYICAgICAgICAgICAgICAgICAgICAgICAgICAgIBwEAIDAgICAgEBAAEAAAAAEFGAgICAgICAgICAgICAgICAgICAgICAgYCAgICAgICAgFAQAgECAgEBAAEAASFggICAgICAgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAUCABAgEBACBIeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBwSCAEcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBwASBIcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIB4SCABAQMAASBQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAYCACAgEBAAEBAAACEFGAgICAgYCAgICAgICAgICAgIGAgICAgICAgICAgICAgFERAQECAgEBAQIBAQAAAQIQcICAgICAgICAgICAgICAgICAgICAgICAgICAgIBgIAEBAQEBAQEBAQEBAQAAAAEAAUCAgICAgICAgICAgICAgICAgICAgICAgICAeTkBAQEBAQEBAQEBAQEAAQABAAAAAgAQcYCAgICAgICBgICAgICAgICAgICAgIBwGAEBAQICAQECAgEBAQEAAQABAAEAAAAAEGiAgICAgICAgICAgICAgICAgICAgGAIAQEBAQICAQECAgEBAQEBAQIBAQEAAAAAAQFQgICAgICAgYCAgICAgIGBgICAUAMDAgECAgEBAwMCAgEAAQEAAQEBAQAAAAABAQIBUICAgYCAgYCAgICAgIGBgIBQAQQEAgICAgEBAwMBAgEBAQECAgECAwMCAgICAQEBAWGAgICAgICAgICAgICAgGgCAgMDAQABAgICAwMBAQMDAQECAgEBBAMCAwIDAQEBAQpxgICAgICAgYCAgICAcBACAwMDAQEBAgICBAMAAQMDAgICAQICAAACAwIDAgIAAQIZeICAgICAgICAgICAEAACAgAAAQECAwIBAAABAQEBAgICAgMCAQECAgICAgIBAQICOICAgICAgICAgIBAAQEDAgEAAQEDAwECAQAAAAEBAgEBAQEBAQEBAQEBAAECAgICAGCAgICAgICAgHABAQECAgACAQECAQEAAQAAAQEBAgIBAQEBAQEBAQEBAQECAgMCASCAgICAgICAgBABAQACAgECAQEBAQECAQEBAQEBAQEBAQEBAQECAgAAAQACAgIBAQBQgICAgICAUAEBAQECAwABAQEBAQEBAgIBAQEBAQEBAQEBAQECAgABAQICAgEBAAEQgICAgICAEAEBAQECAgIBAQEBAQEBAgIBAQEBAgICAgICAQEBAgEBAQICAQEBAQEAYYGBgIBQAQICAgEBAQEBAgIBAQEBAQECAgEBAgICAgICAQEBAQEAAgIBAAEBAgMBIIGAgIAgAQICAAEBAQEBAgIBAQEBAQECAgEBAgICAgEBAgEBAQEBAgICAgAAAgIBAXmAgHABAQIDAQECAgAAAQEBAQEBAQECAgEBAgICAgEAAgIBAQEBAgICAgEBAgIBAUmAgEkBAQICAQEBAgEBAQEBAQEBAQECAgEBAQEBAQICAQECAQIBAAEDAwEAAQECAiCAgCEBAQICAgIAAQABAgIBAQICAQECAgEBAQEBAQICAQEBAAEBAQEBAgEBAQADAgFwcAEBAQICAgIBAAEAAgIBAQICAQECAgEB' },\n 'gemini-96': { width: 96, height: 96, source: 'GeminiWatermarkTool/bg_96', dataBase64: 'BAMEAwMDAwQAAwMEAwIFAgICAAIBAQEBAwIDBAIDAwMDAwMCAwIAAQEBAQECAjl5cTsBAwACAQIEBAIEAwMEAwMDAgQEBAIDAQMCAgECAwMCAwMEAwMEBAMDAwMEBQQEAwQCAwEDAwQCAgMDAQIEAwICAQEAAQAAAgIDAwEDAwIDBQMDAQAAAAEAAAACEICAgYEJAgABAgICAwMCAgIDBAMDAQECAgIBAgACAAEBBAQDAwMDAgMEAwMDBgUEBQQFAQACAQIEAwIAAQEDAQEBAQICAQABAQABAQEAAQICAgMDBAMDAAEAAQAAAQICKYCAgYAxAAABAgEAAAEBAgUEAwQEAgABAgIDBAQCAwUDAgIEBAMDAwQEBAMCBAMEBAMDAAEBAgIFAgMAAQICAAAAAgIBAAEAAQEAAQIBAQABBAMCBAECAAEAAAABAgIDUoCAgYFQAQEBAQEAAAECBAQDAgMEBAICAwIDBAQEBAMEAgMEBQQCAQMDBQQDBAMFBAMDAAABAwUEBAMBAgEBAAADAQMDAAIBAQACAAEAAAACBAMCAgMCAgEEAwABAAEDcoCAgIB5AgMBAgMBAgMDBAQEAwQEAwIBAQMEBQQEBAQEBAMDAwEAAwIDBAMDAgUEBQQDAQADAwMEBAQDAgQEAAEBAQIDAgEAAgIBAQEBAAECBAQEBAEEBQIEAAIEAgIhgYCAgICAIgICAgMDAgECAwQDAwMEAwICAQMDAwQEBAUDAgMEBAIBAwQDAwMDBAQDBAMDAQIBAQQEAwMEAwABAAICAQEDAQECAwMDAwIAAQIDAgICAwIBBAIBAgECAgJSgYCAgIGASQICAgIEAwIBAgIDAwUDBAICAwIDAwMDBAMCAgMDAwIDAgMGBQQEAwMDBAMDAQMCAgMDAgQEAgIBAgMEAQEAAgMDAwECAwACAgICAQEDAQEBAAEBAQECAgFxgYCAgYCAeQICAgIEAwMEAwIDAgMDAQICAgIBAwQDAwQCAQMDAgMEAwQDBQUEBAQDBAMDAwICAgECBAMBAwIDAgIEAQECAwQBAgICAgACAgIDAgMEAwIBAQECAQQDAyqAgYCAgYGAgCEDAgEDAwIDAwMDAwIDAgEBAQEDAwIEAgEAAQEEAwMEAwIEBQQCAgQEBQQEAQMBAQABAwIBAwECAgMCAgECAwQCAwABAAICAgICAgIDAwEBAAEBAQIDA1mBgICAgYGAgGECAAEDBAQDAwMCAgMCAQEAAgIDAgMCBAABAgIDBAQEBAQFBAIEAwMDBgQEAwIEAwEBAQEDAwICAQEBAgMDAgQBAQEBAQMCBAICAQQDAwEBAAEAAQIEEYCAgICAgIGAgIARAQICAgMBAgICAQEBAQMBAQECAgECAgIEBAMDAwMCBAQDAgMDAwQCAwIDAwIDAwEBAQECAwECAgEBAgMDAgIBAwEAAgQDAwICAwMCAwECAQEBAQIDUICAgICBgIGAgIBCAgIBAAIEAwQCAgICAQIBAQMCAgMAAgEEBAQDAwICAwQBAwEDAgMDAwQFAQEBAgABAgICAAABAgMAAgECAQADAwMAAAEDAgMDAwIAAQIBAgAAAgARgYGAgICAgIGAgIB5CAEBAgICAgICAQADAgECAQQDAwIBAgEEAwICAgMDAgQEBAMEBAYDAwMDAQIAAgEAAgMCAQACAwMCAgICAQICAwAAAQIDAgMCAwMCAQEBAAIBAgNBgIGAgICAgYGBgICAQQICAgEEBAQCAQECAwEBAgQDBAMCAQEBAgIDAwMDAgMDAwIEBAUEAwMDAgEBAQMEAQEBAgECAwQCAQICAgEDBAAAAQIDAwMEAwMAAQABAAAEBBJxgYGAgICBgYGCgYGAeQkCBQQEAwIEBAIDAgQBAwQEBAICAgIDAwMEBAMDBAQFBAUGBAIEBAMDAgMCAgMFAwECAQEAAgECAQMDAgIDAgIBAgIDAQIEBAMCAQECAgIDBFKBgYGAgIGBgYKAgYGBgUIDAQMEAgMGAwIBAQIDBAMEBAICAQMDAwQDBAMEBQYDBAIFAwQDBQMDAwMCAwMDBQMCAgABAgEEBAMDAgMBAgEDAwIDAgEDBAUCAwIDAQIDEoGBgYGBgYCAgICAgYGBgHkRAwMCAwMDBAMCAQQCAwMDAgIBAgIDBAIBAwMDAwMDBAMDAwMCAwMBAgMDAwUEAwQCAgEBAgEEBAQEAAIDAwIDAQIBAQIDAQACBAQDAwMCUoGAgYCAgYGAgICBgYCBgIBZBAICAgMDAgICAQMEAQADAQECAwMEBAMCAwIDBAMEBQMDAwIDBAMEAgMEAwICAwMEAgEBAAIDBQQDAQMBAQIDBAIEBAMCBAQDBAUEBAMpgIGAgICAgIOBgICAgYGBgICBIgEBAgQCAQICAAICAgICAwIDAwMDBAMDAwQEAwICAgQDAgMCAwQCAgQEAgQDAgMFBQQCAQADBAQDAQICAQIDAgIBBAICAAIDAwIDAwNxgYCBgICAgIGAgICBgoCBgICBcQkDAwMCAgEBAQIDAwICAwIDAwIDAwMDAwMDBAICAwIDBQMDAwICAwQDAgEDAQICAgMBAgICAwMCAgMAAgMEAwMEAwICAQEBAQEDBEKAgYCAgICAgICAgIGBgYCBgYGBgEkCAwMCBAEBAQEDAwIDAgMCAwMDAQQEBAIEBQQCAwECAgICBQICBAQCAwIDAQIBAgICAgICAgMBAgEBAgMDAgQDAgICAQECAAMEG4GBgYGAgICAgICBgYGBgYGAgICCgYAhAwMEBAIBAwMDBAMEBAMCBAMDAwMFBAMDAwMDAgICAgQEBAQCAwMBAQEBAQECAgEAAAAFBAICAgEDAwMCBAMBAQIDBQMAAQIRcoGAgYGBgICAgICBgYGCgYGAgYGBgYBxCwQFBQMCAAIDAwMDBAQDAwMEAwMDBQIDAgMDBAMDAwQCAwIBAwMAAAABAAAAAQAAAAEDBAIBAgICAwIDBAMDAgIDAgMCAgJRgICAgYGAgIGAgIGBgIGAgIGAgIGBgYGBWQMDBAMDAgIDBAIEAwUEAwQFBQMCBAMDAgMCAgQEAwIBAgMCAwMAAAABAwMBAgEBAAABAgACAwICAQIDAwMBAgICAwEEA0KBgICAgYGBgIGCgYGBgYCBgICBgICBgYGBgDkCAQQEAQMEAgMBBAQEAwMDAwMDAwMFAgMDAgMDAwQCAwIAAgEBAAABAgIDAQAAAQEAAQEAAwMCAgIDBAQBAQEBAQECI4GAgICAgIGBgYKBgYGBgICAgYCAgICAgYKBgIAgAQQEAgIEAQIFAwQEAQQEBAQCBQQDBAUDBAQEAwMBAwECAQIBAQICAgMEAwEAAQECAQIDAQEBAQECAwIDAgEAAwIReYGAgICAgIGBgICBgYGBgIGAgIGBgICBgIGAgIB4EgIEAgICAgECBAQCAgQEAwMDAwMDAgIDAQMDAgQDAwUDAgIAAQICAwMCAgECAgEBAQIDAgIBAgEDAwMAAQEBARBwgICAgICAgICBgICBgYGAgYGAgYGBgICAgYCBgICAcREDAQEEAwICAQMBAgMEBQMDBAIEAwMDBAMCAwMDAwQCAwIBAQIEAgMCBAICAQEBAgQDAwIAAQMBAwEAAQIDEnGAgICAgICAgIGBgYCBgYGBgYCAgIGAgICAgYCBgICAgXEQAQEFAwICAgMCAgMFBAMDAwMEAwICAwQFAwMDAwICAwICAgMFAwMDAwEBAQICAgICAwMAAgICAQIBAgILcYGAgYCAgICAgIGBgYGBgYCCgICBgICBgIGAgYCAgICBgYFpCAMCBAEAAQMCAgIEAwMDAgMDAwICAwQEAwMDAwICAwEBAgMCBAMCAQMAAQICAgMDAwICAQACAQECAhNqgICAgYCAgIGBgYGBgYCAgYGAgYGAgYGBgICBgoCAgICBgoGBcRQEBgICAQIDBAMBBAQCAgIDAwQDBAQFBQMDBAECAwMCAQMDAgEBAwICAgMCAQMDAQMBAwIDAgIBEnKBgYCAgYCAgYCBgYGBgYCBgYCBgIGBgYKCgIGBgYCAgICAgYKAgHERAgAAAwIDAwMDAwMCAgICAwQEBAMEBAQDAwIDBAMAAgMDAQEBAwIBAgQDAgEBAQIDBAICAgIScoGBgoCAgYCBgYGBgYGBgICBgYGBgYGBgYGBgYGAgYCAgICBgYGAgIBxEAEBAQIDBQMDAwUCAgMCAwQCAwQEAwQEBAICBAQBAAMDAQEBBAMCAwMEAwEBAAICBQMBASJ5gIGBgoCAgICAgICAgICAgICAgICBgICAgYGBgIGAgICAgICAgYGBgYCAeCEBAQECAwMDAwMBAgIDBAQCAwMEAwMDAgIDBgUAAgMDAQECAgICAwMDAwEBAQIEAwMBOYGBgICAgICAgICAgICAgICAgICAgICAgYCAgICAgIGBgYCAgIGAgICBgYCAgIBAAgIDAwEEAwICBAQEBAQEBAQEAwMCAwYFBAMAAQQEAgIBBAIBAwMCAwIBAQICAwhYgICAgICAgICBgICAgICAgICAgIGAgICAgICAgIGAgYGCgYCAgIGBgICAgICBgICAURIDAwMDBAQEBAQEBAQDAwQFAwMDBAQFAgMBAQECAgMBAQMCAgMDAwMCAAIDInCAgIGAgICAgICBgYCAgICAgICAgICAgICBgIGAgYGBgIGBgYCAgICAgYCAgIGAgICAgHEaAwEEAgIEAwMDAgIDAwQEAwMDBAICAQIBAQACAwMBAgQFBAMDBAICAghJgICAgICAgICAgICAgYCAgICBgIGBgICAgYGCgICAgYGBgICAgYGBgIGBgICAgICBgYCAgICAQgMCAQIEAwMDAgIEAwQDAwMDAwIBBAUDAQADAgMCAwMEAwQDBAQDInGAgICAgYGAgIGBgIGBgICBgIGBgIGBgICAgIGBgYGAgICAgICAgYGBgYGBgYCAgICBgICAgICAgHIqAgMDAwMDAwMEAwQDAwQCAgICAwQCAgECAQMDAwMFAgIEAxFZgIGBgICAgYGAgYCBgICAgYCBgYGBgYGBgICAgoGCgoGAgICBgICBgYGBgIGAgYGAgICAgYCBgYGAgIGBUhEDAwQDBAQDAwQDAwMCAwIDBgQDBAECAgMCAwMDAwMIQXmBgICAgICAgYGAgYCAgYCBgICBgYGAgICAgICAgYGBgICAgICAgICBgYGAgICAgIGAgICBgYCAgYGBgIKBgYFSEgIFBAMEAwMDAwMDAwQEAwQDBAICBAMCAwICCUJ5gIGAgICAgICAgYGAgIGAgICBgICBgYCAgICAgICBgICBgYCAgICAgICBgYGAgICAgIGBgICAgICAgYGAgIGCgYGBcUITBAUDAwMDBAMDAwQFAwMBAAIDAgIBAhBCeYCAgICAgICAgICAgIGAgIGAgICAgICAgYGAgICAgICAgYCBgYGBgYCAgICAgYGBgICAgICAgICAgICAgIGAgIGBgYGBgYCBURECBAIEAgICAgIDAgIBAwMEAgIhYYCAgIGBgICAgICAgIGBgYGAgICBgICAgICAgYGAgICAgICAgICBgYOAgoGAgYGBgYGAgICAgICAgICAgICAgICBgYCAgYGBgYGBgYFYKQMDAQQCAwMDAgMCAgEgSHmAgICAgYCBgICAgICAgICBgICAgICAgIGAgICAgYGBgYCBgICBgYGBgYGBgYGAgYGBgICAgICAgICBgICAgICBgYGAgYCBgYGAgYGAgICAgnFRJAQEAwMEAwoxUXmAgICAgICAgIGBgIGBgYGAgIKBgYGAgYCAgIGBgYCAgYGBgoKBgICBgoKBgICAgICBgYGBgICAgICAgIGBgICAgICBgYCAgIGBgIGBgYGBgICBgYGCgXJSKxICOoGBgYCBgYGBgYCBgoGBgYCBgYGBgYGCgYGAgICBgYGBgYCAgYCAgYGBgIGAgIGBgICAgICAgIGAgICBgYGAgIGAgICAgICBgYCAgICBgYGBgICAgIGBgYGBgYGAgYA6cYGBgYKBgYGBgYGBgYKBgYCBgoCBgYGBgYGBgYCAgYGCgICAgYGBgIGBgIGBgYGAgICBgICAgIGBgICAgICAgIGBgICAgIGCgYGAgICBgYGBgYGAgYCAgYGAgYGAgIF5eYGBgYGBgICAgYCAgICAgICAgICBgYCAgYCAgICBgYGAgICAgYGAgIGAgICBgYGBgYGAgYGBgICBgYCAgICAgIGAgIGAgYGAgYGBgICAgICBgYGBgYGAgIGBgIGBgYFyOoCAgICAgICAgYCBgIGAgICAgICBgYCAgICAgICBgYCAgICAgoGBgYCAgICAgYCAgYGBgYGAgICAgYGAgICAgICAgICBgoGAgICBgYCAgICBgYGBgYCAgYGAgYGBgYE7AxUoUnGAgICAgIGAgICAgYCAgICAgICAgICAgICAgICAgICAgICAgIGBgICAgICAgYCBgYCAgICAgICBgYGAgIGAgICAgIGBgYGBgYCAgYGBgYGAgICBgYCBgXpRMQkCAwQDAwIhUHGAgICAgICBgICBgICAgICAgICAgICAgICAgIGAgYGAgIGBgICAgICAgIGAgYCAgICAgYGBgYCAgIGAgICBgYGBgYGBgYCAgYGBgIGAgIGBgXlKIgQDAgECAwQCAQIBAgIpWoCAgYCBgICAgICAgYCAgIGBgICAgYCBgIGBgYGBgYCCgICAgYCAgICAgIGAgICAgYGBgYGBgYGBgICAgIGBgYGBgYGBgYGBgYCAgYFhIgQFAwMBAgIBBAQDAwICAgIEAxBRgICAgoKAgIGBgYCBgICBgIGAgIGBgIKBgYGBgoKBgICAgYCAgYCAgIGBgICAgIGBgYGBgYGAgICAgIGBgYGBgIGBgYGAgYB5QhMDAwYGAwMCBAICBAMDAwUEBAMEBAICEkJxgYGBgIGCgYCAgYGBgYGBgYGBgICBgIGBgoGBgYCAgICAgIGBgIGAgICAgYCBgYGBgYGBgICAgYGBgYGAgYGBgYGBeUEJAgICBAQFAwIEAwECBAIDBAUEAgMFBQIDAgQQUYGAgIGCgoGBgYKBgYGBgYGBgICBgICBgYGBgYCAgICAgYGBgYGAgICBgYCBgYGAgYGBgICBgYCBgYGAgYGBgXpCCgQCAgICAgQFBAMEAwICAwMDBAMCBAQDBQQCAgIAAhFTgIGCgYCBgICBgIKBgYGBgYCAgYCAgICAgYGAgICAgYGBgYGBgYGBgICAgICAgICAgIGBgYGBgYGBgYGBWRIEAwMCBAQEAwQEBAMDAgMEAwMCAwICAwQDBAEBAQIAAQMDKHCAgYCAgYCAgIGCgYGCgYCAgYCAgICAgYCAgICAgIGBgYCAgIGBgYCAgIGAgICAgICBgYGBgIGBgXIiBAMDAwQDAwIDAwQEAwMBAgMDAwIDAgMDAwQDBAUEAwIBAgICAAJBgICAgYGAgICAgIGBgYGAgICAgICBgICAgYCAgYGAgIGAgIGCgYCAgICAgYCAgICBgYGBgYGBSgsDAwMDAwMDAwMDAwUDAQMBAgECBAQDBAMEAwMDAwMEAwQAAgACAQEAGHGBgYGAgICAgIGBgYCBgYGAgYCBgICBgYCBgoGAgICAgICBgYCAgICBgYCAgICBgYGBgXEiAwMDAwMDAwMDAwMDBAUEAwMBAQEBAwMEAwMDAwMDBAICAwIAAQMCAAADARFRgYCAgIGBgIGBgYGAgICAgYCBgICAgYCCgYGAgICAgYCBgYCAgICBgYCAgICBgYGBWQoDAwMDAwMDAwMDAwMDAwUEAwMCAwICAwQEBAMDBAMDAwMEAwMBAQEBAgEEAgEEQoGBgYGCgYGBgYGAgICAgYKBgYCAgYGBgYGAgICBgYGAgYGBgIGBgYCAgICBgYE5AwMDAwQDAwMDAwIDAwMDAwQFAwIBAgECAwMDAgMDBQQDBAQDAgMCAgQDAgMBAwECAiJ5gYCBgYKBgICAgICAgYGBgIGAgYCAgIGBgYCBgYGAgICAgYCAgICBgICAeCIDAgMDAwQDBAMDAwIDAwMDAwUEBAMDAwMDAwQCAwMDBAQDBQQEBAQDAwMDAgIBAwIDBAMTcYCBgYCBgIGBgICAgYGBgYCBgYCAgIGBgYCAgYGAgICAgICAgYGBgIBxEQMDAwMDAwMDAwMDBQMEAwMDAwQEBQMDAwQDBAQDAwMDAwMEBAMEAwMDAQMDAwQDAwMDBAQEEnGBgICBgYGBgIGAgYGAgYGAgYGBgYGBgYCBgIGAgIGBgICBgYGBgHESAgIDAgIDAwMEBQMEBQQEBQMDAwQEAwIEAgIBBAQCAwMEAwQFBQMEAwIDAgEEBAQEAwQEAgMDAxJxgYGBgYGBgoCAgIGBgYKBgYKBgoKBgYCBgICAgYGBgICBgYGBaRIDAwMEAwMDAwMEBAMEBAQEBAMDAgQEAgICAgICBAQDAwMEAwQEBQMEAwECAgMEBAMDAwMDBAMEBAIKaYGBgYGBgYGAgICBgYKBgYGBgYGBgICAgICBgYGBgICBgIFxCwQBAwMCAgMAAgQDAwMDAwQEAwIDAwQFAgMCAgICBAQEAwMDAwMDBAMEAgQCAgMDAwMDAwMEAwECAwMDE3KBgYGBgYGAgIGBgYGBgYGBgIGAgICBgIGCgoCAgIGBgHESBAIDBAMEAwMDAwIDBAMCBAQDAwMDBAQEAwIDAgICAwQDAwIDAgMDAwICAgICAQMDAwMCAgMDAwQBAwMDAxJxgoGBgYGAgIGBgYCAgICBgICAgIGAgYGCgYGBgICCcRICAgQDBAMDAwQCAwIFBAMEAwIDAwMDAwQEAwMEAwICAwQEBAMDAwMCBAIBAQECAgIDAgMDAwMDBQQDAwMDBAMReYGBgYGCgYGBgYCAgICBgYCAgICAgYGBgYKBgYF6EgQDAwMCAwIEAwQDBAMEAgMCAwMDBAUFBQMEAwQDAwICAwQDBAIEAwICAgMCAgIBAQIDAwMDBAQFAwMDAwMDAgMBIYGAgICBgYCBgICAgICAgYGAgICBgYGCgYGBgIEjBQUDAwMDAQQCAwUCAwQEAwMDAwMDAwMCAwMDBAMDAwICAwMDAwMDAwICAgMBAgECAgIDAgMDAwQFBQMEBAQCAwICAjmAgICBgICBgYCAgIGAgYGBgYGAgYGBgYGBgUEEBQQDAwMDBAICBAMDAwMEAwMDBAMDAwMCAwMDBAMDBAICAgUEAwMDAwYCAwIDAgICAgMCAwMFBQUEBAIDAwMCAAICAQNZgICAgICAgYGAgYCAgIGBgoGBgYGAgICAUAECAQQDAwMCAQICBAMDAwICBAMDBAMCBAICBAQEAwIDAwEFAwMDAwMEAwMDBAICAgMAAwMCBAQFBQUEAwQEAwMEAgMBAgMIcICAgICBgoGBgYCAgYGBgYGBgICAgIBxEgIBAwMEBQMBAwQDAgQDAwMDAwMDAgMEAwQCAwMEAwEDAgIDAQIBBAMEAgMDAwMBAwMCAwMDBAMEBAIDBAQDAwMCBAQDAwMCIICAgIGBgIGBgYCAgYGAgYGAgYCAgYEaBAQDBAQDAwQDAwMDAgQFBAIDAgMDAwMDAwQCBAMCAgMCAwQCAQECAQIDAwQDAwICAgICAgQDAwMCAgQEAwMDAwMCAwMDAwMDAkmAgIGCgIGBgYCAgYGBgYCAgICAgUICBAQDAgMEAwQEBAQEAgQBBAQDAwMDAwMDAwQEAgIDAwIDAgECAgMBAwIDAwMCAwIEAgMCAgQCAwMEBAMCBQIBAwMDAgMDAwMEAQlxgIKBgYKBgYCBgYGBgYGAgICBcgQDBQQDAwMFBAIDBQMDAwMCAwMDAgQEAwMDAwMCAgIDAwQFAwMEAgQCBQIDAwMCAwMEAwQDAgQDAwMEBAQDBAQCAgIEAwMDAwQDAgIigYGCgYKBgoCBgYGBgYGBgIGBKgICAgIEBAIEAQMCAwICBAIBAgIEAwMDAwMDAgMCAwICAgMEAwQBAwUDAwMDAwMEBAEDAgEDBAUEBAMDBAMDAwIDAwMEAgIDAwACAQIBWYCAgICBgoCBgYGBgYGBgIFSBAMDAwUEBAMDBAMDBAMDAgMDAwMDAwQEBAICAgEDBAMDBAQDAgICAwUDAwICAwQEBAICAQIEAwQFBAIDBAMEAwIDBQQEAgIDAwQDAgICEXiAgICAgYGBgoKBgYGBgYERAwMDAQQCAwMFAwMCBAMFAwIDAwMEAwMEBAQCAQEDAwMDAwMDAwICAgQEBAIDBAQDBQMDBAQDAgMCAgQCAwICAQMDAwIDAwMEAwMEAwMDA0GAgICAgIGCgYGBgYKBgVIEBAQDAwUDAwIDAgMCAwECAgIDAwIDBQMDAwMDAwMDAwMDAwMEAwQEAwMDAwMDBAMEBAIEAwQCBAICAAICAwIEAgIDAwIEAwMDAwUEAwQEBAl5gICCgYCBgoGBgYGBcRMDAwUEBAMDAwIDAwQCAgUDBAUDAwMDAwIDAwMDBAMDAwMDAwMCAwQEAwMDBAIDAwQDAgMDAgMBAgICAAMDAwACAgICAgECAgMDBAQEBAQDAwJBgYGBgYCBgYGAgYGBQQMFBQQDBAMCAgMDAgUDAwMCAwMDBAMDAwMEBAMDBAMDAwQEAwMEAwECAwMDBAMDAwMDBQICAgEBAQMBAQICAwMBAwMEAgECAgMDBAQEBQQDBAIKeYGBgYCBgYGAgIGBEwIEBQQDAwMDAgIDBAQDBQEDBAMEAwMDAwQEBAQDBAIDAwMEAgMDBAICAwMDAgQDAwMEAgIBAgICAgIEAgEBAwMCAgMDBAICAgIDAwQEBAQDAwICQoGAgYCBgYCBgIFSBAQDBAMDBAQEAwIDAgEBAwECBAICBAMEAwQEAwQEAwMDAwMFAwMDAwECBAMDAwIDAwQGAwMDAAIDAAIEAgEDBQQCAwIAAgMCAQIDAwQEBAQDAgICEoGBgYGBgYGBgYESAwQEBAUDAwUDAwMBAQIEAgIBAQQCBAQDAwMEAwQEBAMEAwMEAwMDAwICAwMCAwMCAQMDAwMDAQEDAgICAQIDAwICAwMBAQMCAAICAwMDAwMDAwMDAmGAgIGBgYGAgVkEAwQEBAQEBQUEBAEDAgMCAgEDAgMDAgMDBAQCAwQDAwMDAwMEAwMDAwECAwMEAwMDAwMDAwQEAgICAwECAgMEAwMDAwMCAgECAQIDAgIDAwMDAwQEAiCAgIGBgYKAgSkDAwICBAUBAwMDAwUEAQIAAQIDAgQAAgMEAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgIEBQMCAgMDAgECAwECAgICAgIDAgMCAgICAgIEAwQEBAQDAwIFAwN5gYGBgYKBcQQDAwMDBAMDAwMDAwUEAQECAgECAQIDAwICAwIDBAMDAwICAwICAgEDAgICAwUCBAQFBQQDBAMDAgICAwADAwEBAgQCAwIBAgMBAQEDAwMEBAQDBQMDAwJKgYGBgYGBUgQEAwMFBAQDAwMDAgQEAgICBAIDAgEDBQQEAgIDBAQDBAQCBQIDAwMCAgICBAQDBAMDBAQEBAMDAgMBAgECAgIDAgIEAwIAAgICAgIBAwQEAgIDAgMDAwMigYGBgIGAIgIEAgMEAwQEBAQDAgIDAQEBAgICAgMCAwICAQIFAQEAAQEBAgACAQEDBAICAwMDAwIEBAQEBAMFAwQCAwMCAAEEAwACAwECAgIDAgICAQIEAQMCAwMCAwMCeYCBgYFxAgMDAwMEBAUEBAQBAQMCAgIBAgEAAAMCAgECAgICAwEBAgMAAgEBAgMDAgMCBAQDAwMDAwMCAwMDBAMDAwMCAgUCAwICAgMCAgIBAwQDAgACAgMDAwMEAwMCUoGBgYFQAgMFBAIEBAMEBQICAgMDBQQBBAICAwQFAwIFAgIBAgICAgICAgIDAgMCAgIDAwQCAwIDAgIDAgMEAgQEAwMAAQMCAQACAgICAgEDAwMDAgIBAwMDAgMEAwMDMYGBgYEqAwQEAwIDBAQEAwMEBAICBAMBAwICAwIDAwECAQICAgECAgECAgICAQECAgECAgMDAgIEAwMDAwQDBAMDAwQDAwIDAQIDAgIDAwMDAwMDBAMDAwMEBAMDAwICCYCBgYERBAQEAwQCBAMCAwMDAwICAgIBAgMBAQEAAQICAwICAQIDAwMDAwIBAgQBAgACAwMDAwIDAwQCAwQDAwUCAwIDAAIBAgMCAgICAwIDBAIBAwQEAgMEBAMEAwMCAzlweToDBAQDAgEDAwIEAwIEAwMCAgICAgEDAwECAgECAwQBAQIDAwMDAwEBBAMBAgIC' },\n '720p-landscape': { width: 80, height: 28, source: 'VeoWatermarkRemover/720p-text', dataBase64: 'AQEBBQkICAoFAgEBAgIBAgICAQECAgIBBAoICQgEAgICAQECAwIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAU5c3t9ej8TAgECAwIBAQEBAQECAgkzfH6BfEkWAwIBAQICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAR5Uf35/aywCAgICAgECAgICAgIDHlF9gIBvLwQDAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgIBAQEBAQEBAQEBCzh+gIB7PQoDAgMCAgICAwMDAgU1cH6AgFMdAwMCAQEBAQECAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgEBAQEBAQEBAQEBI2x/gYBbJQIDAwICAgICAwECEUuBgIF7LggCAgIBAQEBAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAQEBAgIBAQEBAQEUR35/f3E+BQMDAgICAgICAgMqX4CAfl4bAgEBAQEBAQICAgICAQEBAQEBAQEBAQEBAQEBAQABAQEBAQECAgICAQEBAQEBAQEBAQEBAQEBAQcmdn1/fFIWAgICAgICAgICCEV0f396MgwCAgEBAQEBAgMGBwcFAwIBAQEBAQEBAQEBAQEBAQEBAQECAwQFBQQCAQAAAQEBAQEBAgIBAQEBAhJWe4CAaTYDAgEBAgICAwMhXX6AfGkXBAICAgICBhowQUhKSUlCNSILAwICAgICAgIBAQEBAQQLIDRCSUlISEA0HwkCAQEBAQECAgEBAQECCSh0gIF6VQgCAQECAgICBEhyf391QAsCAgIDBx5EXW98gICAgX10ZUwoCAMDAwMDAgEBAgIKJ0xic32BgoKBfXRjRyQEAgEBAQICAQEBAQIEDV56gYBoJQQBAQICAgUTY3x/f2wXBAICAxA0ZHl/f3+AgH+AgICAfGo1DwMDAwMCAgIDF0JpfICBgICBgICBgYB6Z0kUBQICAgMBAQEBAQIEOm6AgXVKBQEBAgICCTxxgH9zTAcDAwMPNW9/gH9zW0EyMkBac4CBgHEyDQMCAwICAxtKdoCAgHxtWExMW257gIB+eEoXAgICAgEBAQECAwMRYH+CgGwRBAICAwQOYXqAfmQpBQMDBCxpf39+XC8RCgYHChEvXH6Af2ksBAIDAwMMRHd/f35eMxkRDQwSGzdhgH+BeD0SAwICAQEBAQIDAghKdIKBdzcLAwMDCiZzgIF4TgoCAgEZTn1/f14jBgIBAgICAgUiXX+BfUcUAwMDBDppfoB9Wh0GAgEBAAQECitef4GAaTAFAwIBAQEBAQICBiZggoF7YRMCAgIUU32AgGk3BAQDAzZrf398KAkEBAMEBAMDAw83foB/XikDAwMQWXx/e2UdBwMCAgMDAgICByp2gYB/TRUBAgEBAQEBAgICCkt9gYF+GwQDBB94gYCATxIEBAMGS3+Bf3dLQkBAQEBBQUBAQ1J+goFpMwMDAyNjf390SgkCAQIDAwIDAgIEFUd+gn9aJQQCAQEBAQECAQIDMmZ/gIBHFQMXR4CBgHA3AgIEAhRUgIGAgoCAgYGBgYGBgYCAgYGBf3ZCBAICM2p/f24uBgIBAQICAgMCAgIMM36Cf2UyAwIBAQAAAQICAgITR36CgWgkBiZmgoJ/TBgBAQMCFlV/gYB6c3FxcXBxcXFxcXBwcXBwZzoFAwM2an+Aby4GAQEBAgICAgICAQsvfoF/ZjMDAgEBAQEBAQECAgQwcIGCfzkWPH2BgXY2CQEBAgIRUn+AfWAxJiYmJSUlJSYmJSQlJCUiFAMCAzJpgIFxNQcCAQECAgICAgICDTR+gX9kMAICAQEBAQECAgICBBxPgIGAV0FWfoF/WyADAgIDAghKfIB+aBkFAwMCAgICAwMCAgIDAwQDAgICImOBgnhQCwIBAQICAgICAgMXToCCf1olAgMBAQEBAQEBAgICCzN9gYFza3F+gH03DgICAgIDBDdrgIB8NA8DAgEBAgIDAwUOJRoOBgMCAgILUHqCf3IlCAEBAgICAgECDDN1gYJ5RA8DAwEBAQEBAQEBAQEDHWJ+gH9/f399aR0EAQICAgIDGk18gH5mNhIEAgIDAwQHHEZsW0UkCwICAwQvZIGBfGAsDQMDAgIDAw4zY3+AgGQtBQICAQEBAQEBAQECAQIQPH2BgYCAf3g+DwICAgIDAwIIK2GAgX9sTzAYDwsNHTdYeX5+cjkLAgICAw9EdoKAf2ZJLx0TFBstSWmAgYF3OxACAgEBAQEBAQEBAQEBAQcdaH6BgYF9ax4HAgICAgICAwMOLmGAgH98cF9ZVVZicn1/fnJIGQICAQECAxpJeH+AfnpvYVlbYW15f399dEEUAgICAQEBAQABAQEBAQECAg1Fd4CAgHZREQQCAgICAgICAgILJFR3f4CBgYCAgYGAfnptOBQFAgICAgICBRU2YXt/gICBgIGBgYB/eGExDwQCAgIBAQEAAAABAQEBAQECBBhaZ2dnVyAGAgICAgICAgEBAQIGFChMbX1+f4CAfnhnRyEKBAICAgICAgIEBQocQWF3f39/f4B/c1o4GQcDAgICAgEBAQAAAAEBAQEBAgICAxETExMQBAEBAQECAQICAgEBAgIDBQ4WJTY6PDstHxUNBAICAgICAgIBAQICAwQLEhwqNjs/MyQZEAgDAwMCAgICAgEBAAABAQEBAQEBAQEAAQEBAQEBAQEBAQICAQICAgIBAgIBAgIDBgcIBwUDAgEBAgICAgICAgICAgICAQECAgMFBgYFAwIBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgIDAgICAgICAgIBAQEBAgEBAQEBAQIBAQEBAQECAgICAgICAgICAQECAgEBAQE=' },\n '720p-portrait': { width: 80, height: 28, source: 'VeoWatermarkRemover/720p-text', dataBase64: 'AQEBBQkICAoFAgEBAgIBAgICAQECAgIBBAoICQgEAgICAQECAwIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAU5c3t9ej8TAgECAwIBAQEBAQECAgkzfH6BfEkWAwIBAQICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAR5Uf35/aywCAgICAgECAgICAgIDHlF9gIBvLwQDAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgIBAQEBAQEBAQEBCzh+gIB7PQoDAgMCAgICAwMDAgU1cH6AgFMdAwMCAQEBAQECAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgEBAQEBAQEBAQEBI2x/gYBbJQIDAwICAgICAwECEUuBgIF7LggCAgIBAQEBAgICAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAQEBAgIBAQEBAQEUR35/f3E+BQMDAgICAgICAgMqX4CAfl4bAgEBAQEBAQICAgICAQEBAQEBAQEBAQEBAQEBAQABAQEBAQECAgICAQEBAQEBAQEBAQEBAQEBAQcmdn1/fFIWAgICAgICAgICCEV0f396MgwCAgEBAQEBAgMGBwcFAwIBAQEBAQEBAQEBAQEBAQEBAQECAwQFBQQCAQAAAQEBAQEBAgIBAQEBAhJWe4CAaTYDAgEBAgICAwMhXX6AfGkXBAICAgICBhowQUhKSUlCNSILAwICAgICAgIBAQEBAQQLIDRCSUlISEA0HwkCAQEBAQECAgEBAQECCSh0gIF6VQgCAQECAgICBEhyf391QAsCAgIDBx5EXW98gICAgX10ZUwoCAMDAwMDAgEBAgIKJ0xic32BgoKBfXRjRyQEAgEBAQICAQEBAQIEDV56gYBoJQQBAQICAgUTY3x/f2wXBAICAxA0ZHl/f3+AgH+AgICAfGo1DwMDAwMCAgIDF0JpfICBgICBgICBgYB6Z0kUBQICAgMBAQEBAQIEOm6AgXVKBQEBAgICCTxxgH9zTAcDAwMPNW9/gH9zW0EyMkBac4CBgHEyDQMCAwICAxtKdoCAgHxtWExMW257gIB+eEoXAgICAgEBAQECAwMRYH+CgGwRBAICAwQOYXqAfmQpBQMDBCxpf39+XC8RCgYHChEvXH6Af2ksBAIDAwMMRHd/f35eMxkRDQwSGzdhgH+BeD0SAwICAQEBAQIDAghKdIKBdzcLAwMDCiZzgIF4TgoCAgEZTn1/f14jBgIBAgICAgUiXX+BfUcUAwMDBDppfoB9Wh0GAgEBAAQECitef4GAaTAFAwIBAQEBAQICBiZggoF7YRMCAgIUU32AgGk3BAQDAzZrf398KAkEBAMEBAMDAw83foB/XikDAwMQWXx/e2UdBwMCAgMDAgICByp2gYB/TRUBAgEBAQEBAgICCkt9gYF+GwQDBB94gYCATxIEBAMGS3+Bf3dLQkBAQEBBQUBAQ1J+goFpMwMDAyNjf390SgkCAQIDAwIDAgIEFUd+gn9aJQQCAQEBAQECAQIDMmZ/gIBHFQMXR4CBgHA3AgIEAhRUgIGAgoCAgYGBgYGBgYCAgYGBf3ZCBAICM2p/f24uBgIBAQICAgMCAgIMM36Cf2UyAwIBAQAAAQICAgITR36CgWgkBiZmgoJ/TBgBAQMCFlV/gYB6c3FxcXBxcXFxcXBwcXBwZzoFAwM2an+Aby4GAQEBAgICAgICAQsvfoF/ZjMDAgEBAQEBAQECAgQwcIGCfzkWPH2BgXY2CQEBAgIRUn+AfWAxJiYmJSUlJSYmJSQlJCUiFAMCAzJpgIFxNQcCAQECAgICAgICDTR+gX9kMAICAQEBAQECAgICBBxPgIGAV0FWfoF/WyADAgIDAghKfIB+aBkFAwMCAgICAwMCAgIDAwQDAgICImOBgnhQCwIBAQICAgICAgMXToCCf1olAgMBAQEBAQEBAgICCzN9gYFza3F+gH03DgICAgIDBDdrgIB8NA8DAgEBAgIDAwUOJRoOBgMCAgILUHqCf3IlCAEBAgICAgECDDN1gYJ5RA8DAwEBAQEBAQEBAQEDHWJ+gH9/f399aR0EAQICAgIDGk18gH5mNhIEAgIDAwQHHEZsW0UkCwICAwQvZIGBfGAsDQMDAgIDAw4zY3+AgGQtBQICAQEBAQEBAQECAQIQPH2BgYCAf3g+DwICAgIDAwIIK2GAgX9sTzAYDwsNHTdYeX5+cjkLAgICAw9EdoKAf2ZJLx0TFBstSWmAgYF3OxACAgEBAQEBAQEBAQEBAQcdaH6BgYF9ax4HAgICAgICAwMOLmGAgH98cF9ZVVZicn1/fnJIGQICAQECAxpJeH+AfnpvYVlbYW15f399dEEUAgICAQEBAQABAQEBAQECAg1Fd4CAgHZREQQCAgICAgICAgILJFR3f4CBgYCAgYGAfnptOBQFAgICAgICBRU2YXt/gICBgIGBgYB/eGExDwQCAgIBAQEAAAABAQEBAQECBBhaZ2dnVyAGAgICAgICAgEBAQIGFChMbX1+f4CAfnhnRyEKBAICAgICAgIEBQocQWF3f39/f4B/c1o4GQcDAgICAgEBAQAAAAEBAQEBAgICAxETExMQBAEBAQECAQICAgEBAgIDBQ4WJTY6PDstHxUNBAICAgICAgIBAQICAwQLEhwqNjs/MyQZEAgDAwMCAgICAgEBAAABAQEBAQEBAQEAAQEBAQEBAQEBAQICAQICAgIBAgIBAgIDBgcIBwUDAgEBAgICAgICAgICAgICAQECAgMFBgYFAwIBAQEBAQEBAQECAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgIDAgICAgICAgIBAQEBAgEBAQEBAQIBAQEBAQECAgICAgICAgICAQECAgEBAQE=' },\n '1080p-landscape': { width: 120, height: 42, source: 'VeoWatermarkRemover/1080p-text', dataBase64: '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' },\n '1080p-portrait': { width: 120, height: 42, source: 'VeoWatermarkRemover/1080p-text', dataBase64: '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' },\n 'veo-diamond-1080p-landscape': { width: 96, height: 96, source: 'GeminiWatermarkTool/bg_b_96', dataBase64: 'AgMCAgICAgMCAwICAgICAgIDAgICAgICAgMCAgMCAgICAwICAQICAgIEAwIBDis+QjIQAQICAgICAwICAwICAwMDAwICAgICAgQBAgMDAwMDAwICAgICAgIDAgICAgICAgIDAgIDAgIDAgICAgMCAgICAgICAwICAgECAgIDAgICAwICAQMBAgMDAgIEFTFFRzcXBQMEAwMDAgMCAgMCAwICAgMCAwIDAgIBAQIDAgMDAgEBAwQCAgICAgICAwICAgICAgICAwICAgECAgECAgICAgMCAgICAgICAgICAgICAgICAgICAgICAQMJHDlPUDweCQICAgICAwIDAwICAgICAgICAwICAwICAgEBAgICAQICAgIAAgMBAgIDAgICAwICAgICAwICAgICAgMCAgMCAQICAgICAgICAgMCAgICAwIDAgICAgIDAgIPKURZWUYqEAMDAgIDAgICAgMCAwICAgIDAgIBAgICAwEBAwIBAQICAgIBAgMCAQIDAgICAgICAgIDAgICAgICAgQCAwICAgICAwICAgICAwMDAgICAgICAgMCAgICAgIZNE1dXkwzGQMEAQMCAwIDAwMDAgMCAgICAwIDAgIDAgICAgICAgIDAwMCAgICAgICAwICAgICAgIDAgICAwIDAgMCAgIDAgICAwICAgMCAgQDAgIDAwIDAgMCAgICAgUeN01cXE02HgUCAgMCAwIBAQMCAgIDAQECAwIDAwICAgIDAgICAwICAgMCAgIDAgICAwICAgICAgICAgMCAgICAwMDAwMDAgICAQICAgMCAgMCAwICAgIDAgIDAwIBBA8oO0tZWUo8KA4FAQMCAwMDAgMDAgICAgMCAgICAgIBAgICAgICAgECAgMBAQICAQECAgICAgIDAgICAgICAgICAwICAwICAwMCAgICAwMDAgIDAgIDAgIDAgMCAwIBCBg1Q0xWVkxCNhgHAQMCAgIDAgICAwICAgICAwICAgMCAwICAgICAgICAgIBAQICAQECAgICAQICAgMCAwMCAwICAgICAwEDAwIDAgICAgMCAgICAwICAwMCAgICAgICBh49SE1VVU5HPh0HAQIBBAMCAgICAgIDAgICAgICAgMCAwICAgIDAwICAgICAgIEAgMCAgICAgICAgIDAgIDAwICAwMDAgICAwICAgICAgICAgIDAgICAgICAgMCAwICDSlIT09SUk1OSCkPAgIDAgICAgMCAgICAgICAwIDAgICAgIDAgICAgICAgMCAgIBAgICAwIDAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgIDAgICAgICAgIEGDRRU05QUE5SUTYaBQICAgEDAgICAgICAAECAgICAgICAgMDAgICAgABAgICAgICAAECAwECAQICAgICAgICAgICAwICAgICAgICAgIBAgICAgICAgICAgEDAQMCAgIJJD1VVU9PT05UUz8pEAICAgICAgICAgICAAECAgICAgICAgICAgICAgABAgICAwICAAECAwECAgICAgEEAQICAgECAgMCAgICAgICAwICAgICAgIDAgICAgICAgMCAgMYMEZWVk9OTk9UVUg5IwsDAgIBAgMCAgICAgICAwEBAgICAgEDAgICAgICAgMCAgICAQICAwICAgMCAwIDAgICAwIDAgQCAgIDAgICAwICAgICAgIDAgICAwICAgQCAwkkOEhVVE9OTk9SVEtCLxEDAwECAgMCAgIDAgICAwEBAgMCAgIDAgICAwICAgMCAgIEAgICAwICAgMCAgICAgIDAgICAwICAwIDAgMDAwICAgMCAgMCAgICAgICAwMDBRMyQktTUk5OTk9RUkxJPBgGAgMCAgICAgIDAgIDAwICAwMBAgICAQECAgICAgMBAQICAgICAgEBAgICAgICAgIDAwICAgMCAwMDAgICAwIDAgICAgMCAgIDAgMDAgMCDCREUE1QUE9OTk5PT09TSigQAgIDAgICAgMCAwMCAgICAwICAgICAAECAgIDAwIAAAICAgICAgABAgMCAgICAgMCAwICAgIDAgIEAwMDAwMDAgQCAgIEAgIDAwMCAwICEi9MVlBQUE5PTk9OTk9VTzQbBQIDAgICAgICAgIDAgEBAgMCAgICAgICAwICAgIBAQECAQECAgICAgICAgIDAgICAgICAwMCAgMCAwMCAwMCAgICAgIDAgICAgICAQMLJj5TV1FOT09OTk9OTlBXU0AuFAUCAgMCAgICAgICAwEBAwIDAgIDAgMCAgICAgMBAQEBAgEBAgMBAwICAgIDAgICAgECAgMCAgICAgIDAgICAgICAgICAgIBAwACAQgfOEhVVFBPT05OTk9OTlBUUkc8JAkBAgICAQICAQACAgICAgIAAQMCAgICAgABAgIBAgICAAECAgACAgICAgIDAgICAgEDAgIDAgICAgIDAgICAgIBAgICAgIBAgEBAg8wSExQUU5OTk9OTk5OTk9RUEtGLwwAAgICAQICAAECAgICAgIAAQICAgICAgABAgICAgICAQECAgECAgIDAgIDAgICAwICAgMCAwMCAgIDBAICAgICAgIDAgICAgICCSFFWFNOUE5OT05OTk5PTk5QT1BSQB0IAgMCAgEBAgECAgICAgICAgECAgICAgICAQIBAQICAQECAwIBAgMDAgIDAgMCAwMDAgQCAgIDAgICAwICAgMCAgICAgICAwIDFzFKWVNPTk1OT05PTk9OT05PTlFVSC8ZBAICAgECAgIDAwICAgMCAgECAgICAwICAQIBAQIDAQECAwECAgICAgMCAgIDAgICAgICAgICAgICAgICAgMCAgMCAgICAQUSLz9MVVFPTk5OTk5OTk9NTk5OTlBTTEEyFgYBAgMCAgMDAgICAQECAgICAgICAgECAgICAgICAQECAgEBAwICAgMCAgIDAgICAgIBAgMDAgIDAgIDAwICAgMCAgICBRQsREtOUU9OTk5OTk5OTk9NTU9PTk9RUE1HMBUDAwMDAwICAgICAQECAgICAgICAgICAgIBAgICAQECAgEBAgICAgMCAwICAwICAgMCAgIDAgICAgMCAwMCAwICAgICDSQ5TlFNTlBPTU1OTk5PTk9OT05OTk9PUFJPOyYMAQMDAAECAgECAgMBAQEBAgMCAwIDAgIDAwEDAQECAwICAgICAgIDAgICAgICAgMCAgICAgIBAwICAgIDAgIDAgQLIjhIVlRNTU5OTU1PT05OT05PT05PTk5OT1RVRzkiCwQCAQACAwEBAwIAAQECAgMCAwICAgQDAwIDAQECBAMDAgMCAgICAgICAgICAgICAgICAgICAgIDAgIBAgICAgsdNUdPVlNPTU5OTU5OTk5OT05OT05PTk9NT1JVT0c2HAsCAQICAgACAgIBAQICAgMCAgABAgICAgICAQICAgECAgMCAgICAwICAgICAgICAgICAgIDAwIEAgICAgICBBgtRU9OUVBPT05PTk5OTk5OTk5OT09PTk5OTlBRTk9ELBgEAgICAgIBAgMBAQMCAgIBAQABAgMDAgMCAAECAgABAgMDAgIDAgICAgICAgQDAgICAwMCBAMCAwICAgMJGDFCUlVQT09OTk9OTk5OTk1OTk9OTk5PTU1OTk5OUFZRQDAXBwICAwEAAQECAgIEAQEDAwMCAgMBAQECAQECAwIDAwICAgIEAgICBAMDAgMDAgIDAwMCAgMCAgQCAggZLUJLUlNQTk9OTk9PTk5OT05OTk9OTk5PTU1OT05OUFRRSkItGAcCAwEBAQICAgIDAQECAwMCAgMBAQIDAQECAwECAgICAgIDAgICAgICAgMCAgICAgIDAwMDAwEBAxktQVBPT1BOTk5NTU5OTU1OTk5PTk5OTk5OTU1OT01OTlBOT1BBLBgDAQABAwICAwEBAgACAgEBAgICAgICAAECAgECAgICAgICAgIDAwIDAwICAgMDAgICAgIDAgQLGTBCUVdTTk5OTk5NTU5OTk5OTk1OTk5OTk5NTU5OTk5OTk5OUldQQjAXCwMBAgICAgIBAAEDAgIBAgICAgICAQECAwECAgMCAgICAgMCAwICAgMCAgMEAgECAgICAg0cLUJMUFRRT05OTk5OTk5PTk5OTk5OTk9OTk5OTk5OT05OTk9OUVNQS0IsHgsCAgMCAgIBAgICAwICAgICAgIDAgMDAwICAgICAgIDAgICAgMDAgMCAgICAgMCAwEFDCI2RlFTT1BPTk5OTk9OTk5OTk5OT05OT09OTk5PTk5OTk5OTk5OTk9PUlJENyIMBQECAgIDAgICAQICAgQBAgECAgICAwICAgICAgICAQICAgEBAwICAwICAQIDAQYXJDhGT1VTT05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTU1NTU1NTk9NTk5QUlRPRzgkFQUBAQICAgICAgICAgIAAQICAAECAgICAgICAwICAgICAgEBAgIDAwMDAQIBBRYwO0hOTVBQTk5OTk5PTk5PTk5OTk5OT05OTk5OTk5OTU1NTU1NTk5OTk5OUFBOT0g5LRMDAQICAgECAgICAgIAAQICAAECAgICAwICAgIDAgIBAgICAgMCAgICAgIJGjRIUFZUUE5PTk5PTk5OTk9OTk5PTk5OT05OTk5OTk5PTk5OTk5PTk9OTk5OT05RVVRORDAXCQIDAAICAgEBAgQBAQIDAgICAwICAgMCAgIDAgICAwICAgMCAgIFCg4eMUJPUlVSUE5PTk5OT09PTk9PTk5PTk9OT05PTk9OTk5PTk5OT05PTk9OT05PTk9QVFVSTEAxIBAJAAICAwEBAwMCAQMDAgIDBAICAgMCAwICAQECAgECAgIBAQQWJC8/R0pPT09PT05OTU1OTk5OTk5NTU5OTk5PT01OTk5OTk5OTU1OT05PT05NTU5PTk5OT09PT0xLRjIgCwICAgIDAgMBAgMDAgMDAgEBAgICAgICAAECAgICBAMFDhstPEdSVVJPUE9NT05NTU1OTk5OTk5NTU9OTk5PTk1NT05PTk5PTU1OTk9PT09NTU5OT05PTU1OT1RYWEg6JRMLBAQCAwQBAQQCAgMDAwABAgMCAgICAwECAwICCxIYKDRAR0tQUVBPT09OTk5OTk5OT05OTk9PTk5PTk5OT05OTk9OTk5OTU1OTk5OTk5OT05PT05OTk5PT1JTU0xIPS4kFAoDAgIDAwECAgICAgICAwIBAgICAQEBAgYQIy88Sk5RUlBQT05OTk5OTk5OTk5OTk5OTk9OTk5OTk5OT05OTk9OTk5OTU1OTk5OTk9OTk5OTk5OT05OT09NTlBVUkxFMiMYCAUCAQAAAQIDAwICAgMAAQICBAYHDRgoOEFJU1RWU1FPTk5OTk5NTU5OTU5OTk1NTk5OTk5OTU1OTU5OTk5NTU5OTU5OTk1NTU1NTU5OTU1OTk5OTk5NTVFUV1NPQjcwIxcOBwYEAAECAgICAwIAAQIGDhkdKTQ+SEtMT05QT09OTk5OTk5NTU5OTk5OTk1NTk5OTk5OTU1NTU5OTk5NTU5PTk5OTk1NTU1NTU5OTU1OTk5NTk5NTU5PUE5OSkdFPDQpHRgOBAECAgICAgMIDxkfKDU8SFFTVVRST05OT09OT05PTk5OTk5PTk5OTk1NTk9OTk5OTU1OTk5OTk5NTU5PTk5OTk1NTU1NTU1OTk5OT05OTk9NTU9PTk9QUlRVVVJIPDUoHhkQCQMBDxceKjM3O0JHT1JUVVNRT05PTk9PT05OTk9OTk5PTk5OT01NTk9OTk5PTU1OT05OTk9NTU5PTk5OTk1NTU1NTU1OTk9OT05OTk9NTU5PT09QU1JUVVROR0M8NzQqHBMMMDY9RkxMSktNTk5PT1BNTU5PTk5PTk1NTk5OTk5OTU1OT05OTk5NTU5OTU5OTk1NTU1OTk5OTU1OTk5OTk9NTU5PTk9NTk1NTk5OT05PTU1PTk5OT05NTEtMTExEOTApQEdQWV1cWFVVUlBPTk9NTU5OT05OTk1NTk5OTk5OTU1OTk5OTk5NTU5OTk5OTk1NTU1OTk5OTU1OTk5OTk5NTU9PT05NTk1NT05PTk9OTU1OTk1NT1BRU1VYXFxZTkQ9PkZNWV1cWVdUU09PTk9PTk1PTk5OT05OTk9OTk5PTk5OT05OT01OTk5PTk5PTk5OTk9NTU5OTU1OT05OTU5OTk9PTU5OTk9OTk9OTk9PTk5OT01NT1FSVFZZXF1ZUEhAKjE5RE1OS0xNTk5PUFBOT05OTk5OT05OTk5OTk5PTk5OTk5OTk5OTk5NTk5OT05OT05NTU9PTU1OTk5OTU5PTk9OTU5OT05OT09OTk5PTk5PTU5OT09OTUxLTE1FPTYxDBMbKTQ2O0RHTlJUVVNSUU9OTk5OTk5OTk5OTk1OTU9OTk5OT05NTk9OTU5OTk5OTk9NTU5OTk5OTk1NTk5NTk5OTU5OTk5OTk1NTk5OTU1PUVJUVFNOR0I8NTMqHhYPAwQHDxkeKDU8SFBUVlVSUE9OTk5OTk5OTk5OTk5PTk5OTk5OTk9OTk9PTU1OTk5PTk5NTU5OTk5OTk1OTk5OTk5OTU1OT05OTk1NTU9OTk1PUlNVU1FIPjUoHRgQCAQCAgIAAQIGDxgdKTM8RklJT09RUE9OT05OTk5OTk5PTk5OTk5PTk9OT09OTU1OT09OTk1OTk5PTk5OTk9OTk9OTk5OTk5OT05OT05NT09RUE9OTEtIPzYoHBgOBgIBAgMCAgMBAQICBAYHEBciMThCT1RYVVFOT05OTk9OTk5OT05OT05OTk9OTk9PTU1OT05OTU5OTk5PTk5NT05OTk5OTk5PTk5OT05OTk9OT1NVVlZUSkI4KRsNBwcFAgMBAQICAgMCAgIBAAABAgQIGCMyREpUVFBOTk5OTk5OTk5PTk5OTk5PTk5NTU9OTk5OTk9OTk5OTk5OTU1OT05PTk9OTU1NTk5OTk1NTk5OT1BSUE1KOy4jDwgDAQACAQICAwICAgMDAgICAAEDAwICAwsSIi49R0xTU1FPT05OTk5OTk5OTk5OTk5NTU5OTk9OTk5OTk5OTk5OTU1OTk9OTk5NTU1NTk5OTk1OUFFSUUtIPzMoFxELAgMCAgICAQICAgICAwMBAgICAwMCBAECAgMFDBMnOUlYWVVQT09NTk5OTk5OT01NTk5OTk5PTk5OTk5OTk5OTk1NTk5PT01NT05OTk5PTU5OTU5QUFRVU0c8LBkQBgMDAgIBAQIDAQECAgIDAgIDAgIDAgICAgICAgMCAgILIDJGTExOT09QTk5OTk5OTk1NTk9OTk5OTU5OT05OT05OTk1OTk5PTk1PTk9OTk5OTk5OUE9PT0tIQC8kEwMCAgICAgMAAQICAQECAwICAgICAgICAgICAgICAgIDAgEBCA8hMj9LUVRTUU5OTk5OTk5PT05NTk5OTU1OTk1OTk5NTU5OTk5OTk1NTk5NTk5OTU1PUVRSTkEvHg4KBQICAgABAgICAgICAgICAgEBAgIBAgICAQMCAwICAwMCAgMCAgIJGC9DTVVVUU9OT05PT01PT05OTk5OTU1OTk5OTk5NTU5OTk5OTk1NT05OTk9OTU1PU1VPSDMYCAICAgICAgABAgICAgICAgMCAgEBAgICAgIDAgIDAwMCAgMCAgICAwMDBhIsOUdPT1BRTk5OTk5OTk9NTk5OTU1OT05OTk5OTk5PTU1OTk5OTU5OTk5OUFBOUEY7MBYFAQIDAgIBAQICAgMCAgMCAgICAwICAgMCAgICAwICBAIDAgMCAgIDAgICAwUUJDlIUFZVT05PT05OTk9NTU5PTU1OTk5OTk5OT05OTU5OT05OTU5OTk9QU1ZQSDckFQcBAgIDAgIBAgICAgMCAwIDAgICAwICAgICAgICAgECAwICAgIBAQIDAQICAwIFCyM2RlNUT09OTk1NTk5NTU5OTU1OT01NTU5OTk5OTU1OT05OTk5NTU9PUlJGNiELBAECAgICAQECAwIDAgIBAQEDAgICAgICAgICAwMDAAECAgICAgICAAIDAQECAgICAgseLkJLUFRRTk1NTk5NTU5OTU1OTk1NTk5OT05OTU1OTk9OTk5OUVNQS0ItHQkBAQECAgEBAAECAgMDAgIAAgICAgICAgEDAgMDAwICAgICAwIDAgICAgIDAgICAgICAgQLGTFDUldTT05OTk1OTk5PTk5OTk5OTU5OTk9PTk5OT05NTk9OU1dSQjAZCwQCAgMCAgICAgICAwICAgICAgIDAgICAgICAgIDAgIDAgIDAgICAgQCAgMCAgICAwECAgEBAxkuQlJQT1BPT09OTk5PTk5OT05OTU1OTk5PT05PT05NTlBPUFFCLBgEAgEDAgICAgIDAwICAgIDAgMCAgICAgMCAwICAwMCAgIDAgICAgIDAgICAwEDAwMCAgICAgIBAQgYLUNNU1NRT09NTk5OTU1PTk5OT09OTk5PTk5OTk1NUFNTSkMtGAgCAgICAgIAAQICAgICBAIBAwIBAAICAQECAgICAwMCAgICAgICAwICAgICAgIDAgICAgICAQIBAQMIGDFDU1VQTk9OT05OTU1OTk5OT09OTU5OTU5OTk5OUFVUQzEYCAMDAgMCAwIBAQICAwEDAwABAgIBAgMCAAECAwMCAgICAgICAwICAQICAwICAwMCAQICAgABAQECAgICAhgtRk9OUVBOT05OTk5OT05OTk5NTk5OTk9OTlBRT1BELBgCAgICAwMCAwICAgEBAgICAwIDAgICAgICAgMBAwICAgMCAgICAgICAgICAgICAgICAgICAgABAQECAgICAQkdN0dPVVRPTU5OTk1OT05OTk5OTk5OTk5NT1NWT0g1GwsCAgICAgICAgICAgEAAgIDAwICBAMCAgMDAwMDAwMDAgIDAgICAgICAgICAgECAgICAQICAgAAAQIBAQIBAQMLIjdGVVROTU5OTU5OTk1NTk5OTk5OTU1OTlNVSDgiCgQCAgIDAgIBAwMBAgMCAQEBAwIDAwMDAgMDAgMCAwMDAgICAgICAgICAgICAgICAgICAgICAgACAgIBAQICAAACCyM6UFJOTk9OTk5OTk1NTk5OTk5OTU5PT1FOOSQLAgICAgMDAgABAwMCAwICAAABAgIDAwMCAwMDAgIDAwICAgMCAgICAgICAwICAgMCAgIDAgICAgICAgMDAgICAgICBRUwSE9PUU9PTk9OTk5PTk5OTk5PTk9QUExELRUEAgIDAgIDAgMDAgMCAgIDAgIBAwECBAMBAgMDAgEEAwMCAgICAgIDAgICAwICAgMCAgICAgICAwICAgIDAgMEAgICAQYVNENMU1FOTk5OT05OTk5PTk5PT1FVTEAwEwYBAgIDAwIDBAICAgICAgIDAgMCAgEBAwQBAQICAQECAwICAgICAgICAgICAgICAgICAgICAAECAgABAgICAgICAgICAwEEGjFIVlFOTU1PTk5OTk5NTU5OTVNZSzAYBAICAgIDAAECAwICAgMBAQICAgICAwICAwICAgIDAAECAgIBAgICAgICAgICAgICAgICAgECAAECAgEBAgICAgMEAgICAgICCR5BU1BPTk1OT05PTk5NTU5OTlJYRiAIAwICAgICAAEDAwICAgMBAQICAwMDAwEDAgIDAgIDAQEDAgMDAgICAgIDAgICAgICAgICAgICAgICAwICAgEBAQIDAgIBAgICAQ8wR0tQUFBOT05PTk5NTU9RUExJMQ4DAgMCAQICAgECAwICAgIEAwIDAgMDAgICAgMDAgMDAgIDBAMCAgMCAgIDAgICAwICAgMCAgIDAgICAwICAgMBAAICAgIBAwIBAgwkO0hTVFBOT05OT09NTVFVVEc5IAgBAwMCAQEDAgICAgEBAwMCAgIDAwICAwICAgMCAwIDAgMDAwMDAgMCAgICAgICAwICAgMCAgICAQICAgEBAgICAgIDAQECAgABAQUTLD9TVlFOTk1NTk5OTlFXUjwlDAIBAgIBAQMDAwICAgEBAgICAwICAgEDAwIDAgIBAQIDAgMDAgMCAgICAgICAgICAwICAwMCAgMCAgICAgABAgICAgICAAECAgIBAQECGTNOVlBOTU1OT05PUE9USy0UBAMCAgIAAQIDAgICAwABAgICAgECAQEDAgMCAgMAAQICBAICAgECAgQCAwMCAwICAwIDAgMDAgIDAgIBAgICAgMCAgIDAgICAwICAgIBEChMU09PT09OTk9PT01QRCMMAwEBAgICAgIDAgICAgMCAgMCAgICAgIDAwEBAgICAgMDAgICAwEBAgICAgMDAwMDAgICAwMCAgICAgMDAwICAgICAgIDAgICAgICAgMCBhg8SUxRUk5OTk9RUkpDMhMFAgEBAQQCAgMCAgIDAwICAgMCAgIEAgIDAgECAgMDAwICAgMDAwEBAgICAgICAQICAgICAwICAgMCAgICAgICAgICAgICAgIDAgIDAgICAxEwQEtTUk5OT05SVUk5IwoDAgICAgMCAgMCAAECAwABAgIBAQMDAgECAwICAgICAgMDAgICAgECAgICAgICAQICAwIDAgICAgICAgICAgICAgICAgICAwICAgIDAgMDBAojOEhWVE9OTlBVVkcwGAMCAgIDAwMDAwICAQECAwECAwICAgMDAgECAgICAgMCAwIBAAEBAgEBAgICAgIDAgICAgICAgMCAwIDAgMCAwICAgICAgIDAgICAgICAgQCAwMPKT9UVU5PTk1VVD0lCAECAgMDAgQCAwICAwICAwIDAwMCAgIDAwMDAQICAgQCAgICAgMDBAICAgMDAgICAgICAwMCAgICAgIDAgICAwICAgMCAgIDAgMCAwMCAgMCAgIGGjVRU05RT05TUTUYAwICAwICAwMCAwIEAgMDAwMDAgQDAwIDAwICAgIDAwMDAgIEAgMDAwMDAgICAgICAgIDAgECAgMDAQICAgICAgICAgMCAwICAwICAwICAgICAgICDipIT01SUk5OSCoOAwMDAgIDAwIDAgICAgIDAwMDAwMCAgIDBAIDBAECAwIBAQICAgICBAICAgICAgICAQMCAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIBBx08R0xVVU5HPh4IAQMDAgMCAgMBAwMCAgICAwIDAgIDAwMCAgMCAgECAgIBAQICAgMCAgICAgMCAgICAgICAwICAgICAgMDAgECAgICAgMCAgIDAgICAwICAgICAgICBxg1Q0xWVUxDNRgHAgMDAwMCAwICAwICAgMCAwICAwMDAgMDAwICAwIDAwMDAwEDAQIDAgMDAgICAgMDAgMCAgICAgIDAgMCAgICAwICAgICAgIDAgICAgIDAgICAgIBBA4oPUxZWUw7KQ4EAQICAgIDAgQDAwIDAwIEAgICAwICAwIDAgICAgMCAwQCAgEBAQICAwIDAgMBAgICAgMDAgMDAgICAgICAgICAgICAgIBAgICAQICAgICAgICAgIBAgYeNkxdXU01HgUCAQICAgEDAgICAwIDAQEDAgEBAgIAAQICAgIDAwEBAwMDAwIDAAEDAgICAgIBAQMEAgMCAgIDAgMCAgMCAgMCAgICAgIBAgICAgICAgICAgICAgMCAgMaM0tdXk0zGAICAgICAQABAgMCAwMDAgECAgEBAgIAAQICAgICAgABAgICAwIDAAICAgICAgMCAgMDAwMCAwIDAgMCAwECAgEDBAICAgICAgIDAgICAwICAgMCAgICAwMQK0VZWUQpDwIDAgICAwICAgMCAgMCAgICAgICAgICAgEDAgICAgEBAgMCAgMCAgICAwICAwMCAgIDAgIDAwICAwIDAgMDAgMCBAICAgMCAgIDAgICAwICAgMCAgIDAgMIHzxPTjocCAICAgICAgICAgMCAQMDAgICAgICAgICAgIDAgICAgAAAgICAgIDAgICAwICAQICAgMCAgICAgICAgICAgIDAgICAgMCAgICAgICAgICAgIDAgMCAgIDAgIEFTZHRTETBAECAQECAgICAwICAgICAgICAgEBAgMAAQIDAgICAgICAgIBAQIDAgICAgEBAgICAgICAgMCAgICAgICAgICAQMCAwICAgICAgICAQIDAgICAgICAgICAgMBDzBAPioNAgICAAEDAgICAgMCAgICAgICAgEBAwIBAQIBAgICAgICAgMBAQICAgICAgAB' },\n 'veo-diamond-1080p-portrait': { width: 96, height: 96, source: 'GeminiWatermarkTool/bg_b_96', dataBase64: 'AgMCAgICAgMCAwICAgICAgIDAgICAgICAgMCAgMCAgICAwICAQICAgIEAwIBDis+QjIQAQICAgICAwICAwICAwMDAwICAgICAgQBAgMDAwMDAwICAgICAgIDAgICAgICAgIDAgIDAgIDAgICAgMCAgICAgICAwICAgECAgIDAgICAwICAQMBAgMDAgIEFTFFRzcXBQMEAwMDAgMCAgMCAwICAgMCAwIDAgIBAQIDAgMDAgEBAwQCAgICAgICAwICAgICAgICAwICAgECAgECAgICAgMCAgICAgICAgICAgICAgICAgICAgICAQMJHDlPUDweCQICAgICAwIDAwICAgICAgICAwICAwICAgEBAgICAQICAgIAAgMBAgIDAgICAwICAgICAwICAgICAgMCAgMCAQICAgICAgICAgMCAgICAwIDAgICAgIDAgIPKURZWUYqEAMDAgIDAgICAgMCAwICAgIDAgIBAgICAwEBAwIBAQICAgIBAgMCAQIDAgICAgICAgIDAgICAgICAgQCAwICAgICAwICAgICAwMDAgICAgICAgMCAgICAgIZNE1dXkwzGQMEAQMCAwIDAwMDAgMCAgICAwIDAgIDAgICAgICAgIDAwMCAgICAgICAwICAgICAgIDAgICAwIDAgMCAgIDAgICAwICAgMCAgQDAgIDAwIDAgMCAgICAgUeN01cXE02HgUCAgMCAwIBAQMCAgIDAQECAwIDAwICAgIDAgICAwICAgMCAgIDAgICAwICAgICAgICAgMCAgICAwMDAwMDAgICAQICAgMCAgMCAwICAgIDAgIDAwIBBA8oO0tZWUo8KA4FAQMCAwMDAgMDAgICAgMCAgICAgIBAgICAgICAgECAgMBAQICAQECAgICAgIDAgICAgICAgICAwICAwICAwMCAgICAwMDAgIDAgIDAgIDAgMCAwIBCBg1Q0xWVkxCNhgHAQMCAgIDAgICAwICAgICAwICAgMCAwICAgICAgICAgIBAQICAQECAgICAQICAgMCAwMCAwICAgICAwEDAwIDAgICAgMCAgICAwICAwMCAgICAgICBh49SE1VVU5HPh0HAQIBBAMCAgICAgIDAgICAgICAgMCAwICAgIDAwICAgICAgIEAgMCAgICAgICAgIDAgIDAwICAwMDAgICAwICAgICAgICAgIDAgICAgICAgMCAwICDSlIT09SUk1OSCkPAgIDAgICAgMCAgICAgICAwIDAgICAgIDAgICAgICAgMCAgIBAgICAwIDAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgIDAgICAgICAgIEGDRRU05QUE5SUTYaBQICAgEDAgICAgICAAECAgICAgICAgMDAgICAgABAgICAgICAAECAwECAQICAgICAgICAgICAwICAgICAgICAgIBAgICAgICAgICAgEDAQMCAgIJJD1VVU9PT05UUz8pEAICAgICAgICAgICAAECAgICAgICAgICAgICAgABAgICAwICAAECAwECAgICAgEEAQICAgECAgMCAgICAgICAwICAgICAgIDAgICAgICAgMCAgMYMEZWVk9OTk9UVUg5IwsDAgIBAgMCAgICAgICAwEBAgICAgEDAgICAgICAgMCAgICAQICAwICAgMCAwIDAgICAwIDAgQCAgIDAgICAwICAgICAgIDAgICAwICAgQCAwkkOEhVVE9OTk9SVEtCLxEDAwECAgMCAgIDAgICAwEBAgMCAgIDAgICAwICAgMCAgIEAgICAwICAgMCAgICAgIDAgICAwICAwIDAgMDAwICAgMCAgMCAgICAgICAwMDBRMyQktTUk5OTk9RUkxJPBgGAgMCAgICAgIDAgIDAwICAwMBAgICAQECAgICAgMBAQICAgICAgEBAgICAgICAgIDAwICAgMCAwMDAgICAwIDAgICAgMCAgIDAgMDAgMCDCREUE1QUE9OTk5PT09TSigQAgIDAgICAgMCAwMCAgICAwICAgICAAECAgIDAwIAAAICAgICAgABAgMCAgICAgMCAwICAgIDAgIEAwMDAwMDAgQCAgIEAgIDAwMCAwICEi9MVlBQUE5PTk9OTk9VTzQbBQIDAgICAgICAgIDAgEBAgMCAgICAgICAwICAgIBAQECAQECAgICAgICAgIDAgICAgICAwMCAgMCAwMCAwMCAgICAgIDAgICAgICAQMLJj5TV1FOT09OTk9OTlBXU0AuFAUCAgMCAgICAgICAwEBAwIDAgIDAgMCAgICAgMBAQEBAgEBAgMBAwICAgIDAgICAgECAgMCAgICAgIDAgICAgICAgICAgIBAwACAQgfOEhVVFBPT05OTk9OTlBUUkc8JAkBAgICAQICAQACAgICAgIAAQMCAgICAgABAgIBAgICAAECAgACAgICAgIDAgICAgEDAgIDAgICAgIDAgICAgIBAgICAgIBAgEBAg8wSExQUU5OTk9OTk5OTk9RUEtGLwwAAgICAQICAAECAgICAgIAAQICAgICAgABAgICAgICAQECAgECAgIDAgIDAgICAwICAgMCAwMCAgIDBAICAgICAgIDAgICAgICCSFFWFNOUE5OT05OTk5PTk5QT1BSQB0IAgMCAgEBAgECAgICAgICAgECAgICAgICAQIBAQICAQECAwIBAgMDAgIDAgMCAwMDAgQCAgIDAgICAwICAgMCAgICAgICAwIDFzFKWVNPTk1OT05PTk9OT05PTlFVSC8ZBAICAgECAgIDAwICAgMCAgECAgICAwICAQIBAQIDAQECAwECAgICAgMCAgIDAgICAgICAgICAgICAgICAgMCAgMCAgICAQUSLz9MVVFPTk5OTk5OTk9NTk5OTlBTTEEyFgYBAgMCAgMDAgICAQECAgICAgICAgECAgICAgICAQECAgEBAwICAgMCAgIDAgICAgIBAgMDAgIDAgIDAwICAgMCAgICBRQsREtOUU9OTk5OTk5OTk9NTU9PTk9RUE1HMBUDAwMDAwICAgICAQECAgICAgICAgICAgIBAgICAQECAgEBAgICAgMCAwICAwICAgMCAgIDAgICAgMCAwMCAwICAgICDSQ5TlFNTlBPTU1OTk5PTk9OT05OTk9PUFJPOyYMAQMDAAECAgECAgMBAQEBAgMCAwIDAgIDAwEDAQECAwICAgICAgIDAgICAgICAgMCAgICAgIBAwICAgIDAgIDAgQLIjhIVlRNTU5OTU1PT05OT05PT05PTk5OT1RVRzkiCwQCAQACAwEBAwIAAQECAgMCAwICAgQDAwIDAQECBAMDAgMCAgICAgICAgICAgICAgICAgICAgIDAgIBAgICAgsdNUdPVlNPTU5OTU5OTk5OT05OT05PTk9NT1JVT0c2HAsCAQICAgACAgIBAQICAgMCAgABAgICAgICAQICAgECAgMCAgICAwICAgICAgICAgICAgIDAwIEAgICAgICBBgtRU9OUVBPT05PTk5OTk5OTk5OT09PTk5OTlBRTk9ELBgEAgICAgIBAgMBAQMCAgIBAQABAgMDAgMCAAECAgABAgMDAgIDAgICAgICAgQDAgICAwMCBAMCAwICAgMJGDFCUlVQT09OTk9OTk5OTk1OTk9OTk5PTU1OTk5OUFZRQDAXBwICAwEAAQECAgIEAQEDAwMCAgMBAQECAQECAwIDAwICAgIEAgICBAMDAgMDAgIDAwMCAgMCAgQCAggZLUJLUlNQTk9OTk9PTk5OT05OTk9OTk5PTU1OT05OUFRRSkItGAcCAwEBAQICAgIDAQECAwMCAgMBAQIDAQECAwECAgICAgIDAgICAgICAgMCAgICAgIDAwMDAwEBAxktQVBPT1BOTk5NTU5OTU1OTk5PTk5OTk5OTU1OT01OTlBOT1BBLBgDAQABAwICAwEBAgACAgEBAgICAgICAAECAgECAgICAgICAgIDAwIDAwICAgMDAgICAgIDAgQLGTBCUVdTTk5OTk5NTU5OTk5OTk1OTk5OTk5NTU5OTk5OTk5OUldQQjAXCwMBAgICAgIBAAEDAgIBAgICAgICAQECAwECAgMCAgICAgMCAwICAgMCAgMEAgECAgICAg0cLUJMUFRRT05OTk5OTk5PTk5OTk5OTk9OTk5OTk5OT05OTk9OUVNQS0IsHgsCAgMCAgIBAgICAwICAgICAgIDAgMDAwICAgICAgIDAgICAgMDAgMCAgICAgMCAwEFDCI2RlFTT1BPTk5OTk9OTk5OTk5OT05OT09OTk5PTk5OTk5OTk5OTk9PUlJENyIMBQECAgIDAgICAQICAgQBAgECAgICAwICAgICAgICAQICAgEBAwICAwICAQIDAQYXJDhGT1VTT05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTU1NTU1NTk9NTk5QUlRPRzgkFQUBAQICAgICAgICAgIAAQICAAECAgICAgICAwICAgICAgEBAgIDAwMDAQIBBRYwO0hOTVBQTk5OTk5PTk5PTk5OTk5OT05OTk5OTk5OTU1NTU1NTk5OTk5OUFBOT0g5LRMDAQICAgECAgICAgIAAQICAAECAgICAwICAgIDAgIBAgICAgMCAgICAgIJGjRIUFZUUE5PTk5PTk5OTk9OTk5PTk5OT05OTk5OTk5PTk5OTk5PTk9OTk5OT05RVVRORDAXCQIDAAICAgEBAgQBAQIDAgICAwICAgMCAgIDAgICAwICAgMCAgIFCg4eMUJPUlVSUE5PTk5OT09PTk9PTk5PTk9OT05PTk9OTk5PTk5OT05PTk9OT05PTk9QVFVSTEAxIBAJAAICAwEBAwMCAQMDAgIDBAICAgMCAwICAQECAgECAgIBAQQWJC8/R0pPT09PT05OTU1OTk5OTk5NTU5OTk5PT01OTk5OTk5OTU1OT05PT05NTU5PTk5OT09PT0xLRjIgCwICAgIDAgMBAgMDAgMDAgEBAgICAgICAAECAgICBAMFDhstPEdSVVJPUE9NT05NTU1OTk5OTk5NTU9OTk5PTk1NT05PTk5PTU1OTk9PT09NTU5OT05PTU1OT1RYWEg6JRMLBAQCAwQBAQQCAgMDAwABAgMCAgICAwECAwICCxIYKDRAR0tQUVBPT09OTk5OTk5OT05OTk9PTk5PTk5OT05OTk9OTk5OTU1OTk5OTk5OT05PT05OTk5PT1JTU0xIPS4kFAoDAgIDAwECAgICAgICAwIBAgICAQEBAgYQIy88Sk5RUlBQT05OTk5OTk5OTk5OTk5OTk9OTk5OTk5OT05OTk9OTk5OTU1OTk5OTk9OTk5OTk5OT05OT09NTlBVUkxFMiMYCAUCAQAAAQIDAwICAgMAAQICBAYHDRgoOEFJU1RWU1FPTk5OTk5NTU5OTU5OTk1NTk5OTk5OTU1OTU5OTk5NTU5OTU5OTk1NTU1NTU5OTU1OTk5OTk5NTVFUV1NPQjcwIxcOBwYEAAECAgICAwIAAQIGDhkdKTQ+SEtMT05QT09OTk5OTk5NTU5OTk5OTk1NTk5OTk5OTU1NTU5OTk5NTU5PTk5OTk1NTU1NTU5OTU1OTk5NTk5NTU5PUE5OSkdFPDQpHRgOBAECAgICAgMIDxkfKDU8SFFTVVRST05OT09OT05PTk5OTk5PTk5OTk1NTk9OTk5OTU1OTk5OTk5NTU5PTk5OTk1NTU1NTU1OTk5OT05OTk9NTU9PTk9QUlRVVVJIPDUoHhkQCQMBDxceKjM3O0JHT1JUVVNRT05PTk9PT05OTk9OTk5PTk5OT01NTk9OTk5PTU1OT05OTk9NTU5PTk5OTk1NTU1NTU1OTk9OT05OTk9NTU5PT09QU1JUVVROR0M8NzQqHBMMMDY9RkxMSktNTk5PT1BNTU5PTk5PTk1NTk5OTk5OTU1OT05OTk5NTU5OTU5OTk1NTU1OTk5OTU1OTk5OTk9NTU5PTk9NTk1NTk5OT05PTU1PTk5OT05NTEtMTExEOTApQEdQWV1cWFVVUlBPTk9NTU5OT05OTk1NTk5OTk5OTU1OTk5OTk5NTU5OTk5OTk1NTU1OTk5OTU1OTk5OTk5NTU9PT05NTk1NT05PTk9OTU1OTk1NT1BRU1VYXFxZTkQ9PkZNWV1cWVdUU09PTk9PTk1PTk5OT05OTk9OTk5PTk5OT05OT01OTk5PTk5PTk5OTk9NTU5OTU1OT05OTU5OTk9PTU5OTk9OTk9OTk9PTk5OT01NT1FSVFZZXF1ZUEhAKjE5RE1OS0xNTk5PUFBOT05OTk5OT05OTk5OTk5PTk5OTk5OTk5OTk5NTk5OT05OT05NTU9PTU1OTk5OTU5PTk9OTU5OT05OT09OTk5PTk5PTU5OT09OTUxLTE1FPTYxDBMbKTQ2O0RHTlJUVVNSUU9OTk5OTk5OTk5OTk1OTU9OTk5OT05NTk9OTU5OTk5OTk9NTU5OTk5OTk1NTk5NTk5OTU5OTk5OTk1NTk5OTU1PUVJUVFNOR0I8NTMqHhYPAwQHDxkeKDU8SFBUVlVSUE9OTk5OTk5OTk5OTk5PTk5OTk5OTk9OTk9PTU1OTk5PTk5NTU5OTk5OTk1OTk5OTk5OTU1OT05OTk1NTU9OTk1PUlNVU1FIPjUoHRgQCAQCAgIAAQIGDxgdKTM8RklJT09RUE9OT05OTk5OTk5PTk5OTk5PTk9OT09OTU1OT09OTk1OTk5PTk5OTk9OTk9OTk5OTk5OT05OT05NT09RUE9OTEtIPzYoHBgOBgIBAgMCAgMBAQICBAYHEBciMThCT1RYVVFOT05OTk9OTk5OT05OT05OTk9OTk9PTU1OT05OTU5OTk5PTk5NT05OTk5OTk5PTk5OT05OTk9OT1NVVlZUSkI4KRsNBwcFAgMBAQICAgMCAgIBAAABAgQIGCMyREpUVFBOTk5OTk5OTk5PTk5OTk5PTk5NTU9OTk5OTk9OTk5OTk5OTU1OT05PTk9OTU1NTk5OTk1NTk5OT1BSUE1KOy4jDwgDAQACAQICAwICAgMDAgICAAEDAwICAwsSIi49R0xTU1FPT05OTk5OTk5OTk5OTk5NTU5OTk9OTk5OTk5OTk5OTU1OTk9OTk5NTU1NTk5OTk1OUFFSUUtIPzMoFxELAgMCAgICAQICAgICAwMBAgICAwMCBAECAgMFDBMnOUlYWVVQT09NTk5OTk5OT01NTk5OTk5PTk5OTk5OTk5OTk1NTk5PT01NT05OTk5PTU5OTU5QUFRVU0c8LBkQBgMDAgIBAQIDAQECAgIDAgIDAgIDAgICAgICAgMCAgILIDJGTExOT09QTk5OTk5OTk1NTk9OTk5OTU5OT05OT05OTk1OTk5PTk1PTk9OTk5OTk5OUE9PT0tIQC8kEwMCAgICAgMAAQICAQECAwICAgICAgICAgICAgICAgIDAgEBCA8hMj9LUVRTUU5OTk5OTk5PT05NTk5OTU1OTk1OTk5NTU5OTk5OTk1NTk5NTk5OTU1PUVRSTkEvHg4KBQICAgABAgICAgICAgICAgEBAgIBAgICAQMCAwICAwMCAgMCAgIJGC9DTVVVUU9OT05PT01PT05OTk5OTU1OTk5OTk5NTU5OTk5OTk1NT05OTk9OTU1PU1VPSDMYCAICAgICAgABAgICAgICAgMCAgEBAgICAgIDAgIDAwMCAgMCAgICAwMDBhIsOUdPT1BRTk5OTk5OTk9NTk5OTU1OT05OTk5OTk5PTU1OTk5OTU5OTk5OUFBOUEY7MBYFAQIDAgIBAQICAgMCAgMCAgICAwICAgMCAgICAwICBAIDAgMCAgIDAgICAwUUJDlIUFZVT05PT05OTk9NTU5PTU1OTk5OTk5OT05OTU5OT05OTU5OTk9QU1ZQSDckFQcBAgIDAgIBAgICAgMCAwIDAgICAwICAgICAgICAgECAwICAgIBAQIDAQICAwIFCyM2RlNUT09OTk1NTk5NTU5OTU1OT01NTU5OTk5OTU1OT05OTk5NTU9PUlJGNiELBAECAgICAQECAwIDAgIBAQEDAgICAgICAgICAwMDAAECAgICAgICAAIDAQECAgICAgseLkJLUFRRTk1NTk5NTU5OTU1OTk1NTk5OT05OTU1OTk9OTk5OUVNQS0ItHQkBAQECAgEBAAECAgMDAgIAAgICAgICAgEDAgMDAwICAgICAwIDAgICAgIDAgICAgICAgQLGTFDUldTT05OTk1OTk5PTk5OTk5OTU5OTk9PTk5OT05NTk9OU1dSQjAZCwQCAgMCAgICAgICAwICAgICAgIDAgICAgICAgIDAgIDAgIDAgICAgQCAgMCAgICAwECAgEBAxkuQlJQT1BPT09OTk5PTk5OT05OTU1OTk5PT05PT05NTlBPUFFCLBgEAgEDAgICAgIDAwICAgIDAgMCAgICAgMCAwICAwMCAgIDAgICAgIDAgICAwEDAwMCAgICAgIBAQgYLUNNU1NRT09NTk5OTU1PTk5OT09OTk5PTk5OTk1NUFNTSkMtGAgCAgICAgIAAQICAgICBAIBAwIBAAICAQECAgICAwMCAgICAgICAwICAgICAgIDAgICAgICAQIBAQMIGDFDU1VQTk9OT05OTU1OTk5OT09OTU5OTU5OTk5OUFVUQzEYCAMDAgMCAwIBAQICAwEDAwABAgIBAgMCAAECAwMCAgICAgICAwICAQICAwICAwMCAQICAgABAQECAgICAhgtRk9OUVBOT05OTk5OT05OTk5NTk5OTk9OTlBRT1BELBgCAgICAwMCAwICAgEBAgICAwIDAgICAgICAgMBAwICAgMCAgICAgICAgICAgICAgICAgICAgABAQECAgICAQkdN0dPVVRPTU5OTk1OT05OTk5OTk5OTk5NT1NWT0g1GwsCAgICAgICAgICAgEAAgIDAwICBAMCAgMDAwMDAwMDAgIDAgICAgICAgICAgECAgICAQICAgAAAQIBAQIBAQMLIjdGVVROTU5OTU5OTk1NTk5OTk5OTU1OTlNVSDgiCgQCAgIDAgIBAwMBAgMCAQEBAwIDAwMDAgMDAgMCAwMDAgICAgICAgICAgICAgICAgICAgICAgACAgIBAQICAAACCyM6UFJOTk9OTk5OTk1NTk5OTk5OTU5PT1FOOSQLAgICAgMDAgABAwMCAwICAAABAgIDAwMCAwMDAgIDAwICAgMCAgICAgICAwICAgMCAgIDAgICAgICAgMDAgICAgICBRUwSE9PUU9PTk9OTk5PTk5OTk5PTk9QUExELRUEAgIDAgIDAgMDAgMCAgIDAgIBAwECBAMBAgMDAgEEAwMCAgICAgIDAgICAwICAgMCAgICAgICAwICAgIDAgMEAgICAQYVNENMU1FOTk5OT05OTk5PTk5PT1FVTEAwEwYBAgIDAwIDBAICAgICAgIDAgMCAgEBAwQBAQICAQECAwICAgICAgICAgICAgICAgICAgICAAECAgABAgICAgICAgICAwEEGjFIVlFOTU1PTk5OTk5NTU5OTVNZSzAYBAICAgIDAAECAwICAgMBAQICAgICAwICAwICAgIDAAECAgIBAgICAgICAgICAgICAgICAgECAAECAgEBAgICAgMEAgICAgICCR5BU1BPTk1OT05PTk5NTU5OTlJYRiAIAwICAgICAAEDAwICAgMBAQICAwMDAwEDAgIDAgIDAQEDAgMDAgICAgIDAgICAgICAgICAgICAgICAwICAgEBAQIDAgIBAgICAQ8wR0tQUFBOT05PTk5NTU9RUExJMQ4DAgMCAQICAgECAwICAgIEAwIDAgMDAgICAgMDAgMDAgIDBAMCAgMCAgIDAgICAwICAgMCAgIDAgICAwICAgMBAAICAgIBAwIBAgwkO0hTVFBOT05OT09NTVFVVEc5IAgBAwMCAQEDAgICAgEBAwMCAgIDAwICAwICAgMCAwIDAgMDAwMDAgMCAgICAgICAwICAgMCAgICAQICAgEBAgICAgIDAQECAgABAQUTLD9TVlFOTk1NTk5OTlFXUjwlDAIBAgIBAQMDAwICAgEBAgICAwICAgEDAwIDAgIBAQIDAgMDAgMCAgICAgICAgICAwICAwMCAgMCAgICAgABAgICAgICAAECAgIBAQECGTNOVlBOTU1OT05PUE9USy0UBAMCAgIAAQIDAgICAwABAgICAgECAQEDAgMCAgMAAQICBAICAgECAgQCAwMCAwICAwIDAgMDAgIDAgIBAgICAgMCAgIDAgICAwICAgIBEChMU09PT09OTk9PT01QRCMMAwEBAgICAgIDAgICAgMCAgMCAgICAgIDAwEBAgICAgMDAgICAwEBAgICAgMDAwMDAgICAwMCAgICAgMDAwICAgICAgIDAgICAgICAgMCBhg8SUxRUk5OTk9RUkpDMhMFAgEBAQQCAgMCAgIDAwICAgMCAgIEAgIDAgECAgMDAwICAgMDAwEBAgICAgICAQICAgICAwICAgMCAgICAgICAgICAgICAgIDAgIDAgICAxEwQEtTUk5OT05SVUk5IwoDAgICAgMCAgMCAAECAwABAgIBAQMDAgECAwICAgICAgMDAgICAgECAgICAgICAQICAwIDAgICAgICAgICAgICAgICAgICAwICAgIDAgMDBAojOEhWVE9OTlBVVkcwGAMCAgIDAwMDAwICAQECAwECAwICAgMDAgECAgICAgMCAwIBAAEBAgEBAgICAgIDAgICAgICAgMCAwIDAgMCAwICAgICAgIDAgICAgICAgQCAwMPKT9UVU5PTk1VVD0lCAECAgMDAgQCAwICAwICAwIDAwMCAgIDAwMDAQICAgQCAgICAgMDBAICAgMDAgICAgICAwMCAgICAgIDAgICAwICAgMCAgIDAgMCAwMCAgMCAgIGGjVRU05RT05TUTUYAwICAwICAwMCAwIEAgMDAwMDAgQDAwIDAwICAgIDAwMDAgIEAgMDAwMDAgICAgICAgIDAgECAgMDAQICAgICAgICAgMCAwICAwICAwICAgICAgICDipIT01SUk5OSCoOAwMDAgIDAwIDAgICAgIDAwMDAwMCAgIDBAIDBAECAwIBAQICAgICBAICAgICAgICAQMCAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIBBx08R0xVVU5HPh4IAQMDAgMCAgMBAwMCAgICAwIDAgIDAwMCAgMCAgECAgIBAQICAgMCAgICAgMCAgICAgICAwICAgICAgMDAgECAgICAgMCAgIDAgICAwICAgICAgICBxg1Q0xWVUxDNRgHAgMDAwMCAwICAwICAgMCAwICAwMDAgMDAwICAwIDAwMDAwEDAQIDAgMDAgICAgMDAgMCAgICAgIDAgMCAgICAwICAgICAgIDAgICAgIDAgICAgIBBA4oPUxZWUw7KQ4EAQICAgIDAgQDAwIDAwIEAgICAwICAwIDAgICAgMCAwQCAgEBAQICAwIDAgMBAgICAgMDAgMDAgICAgICAgICAgICAgIBAgICAQICAgICAgICAgIBAgYeNkxdXU01HgUCAQICAgEDAgICAwIDAQEDAgEBAgIAAQICAgIDAwEBAwMDAwIDAAEDAgICAgIBAQMEAgMCAgIDAgMCAgMCAgMCAgICAgIBAgICAgICAgICAgICAgMCAgMaM0tdXk0zGAICAgICAQABAgMCAwMDAgECAgEBAgIAAQICAgICAgABAgICAwIDAAICAgICAgMCAgMDAwMCAwIDAgMCAwECAgEDBAICAgICAgIDAgICAwICAgMCAgICAwMQK0VZWUQpDwIDAgICAwICAgMCAgMCAgICAgICAgICAgEDAgICAgEBAgMCAgMCAgICAwICAwMCAgIDAgIDAwICAwIDAgMDAgMCBAICAgMCAgIDAgICAwICAgMCAgIDAgMIHzxPTjocCAICAgICAgICAgMCAQMDAgICAgICAgICAgIDAgICAgAAAgICAgIDAgICAwICAQICAgMCAgICAgICAgICAgIDAgICAgMCAgICAgICAgICAgIDAgMCAgIDAgIEFTZHRTETBAECAQECAgICAwICAgICAgICAgEBAgMAAQIDAgICAgICAgIBAQIDAgICAgEBAgICAgICAgMCAgICAgICAgICAQMCAwICAgICAgICAQIDAgICAgICAgICAgMBDzBAPioNAgICAAEDAgICAgMCAgICAgICAgEBAwIBAQIBAgICAgICAgMBAQICAgICAgAB' },\n}\n\n\n/** Decode a packed alpha entry into Float32Array (0\u20131). */\nexport function decodeCalibratedAlpha(entry) {\n const binary = typeof atob === 'function'\n ? atob(entry.dataBase64)\n : Buffer.from(entry.dataBase64, 'base64').toString('binary')\n\n const map = new Float32Array(entry.width * entry.height)\n for (let i = 0; i < map.length; i++) {\n map[i] = binary.charCodeAt(i) / 255\n }\n return map\n}\n\n/** @returns {{ data: Float32Array, width: number, height: number, source: string }|null} */\nexport function loadCalibratedAlphaMap(key) {\n const entry = CALIBRATED_ALPHA_ENTRIES[key]\n if (!entry) return null\n return {\n data: decodeCalibratedAlpha(entry),\n width: entry.width,\n height: entry.height,\n source: entry.source,\n }\n}\n", "/**\n * Embedded alpha maps for video watermark removal.\n * Calibrated from GeminiWatermarkTool + VeoWatermarkRemover upstream captures.\n */\n\nimport { loadCalibratedAlphaMap } from './calibratedAlphaData.js'\n\nconst alphaMapRegistry = new Map()\n\nconst VIDEO_ALPHA_KEYS = [\n '720p-landscape',\n '720p-portrait',\n '1080p-landscape',\n '1080p-portrait',\n 'veo-diamond-1080p-landscape',\n 'veo-diamond-1080p-portrait',\n]\n\nfor (const key of VIDEO_ALPHA_KEYS) {\n const loaded = loadCalibratedAlphaMap(key)\n if (loaded) {\n alphaMapRegistry.set(key, loaded)\n }\n}\n\n/**\n * Bilinear resize helper (used when registering custom maps).\n */\nexport function resizeAlphaMap(source, sourceWidth, sourceHeight, targetWidth, targetHeight) {\n if (sourceWidth === targetWidth && sourceHeight === targetHeight) {\n return new Float32Array(source)\n }\n\n const result = new Float32Array(targetWidth * targetHeight)\n const xScale = sourceWidth / targetWidth\n const yScale = sourceHeight / targetHeight\n\n for (let y = 0; y < targetHeight; y++) {\n const sourceY = (y + 0.5) * yScale - 0.5\n const sourceY0 = Math.floor(sourceY)\n const y0 = Math.max(0, sourceY0)\n const y1 = Math.min(sourceHeight - 1, y0 + 1)\n const yWeight = Math.max(0, Math.min(1, sourceY - sourceY0))\n\n for (let x = 0; x < targetWidth; x++) {\n const sourceX = (x + 0.5) * xScale - 0.5\n const sourceX0 = Math.floor(sourceX)\n const x0 = Math.max(0, sourceX0)\n const x1 = Math.min(sourceWidth - 1, x0 + 1)\n const xWeight = Math.max(0, Math.min(1, sourceX - sourceX0))\n\n const top =\n source[y0 * sourceWidth + x0] * (1 - xWeight) +\n source[y0 * sourceWidth + x1] * xWeight\n const bottom =\n source[y1 * sourceWidth + x0] * (1 - xWeight) +\n source[y1 * sourceWidth + x1] * xWeight\n\n result[y * targetWidth + x] = top * (1 - yWeight) + bottom * yWeight\n }\n }\n\n return result\n}\n\n/**\n * @param {string} key\n * @returns {{ data: Float32Array, width: number, height: number, source?: string } | null}\n */\nexport function getEmbeddedAlphaMap(key) {\n return alphaMapRegistry.get(key) || loadCalibratedAlphaMap(key)\n}\n\nexport function registerAlphaMap(key, data, width, height, source = 'custom') {\n alphaMapRegistry.set(key, { data, width, height, source })\n}\n\nexport function listAlphaMapKeys() {\n return Array.from(alphaMapRegistry.keys())\n}\n", "/**\n * Per-frame watermark processing orchestrator.\n * Combines veoConfig + alphaMap + blendModes to process a single frame.\n */\n\nimport { removeWatermark } from './blendModes.js';\nimport { getVeoWatermarkInfo, normalizeVideoWatermarkProfile } from './veoConfig.js';\nimport { getEmbeddedAlphaMap } from './embeddedAlphaMaps.js';\n\n/**\n * Process a single video frame to remove the configured video watermark.\n *\n * @param {ImageData} frameData - Frame pixel data\n * @param {{ width?: number, height?: number, videoProfile?: 'diamond'|'legacy' }} options\n * @returns {{ imageData: ImageData, processed: boolean, reason?: string, profile?: string|null, position?: object|null }}\n */\nexport function processFrame(frameData, options = {}) {\n const width = options.width || frameData.width;\n const height = options.height || frameData.height;\n const profile = normalizeVideoWatermarkProfile(options.videoProfile ?? options.profile);\n\n if (!profile) {\n return { imageData: frameData, processed: false, reason: 'unsupported_profile', profile: null };\n }\n\n const info = getVeoWatermarkInfo(width, height, profile);\n if (!info) {\n return { imageData: frameData, processed: false, reason: 'unsupported_resolution', profile };\n }\n\n const alphaMap = getEmbeddedAlphaMap(info.alphaMapKey);\n if (!alphaMap) {\n return { imageData: frameData, processed: false, reason: 'missing_alpha_map', profile };\n }\n\n removeWatermark(frameData, alphaMap.data, info.position);\n return { imageData: frameData, processed: true, profile, position: info.position };\n}\n\n/**\n * Create a reusable frame processor for a specific video (caches config lookup).\n *\n * @param {number} frameWidth\n * @param {number} frameHeight\n * @param {{ videoProfile?: 'diamond'|'legacy' }} options\n * @returns {{ profile: string|null, position: object|null, process(frameData: ImageData): { imageData: ImageData, processed: boolean, reason?: string, profile?: string|null, position?: object|null } }}\n */\nexport function createFrameProcessor(frameWidth, frameHeight, options = {}) {\n const profile = normalizeVideoWatermarkProfile(options.videoProfile ?? options.profile);\n\n if (!profile) {\n return {\n profile: null,\n position: null,\n process(frameData) {\n return { imageData: frameData, processed: false, reason: 'unsupported_profile', profile: null };\n },\n };\n }\n\n const info = getVeoWatermarkInfo(frameWidth, frameHeight, profile);\n if (!info) {\n return {\n profile,\n position: null,\n process(frameData) {\n return { imageData: frameData, processed: false, reason: 'unsupported_resolution', profile };\n },\n };\n }\n\n const alphaMap = getEmbeddedAlphaMap(info.alphaMapKey);\n if (!alphaMap) {\n return {\n profile,\n position: info.position,\n process(frameData) {\n return { imageData: frameData, processed: false, reason: 'missing_alpha_map', profile };\n },\n };\n }\n\n const position = info.position;\n const mapData = alphaMap.data;\n\n return {\n profile,\n position,\n process(frameData) {\n removeWatermark(frameData, mapData, position);\n return { imageData: frameData, processed: true, profile, position };\n },\n };\n}\n", "/**\n * Full video processing pipeline.\n * Orchestrates: decode \u2192 per-frame watermark removal \u2192 encode.\n */\n\nimport { createDecoder, createNodeDecoder } from './videoDecoder.js';\nimport { createEncoder, createNodeEncoder } from './videoEncoder.js';\nimport { createFrameProcessor } from '../core/frameProcessor.js';\n\n/**\n * @typedef {Object} ProcessOptions\n * @property {string} [environment] - 'browser' | 'node' | 'auto'\n * @property {number} [bitrate] - Output bitrate\n * @property {'diamond'|'legacy'} [videoProfile] - diamond for Gemini 3.5+ videos, legacy for old \"Veo\" text videos\n * @property {(current: number, total: number) => void} [onProgress]\n */\n\n/**\n * Process a video file to remove Veo watermarks.\n *\n * @param {File|Blob|Uint8Array} input - Source video\n * @param {ProcessOptions} options\n * @returns {Promise<Blob|Uint8Array>} Processed video\n */\nexport async function processVideo(input, options = {}) {\n const { environment = 'auto', bitrate, onProgress, videoProfile = 'diamond' } = options;\n\n const useNode =\n environment === 'node' ||\n (environment === 'auto' && typeof VideoDecoder === 'undefined');\n\n const decoder = useNode ? await createNodeDecoder() : createDecoder(environment);\n const videoInfo = await decoder.open(input);\n\n const processor = createFrameProcessor(videoInfo.width, videoInfo.height, { videoProfile });\n\n const encoder = useNode ? await createNodeEncoder() : createEncoder(environment);\n await encoder.init({\n width: videoInfo.width,\n height: videoInfo.height,\n fps: videoInfo.fps,\n bitrate: bitrate || 5_000_000,\n });\n\n // 4. Extract and pass through audio\n const audioData = await decoder.extractAudio();\n if (audioData) {\n await encoder.setAudioTrack(audioData);\n }\n\n // 5. Process frames\n let frameIndex = 0;\n let processedFrames = 0;\n let skippedFrames = 0;\n let skipReason = null;\n const totalFrames = videoInfo.frameCount || 0;\n\n for await (const frame of decoder.decodeFrames()) {\n // Remove watermark from frame\n const frameResult = processor.process(frame.imageData);\n if (frameResult.processed) {\n processedFrames++;\n } else {\n skippedFrames++;\n skipReason = skipReason || frameResult.reason || 'not_processed';\n }\n\n // Encode processed frame\n await encoder.encodeFrame(frame.imageData, frame.timestamp);\n\n frameIndex++;\n if (onProgress && totalFrames > 0) {\n onProgress(frameIndex, totalFrames);\n }\n }\n\n // 6. Finalize\n await decoder.close();\n const output = await encoder.finalize();\n\n if (output && typeof output === 'object') {\n output.videoProfile = processor.profile;\n output.processedFrames = processedFrames;\n output.skippedFrames = skippedFrames;\n output.skipped = processedFrames === 0;\n output.reason = processedFrames === 0 ? skipReason : null;\n }\n\n return output;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["FfmpegDecoder", "FfmpegEncoder"]
|
|
7
|
+
}
|
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pictx/gemini-veo-watermark-remover",
|
|
3
|
+
"version": "0.2.2",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"description": "Remove Gemini 3.5+/legacy image watermarks and Veo video watermarks locally with reverse alpha blending. Browser, CLI, SDK, extension, userscript.",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./browser": {
|
|
17
|
+
"types": "./dist/browser.d.ts",
|
|
18
|
+
"import": "./dist/browser.js"
|
|
19
|
+
},
|
|
20
|
+
"./node": {
|
|
21
|
+
"types": "./dist/node.d.ts",
|
|
22
|
+
"import": "./dist/node.js"
|
|
23
|
+
},
|
|
24
|
+
"./gemini": {
|
|
25
|
+
"types": "./dist/gemini.d.ts",
|
|
26
|
+
"import": "./dist/gemini.js"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"bin": {
|
|
30
|
+
"pictx": "bin/pictx.mjs"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist/",
|
|
34
|
+
"bin/",
|
|
35
|
+
"assets/masks/",
|
|
36
|
+
"skills/",
|
|
37
|
+
"src/extension/",
|
|
38
|
+
"src/userscript/"
|
|
39
|
+
],
|
|
40
|
+
"scripts": {
|
|
41
|
+
"embed-masks": "node scripts/embed-alpha-maps.mjs",
|
|
42
|
+
"prebuild": "node scripts/embed-alpha-maps.mjs",
|
|
43
|
+
"build": "node build.js",
|
|
44
|
+
"dev": "node build.js --watch",
|
|
45
|
+
"test": "node --test tests/*.test.js",
|
|
46
|
+
"package:extension": "node scripts/package-extension.mjs"
|
|
47
|
+
},
|
|
48
|
+
"keywords": [
|
|
49
|
+
"gemini",
|
|
50
|
+
"veo",
|
|
51
|
+
"watermark",
|
|
52
|
+
"remover",
|
|
53
|
+
"image",
|
|
54
|
+
"video",
|
|
55
|
+
"webcodecs",
|
|
56
|
+
"reverse-alpha-blending",
|
|
57
|
+
"chrome-extension",
|
|
58
|
+
"userscript"
|
|
59
|
+
],
|
|
60
|
+
"license": "MIT",
|
|
61
|
+
"author": "ACs-del",
|
|
62
|
+
"homepage": "https://pictx.ai",
|
|
63
|
+
"repository": {
|
|
64
|
+
"type": "git",
|
|
65
|
+
"url": "git+https://github.com/ACs-del/gemini-veo-watermark-remover.git"
|
|
66
|
+
},
|
|
67
|
+
"bugs": {
|
|
68
|
+
"url": "https://github.com/ACs-del/gemini-veo-watermark-remover/issues"
|
|
69
|
+
},
|
|
70
|
+
"dependencies": {
|
|
71
|
+
"@ffmpeg/ffmpeg": "^0.12.10",
|
|
72
|
+
"@ffmpeg/util": "^0.12.1",
|
|
73
|
+
"mp4-muxer": "^5.1.3",
|
|
74
|
+
"mp4box": "^0.5.4"
|
|
75
|
+
},
|
|
76
|
+
"optionalDependencies": {
|
|
77
|
+
"sharp": "^0.33.0"
|
|
78
|
+
},
|
|
79
|
+
"devDependencies": {
|
|
80
|
+
"esbuild": "^0.25.0"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gemini-veo-watermark-remover
|
|
3
|
+
description: Remove visible Gemini image and Veo video watermarks locally using reverse alpha blending. Use when cleaning Gemini-generated images or Veo MP4 outputs without uploading files to a server.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Gemini & Veo Watermark Remover (@pictx)
|
|
7
|
+
|
|
8
|
+
Local watermark removal for Gemini images and Veo videos using calibrated reverse alpha blending.
|
|
9
|
+
|
|
10
|
+
## Channel boundaries
|
|
11
|
+
|
|
12
|
+
| Channel | Images | Videos |
|
|
13
|
+
| --- | --- | --- |
|
|
14
|
+
| This Skill / `pictx` CLI | ✅ | ✅ |
|
|
15
|
+
| Chrome extension / userscript | ✅ | ❌ |
|
|
16
|
+
|
|
17
|
+
Use the Skill or CLI for Veo MP4 files. Extension and userscript only integrate with Gemini page image previews.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pnpm dlx skills add ACs-del/gemini-veo-watermark-remover --skill @pictx/gemini-veo-watermark-remover
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## When to use
|
|
26
|
+
|
|
27
|
+
- User asks to remove Gemini sparkle/diamond watermarks from images
|
|
28
|
+
- User asks to strip Veo video watermarks (1080p diamond or legacy text with `--legacy`)
|
|
29
|
+
- Batch-cleaning assets in a repo without cloud APIs
|
|
30
|
+
|
|
31
|
+
## Commands
|
|
32
|
+
|
|
33
|
+
### Image (PNG/JPEG/WebP)
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
node skills/gemini-veo-watermark-remover/scripts/run.mjs ./input.png ./clean.png
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Video (MP4)
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
node skills/gemini-veo-watermark-remover/scripts/run.mjs ./input.mp4 ./clean.mp4
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Batch folder
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
node skills/gemini-veo-watermark-remover/scripts/run.mjs ./photos --out-dir ./clean
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Legacy Veo text watermark
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
node skills/gemini-veo-watermark-remover/scripts/run.mjs ./old-veo.mp4 ./clean.mp4 --legacy
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### JSON output (for automation)
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
node skills/gemini-veo-watermark-remover/scripts/run.mjs ./input.png ./clean.png --json
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## npm / CLI (outside Skill)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
npx @pictx/gemini-veo-watermark-remover remove image.png
|
|
67
|
+
npm i -g @pictx/gemini-veo-watermark-remover
|
|
68
|
+
pictx remove video.mp4
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Notes
|
|
72
|
+
|
|
73
|
+
- Only removes **visible** overlays; does not remove SynthID
|
|
74
|
+
- Diamond video mode supports 1920×1080 and 1080×1920
|
|
75
|
+
- Image pipeline uses restoration validation by default (`--adaptive off` to disable)
|
|
76
|
+
- Requires `npm install` in the package root (optional `sharp` for image I/O)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Agent skill entrypoint — wraps the pictx CLI for image/video watermark removal.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* node skills/gemini-veo-watermark-remover/scripts/run.mjs <input> [output] [--legacy] [--json]
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { spawnSync } from 'node:child_process'
|
|
10
|
+
import { fileURLToPath } from 'node:url'
|
|
11
|
+
import { dirname, join } from 'node:path'
|
|
12
|
+
|
|
13
|
+
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
14
|
+
const pkgRoot = join(__dirname, '..', '..', '..')
|
|
15
|
+
const cliPath = join(pkgRoot, 'dist', 'cli.js')
|
|
16
|
+
|
|
17
|
+
const args = process.argv.slice(2)
|
|
18
|
+
|
|
19
|
+
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
20
|
+
console.log(`Usage: node ${fileURLToPath(import.meta.url)} <input> [output] [--legacy] [--json]`)
|
|
21
|
+
process.exit(args.length === 0 ? 1 : 0)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const input = args[0]
|
|
25
|
+
const passthrough = args.slice(1)
|
|
26
|
+
const outputFlag = passthrough[0] && !passthrough[0].startsWith('-')
|
|
27
|
+
? ['--output', passthrough[0], ...passthrough.slice(1)]
|
|
28
|
+
: passthrough
|
|
29
|
+
|
|
30
|
+
const result = spawnSync(
|
|
31
|
+
process.execPath,
|
|
32
|
+
[cliPath, 'remove', input, ...outputFlag],
|
|
33
|
+
{ stdio: 'inherit', cwd: pkgRoot },
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
process.exit(result.status ?? 1)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Service worker: manages extension state and relays messages between
|
|
5
|
+
* the popup and content scripts.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// Initialise default storage values on install
|
|
9
|
+
chrome.runtime.onInstalled.addListener(() => {
|
|
10
|
+
chrome.storage.local.set({
|
|
11
|
+
gvwrEnabled: true,
|
|
12
|
+
gvwrTotalCleaned: 0,
|
|
13
|
+
gvwrSessionCleaned: 0,
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// Reset session counter when the service worker starts (new browser session)
|
|
18
|
+
chrome.storage.local.set({ gvwrSessionCleaned: 0 });
|
|
19
|
+
|
|
20
|
+
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
21
|
+
switch (message.type) {
|
|
22
|
+
// Popup toggled the extension on/off — relay to all matching tabs
|
|
23
|
+
case 'gvwr-toggle': {
|
|
24
|
+
chrome.tabs.query(
|
|
25
|
+
{ url: ['https://gemini.google.com/*', 'https://aistudio.google.com/*'] },
|
|
26
|
+
(tabs) => {
|
|
27
|
+
for (const tab of tabs) {
|
|
28
|
+
chrome.tabs.sendMessage(tab.id, message).catch(() => {});
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
);
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Content script reports a cleaned image
|
|
36
|
+
case 'gvwr-image-cleaned': {
|
|
37
|
+
chrome.storage.local.get(
|
|
38
|
+
{ gvwrTotalCleaned: 0, gvwrSessionCleaned: 0 },
|
|
39
|
+
(result) => {
|
|
40
|
+
chrome.storage.local.set({
|
|
41
|
+
gvwrTotalCleaned: result.gvwrTotalCleaned + 1,
|
|
42
|
+
gvwrSessionCleaned: result.gvwrSessionCleaned + 1,
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Content script asks for current enabled state
|
|
50
|
+
case 'gvwr-get-state': {
|
|
51
|
+
chrome.storage.local.get({ gvwrEnabled: true }, (result) => {
|
|
52
|
+
sendResponse({ enabled: result.gvwrEnabled });
|
|
53
|
+
});
|
|
54
|
+
return true; // keep channel open for async sendResponse
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|