diff --git a/packages/media/cpp/.gitignore b/packages/media/cpp/.gitignore index 772991b9..e98cced6 100644 --- a/packages/media/cpp/.gitignore +++ b/packages/media/cpp/.gitignore @@ -8,3 +8,4 @@ cache third_party/vips-dev-*/ third_party/vips-dev-x64-all*.zip .env + diff --git a/packages/media/cpp/README.md b/packages/media/cpp/README.md index 1c046c4f..069abc91 100644 --- a/packages/media/cpp/README.md +++ b/packages/media/cpp/README.md @@ -111,7 +111,7 @@ Sharp wraps libvips: **decode → process → encode**. We do the same with `vip **Windows:** `pm-image resize --ui` opens a **native Win32** dialog to choose input/output paths, max dimensions, fit mode, quality, and enlargement / autorotate / strip options. Other CLI flags seed the dialog; **`--src` / `--dst` are not allowed** with `--ui`. If you cancel, the command exits without processing. -**REST** `POST /v1/resize` and **IPC** use the same JSON keys as the table, plus the fields in the **“Batch paths & cache”** section below. +**REST** `POST /v1/resize` accepts **`application/json`** (same keys as the table, plus **“Batch paths & cache”** below) **or** **`multipart/form-data`** (upload a file; response is the **image bytes** — see **`serve`**). **IPC** uses the same JSON keys as the table, plus the batch/cache fields. --- @@ -190,7 +190,7 @@ curl -s -X POST http://127.0.0.1:8080/v1/resize \ All **resize** options (`max_width`, `fit`, …) participate in the same JSON body. -**REST / IPC** always require `"output"` in JSON (no automatic path). +**REST / IPC** JSON always require `"output"` in JSON (no automatic path). Multipart upload does not use `input`/`output` paths. ### Output cache @@ -296,20 +296,34 @@ pm-image resize img.jpg rotated.jpg --max-width 1024 --rotate 90 --flip ### `serve` — HTTP REST ```bash -# Default: http://127.0.0.1:8080 — GET /health, POST /v1/resize with JSON body +# Default: http://127.0.0.1:8080 — GET /health, POST /v1/resize pm-image serve --host 127.0.0.1 -p 8080 ``` -Example resize request (paths must be readable/writable by the server process): +| Mode | `Content-Type` | Request | Response | +|------|----------------|---------|----------| +| **Upload** | `multipart/form-data` | Image part **`file`**, **`image`**, or **`upload`**; optional fields: `max_width`, `max_height`, `format`, `fit`, `quality`, … | **Binary image** (`Content-Type` matches format; default **JPEG** if `format` omitted). `Content-Disposition: inline; filename="resized…"`. | +| **Paths** | `application/json` | **`input`** and **`output`** (server-visible paths), plus resize / batch / cache fields | **JSON** — `{"ok":true}` or batch `count` / `outputs` | + +**Upload (multipart):** the response body is the **processed image**, not JSON. The on-disk **output cache is not used** for uploads (each request uses temporary files). ```bash curl -s http://127.0.0.1:8080/health +curl -s -o thumb.jpg -X POST http://127.0.0.1:8080/v1/resize \ + -F "file=@/path/in.png" \ + -F "max_width=400" \ + -F "quality=85" +``` + +**Paths (JSON):** same resize options as the CLI, with `input` and `output` paths (must be readable/writable by the server process). + +```bash curl -s -X POST http://127.0.0.1:8080/v1/resize \ -H 'Content-Type: application/json' \ -d '{"input":"/path/in.png","output":"/path/out.webp","max_width":400,"quality":80}' ``` -Optional: `"cache":false`, `"expand_glob":false`, `"cache_dir":"..."` — see **Batch paths & cache** above. +Optional JSON: `"cache":false`, `"expand_glob":false`, `"cache_dir":"..."` — see **Batch paths & cache** above. ### `ipc` — one JSON line per connection (TCP; Unix socket on Linux/macOS) @@ -321,24 +335,26 @@ pm-image ipc --host 127.0.0.1 -p 9333 --cache-dir ./cache/images Same JSON fields as REST (`input`, `output`, globs, `expand_glob`, `cache`, `cache_dir`, resize options). -### `kbot` — forward to another binary (optional) - -Requires **`KBOT_EXE`** pointing at the kbot executable; remaining args are passed through. - -```bash -export KBOT_EXE=/path/to/kbot # Windows: set KBOT_EXE=C:\path\to\kbot.exe -pm-image kbot ai --prompt "hello" -``` - ## Tests +From `packages/media/cpp`, after **`cmake --build --preset release`** (or `npm run build:release`): + ```bash -npm run test:media +npm run test:media # full suite +npm run test:media:rest # REST only (JSON + multipart) +npm run test:media:multipart # multipart upload → image body only +npm run test:media:templates # `${SRC_*}` REST + IPC + CLI +npm run test:media:glob # recursive glob + templates (PNG under glob-in/) +npm run test:media:glob:raw # same for tests/assets/raw/**/*.arw (skips if none) +npm run test:media:ipc # IPC only +npm run test:media:url # HTTP(S) URL inputs — needs network ``` -Requires a built `dist/pm-image` **linked against libvips** and fixture PNGs (`npm run generate:assets` if missing). +Requires a built **`dist/pm-image`** linked against **libvips** and fixture PNGs (`npm run generate:assets` if missing). -The suite covers **REST**, **IPC (TCP)**, optional **Unix socket** on non-Windows, **destination templates** (`npm run test:media:templates`), and **recursive glob + `${SRC_DIR}` / `${SRC_NAME}`** (`npm run test:media:glob` — outputs under `tests/assets/glob-in/**/out/`, gitignored, for manual inspection). +Each run overwrites **`tests/test-report-last.md`** with Markdown from **`orchestrator/reports.js`**: **host** (CPU, RAM, load), **Node process** (CPU/memory deltas, RSS), timing, plus **image rows** (fixture and response **byte sizes**, PNG **pixel dimensions** when known, and multipart/JSON **output file** sizes). + +The suite covers **REST** (JSON paths and **multipart upload**), **IPC (TCP)**, optional **Unix socket** on non-Windows, **destination templates**, and **recursive glob + `${SRC_DIR}` / `${SRC_NAME}`** (`test:media:glob` — outputs under `tests/assets/glob-in/**/out/`, gitignored, for manual inspection). **`test:media:glob:raw`** runs the same glob flow against user-supplied **`.arw`** files under `tests/assets/raw/` (skipped when the folder is missing or has no ARW files). **HTTP URL smoke tests** (downloads from **picsum.photos**, needs network): diff --git a/packages/media/cpp/cache/images/00/005790ced6597aef81d01d2addbad574b3b545a7d82e104715c952a40ed22c99 b/packages/media/cpp/cache/images/00/005790ced6597aef81d01d2addbad574b3b545a7d82e104715c952a40ed22c99 deleted file mode 100644 index db14bafe..00000000 Binary files a/packages/media/cpp/cache/images/00/005790ced6597aef81d01d2addbad574b3b545a7d82e104715c952a40ed22c99 and /dev/null differ diff --git a/packages/media/cpp/cache/images/00/0087635e962c75857a3b1f450655bf6c07e7911e71d90196ea8b1add284a1cf8 b/packages/media/cpp/cache/images/00/0087635e962c75857a3b1f450655bf6c07e7911e71d90196ea8b1add284a1cf8 deleted file mode 100644 index be3c0bf3..00000000 Binary files a/packages/media/cpp/cache/images/00/0087635e962c75857a3b1f450655bf6c07e7911e71d90196ea8b1add284a1cf8 and /dev/null differ diff --git a/packages/media/cpp/cache/images/01/01759d578fd3575efb0df8c6e6f643a580c2e5e63bbfaa97489b1c6ea76e98bb b/packages/media/cpp/cache/images/01/01759d578fd3575efb0df8c6e6f643a580c2e5e63bbfaa97489b1c6ea76e98bb deleted file mode 100644 index 32cbadda..00000000 Binary files a/packages/media/cpp/cache/images/01/01759d578fd3575efb0df8c6e6f643a580c2e5e63bbfaa97489b1c6ea76e98bb and /dev/null differ diff --git a/packages/media/cpp/cache/images/01/01f40f430d0ff8b0c16d522f573209b6b5f7f97106188d9c14f57f6f60bbcd70 b/packages/media/cpp/cache/images/01/01f40f430d0ff8b0c16d522f573209b6b5f7f97106188d9c14f57f6f60bbcd70 deleted file mode 100644 index 480f0979..00000000 Binary files a/packages/media/cpp/cache/images/01/01f40f430d0ff8b0c16d522f573209b6b5f7f97106188d9c14f57f6f60bbcd70 and /dev/null differ diff --git a/packages/media/cpp/cache/images/02/0258a6361b9f0b789b8eb050921afb07dad08c48e95afb134f00df299eda94ef b/packages/media/cpp/cache/images/02/0258a6361b9f0b789b8eb050921afb07dad08c48e95afb134f00df299eda94ef deleted file mode 100644 index fbb85ed8..00000000 Binary files a/packages/media/cpp/cache/images/02/0258a6361b9f0b789b8eb050921afb07dad08c48e95afb134f00df299eda94ef and /dev/null differ diff --git a/packages/media/cpp/cache/images/04/04e1395ca2a8c84708d173f658ad2c2d236a3d6b730fd8c94ffcfb81f30e708b b/packages/media/cpp/cache/images/04/04e1395ca2a8c84708d173f658ad2c2d236a3d6b730fd8c94ffcfb81f30e708b deleted file mode 100644 index 06351f8a..00000000 Binary files a/packages/media/cpp/cache/images/04/04e1395ca2a8c84708d173f658ad2c2d236a3d6b730fd8c94ffcfb81f30e708b and /dev/null differ diff --git a/packages/media/cpp/cache/images/05/050c2cf80708c6a3876ed86bac40ec554d9d3f71d30567b6b769b78425b1ad2f b/packages/media/cpp/cache/images/05/050c2cf80708c6a3876ed86bac40ec554d9d3f71d30567b6b769b78425b1ad2f deleted file mode 100644 index 8322ebc2..00000000 Binary files a/packages/media/cpp/cache/images/05/050c2cf80708c6a3876ed86bac40ec554d9d3f71d30567b6b769b78425b1ad2f and /dev/null differ diff --git a/packages/media/cpp/cache/images/07/07459a43ef692c109a29bd0e58d9120a249132fbf826c9027c7dbaebc418e3a7 b/packages/media/cpp/cache/images/07/07459a43ef692c109a29bd0e58d9120a249132fbf826c9027c7dbaebc418e3a7 deleted file mode 100644 index cb580c89..00000000 Binary files a/packages/media/cpp/cache/images/07/07459a43ef692c109a29bd0e58d9120a249132fbf826c9027c7dbaebc418e3a7 and /dev/null differ diff --git a/packages/media/cpp/cache/images/07/0753cb440c0d371c8d2fd3869cd5a51d976295433ef6028d2ce9c8cd8b8390f1 b/packages/media/cpp/cache/images/07/0753cb440c0d371c8d2fd3869cd5a51d976295433ef6028d2ce9c8cd8b8390f1 deleted file mode 100644 index 7496a665..00000000 Binary files a/packages/media/cpp/cache/images/07/0753cb440c0d371c8d2fd3869cd5a51d976295433ef6028d2ce9c8cd8b8390f1 and /dev/null differ diff --git a/packages/media/cpp/cache/images/07/07b8cfbcd822edbe2e721549d319a9bcaabd6c98829a13832dfa95f69225e930 b/packages/media/cpp/cache/images/07/07b8cfbcd822edbe2e721549d319a9bcaabd6c98829a13832dfa95f69225e930 deleted file mode 100644 index 216de721..00000000 Binary files a/packages/media/cpp/cache/images/07/07b8cfbcd822edbe2e721549d319a9bcaabd6c98829a13832dfa95f69225e930 and /dev/null differ diff --git a/packages/media/cpp/cache/images/0a/0a81c9fad0398b1e13b4524ad6450c9884a9b25b193bf5e450ecaea3d9e71115 b/packages/media/cpp/cache/images/0a/0a81c9fad0398b1e13b4524ad6450c9884a9b25b193bf5e450ecaea3d9e71115 deleted file mode 100644 index f5129e14..00000000 Binary files a/packages/media/cpp/cache/images/0a/0a81c9fad0398b1e13b4524ad6450c9884a9b25b193bf5e450ecaea3d9e71115 and /dev/null differ diff --git a/packages/media/cpp/cache/images/0a/0aed912bc0ccff6841644b0a8d9e94893682511644f1ed297396f44090af4f84 b/packages/media/cpp/cache/images/0a/0aed912bc0ccff6841644b0a8d9e94893682511644f1ed297396f44090af4f84 deleted file mode 100644 index 3b8ab409..00000000 Binary files a/packages/media/cpp/cache/images/0a/0aed912bc0ccff6841644b0a8d9e94893682511644f1ed297396f44090af4f84 and /dev/null differ diff --git a/packages/media/cpp/cache/images/0c/0c461c12da982822607459f30cdc3c76c19758d8a95801c70d0b8a240af92e31 b/packages/media/cpp/cache/images/0c/0c461c12da982822607459f30cdc3c76c19758d8a95801c70d0b8a240af92e31 deleted file mode 100644 index 28787004..00000000 Binary files a/packages/media/cpp/cache/images/0c/0c461c12da982822607459f30cdc3c76c19758d8a95801c70d0b8a240af92e31 and /dev/null differ diff --git a/packages/media/cpp/cache/images/0d/0d188d061c354aea1e02c6fc6134f5c35222636cda511f19bf4862d909776934 b/packages/media/cpp/cache/images/0d/0d188d061c354aea1e02c6fc6134f5c35222636cda511f19bf4862d909776934 deleted file mode 100644 index 165714f0..00000000 Binary files a/packages/media/cpp/cache/images/0d/0d188d061c354aea1e02c6fc6134f5c35222636cda511f19bf4862d909776934 and /dev/null differ diff --git a/packages/media/cpp/cache/images/0d/0dfb3249ad37196dcef3be680940509221814ba22e08942a00f4e14a37a5639c b/packages/media/cpp/cache/images/0d/0dfb3249ad37196dcef3be680940509221814ba22e08942a00f4e14a37a5639c deleted file mode 100644 index 6e13baa1..00000000 Binary files a/packages/media/cpp/cache/images/0d/0dfb3249ad37196dcef3be680940509221814ba22e08942a00f4e14a37a5639c and /dev/null differ diff --git a/packages/media/cpp/cache/images/0e/0e013d2fd19b2ab21ecbe4c497924952b941f1cf4264f49a9d21a28aae363340 b/packages/media/cpp/cache/images/0e/0e013d2fd19b2ab21ecbe4c497924952b941f1cf4264f49a9d21a28aae363340 deleted file mode 100644 index 6905078d..00000000 Binary files a/packages/media/cpp/cache/images/0e/0e013d2fd19b2ab21ecbe4c497924952b941f1cf4264f49a9d21a28aae363340 and /dev/null differ diff --git a/packages/media/cpp/cache/images/0f/0f8bddc1f12252d78b7fe2671dca4733595d12208c08a0c1b369cd8b877d1180 b/packages/media/cpp/cache/images/0f/0f8bddc1f12252d78b7fe2671dca4733595d12208c08a0c1b369cd8b877d1180 deleted file mode 100644 index 36e302d4..00000000 Binary files a/packages/media/cpp/cache/images/0f/0f8bddc1f12252d78b7fe2671dca4733595d12208c08a0c1b369cd8b877d1180 and /dev/null differ diff --git a/packages/media/cpp/cache/images/10/10bef2088a3683216c40ac68c626d84a6a0ecf27e0bed15de125681d084c7605 b/packages/media/cpp/cache/images/10/10bef2088a3683216c40ac68c626d84a6a0ecf27e0bed15de125681d084c7605 deleted file mode 100644 index 52f5316b..00000000 Binary files a/packages/media/cpp/cache/images/10/10bef2088a3683216c40ac68c626d84a6a0ecf27e0bed15de125681d084c7605 and /dev/null differ diff --git a/packages/media/cpp/cache/images/12/12c703785e24aa598af7e08f8c151f647834b14cdea6b743c80cd29f2b08309e b/packages/media/cpp/cache/images/12/12c703785e24aa598af7e08f8c151f647834b14cdea6b743c80cd29f2b08309e deleted file mode 100644 index 4b3ca4b1..00000000 Binary files a/packages/media/cpp/cache/images/12/12c703785e24aa598af7e08f8c151f647834b14cdea6b743c80cd29f2b08309e and /dev/null differ diff --git a/packages/media/cpp/cache/images/12/12d8c1dada66775311b4fb6b730fde7cba91c6a0a9e3e8980686b2c98e3e2111 b/packages/media/cpp/cache/images/12/12d8c1dada66775311b4fb6b730fde7cba91c6a0a9e3e8980686b2c98e3e2111 deleted file mode 100644 index 73e8c705..00000000 Binary files a/packages/media/cpp/cache/images/12/12d8c1dada66775311b4fb6b730fde7cba91c6a0a9e3e8980686b2c98e3e2111 and /dev/null differ diff --git a/packages/media/cpp/cache/images/12/12fab9e8d620afc4a45c613de013b7cb8391229222e8ab5193d8144e3fb73109 b/packages/media/cpp/cache/images/12/12fab9e8d620afc4a45c613de013b7cb8391229222e8ab5193d8144e3fb73109 deleted file mode 100644 index bf7a4c03..00000000 Binary files a/packages/media/cpp/cache/images/12/12fab9e8d620afc4a45c613de013b7cb8391229222e8ab5193d8144e3fb73109 and /dev/null differ diff --git a/packages/media/cpp/cache/images/13/13ea0681e7cecd842f5436d4c92fce2a983b71b59f6af5d517fd5b03e9d7a4fd b/packages/media/cpp/cache/images/13/13ea0681e7cecd842f5436d4c92fce2a983b71b59f6af5d517fd5b03e9d7a4fd deleted file mode 100644 index d24f6b0e..00000000 Binary files a/packages/media/cpp/cache/images/13/13ea0681e7cecd842f5436d4c92fce2a983b71b59f6af5d517fd5b03e9d7a4fd and /dev/null differ diff --git a/packages/media/cpp/cache/images/14/140dd182742694f46e1879f99fddd45594dfa6a7d846a617668cce18939cef3a b/packages/media/cpp/cache/images/14/140dd182742694f46e1879f99fddd45594dfa6a7d846a617668cce18939cef3a deleted file mode 100644 index 8a7eafa9..00000000 Binary files a/packages/media/cpp/cache/images/14/140dd182742694f46e1879f99fddd45594dfa6a7d846a617668cce18939cef3a and /dev/null differ diff --git a/packages/media/cpp/cache/images/14/144f25dab17dff1f7a94a0ce0b74b1c3787c6a480113da9848f7d0697aa4ac3f b/packages/media/cpp/cache/images/14/144f25dab17dff1f7a94a0ce0b74b1c3787c6a480113da9848f7d0697aa4ac3f deleted file mode 100644 index 3e586fc2..00000000 Binary files a/packages/media/cpp/cache/images/14/144f25dab17dff1f7a94a0ce0b74b1c3787c6a480113da9848f7d0697aa4ac3f and /dev/null differ diff --git a/packages/media/cpp/cache/images/15/1510c3d5fd494f802f49ab63840872b855148dc393900f3e5824146932709ec3 b/packages/media/cpp/cache/images/15/1510c3d5fd494f802f49ab63840872b855148dc393900f3e5824146932709ec3 deleted file mode 100644 index 56414d94..00000000 Binary files a/packages/media/cpp/cache/images/15/1510c3d5fd494f802f49ab63840872b855148dc393900f3e5824146932709ec3 and /dev/null differ diff --git a/packages/media/cpp/cache/images/15/15268845b87528318c43659af8f56e8459b13101be3a1087a65f235dfa9902c1 b/packages/media/cpp/cache/images/15/15268845b87528318c43659af8f56e8459b13101be3a1087a65f235dfa9902c1 deleted file mode 100644 index 9c0807bd..00000000 Binary files a/packages/media/cpp/cache/images/15/15268845b87528318c43659af8f56e8459b13101be3a1087a65f235dfa9902c1 and /dev/null differ diff --git a/packages/media/cpp/cache/images/15/1572a5eb3227e6b184e1f3d33766a79808296f548aa79b3f0679bfd13e254ebf b/packages/media/cpp/cache/images/15/1572a5eb3227e6b184e1f3d33766a79808296f548aa79b3f0679bfd13e254ebf deleted file mode 100644 index 273fcabf..00000000 Binary files a/packages/media/cpp/cache/images/15/1572a5eb3227e6b184e1f3d33766a79808296f548aa79b3f0679bfd13e254ebf and /dev/null differ diff --git a/packages/media/cpp/cache/images/15/15f73115f4bf7abe19d8d1b5957e65ad4c8fee904c7f9547c9db33c5c287cf0f b/packages/media/cpp/cache/images/15/15f73115f4bf7abe19d8d1b5957e65ad4c8fee904c7f9547c9db33c5c287cf0f deleted file mode 100644 index 1a968c27..00000000 Binary files a/packages/media/cpp/cache/images/15/15f73115f4bf7abe19d8d1b5957e65ad4c8fee904c7f9547c9db33c5c287cf0f and /dev/null differ diff --git a/packages/media/cpp/cache/images/15/15f79154ff845554279e4e0cb3fd085f84077df7caf5af753202e0b7a9cf5446 b/packages/media/cpp/cache/images/15/15f79154ff845554279e4e0cb3fd085f84077df7caf5af753202e0b7a9cf5446 deleted file mode 100644 index 59d892b1..00000000 Binary files a/packages/media/cpp/cache/images/15/15f79154ff845554279e4e0cb3fd085f84077df7caf5af753202e0b7a9cf5446 and /dev/null differ diff --git a/packages/media/cpp/cache/images/18/181924777df58295b68a5f94baed60edd23c841f1c887c7e25407bd385fd1406 b/packages/media/cpp/cache/images/18/181924777df58295b68a5f94baed60edd23c841f1c887c7e25407bd385fd1406 deleted file mode 100644 index a9c7f042..00000000 Binary files a/packages/media/cpp/cache/images/18/181924777df58295b68a5f94baed60edd23c841f1c887c7e25407bd385fd1406 and /dev/null differ diff --git a/packages/media/cpp/cache/images/18/189881b68eb28347a7685a531a7a590429e3681d725e4dce68daff775f4fb6c2 b/packages/media/cpp/cache/images/18/189881b68eb28347a7685a531a7a590429e3681d725e4dce68daff775f4fb6c2 deleted file mode 100644 index 13fbd20c..00000000 Binary files a/packages/media/cpp/cache/images/18/189881b68eb28347a7685a531a7a590429e3681d725e4dce68daff775f4fb6c2 and /dev/null differ diff --git a/packages/media/cpp/cache/images/18/18b2b80786b801e68b0a746383066489254ee9fff8687b76f7584b324ea767ba b/packages/media/cpp/cache/images/18/18b2b80786b801e68b0a746383066489254ee9fff8687b76f7584b324ea767ba deleted file mode 100644 index 2e542834..00000000 Binary files a/packages/media/cpp/cache/images/18/18b2b80786b801e68b0a746383066489254ee9fff8687b76f7584b324ea767ba and /dev/null differ diff --git a/packages/media/cpp/cache/images/19/19cb568d994f22bea84c5c7297e960ef614adb59a8ad2bc8cabf7cadbe8a96dd b/packages/media/cpp/cache/images/19/19cb568d994f22bea84c5c7297e960ef614adb59a8ad2bc8cabf7cadbe8a96dd deleted file mode 100644 index 4d3b775e..00000000 Binary files a/packages/media/cpp/cache/images/19/19cb568d994f22bea84c5c7297e960ef614adb59a8ad2bc8cabf7cadbe8a96dd and /dev/null differ diff --git a/packages/media/cpp/cache/images/1a/1af9dfda72578c678e5df5bbb8eefb6c71b6e84bf4387cc8b4b2111ee03e5578 b/packages/media/cpp/cache/images/1a/1af9dfda72578c678e5df5bbb8eefb6c71b6e84bf4387cc8b4b2111ee03e5578 deleted file mode 100644 index d40600ec..00000000 Binary files a/packages/media/cpp/cache/images/1a/1af9dfda72578c678e5df5bbb8eefb6c71b6e84bf4387cc8b4b2111ee03e5578 and /dev/null differ diff --git a/packages/media/cpp/cache/images/1b/1b543faca1e2c10b1daf8b5506735c5ef26a5362d02dcbd0735ecdb6d1d05c3d b/packages/media/cpp/cache/images/1b/1b543faca1e2c10b1daf8b5506735c5ef26a5362d02dcbd0735ecdb6d1d05c3d deleted file mode 100644 index 37ad3267..00000000 Binary files a/packages/media/cpp/cache/images/1b/1b543faca1e2c10b1daf8b5506735c5ef26a5362d02dcbd0735ecdb6d1d05c3d and /dev/null differ diff --git a/packages/media/cpp/cache/images/1c/1cf5ccaa4761739cc9afb229b180eb360623188b96a69844da08a66144bb65da b/packages/media/cpp/cache/images/1c/1cf5ccaa4761739cc9afb229b180eb360623188b96a69844da08a66144bb65da deleted file mode 100644 index f40bb761..00000000 Binary files a/packages/media/cpp/cache/images/1c/1cf5ccaa4761739cc9afb229b180eb360623188b96a69844da08a66144bb65da and /dev/null differ diff --git a/packages/media/cpp/cache/images/1d/1deb9e593ca7b849ee769b83a32b12cae1d554e283808f81b84bb5aadddf842b b/packages/media/cpp/cache/images/1d/1deb9e593ca7b849ee769b83a32b12cae1d554e283808f81b84bb5aadddf842b deleted file mode 100644 index b71713f5..00000000 Binary files a/packages/media/cpp/cache/images/1d/1deb9e593ca7b849ee769b83a32b12cae1d554e283808f81b84bb5aadddf842b and /dev/null differ diff --git a/packages/media/cpp/cache/images/1e/1eb201f9ce6eeff0c78fc3fb545a70e50bd8b6d475766cf2051726bea7c017c1 b/packages/media/cpp/cache/images/1e/1eb201f9ce6eeff0c78fc3fb545a70e50bd8b6d475766cf2051726bea7c017c1 deleted file mode 100644 index 5ee276b9..00000000 Binary files a/packages/media/cpp/cache/images/1e/1eb201f9ce6eeff0c78fc3fb545a70e50bd8b6d475766cf2051726bea7c017c1 and /dev/null differ diff --git a/packages/media/cpp/cache/images/1e/1eeaff6ad98b68e2d59caf9ae69d0e3e881de45d82dacad7a4032293bfa01b8d b/packages/media/cpp/cache/images/1e/1eeaff6ad98b68e2d59caf9ae69d0e3e881de45d82dacad7a4032293bfa01b8d deleted file mode 100644 index 153fa0ea..00000000 Binary files a/packages/media/cpp/cache/images/1e/1eeaff6ad98b68e2d59caf9ae69d0e3e881de45d82dacad7a4032293bfa01b8d and /dev/null differ diff --git a/packages/media/cpp/cache/images/20/20c018bc27398d85dc3782ab9b2447a4f2ede4698220b7a09ef48d01e5fb5583 b/packages/media/cpp/cache/images/20/20c018bc27398d85dc3782ab9b2447a4f2ede4698220b7a09ef48d01e5fb5583 deleted file mode 100644 index 857b36f4..00000000 Binary files a/packages/media/cpp/cache/images/20/20c018bc27398d85dc3782ab9b2447a4f2ede4698220b7a09ef48d01e5fb5583 and /dev/null differ diff --git a/packages/media/cpp/cache/images/21/217a8d0d2f72e354956c8b55541c0c6720a5af2b7c872437521a726e1ad25ead b/packages/media/cpp/cache/images/21/217a8d0d2f72e354956c8b55541c0c6720a5af2b7c872437521a726e1ad25ead deleted file mode 100644 index 0244b1d2..00000000 Binary files a/packages/media/cpp/cache/images/21/217a8d0d2f72e354956c8b55541c0c6720a5af2b7c872437521a726e1ad25ead and /dev/null differ diff --git a/packages/media/cpp/cache/images/21/21ca9f94bb37acd37381e23491ae8dce9f27704bbf67bc0f93098b495dce2c4b b/packages/media/cpp/cache/images/21/21ca9f94bb37acd37381e23491ae8dce9f27704bbf67bc0f93098b495dce2c4b deleted file mode 100644 index 9129b689..00000000 Binary files a/packages/media/cpp/cache/images/21/21ca9f94bb37acd37381e23491ae8dce9f27704bbf67bc0f93098b495dce2c4b and /dev/null differ diff --git a/packages/media/cpp/cache/images/22/22b435dcd5a6bf20c40e61ee033bcfd2ca269b341b9250000f4b0cd8fb8de64d b/packages/media/cpp/cache/images/22/22b435dcd5a6bf20c40e61ee033bcfd2ca269b341b9250000f4b0cd8fb8de64d deleted file mode 100644 index 5edfa9b5..00000000 Binary files a/packages/media/cpp/cache/images/22/22b435dcd5a6bf20c40e61ee033bcfd2ca269b341b9250000f4b0cd8fb8de64d and /dev/null differ diff --git a/packages/media/cpp/cache/images/23/2300b581bec307711b85cb2bd9e93b7412e2dbb35228bb323a01e295aa7f02bf b/packages/media/cpp/cache/images/23/2300b581bec307711b85cb2bd9e93b7412e2dbb35228bb323a01e295aa7f02bf deleted file mode 100644 index 3ad94728..00000000 Binary files a/packages/media/cpp/cache/images/23/2300b581bec307711b85cb2bd9e93b7412e2dbb35228bb323a01e295aa7f02bf and /dev/null differ diff --git a/packages/media/cpp/cache/images/24/24c99cfb50da4bcbbc52fdd2be27cea7ec91c5b6ccb9d349176385db1acdf72c b/packages/media/cpp/cache/images/24/24c99cfb50da4bcbbc52fdd2be27cea7ec91c5b6ccb9d349176385db1acdf72c deleted file mode 100644 index 70d4ddb1..00000000 Binary files a/packages/media/cpp/cache/images/24/24c99cfb50da4bcbbc52fdd2be27cea7ec91c5b6ccb9d349176385db1acdf72c and /dev/null differ diff --git a/packages/media/cpp/cache/images/25/25a9da917141a9e316b9705e2b80922bd689243200a12b4b8a8604567623dfa3 b/packages/media/cpp/cache/images/25/25a9da917141a9e316b9705e2b80922bd689243200a12b4b8a8604567623dfa3 deleted file mode 100644 index e910d360..00000000 Binary files a/packages/media/cpp/cache/images/25/25a9da917141a9e316b9705e2b80922bd689243200a12b4b8a8604567623dfa3 and /dev/null differ diff --git a/packages/media/cpp/cache/images/25/25d0fd5579af67038ec0d48cc87fa018b39be147c10a38b2910d1fe4270abaf0 b/packages/media/cpp/cache/images/25/25d0fd5579af67038ec0d48cc87fa018b39be147c10a38b2910d1fe4270abaf0 deleted file mode 100644 index 86560e58..00000000 Binary files a/packages/media/cpp/cache/images/25/25d0fd5579af67038ec0d48cc87fa018b39be147c10a38b2910d1fe4270abaf0 and /dev/null differ diff --git a/packages/media/cpp/cache/images/26/26e4f6d0d168ebe125223a6a96c7b55c149137c80db69a8c4fff30b5da803703 b/packages/media/cpp/cache/images/26/26e4f6d0d168ebe125223a6a96c7b55c149137c80db69a8c4fff30b5da803703 deleted file mode 100644 index 4b9624f6..00000000 Binary files a/packages/media/cpp/cache/images/26/26e4f6d0d168ebe125223a6a96c7b55c149137c80db69a8c4fff30b5da803703 and /dev/null differ diff --git a/packages/media/cpp/cache/images/27/270491d587cb05c26c7c712e75d63cb03de54d54a185c720ed44dd9776078a54 b/packages/media/cpp/cache/images/27/270491d587cb05c26c7c712e75d63cb03de54d54a185c720ed44dd9776078a54 deleted file mode 100644 index 680a080f..00000000 Binary files a/packages/media/cpp/cache/images/27/270491d587cb05c26c7c712e75d63cb03de54d54a185c720ed44dd9776078a54 and /dev/null differ diff --git a/packages/media/cpp/cache/images/27/2740a6f92116f6457637d0aed6a9f1ff4777070d9cf75aa4bd038f97f5051333 b/packages/media/cpp/cache/images/27/2740a6f92116f6457637d0aed6a9f1ff4777070d9cf75aa4bd038f97f5051333 deleted file mode 100644 index bf1fe1bc..00000000 Binary files a/packages/media/cpp/cache/images/27/2740a6f92116f6457637d0aed6a9f1ff4777070d9cf75aa4bd038f97f5051333 and /dev/null differ diff --git a/packages/media/cpp/cache/images/27/278a3ef76fa6a8cf305f06f665fde6645e0a4a00339972313712d0441e785e55 b/packages/media/cpp/cache/images/27/278a3ef76fa6a8cf305f06f665fde6645e0a4a00339972313712d0441e785e55 deleted file mode 100644 index 13ad08a6..00000000 Binary files a/packages/media/cpp/cache/images/27/278a3ef76fa6a8cf305f06f665fde6645e0a4a00339972313712d0441e785e55 and /dev/null differ diff --git a/packages/media/cpp/cache/images/28/2844edf5cff39406ea66e4a22d12a4b5848d970b5720ac0bf0268f1fb4b87171 b/packages/media/cpp/cache/images/28/2844edf5cff39406ea66e4a22d12a4b5848d970b5720ac0bf0268f1fb4b87171 deleted file mode 100644 index 6e2fe71b..00000000 Binary files a/packages/media/cpp/cache/images/28/2844edf5cff39406ea66e4a22d12a4b5848d970b5720ac0bf0268f1fb4b87171 and /dev/null differ diff --git a/packages/media/cpp/cache/images/28/28aebbf93681f636f2c2b395359dd4b116a36cf504563ea706920b74d4835340 b/packages/media/cpp/cache/images/28/28aebbf93681f636f2c2b395359dd4b116a36cf504563ea706920b74d4835340 deleted file mode 100644 index 6525ffe3..00000000 Binary files a/packages/media/cpp/cache/images/28/28aebbf93681f636f2c2b395359dd4b116a36cf504563ea706920b74d4835340 and /dev/null differ diff --git a/packages/media/cpp/cache/images/28/28d001026135db40073f77c50c9b55f0ed6c06de45e1f4259d6c4a1a9d055bef b/packages/media/cpp/cache/images/28/28d001026135db40073f77c50c9b55f0ed6c06de45e1f4259d6c4a1a9d055bef deleted file mode 100644 index 9f643141..00000000 Binary files a/packages/media/cpp/cache/images/28/28d001026135db40073f77c50c9b55f0ed6c06de45e1f4259d6c4a1a9d055bef and /dev/null differ diff --git a/packages/media/cpp/cache/images/28/28e59f343d6210812d12de74ae2d64008e8733964b7beb6a0e59e5f25682fc12 b/packages/media/cpp/cache/images/28/28e59f343d6210812d12de74ae2d64008e8733964b7beb6a0e59e5f25682fc12 deleted file mode 100644 index 29c9d8f4..00000000 Binary files a/packages/media/cpp/cache/images/28/28e59f343d6210812d12de74ae2d64008e8733964b7beb6a0e59e5f25682fc12 and /dev/null differ diff --git a/packages/media/cpp/cache/images/2a/2a429330af11b919a1a938457e33e55e322ea7f8ad25a44dbb21bdba7dcd723e b/packages/media/cpp/cache/images/2a/2a429330af11b919a1a938457e33e55e322ea7f8ad25a44dbb21bdba7dcd723e deleted file mode 100644 index c8fb29c6..00000000 Binary files a/packages/media/cpp/cache/images/2a/2a429330af11b919a1a938457e33e55e322ea7f8ad25a44dbb21bdba7dcd723e and /dev/null differ diff --git a/packages/media/cpp/cache/images/2a/2a85da5ebc8901da3bf3aec3ce333b01d1f0e665848302467488dc019a556194 b/packages/media/cpp/cache/images/2a/2a85da5ebc8901da3bf3aec3ce333b01d1f0e665848302467488dc019a556194 deleted file mode 100644 index f7c07a3a..00000000 Binary files a/packages/media/cpp/cache/images/2a/2a85da5ebc8901da3bf3aec3ce333b01d1f0e665848302467488dc019a556194 and /dev/null differ diff --git a/packages/media/cpp/cache/images/2b/2b21853c26392b359e589d2e0144654f22e5a30bb92650b2b5d1bb02ca25724f b/packages/media/cpp/cache/images/2b/2b21853c26392b359e589d2e0144654f22e5a30bb92650b2b5d1bb02ca25724f deleted file mode 100644 index 42c88081..00000000 Binary files a/packages/media/cpp/cache/images/2b/2b21853c26392b359e589d2e0144654f22e5a30bb92650b2b5d1bb02ca25724f and /dev/null differ diff --git a/packages/media/cpp/cache/images/2c/2c0eb596ab02e59edef4708e7864bf554f7f797edac1309c4af0bc0eb33a60c8 b/packages/media/cpp/cache/images/2c/2c0eb596ab02e59edef4708e7864bf554f7f797edac1309c4af0bc0eb33a60c8 deleted file mode 100644 index 501a79bf..00000000 Binary files a/packages/media/cpp/cache/images/2c/2c0eb596ab02e59edef4708e7864bf554f7f797edac1309c4af0bc0eb33a60c8 and /dev/null differ diff --git a/packages/media/cpp/cache/images/2c/2c4b576fc6bbb9ed212637ac20b7a4f6f3f3c3db19605817c957528a62ddd24a b/packages/media/cpp/cache/images/2c/2c4b576fc6bbb9ed212637ac20b7a4f6f3f3c3db19605817c957528a62ddd24a deleted file mode 100644 index 6574cf80..00000000 Binary files a/packages/media/cpp/cache/images/2c/2c4b576fc6bbb9ed212637ac20b7a4f6f3f3c3db19605817c957528a62ddd24a and /dev/null differ diff --git a/packages/media/cpp/cache/images/2c/2c7b0f692da91b670afbacf2783a1426c14e634c67b9d77f7decb98b5e3f1034 b/packages/media/cpp/cache/images/2c/2c7b0f692da91b670afbacf2783a1426c14e634c67b9d77f7decb98b5e3f1034 deleted file mode 100644 index 75e8a02c..00000000 Binary files a/packages/media/cpp/cache/images/2c/2c7b0f692da91b670afbacf2783a1426c14e634c67b9d77f7decb98b5e3f1034 and /dev/null differ diff --git a/packages/media/cpp/cache/images/2c/2ca69f182724d48eb1a22b4e842ab49d0f120166c53eb67fdbcd4c7ed2b7d22f b/packages/media/cpp/cache/images/2c/2ca69f182724d48eb1a22b4e842ab49d0f120166c53eb67fdbcd4c7ed2b7d22f deleted file mode 100644 index c511ca7f..00000000 Binary files a/packages/media/cpp/cache/images/2c/2ca69f182724d48eb1a22b4e842ab49d0f120166c53eb67fdbcd4c7ed2b7d22f and /dev/null differ diff --git a/packages/media/cpp/cache/images/2d/2d582e51bed0a7dcef69daedbbf34a455ba7b813917e1af7e1cfca7ea14b2969 b/packages/media/cpp/cache/images/2d/2d582e51bed0a7dcef69daedbbf34a455ba7b813917e1af7e1cfca7ea14b2969 deleted file mode 100644 index bea17fb5..00000000 Binary files a/packages/media/cpp/cache/images/2d/2d582e51bed0a7dcef69daedbbf34a455ba7b813917e1af7e1cfca7ea14b2969 and /dev/null differ diff --git a/packages/media/cpp/cache/images/2d/2d7bf40c7687e047c026acb7dc8d2ee4e7280382efe2567e91fdf3a129aef585 b/packages/media/cpp/cache/images/2d/2d7bf40c7687e047c026acb7dc8d2ee4e7280382efe2567e91fdf3a129aef585 deleted file mode 100644 index 1f5f409d..00000000 Binary files a/packages/media/cpp/cache/images/2d/2d7bf40c7687e047c026acb7dc8d2ee4e7280382efe2567e91fdf3a129aef585 and /dev/null differ diff --git a/packages/media/cpp/cache/images/2d/2d984b0f351a8f1d54d9f592810d176803429df2a2884ada4aeea40051edecac b/packages/media/cpp/cache/images/2d/2d984b0f351a8f1d54d9f592810d176803429df2a2884ada4aeea40051edecac deleted file mode 100644 index dabb1bd4..00000000 Binary files a/packages/media/cpp/cache/images/2d/2d984b0f351a8f1d54d9f592810d176803429df2a2884ada4aeea40051edecac and /dev/null differ diff --git a/packages/media/cpp/cache/images/2d/2d9ee71c3de50a72c82bead8d1e03b94071caad7fc4c780ec12b4fa5d869b731 b/packages/media/cpp/cache/images/2d/2d9ee71c3de50a72c82bead8d1e03b94071caad7fc4c780ec12b4fa5d869b731 deleted file mode 100644 index f496a958..00000000 Binary files a/packages/media/cpp/cache/images/2d/2d9ee71c3de50a72c82bead8d1e03b94071caad7fc4c780ec12b4fa5d869b731 and /dev/null differ diff --git a/packages/media/cpp/cache/images/31/3141182647d8eb30d8e77c30c2c27e725a0a95ad95c5eec8380c07e4276634c0 b/packages/media/cpp/cache/images/31/3141182647d8eb30d8e77c30c2c27e725a0a95ad95c5eec8380c07e4276634c0 deleted file mode 100644 index 5071238b..00000000 Binary files a/packages/media/cpp/cache/images/31/3141182647d8eb30d8e77c30c2c27e725a0a95ad95c5eec8380c07e4276634c0 and /dev/null differ diff --git a/packages/media/cpp/cache/images/31/319d3dae2bffcf7ba1e635a9adf8d5753f0624f68c12001a59eda56d01b1b6ef b/packages/media/cpp/cache/images/31/319d3dae2bffcf7ba1e635a9adf8d5753f0624f68c12001a59eda56d01b1b6ef deleted file mode 100644 index dd429737..00000000 Binary files a/packages/media/cpp/cache/images/31/319d3dae2bffcf7ba1e635a9adf8d5753f0624f68c12001a59eda56d01b1b6ef and /dev/null differ diff --git a/packages/media/cpp/cache/images/33/3360f2201479c42ba54f35d04e727a900b24d61a70629ebe72c72f8e8c66ff14 b/packages/media/cpp/cache/images/33/3360f2201479c42ba54f35d04e727a900b24d61a70629ebe72c72f8e8c66ff14 deleted file mode 100644 index da5180e8..00000000 Binary files a/packages/media/cpp/cache/images/33/3360f2201479c42ba54f35d04e727a900b24d61a70629ebe72c72f8e8c66ff14 and /dev/null differ diff --git a/packages/media/cpp/cache/images/34/341774500a932936588430d31665c7c7b5818f97e2bc78f7fe9c0400f597f5c1 b/packages/media/cpp/cache/images/34/341774500a932936588430d31665c7c7b5818f97e2bc78f7fe9c0400f597f5c1 deleted file mode 100644 index 1b83abd4..00000000 Binary files a/packages/media/cpp/cache/images/34/341774500a932936588430d31665c7c7b5818f97e2bc78f7fe9c0400f597f5c1 and /dev/null differ diff --git a/packages/media/cpp/cache/images/34/344dd3d2fba317426a9d2ddea41e336475663ae9a65337c9627e0c2ff3a1ffc2 b/packages/media/cpp/cache/images/34/344dd3d2fba317426a9d2ddea41e336475663ae9a65337c9627e0c2ff3a1ffc2 deleted file mode 100644 index 4eddacfa..00000000 Binary files a/packages/media/cpp/cache/images/34/344dd3d2fba317426a9d2ddea41e336475663ae9a65337c9627e0c2ff3a1ffc2 and /dev/null differ diff --git a/packages/media/cpp/cache/images/34/34a36e6850c8adc6cf04865cd9e2eb006851e6187685f97d30b6d9190760c66d b/packages/media/cpp/cache/images/34/34a36e6850c8adc6cf04865cd9e2eb006851e6187685f97d30b6d9190760c66d deleted file mode 100644 index c9a22173..00000000 Binary files a/packages/media/cpp/cache/images/34/34a36e6850c8adc6cf04865cd9e2eb006851e6187685f97d30b6d9190760c66d and /dev/null differ diff --git a/packages/media/cpp/cache/images/35/35100bf1e725168293126c49c52c0fb4311f1ff68d96973acaec7c6ce72dcb5b b/packages/media/cpp/cache/images/35/35100bf1e725168293126c49c52c0fb4311f1ff68d96973acaec7c6ce72dcb5b deleted file mode 100644 index 9479eae5..00000000 Binary files a/packages/media/cpp/cache/images/35/35100bf1e725168293126c49c52c0fb4311f1ff68d96973acaec7c6ce72dcb5b and /dev/null differ diff --git a/packages/media/cpp/cache/images/35/353897cbd4578a02a2381a4d66d9367d7af61f1662792a611264db55cd3c3e55 b/packages/media/cpp/cache/images/35/353897cbd4578a02a2381a4d66d9367d7af61f1662792a611264db55cd3c3e55 deleted file mode 100644 index 1687c6e3..00000000 Binary files a/packages/media/cpp/cache/images/35/353897cbd4578a02a2381a4d66d9367d7af61f1662792a611264db55cd3c3e55 and /dev/null differ diff --git a/packages/media/cpp/cache/images/35/35b010d0d8dc6419b575d76454d9cf94bde6c736ee86d56788588ad10cba1937 b/packages/media/cpp/cache/images/35/35b010d0d8dc6419b575d76454d9cf94bde6c736ee86d56788588ad10cba1937 deleted file mode 100644 index b53e2f7e..00000000 Binary files a/packages/media/cpp/cache/images/35/35b010d0d8dc6419b575d76454d9cf94bde6c736ee86d56788588ad10cba1937 and /dev/null differ diff --git a/packages/media/cpp/cache/images/35/35fc45f1b991c71400754b1726ea119493ca931abd04527f47ff04fc1a29afb7 b/packages/media/cpp/cache/images/35/35fc45f1b991c71400754b1726ea119493ca931abd04527f47ff04fc1a29afb7 deleted file mode 100644 index a8f23f44..00000000 Binary files a/packages/media/cpp/cache/images/35/35fc45f1b991c71400754b1726ea119493ca931abd04527f47ff04fc1a29afb7 and /dev/null differ diff --git a/packages/media/cpp/cache/images/36/362c5b7dc39cb792f9593399fd75e048f0d0d70c04cc5019f01eb8f5a0f01c48 b/packages/media/cpp/cache/images/36/362c5b7dc39cb792f9593399fd75e048f0d0d70c04cc5019f01eb8f5a0f01c48 deleted file mode 100644 index 09d55acb..00000000 Binary files a/packages/media/cpp/cache/images/36/362c5b7dc39cb792f9593399fd75e048f0d0d70c04cc5019f01eb8f5a0f01c48 and /dev/null differ diff --git a/packages/media/cpp/cache/images/36/36549d8454f2adecc88cd0e9822a84e22714477224068a05f375626da0fd99bf b/packages/media/cpp/cache/images/36/36549d8454f2adecc88cd0e9822a84e22714477224068a05f375626da0fd99bf deleted file mode 100644 index cfffc99d..00000000 Binary files a/packages/media/cpp/cache/images/36/36549d8454f2adecc88cd0e9822a84e22714477224068a05f375626da0fd99bf and /dev/null differ diff --git a/packages/media/cpp/cache/images/36/36efdd2106a35737073009c44aeb42f4c4af2699086a6007ab9d900c408f605e b/packages/media/cpp/cache/images/36/36efdd2106a35737073009c44aeb42f4c4af2699086a6007ab9d900c408f605e deleted file mode 100644 index 59d188a4..00000000 Binary files a/packages/media/cpp/cache/images/36/36efdd2106a35737073009c44aeb42f4c4af2699086a6007ab9d900c408f605e and /dev/null differ diff --git a/packages/media/cpp/cache/images/37/3712e9f4c60f209a5f3db6e8cb43e4cea21faa8b1b863bfa75578490c7f2ec52 b/packages/media/cpp/cache/images/37/3712e9f4c60f209a5f3db6e8cb43e4cea21faa8b1b863bfa75578490c7f2ec52 deleted file mode 100644 index 3cef8834..00000000 Binary files a/packages/media/cpp/cache/images/37/3712e9f4c60f209a5f3db6e8cb43e4cea21faa8b1b863bfa75578490c7f2ec52 and /dev/null differ diff --git a/packages/media/cpp/cache/images/37/37153ed044e44f962f0b05bdaad334a033b88d74342f5eee0bd41e47cf2a6e8c b/packages/media/cpp/cache/images/37/37153ed044e44f962f0b05bdaad334a033b88d74342f5eee0bd41e47cf2a6e8c deleted file mode 100644 index 9f30b6cf..00000000 Binary files a/packages/media/cpp/cache/images/37/37153ed044e44f962f0b05bdaad334a033b88d74342f5eee0bd41e47cf2a6e8c and /dev/null differ diff --git a/packages/media/cpp/cache/images/37/37fe78745dbe37b44877c9e672e3602311fdfa9e372cc1b637f271fdbea69618 b/packages/media/cpp/cache/images/37/37fe78745dbe37b44877c9e672e3602311fdfa9e372cc1b637f271fdbea69618 deleted file mode 100644 index 23063a32..00000000 Binary files a/packages/media/cpp/cache/images/37/37fe78745dbe37b44877c9e672e3602311fdfa9e372cc1b637f271fdbea69618 and /dev/null differ diff --git a/packages/media/cpp/cache/images/38/38756f350c35cda53874389e1b24b549abd133f9c860ee3869007aaa92a38b2c b/packages/media/cpp/cache/images/38/38756f350c35cda53874389e1b24b549abd133f9c860ee3869007aaa92a38b2c deleted file mode 100644 index d8a25147..00000000 Binary files a/packages/media/cpp/cache/images/38/38756f350c35cda53874389e1b24b549abd133f9c860ee3869007aaa92a38b2c and /dev/null differ diff --git a/packages/media/cpp/cache/images/39/39150543d901a0e9298488a227be7228680e3ccea678e57aa798ad3055af7193 b/packages/media/cpp/cache/images/39/39150543d901a0e9298488a227be7228680e3ccea678e57aa798ad3055af7193 deleted file mode 100644 index 47b9ad12..00000000 Binary files a/packages/media/cpp/cache/images/39/39150543d901a0e9298488a227be7228680e3ccea678e57aa798ad3055af7193 and /dev/null differ diff --git a/packages/media/cpp/cache/images/3b/3b2fd504841a78c438ca13f1e2643a4d30d41537ab5cb30f4453ebe30b230634 b/packages/media/cpp/cache/images/3b/3b2fd504841a78c438ca13f1e2643a4d30d41537ab5cb30f4453ebe30b230634 deleted file mode 100644 index 78f79f50..00000000 Binary files a/packages/media/cpp/cache/images/3b/3b2fd504841a78c438ca13f1e2643a4d30d41537ab5cb30f4453ebe30b230634 and /dev/null differ diff --git a/packages/media/cpp/cache/images/3c/3cfde0b83ef6a71fae80ba00144974fb1eca111472c12ae7bfa26e4cf51f206c b/packages/media/cpp/cache/images/3c/3cfde0b83ef6a71fae80ba00144974fb1eca111472c12ae7bfa26e4cf51f206c deleted file mode 100644 index c1844c29..00000000 Binary files a/packages/media/cpp/cache/images/3c/3cfde0b83ef6a71fae80ba00144974fb1eca111472c12ae7bfa26e4cf51f206c and /dev/null differ diff --git a/packages/media/cpp/cache/images/3f/3f0d38c39e5883b3c3fb5088076df430a90c862bcc8965308ac52b7750bb8320 b/packages/media/cpp/cache/images/3f/3f0d38c39e5883b3c3fb5088076df430a90c862bcc8965308ac52b7750bb8320 deleted file mode 100644 index f32659e6..00000000 Binary files a/packages/media/cpp/cache/images/3f/3f0d38c39e5883b3c3fb5088076df430a90c862bcc8965308ac52b7750bb8320 and /dev/null differ diff --git a/packages/media/cpp/cache/images/3f/3f137a9287939275dbd59ecc0a82276e94674fb0816de42a2e47870b568cf0bc b/packages/media/cpp/cache/images/3f/3f137a9287939275dbd59ecc0a82276e94674fb0816de42a2e47870b568cf0bc deleted file mode 100644 index 12fb7a89..00000000 Binary files a/packages/media/cpp/cache/images/3f/3f137a9287939275dbd59ecc0a82276e94674fb0816de42a2e47870b568cf0bc and /dev/null differ diff --git a/packages/media/cpp/cache/images/3f/3f2953ef26d07989838c69c1818e5c41d94866f3aee5a89278e35fa1e269817b b/packages/media/cpp/cache/images/3f/3f2953ef26d07989838c69c1818e5c41d94866f3aee5a89278e35fa1e269817b deleted file mode 100644 index 52497d99..00000000 Binary files a/packages/media/cpp/cache/images/3f/3f2953ef26d07989838c69c1818e5c41d94866f3aee5a89278e35fa1e269817b and /dev/null differ diff --git a/packages/media/cpp/cache/images/41/4175244b907c6c8c83d8f87592337a79beaa3009d5e0d9d5c111763305d95dc7 b/packages/media/cpp/cache/images/41/4175244b907c6c8c83d8f87592337a79beaa3009d5e0d9d5c111763305d95dc7 deleted file mode 100644 index b68cb16b..00000000 Binary files a/packages/media/cpp/cache/images/41/4175244b907c6c8c83d8f87592337a79beaa3009d5e0d9d5c111763305d95dc7 and /dev/null differ diff --git a/packages/media/cpp/cache/images/41/41f054bcb6dc7d0a26a4f7fefc37c4dbaaf452cb86a185b92504a9bc30913856 b/packages/media/cpp/cache/images/41/41f054bcb6dc7d0a26a4f7fefc37c4dbaaf452cb86a185b92504a9bc30913856 deleted file mode 100644 index 5e3c4971..00000000 Binary files a/packages/media/cpp/cache/images/41/41f054bcb6dc7d0a26a4f7fefc37c4dbaaf452cb86a185b92504a9bc30913856 and /dev/null differ diff --git a/packages/media/cpp/cache/images/43/437779e2708fc1c616e08039de950752c000dad327f197ed07083606c108691a b/packages/media/cpp/cache/images/43/437779e2708fc1c616e08039de950752c000dad327f197ed07083606c108691a deleted file mode 100644 index f16239fe..00000000 Binary files a/packages/media/cpp/cache/images/43/437779e2708fc1c616e08039de950752c000dad327f197ed07083606c108691a and /dev/null differ diff --git a/packages/media/cpp/cache/images/43/438defe7599d44c6e6f855984751c2047ad2c3121c14d84b602a0ccd87855ee8 b/packages/media/cpp/cache/images/43/438defe7599d44c6e6f855984751c2047ad2c3121c14d84b602a0ccd87855ee8 deleted file mode 100644 index 6b3574b0..00000000 Binary files a/packages/media/cpp/cache/images/43/438defe7599d44c6e6f855984751c2047ad2c3121c14d84b602a0ccd87855ee8 and /dev/null differ diff --git a/packages/media/cpp/cache/images/44/445b017201086df8ecacefee00da806949c6e3f0eed69bc8bfd4f25b991a8ef7 b/packages/media/cpp/cache/images/44/445b017201086df8ecacefee00da806949c6e3f0eed69bc8bfd4f25b991a8ef7 deleted file mode 100644 index ba8bac12..00000000 Binary files a/packages/media/cpp/cache/images/44/445b017201086df8ecacefee00da806949c6e3f0eed69bc8bfd4f25b991a8ef7 and /dev/null differ diff --git a/packages/media/cpp/cache/images/45/45fa4d31416d719833ecc372f3cb37168b8faff895a8f84c49ea2aaede694cd2 b/packages/media/cpp/cache/images/45/45fa4d31416d719833ecc372f3cb37168b8faff895a8f84c49ea2aaede694cd2 deleted file mode 100644 index 16b85d52..00000000 Binary files a/packages/media/cpp/cache/images/45/45fa4d31416d719833ecc372f3cb37168b8faff895a8f84c49ea2aaede694cd2 and /dev/null differ diff --git a/packages/media/cpp/cache/images/46/46bb950a35cbd7029c5fd455cd980aca7d80295c1f8c0e6df393c2a42ae34118 b/packages/media/cpp/cache/images/46/46bb950a35cbd7029c5fd455cd980aca7d80295c1f8c0e6df393c2a42ae34118 deleted file mode 100644 index 350e28bd..00000000 Binary files a/packages/media/cpp/cache/images/46/46bb950a35cbd7029c5fd455cd980aca7d80295c1f8c0e6df393c2a42ae34118 and /dev/null differ diff --git a/packages/media/cpp/cache/images/47/471a65a608dd5b04467f9633ccc61466757d46d13fca2e0daff0c56a55c0e3e6 b/packages/media/cpp/cache/images/47/471a65a608dd5b04467f9633ccc61466757d46d13fca2e0daff0c56a55c0e3e6 deleted file mode 100644 index 7b3fe081..00000000 Binary files a/packages/media/cpp/cache/images/47/471a65a608dd5b04467f9633ccc61466757d46d13fca2e0daff0c56a55c0e3e6 and /dev/null differ diff --git a/packages/media/cpp/cache/images/48/488f7c2bac269b4b3d446c1af2a6f12375fd7eb4676bf3a10f47d8be1cad73dd b/packages/media/cpp/cache/images/48/488f7c2bac269b4b3d446c1af2a6f12375fd7eb4676bf3a10f47d8be1cad73dd deleted file mode 100644 index c555b9cc..00000000 Binary files a/packages/media/cpp/cache/images/48/488f7c2bac269b4b3d446c1af2a6f12375fd7eb4676bf3a10f47d8be1cad73dd and /dev/null differ diff --git a/packages/media/cpp/cache/images/48/489725d9674a49003fca615d6e58a237791f30abba2d9d8ce69f7e9fff34a34f b/packages/media/cpp/cache/images/48/489725d9674a49003fca615d6e58a237791f30abba2d9d8ce69f7e9fff34a34f deleted file mode 100644 index a44569dd..00000000 Binary files a/packages/media/cpp/cache/images/48/489725d9674a49003fca615d6e58a237791f30abba2d9d8ce69f7e9fff34a34f and /dev/null differ diff --git a/packages/media/cpp/cache/images/49/493c904afdfa57e5c68202d13157efe52edd6a6af26e2df054b58a2ca441b84a b/packages/media/cpp/cache/images/49/493c904afdfa57e5c68202d13157efe52edd6a6af26e2df054b58a2ca441b84a deleted file mode 100644 index 193fb0a5..00000000 Binary files a/packages/media/cpp/cache/images/49/493c904afdfa57e5c68202d13157efe52edd6a6af26e2df054b58a2ca441b84a and /dev/null differ diff --git a/packages/media/cpp/cache/images/49/494a250b3b31b74ec6f69339d842b6c624b886c79098683b833e4532b8fb5fb2 b/packages/media/cpp/cache/images/49/494a250b3b31b74ec6f69339d842b6c624b886c79098683b833e4532b8fb5fb2 deleted file mode 100644 index b2052d41..00000000 Binary files a/packages/media/cpp/cache/images/49/494a250b3b31b74ec6f69339d842b6c624b886c79098683b833e4532b8fb5fb2 and /dev/null differ diff --git a/packages/media/cpp/cache/images/4a/4acac4d0431bd59fb616341a9a3633da4b464bbc5bdc087ff6a2d560e0ab3c72 b/packages/media/cpp/cache/images/4a/4acac4d0431bd59fb616341a9a3633da4b464bbc5bdc087ff6a2d560e0ab3c72 deleted file mode 100644 index a8241233..00000000 Binary files a/packages/media/cpp/cache/images/4a/4acac4d0431bd59fb616341a9a3633da4b464bbc5bdc087ff6a2d560e0ab3c72 and /dev/null differ diff --git a/packages/media/cpp/cache/images/4a/4ae59934132c4b8a38087c3842732582dc506d8c81530e0ceb5325d753fe7a56 b/packages/media/cpp/cache/images/4a/4ae59934132c4b8a38087c3842732582dc506d8c81530e0ceb5325d753fe7a56 deleted file mode 100644 index e59a5e66..00000000 Binary files a/packages/media/cpp/cache/images/4a/4ae59934132c4b8a38087c3842732582dc506d8c81530e0ceb5325d753fe7a56 and /dev/null differ diff --git a/packages/media/cpp/cache/images/4c/4ce7e87d4b20ecda21b3ba7078fdd1c71758d420a4233e35bdb5d346f301653c b/packages/media/cpp/cache/images/4c/4ce7e87d4b20ecda21b3ba7078fdd1c71758d420a4233e35bdb5d346f301653c deleted file mode 100644 index b735aba5..00000000 Binary files a/packages/media/cpp/cache/images/4c/4ce7e87d4b20ecda21b3ba7078fdd1c71758d420a4233e35bdb5d346f301653c and /dev/null differ diff --git a/packages/media/cpp/cache/images/4e/4e7c429acd87cef3c5235c959a08dc1f4454ec1b6b1d34d8a072ee74b54abaa4 b/packages/media/cpp/cache/images/4e/4e7c429acd87cef3c5235c959a08dc1f4454ec1b6b1d34d8a072ee74b54abaa4 deleted file mode 100644 index 15906a49..00000000 Binary files a/packages/media/cpp/cache/images/4e/4e7c429acd87cef3c5235c959a08dc1f4454ec1b6b1d34d8a072ee74b54abaa4 and /dev/null differ diff --git a/packages/media/cpp/cache/images/50/5007e3ee2d8bc7b0fb11b8af47fc84fca816468c495cef401b8bca0a2fe2e6af b/packages/media/cpp/cache/images/50/5007e3ee2d8bc7b0fb11b8af47fc84fca816468c495cef401b8bca0a2fe2e6af deleted file mode 100644 index a21ad9eb..00000000 Binary files a/packages/media/cpp/cache/images/50/5007e3ee2d8bc7b0fb11b8af47fc84fca816468c495cef401b8bca0a2fe2e6af and /dev/null differ diff --git a/packages/media/cpp/cache/images/50/5055eee9b36549eaff5cacca9beba8962fa15bd6d41d62516e3f73b4cb27fcfc b/packages/media/cpp/cache/images/50/5055eee9b36549eaff5cacca9beba8962fa15bd6d41d62516e3f73b4cb27fcfc deleted file mode 100644 index 56293f60..00000000 Binary files a/packages/media/cpp/cache/images/50/5055eee9b36549eaff5cacca9beba8962fa15bd6d41d62516e3f73b4cb27fcfc and /dev/null differ diff --git a/packages/media/cpp/cache/images/52/52b9a85c3933722fb0a96814922e270557760a39904977a409d453d096db39c4 b/packages/media/cpp/cache/images/52/52b9a85c3933722fb0a96814922e270557760a39904977a409d453d096db39c4 deleted file mode 100644 index 73f1b0de..00000000 Binary files a/packages/media/cpp/cache/images/52/52b9a85c3933722fb0a96814922e270557760a39904977a409d453d096db39c4 and /dev/null differ diff --git a/packages/media/cpp/cache/images/53/53e3da225b6b4df7a697f911b82c0f890e6f2623e1de7f260bceca970974a098 b/packages/media/cpp/cache/images/53/53e3da225b6b4df7a697f911b82c0f890e6f2623e1de7f260bceca970974a098 deleted file mode 100644 index e7968684..00000000 Binary files a/packages/media/cpp/cache/images/53/53e3da225b6b4df7a697f911b82c0f890e6f2623e1de7f260bceca970974a098 and /dev/null differ diff --git a/packages/media/cpp/cache/images/54/5464821c65c72e5e9ee96e45a2df5acae2fc738e7bb0f8aeddf2c605e4b0d917 b/packages/media/cpp/cache/images/54/5464821c65c72e5e9ee96e45a2df5acae2fc738e7bb0f8aeddf2c605e4b0d917 deleted file mode 100644 index e20a8e09..00000000 Binary files a/packages/media/cpp/cache/images/54/5464821c65c72e5e9ee96e45a2df5acae2fc738e7bb0f8aeddf2c605e4b0d917 and /dev/null differ diff --git a/packages/media/cpp/cache/images/54/5498d6b85b16ec6a6d8e13a23b0e5646acc9e8419ddb786251de23b6c9896762 b/packages/media/cpp/cache/images/54/5498d6b85b16ec6a6d8e13a23b0e5646acc9e8419ddb786251de23b6c9896762 deleted file mode 100644 index 879fe8c1..00000000 Binary files a/packages/media/cpp/cache/images/54/5498d6b85b16ec6a6d8e13a23b0e5646acc9e8419ddb786251de23b6c9896762 and /dev/null differ diff --git a/packages/media/cpp/cache/images/54/54e4574b4ab29d4c3ea6f8c51319af1cfaa79a3dafa47fc3cb8d13867e9aa308 b/packages/media/cpp/cache/images/54/54e4574b4ab29d4c3ea6f8c51319af1cfaa79a3dafa47fc3cb8d13867e9aa308 deleted file mode 100644 index a0fb7728..00000000 Binary files a/packages/media/cpp/cache/images/54/54e4574b4ab29d4c3ea6f8c51319af1cfaa79a3dafa47fc3cb8d13867e9aa308 and /dev/null differ diff --git a/packages/media/cpp/cache/images/55/555fda378e867bbc87125fdbb308572c158223d0f4a06cf811d50bc7b36cb192 b/packages/media/cpp/cache/images/55/555fda378e867bbc87125fdbb308572c158223d0f4a06cf811d50bc7b36cb192 deleted file mode 100644 index 9825a9c6..00000000 Binary files a/packages/media/cpp/cache/images/55/555fda378e867bbc87125fdbb308572c158223d0f4a06cf811d50bc7b36cb192 and /dev/null differ diff --git a/packages/media/cpp/cache/images/57/57c7426ca92feec18575179d8c096753b0b715075747500fd42912e3f59cf00c b/packages/media/cpp/cache/images/57/57c7426ca92feec18575179d8c096753b0b715075747500fd42912e3f59cf00c deleted file mode 100644 index 680d5fd4..00000000 Binary files a/packages/media/cpp/cache/images/57/57c7426ca92feec18575179d8c096753b0b715075747500fd42912e3f59cf00c and /dev/null differ diff --git a/packages/media/cpp/cache/images/58/589c84161f99d0651de4836d2417003bf11a410739099cdc6c353096dada54cc b/packages/media/cpp/cache/images/58/589c84161f99d0651de4836d2417003bf11a410739099cdc6c353096dada54cc deleted file mode 100644 index 0e7ac9dd..00000000 Binary files a/packages/media/cpp/cache/images/58/589c84161f99d0651de4836d2417003bf11a410739099cdc6c353096dada54cc and /dev/null differ diff --git a/packages/media/cpp/cache/images/5a/5ae6e96b6c7eadb8133b7f788a60f0cd611b155ce05caa59666011d344fb469f b/packages/media/cpp/cache/images/5a/5ae6e96b6c7eadb8133b7f788a60f0cd611b155ce05caa59666011d344fb469f deleted file mode 100644 index 056fad6d..00000000 Binary files a/packages/media/cpp/cache/images/5a/5ae6e96b6c7eadb8133b7f788a60f0cd611b155ce05caa59666011d344fb469f and /dev/null differ diff --git a/packages/media/cpp/cache/images/5b/5b93f8020b135ef8d8a8ee3c0257e813a6ff774c134611744068437c416467bf b/packages/media/cpp/cache/images/5b/5b93f8020b135ef8d8a8ee3c0257e813a6ff774c134611744068437c416467bf deleted file mode 100644 index c6d156b7..00000000 Binary files a/packages/media/cpp/cache/images/5b/5b93f8020b135ef8d8a8ee3c0257e813a6ff774c134611744068437c416467bf and /dev/null differ diff --git a/packages/media/cpp/cache/images/5c/5cffe50888056436c7f4c0c6c2597ef654bf3581d2a10664cecd10d490978acf b/packages/media/cpp/cache/images/5c/5cffe50888056436c7f4c0c6c2597ef654bf3581d2a10664cecd10d490978acf deleted file mode 100644 index 0b439b59..00000000 Binary files a/packages/media/cpp/cache/images/5c/5cffe50888056436c7f4c0c6c2597ef654bf3581d2a10664cecd10d490978acf and /dev/null differ diff --git a/packages/media/cpp/cache/images/5d/5d358685bb040744e139fa18f8ee0d104d771d6e3fdccade0f86cc35bde7a41e b/packages/media/cpp/cache/images/5d/5d358685bb040744e139fa18f8ee0d104d771d6e3fdccade0f86cc35bde7a41e deleted file mode 100644 index ad40bfbe..00000000 Binary files a/packages/media/cpp/cache/images/5d/5d358685bb040744e139fa18f8ee0d104d771d6e3fdccade0f86cc35bde7a41e and /dev/null differ diff --git a/packages/media/cpp/cache/images/5e/5e971016d8cfe7f9efc06e2e7265e5a089605057f86fdb6b71145bb047a144f4 b/packages/media/cpp/cache/images/5e/5e971016d8cfe7f9efc06e2e7265e5a089605057f86fdb6b71145bb047a144f4 deleted file mode 100644 index 255e5a68..00000000 Binary files a/packages/media/cpp/cache/images/5e/5e971016d8cfe7f9efc06e2e7265e5a089605057f86fdb6b71145bb047a144f4 and /dev/null differ diff --git a/packages/media/cpp/cache/images/5f/5fcb0581343c506fac42565ab9aecb72895c0fcc4b9ba5f2ee840f3729b3dc07 b/packages/media/cpp/cache/images/5f/5fcb0581343c506fac42565ab9aecb72895c0fcc4b9ba5f2ee840f3729b3dc07 deleted file mode 100644 index 680a080f..00000000 Binary files a/packages/media/cpp/cache/images/5f/5fcb0581343c506fac42565ab9aecb72895c0fcc4b9ba5f2ee840f3729b3dc07 and /dev/null differ diff --git a/packages/media/cpp/cache/images/5f/5fe56856f7edecf6ce6b1bb58e068bb1c1924ff1d5f89cf011c196720de26b7d b/packages/media/cpp/cache/images/5f/5fe56856f7edecf6ce6b1bb58e068bb1c1924ff1d5f89cf011c196720de26b7d deleted file mode 100644 index f80deda6..00000000 Binary files a/packages/media/cpp/cache/images/5f/5fe56856f7edecf6ce6b1bb58e068bb1c1924ff1d5f89cf011c196720de26b7d and /dev/null differ diff --git a/packages/media/cpp/cache/images/5f/5ff52e5ade108abd3a14d6858519c579ace5fe8d73d1e0acb9433f9c1fce88f5 b/packages/media/cpp/cache/images/5f/5ff52e5ade108abd3a14d6858519c579ace5fe8d73d1e0acb9433f9c1fce88f5 deleted file mode 100644 index 2d042e6a..00000000 Binary files a/packages/media/cpp/cache/images/5f/5ff52e5ade108abd3a14d6858519c579ace5fe8d73d1e0acb9433f9c1fce88f5 and /dev/null differ diff --git a/packages/media/cpp/cache/images/61/61684494d73a758918eb0f88bd32537f648f2133c3e75f5974dd0b44ae6e62ad b/packages/media/cpp/cache/images/61/61684494d73a758918eb0f88bd32537f648f2133c3e75f5974dd0b44ae6e62ad deleted file mode 100644 index 9074f885..00000000 Binary files a/packages/media/cpp/cache/images/61/61684494d73a758918eb0f88bd32537f648f2133c3e75f5974dd0b44ae6e62ad and /dev/null differ diff --git a/packages/media/cpp/cache/images/61/618acdbd1e1f26f2700506c71453e5674f299885dba374bc4e2a0b8e8a866178 b/packages/media/cpp/cache/images/61/618acdbd1e1f26f2700506c71453e5674f299885dba374bc4e2a0b8e8a866178 deleted file mode 100644 index d9e8763c..00000000 Binary files a/packages/media/cpp/cache/images/61/618acdbd1e1f26f2700506c71453e5674f299885dba374bc4e2a0b8e8a866178 and /dev/null differ diff --git a/packages/media/cpp/cache/images/62/62a2bb61446e85402d00a414eab58e297f471a3d19cf3f7b4a9ea2754f8884c2 b/packages/media/cpp/cache/images/62/62a2bb61446e85402d00a414eab58e297f471a3d19cf3f7b4a9ea2754f8884c2 deleted file mode 100644 index 56942fd9..00000000 Binary files a/packages/media/cpp/cache/images/62/62a2bb61446e85402d00a414eab58e297f471a3d19cf3f7b4a9ea2754f8884c2 and /dev/null differ diff --git a/packages/media/cpp/cache/images/64/64232d2095d05a5d0cdd14a9faa6dc4474e31b48d2584db5cee975106b231139 b/packages/media/cpp/cache/images/64/64232d2095d05a5d0cdd14a9faa6dc4474e31b48d2584db5cee975106b231139 deleted file mode 100644 index c9ce9268..00000000 Binary files a/packages/media/cpp/cache/images/64/64232d2095d05a5d0cdd14a9faa6dc4474e31b48d2584db5cee975106b231139 and /dev/null differ diff --git a/packages/media/cpp/cache/images/64/644209b27ed14944f32bd0aff8d19a99dc2d9bc843275436c801d0196c03e55c b/packages/media/cpp/cache/images/64/644209b27ed14944f32bd0aff8d19a99dc2d9bc843275436c801d0196c03e55c deleted file mode 100644 index 7673848e..00000000 Binary files a/packages/media/cpp/cache/images/64/644209b27ed14944f32bd0aff8d19a99dc2d9bc843275436c801d0196c03e55c and /dev/null differ diff --git a/packages/media/cpp/cache/images/64/645ba61b0b1692a81d04812d146c854196ccc5017ab5b066318939ceff6c5298 b/packages/media/cpp/cache/images/64/645ba61b0b1692a81d04812d146c854196ccc5017ab5b066318939ceff6c5298 deleted file mode 100644 index 56293f60..00000000 Binary files a/packages/media/cpp/cache/images/64/645ba61b0b1692a81d04812d146c854196ccc5017ab5b066318939ceff6c5298 and /dev/null differ diff --git a/packages/media/cpp/cache/images/65/654c9ca44f236650778f2276e24420790aa850bc875447ebacf7208642af4b4d b/packages/media/cpp/cache/images/65/654c9ca44f236650778f2276e24420790aa850bc875447ebacf7208642af4b4d deleted file mode 100644 index 675a184c..00000000 Binary files a/packages/media/cpp/cache/images/65/654c9ca44f236650778f2276e24420790aa850bc875447ebacf7208642af4b4d and /dev/null differ diff --git a/packages/media/cpp/cache/images/65/65845816e38f616496af8b97bfd379560cf047ca2421e01b805986c9b93ddd71 b/packages/media/cpp/cache/images/65/65845816e38f616496af8b97bfd379560cf047ca2421e01b805986c9b93ddd71 deleted file mode 100644 index 0f9e6403..00000000 Binary files a/packages/media/cpp/cache/images/65/65845816e38f616496af8b97bfd379560cf047ca2421e01b805986c9b93ddd71 and /dev/null differ diff --git a/packages/media/cpp/cache/images/66/66e3be10293f75adeac14a68d5ee3e3830696cdccab887ce3bbe20b23af8934c b/packages/media/cpp/cache/images/66/66e3be10293f75adeac14a68d5ee3e3830696cdccab887ce3bbe20b23af8934c deleted file mode 100644 index b71894c2..00000000 Binary files a/packages/media/cpp/cache/images/66/66e3be10293f75adeac14a68d5ee3e3830696cdccab887ce3bbe20b23af8934c and /dev/null differ diff --git a/packages/media/cpp/cache/images/67/6705811f069b5eb42a3100baf6597c6659ce8dd905df61e78afd907eaeaaa118 b/packages/media/cpp/cache/images/67/6705811f069b5eb42a3100baf6597c6659ce8dd905df61e78afd907eaeaaa118 deleted file mode 100644 index 9173f312..00000000 Binary files a/packages/media/cpp/cache/images/67/6705811f069b5eb42a3100baf6597c6659ce8dd905df61e78afd907eaeaaa118 and /dev/null differ diff --git a/packages/media/cpp/cache/images/67/67702dd9af19659b1c90b5576d12e136efad4865e73d6aaa7d3ab99f25bc06ec b/packages/media/cpp/cache/images/67/67702dd9af19659b1c90b5576d12e136efad4865e73d6aaa7d3ab99f25bc06ec deleted file mode 100644 index 5d15b77e..00000000 Binary files a/packages/media/cpp/cache/images/67/67702dd9af19659b1c90b5576d12e136efad4865e73d6aaa7d3ab99f25bc06ec and /dev/null differ diff --git a/packages/media/cpp/cache/images/67/6772e82e6a340623a27e1bf8bc7906a97ef3a74d9ad363037bdfe931e7ce9b46 b/packages/media/cpp/cache/images/67/6772e82e6a340623a27e1bf8bc7906a97ef3a74d9ad363037bdfe931e7ce9b46 deleted file mode 100644 index f7158a5f..00000000 Binary files a/packages/media/cpp/cache/images/67/6772e82e6a340623a27e1bf8bc7906a97ef3a74d9ad363037bdfe931e7ce9b46 and /dev/null differ diff --git a/packages/media/cpp/cache/images/68/68156ecb4d434e598f0c2f267f7a37c054a34889eb30f051c7e7706f825cc198 b/packages/media/cpp/cache/images/68/68156ecb4d434e598f0c2f267f7a37c054a34889eb30f051c7e7706f825cc198 deleted file mode 100644 index da5594f6..00000000 Binary files a/packages/media/cpp/cache/images/68/68156ecb4d434e598f0c2f267f7a37c054a34889eb30f051c7e7706f825cc198 and /dev/null differ diff --git a/packages/media/cpp/cache/images/6a/6aaccd59de946744224598ac5177597977046dc2d53a6d00403edbded0970d4b b/packages/media/cpp/cache/images/6a/6aaccd59de946744224598ac5177597977046dc2d53a6d00403edbded0970d4b deleted file mode 100644 index fc53f449..00000000 Binary files a/packages/media/cpp/cache/images/6a/6aaccd59de946744224598ac5177597977046dc2d53a6d00403edbded0970d4b and /dev/null differ diff --git a/packages/media/cpp/cache/images/6c/6c837fcef535a40c58718c22e2493601587a19326bd3637957cb77cf7b075a6b b/packages/media/cpp/cache/images/6c/6c837fcef535a40c58718c22e2493601587a19326bd3637957cb77cf7b075a6b deleted file mode 100644 index 721632de..00000000 Binary files a/packages/media/cpp/cache/images/6c/6c837fcef535a40c58718c22e2493601587a19326bd3637957cb77cf7b075a6b and /dev/null differ diff --git a/packages/media/cpp/cache/images/6c/6ca9582586d90270065a6cba20b4acb41802e9b9ef44bb39907bf00e0e55e2e5 b/packages/media/cpp/cache/images/6c/6ca9582586d90270065a6cba20b4acb41802e9b9ef44bb39907bf00e0e55e2e5 deleted file mode 100644 index 67d56516..00000000 Binary files a/packages/media/cpp/cache/images/6c/6ca9582586d90270065a6cba20b4acb41802e9b9ef44bb39907bf00e0e55e2e5 and /dev/null differ diff --git a/packages/media/cpp/cache/images/6c/6cf93a5b308010abc438e94dcbb45eac21c1af0e29db09cc6d03e52926a584c7 b/packages/media/cpp/cache/images/6c/6cf93a5b308010abc438e94dcbb45eac21c1af0e29db09cc6d03e52926a584c7 deleted file mode 100644 index 9365d413..00000000 Binary files a/packages/media/cpp/cache/images/6c/6cf93a5b308010abc438e94dcbb45eac21c1af0e29db09cc6d03e52926a584c7 and /dev/null differ diff --git a/packages/media/cpp/cache/images/6d/6d1c874550f4d69c6d3e11219caa80a582ed8b3c4300ab0e602638d755651e55 b/packages/media/cpp/cache/images/6d/6d1c874550f4d69c6d3e11219caa80a582ed8b3c4300ab0e602638d755651e55 deleted file mode 100644 index 7ff6c0b9..00000000 Binary files a/packages/media/cpp/cache/images/6d/6d1c874550f4d69c6d3e11219caa80a582ed8b3c4300ab0e602638d755651e55 and /dev/null differ diff --git a/packages/media/cpp/cache/images/6e/6e4f406cffb077d9f01cb2039e218743d737aa8c6c12234ff46dd7df185dfdc5 b/packages/media/cpp/cache/images/6e/6e4f406cffb077d9f01cb2039e218743d737aa8c6c12234ff46dd7df185dfdc5 deleted file mode 100644 index c5db398d..00000000 Binary files a/packages/media/cpp/cache/images/6e/6e4f406cffb077d9f01cb2039e218743d737aa8c6c12234ff46dd7df185dfdc5 and /dev/null differ diff --git a/packages/media/cpp/cache/images/6e/6e976aaf1758ec100c3753a8ccad499641ae3b2446304551324159be221edd35 b/packages/media/cpp/cache/images/6e/6e976aaf1758ec100c3753a8ccad499641ae3b2446304551324159be221edd35 deleted file mode 100644 index c36ccab3..00000000 Binary files a/packages/media/cpp/cache/images/6e/6e976aaf1758ec100c3753a8ccad499641ae3b2446304551324159be221edd35 and /dev/null differ diff --git a/packages/media/cpp/cache/images/6e/6eb751d1dfbcd23f11f1a16a4ba353cf5c27c7a4840ee9464378da6e0c8fbdb7 b/packages/media/cpp/cache/images/6e/6eb751d1dfbcd23f11f1a16a4ba353cf5c27c7a4840ee9464378da6e0c8fbdb7 deleted file mode 100644 index 2f4f3a00..00000000 Binary files a/packages/media/cpp/cache/images/6e/6eb751d1dfbcd23f11f1a16a4ba353cf5c27c7a4840ee9464378da6e0c8fbdb7 and /dev/null differ diff --git a/packages/media/cpp/cache/images/6e/6ec28344e8e4a3385437b9ffdd419c10bfc000fdd7a6e7ec88e23fbfde6395e4 b/packages/media/cpp/cache/images/6e/6ec28344e8e4a3385437b9ffdd419c10bfc000fdd7a6e7ec88e23fbfde6395e4 deleted file mode 100644 index 20ed30a9..00000000 Binary files a/packages/media/cpp/cache/images/6e/6ec28344e8e4a3385437b9ffdd419c10bfc000fdd7a6e7ec88e23fbfde6395e4 and /dev/null differ diff --git a/packages/media/cpp/cache/images/6f/6f5f731784825565d3b619b35bb4ed4a689093d59ad6d26ca72b3687a82efe01 b/packages/media/cpp/cache/images/6f/6f5f731784825565d3b619b35bb4ed4a689093d59ad6d26ca72b3687a82efe01 deleted file mode 100644 index 7c3129a1..00000000 Binary files a/packages/media/cpp/cache/images/6f/6f5f731784825565d3b619b35bb4ed4a689093d59ad6d26ca72b3687a82efe01 and /dev/null differ diff --git a/packages/media/cpp/cache/images/6f/6fba814a895f748626566c7b9be244ceb3e134198a947d259287446656fca8c6 b/packages/media/cpp/cache/images/6f/6fba814a895f748626566c7b9be244ceb3e134198a947d259287446656fca8c6 deleted file mode 100644 index cf512071..00000000 Binary files a/packages/media/cpp/cache/images/6f/6fba814a895f748626566c7b9be244ceb3e134198a947d259287446656fca8c6 and /dev/null differ diff --git a/packages/media/cpp/cache/images/71/71f6ee9c3858c27eed3fe5af166f5f0fcbe44f24fa5c7fe768b060fa142ead12 b/packages/media/cpp/cache/images/71/71f6ee9c3858c27eed3fe5af166f5f0fcbe44f24fa5c7fe768b060fa142ead12 deleted file mode 100644 index 84686ea7..00000000 Binary files a/packages/media/cpp/cache/images/71/71f6ee9c3858c27eed3fe5af166f5f0fcbe44f24fa5c7fe768b060fa142ead12 and /dev/null differ diff --git a/packages/media/cpp/cache/images/72/723557af8e2e041cc52d4141d238885188af82e72fd91c417ca01497a993af13 b/packages/media/cpp/cache/images/72/723557af8e2e041cc52d4141d238885188af82e72fd91c417ca01497a993af13 deleted file mode 100644 index 442c665c..00000000 Binary files a/packages/media/cpp/cache/images/72/723557af8e2e041cc52d4141d238885188af82e72fd91c417ca01497a993af13 and /dev/null differ diff --git a/packages/media/cpp/cache/images/73/7384478a9cb235c4b980a942bf43b3f0c1f27d1fb2dffbdb25e144dea959bfe7 b/packages/media/cpp/cache/images/73/7384478a9cb235c4b980a942bf43b3f0c1f27d1fb2dffbdb25e144dea959bfe7 deleted file mode 100644 index 089db3d0..00000000 Binary files a/packages/media/cpp/cache/images/73/7384478a9cb235c4b980a942bf43b3f0c1f27d1fb2dffbdb25e144dea959bfe7 and /dev/null differ diff --git a/packages/media/cpp/cache/images/76/7630a17aa7d155aa38ac6b198a26836cd98e9793dedbe15af16f1fda66124897 b/packages/media/cpp/cache/images/76/7630a17aa7d155aa38ac6b198a26836cd98e9793dedbe15af16f1fda66124897 deleted file mode 100644 index afb02cca..00000000 Binary files a/packages/media/cpp/cache/images/76/7630a17aa7d155aa38ac6b198a26836cd98e9793dedbe15af16f1fda66124897 and /dev/null differ diff --git a/packages/media/cpp/cache/images/76/76eeefc0ef6c4aadefc6811f89d7f6eb5feeb4108db0abe6d352ceb94919b676 b/packages/media/cpp/cache/images/76/76eeefc0ef6c4aadefc6811f89d7f6eb5feeb4108db0abe6d352ceb94919b676 deleted file mode 100644 index 76a87e64..00000000 Binary files a/packages/media/cpp/cache/images/76/76eeefc0ef6c4aadefc6811f89d7f6eb5feeb4108db0abe6d352ceb94919b676 and /dev/null differ diff --git a/packages/media/cpp/cache/images/77/77b63ee4797fafc28d11561e9babe7562855320068b8f1753f8a9ce669114bd4 b/packages/media/cpp/cache/images/77/77b63ee4797fafc28d11561e9babe7562855320068b8f1753f8a9ce669114bd4 deleted file mode 100644 index ef6a82e7..00000000 Binary files a/packages/media/cpp/cache/images/77/77b63ee4797fafc28d11561e9babe7562855320068b8f1753f8a9ce669114bd4 and /dev/null differ diff --git a/packages/media/cpp/cache/images/77/77e4424fa26698282e1f66f4ab0b23be31ba3bae89bb0bd82a5aaa7fca34234e b/packages/media/cpp/cache/images/77/77e4424fa26698282e1f66f4ab0b23be31ba3bae89bb0bd82a5aaa7fca34234e deleted file mode 100644 index 051b9ef4..00000000 Binary files a/packages/media/cpp/cache/images/77/77e4424fa26698282e1f66f4ab0b23be31ba3bae89bb0bd82a5aaa7fca34234e and /dev/null differ diff --git a/packages/media/cpp/cache/images/77/77e881bc0b67a5e0eacb54a3b06ff4f404adc7f7e2ee76b11e99a5a69084a6e4 b/packages/media/cpp/cache/images/77/77e881bc0b67a5e0eacb54a3b06ff4f404adc7f7e2ee76b11e99a5a69084a6e4 deleted file mode 100644 index 0b897f0e..00000000 Binary files a/packages/media/cpp/cache/images/77/77e881bc0b67a5e0eacb54a3b06ff4f404adc7f7e2ee76b11e99a5a69084a6e4 and /dev/null differ diff --git a/packages/media/cpp/cache/images/78/780ef7a02f96a3c840ef53ec1fad4b201c4c6c3dc673635684c30ffa73e42144 b/packages/media/cpp/cache/images/78/780ef7a02f96a3c840ef53ec1fad4b201c4c6c3dc673635684c30ffa73e42144 deleted file mode 100644 index 24368d67..00000000 Binary files a/packages/media/cpp/cache/images/78/780ef7a02f96a3c840ef53ec1fad4b201c4c6c3dc673635684c30ffa73e42144 and /dev/null differ diff --git a/packages/media/cpp/cache/images/78/783125c2733dc9f1831a921483fd7db4a7f9d378a3fb4d2afa8284d95d946d92 b/packages/media/cpp/cache/images/78/783125c2733dc9f1831a921483fd7db4a7f9d378a3fb4d2afa8284d95d946d92 deleted file mode 100644 index c9540412..00000000 Binary files a/packages/media/cpp/cache/images/78/783125c2733dc9f1831a921483fd7db4a7f9d378a3fb4d2afa8284d95d946d92 and /dev/null differ diff --git a/packages/media/cpp/cache/images/78/7887e7b0e835231baca53bac96526f5be94c47ddf8d63b4f28b2837c617899ae b/packages/media/cpp/cache/images/78/7887e7b0e835231baca53bac96526f5be94c47ddf8d63b4f28b2837c617899ae deleted file mode 100644 index cb700efb..00000000 Binary files a/packages/media/cpp/cache/images/78/7887e7b0e835231baca53bac96526f5be94c47ddf8d63b4f28b2837c617899ae and /dev/null differ diff --git a/packages/media/cpp/cache/images/78/78c95518ee5f40315c2fe15d9df99fc18cdb65b561e835961e36608e2023801a b/packages/media/cpp/cache/images/78/78c95518ee5f40315c2fe15d9df99fc18cdb65b561e835961e36608e2023801a deleted file mode 100644 index ab4284eb..00000000 Binary files a/packages/media/cpp/cache/images/78/78c95518ee5f40315c2fe15d9df99fc18cdb65b561e835961e36608e2023801a and /dev/null differ diff --git a/packages/media/cpp/cache/images/78/78dbdff2049dc87289371fad32a9256d305e9f9bc89052e4700ef9924810d45b b/packages/media/cpp/cache/images/78/78dbdff2049dc87289371fad32a9256d305e9f9bc89052e4700ef9924810d45b deleted file mode 100644 index 6b3574b0..00000000 Binary files a/packages/media/cpp/cache/images/78/78dbdff2049dc87289371fad32a9256d305e9f9bc89052e4700ef9924810d45b and /dev/null differ diff --git a/packages/media/cpp/cache/images/7a/7af61cef548b8a7e449f2ccb67b08c7e3f8e13a823b43671629412a124ae234b b/packages/media/cpp/cache/images/7a/7af61cef548b8a7e449f2ccb67b08c7e3f8e13a823b43671629412a124ae234b deleted file mode 100644 index 3a05a48d..00000000 Binary files a/packages/media/cpp/cache/images/7a/7af61cef548b8a7e449f2ccb67b08c7e3f8e13a823b43671629412a124ae234b and /dev/null differ diff --git a/packages/media/cpp/cache/images/7a/7af6a4fb1c9b43f45392e8b9479ef1f7f9befad56c2be9a4bc0c0b786749b926 b/packages/media/cpp/cache/images/7a/7af6a4fb1c9b43f45392e8b9479ef1f7f9befad56c2be9a4bc0c0b786749b926 deleted file mode 100644 index 45af3e72..00000000 Binary files a/packages/media/cpp/cache/images/7a/7af6a4fb1c9b43f45392e8b9479ef1f7f9befad56c2be9a4bc0c0b786749b926 and /dev/null differ diff --git a/packages/media/cpp/cache/images/7b/7b8d66d90b4505a3251434778d0a48b82610a9bfb08da4dd05cc149d5e727f67 b/packages/media/cpp/cache/images/7b/7b8d66d90b4505a3251434778d0a48b82610a9bfb08da4dd05cc149d5e727f67 deleted file mode 100644 index c4042593..00000000 Binary files a/packages/media/cpp/cache/images/7b/7b8d66d90b4505a3251434778d0a48b82610a9bfb08da4dd05cc149d5e727f67 and /dev/null differ diff --git a/packages/media/cpp/cache/images/7c/7c71574173c0af38a390bcdd6756f0b690ca3f723d884806254b074cafd04bb2 b/packages/media/cpp/cache/images/7c/7c71574173c0af38a390bcdd6756f0b690ca3f723d884806254b074cafd04bb2 deleted file mode 100644 index 01620867..00000000 Binary files a/packages/media/cpp/cache/images/7c/7c71574173c0af38a390bcdd6756f0b690ca3f723d884806254b074cafd04bb2 and /dev/null differ diff --git a/packages/media/cpp/cache/images/7c/7cb8e2bb8c731e7c3d35d02ef00acb62869ffd8c43dfe2bb0fe7457b14c87926 b/packages/media/cpp/cache/images/7c/7cb8e2bb8c731e7c3d35d02ef00acb62869ffd8c43dfe2bb0fe7457b14c87926 deleted file mode 100644 index 3fff93f8..00000000 Binary files a/packages/media/cpp/cache/images/7c/7cb8e2bb8c731e7c3d35d02ef00acb62869ffd8c43dfe2bb0fe7457b14c87926 and /dev/null differ diff --git a/packages/media/cpp/cache/images/80/80a04940e0cab11d8e566932a4b899531882ab3fb099e434e854cf3d46ec7a80 b/packages/media/cpp/cache/images/80/80a04940e0cab11d8e566932a4b899531882ab3fb099e434e854cf3d46ec7a80 deleted file mode 100644 index 7e7afea2..00000000 Binary files a/packages/media/cpp/cache/images/80/80a04940e0cab11d8e566932a4b899531882ab3fb099e434e854cf3d46ec7a80 and /dev/null differ diff --git a/packages/media/cpp/cache/images/81/817af1d2656b1fc8dcc0dce21f0b624eccef897c2f7468cb345c2aaf03428bb9 b/packages/media/cpp/cache/images/81/817af1d2656b1fc8dcc0dce21f0b624eccef897c2f7468cb345c2aaf03428bb9 deleted file mode 100644 index 6a06bd90..00000000 Binary files a/packages/media/cpp/cache/images/81/817af1d2656b1fc8dcc0dce21f0b624eccef897c2f7468cb345c2aaf03428bb9 and /dev/null differ diff --git a/packages/media/cpp/cache/images/81/818802e0d4885fec16a466de4f1a96e9a44732eed7915d09fc09f6d08e3bf8c0 b/packages/media/cpp/cache/images/81/818802e0d4885fec16a466de4f1a96e9a44732eed7915d09fc09f6d08e3bf8c0 deleted file mode 100644 index 053a50f5..00000000 Binary files a/packages/media/cpp/cache/images/81/818802e0d4885fec16a466de4f1a96e9a44732eed7915d09fc09f6d08e3bf8c0 and /dev/null differ diff --git a/packages/media/cpp/cache/images/81/81f418862e31b9a1348fa36d882bd1adf8f782b432efe2b2c92f6525f2d73400 b/packages/media/cpp/cache/images/81/81f418862e31b9a1348fa36d882bd1adf8f782b432efe2b2c92f6525f2d73400 deleted file mode 100644 index fd5a6530..00000000 Binary files a/packages/media/cpp/cache/images/81/81f418862e31b9a1348fa36d882bd1adf8f782b432efe2b2c92f6525f2d73400 and /dev/null differ diff --git a/packages/media/cpp/cache/images/84/843485dc38d59a502aa5da34e0544bdac5feacfab0f05f09faeeecdb280b2ede b/packages/media/cpp/cache/images/84/843485dc38d59a502aa5da34e0544bdac5feacfab0f05f09faeeecdb280b2ede deleted file mode 100644 index c448524e..00000000 Binary files a/packages/media/cpp/cache/images/84/843485dc38d59a502aa5da34e0544bdac5feacfab0f05f09faeeecdb280b2ede and /dev/null differ diff --git a/packages/media/cpp/cache/images/84/843aaf8101776dd90f6c4b44e0fedad0f1100500b633fbdeb94e57e03d3f3483 b/packages/media/cpp/cache/images/84/843aaf8101776dd90f6c4b44e0fedad0f1100500b633fbdeb94e57e03d3f3483 deleted file mode 100644 index b33dd681..00000000 Binary files a/packages/media/cpp/cache/images/84/843aaf8101776dd90f6c4b44e0fedad0f1100500b633fbdeb94e57e03d3f3483 and /dev/null differ diff --git a/packages/media/cpp/cache/images/84/845a84275214ff090d77fd2b43ca318146a935726a6e3c02f5516cc93806f8e0 b/packages/media/cpp/cache/images/84/845a84275214ff090d77fd2b43ca318146a935726a6e3c02f5516cc93806f8e0 deleted file mode 100644 index c5b7d318..00000000 Binary files a/packages/media/cpp/cache/images/84/845a84275214ff090d77fd2b43ca318146a935726a6e3c02f5516cc93806f8e0 and /dev/null differ diff --git a/packages/media/cpp/cache/images/84/84fcedd770759c516ba9bf75a554fbc9ee1cf2ed04569a7799e3b55e23d65770 b/packages/media/cpp/cache/images/84/84fcedd770759c516ba9bf75a554fbc9ee1cf2ed04569a7799e3b55e23d65770 deleted file mode 100644 index 222335a3..00000000 Binary files a/packages/media/cpp/cache/images/84/84fcedd770759c516ba9bf75a554fbc9ee1cf2ed04569a7799e3b55e23d65770 and /dev/null differ diff --git a/packages/media/cpp/cache/images/85/857564783e599f5ade269440a486890886b2d954cf9f1b0559bbeab110627b8d b/packages/media/cpp/cache/images/85/857564783e599f5ade269440a486890886b2d954cf9f1b0559bbeab110627b8d deleted file mode 100644 index b3e4de2e..00000000 Binary files a/packages/media/cpp/cache/images/85/857564783e599f5ade269440a486890886b2d954cf9f1b0559bbeab110627b8d and /dev/null differ diff --git a/packages/media/cpp/cache/images/86/86440c28cebb6a0a755fdd6c0cd1219b1d9b4eeb029e563abd95c0473c41412e b/packages/media/cpp/cache/images/86/86440c28cebb6a0a755fdd6c0cd1219b1d9b4eeb029e563abd95c0473c41412e deleted file mode 100644 index cbf152ca..00000000 Binary files a/packages/media/cpp/cache/images/86/86440c28cebb6a0a755fdd6c0cd1219b1d9b4eeb029e563abd95c0473c41412e and /dev/null differ diff --git a/packages/media/cpp/cache/images/87/87b742ac4ff1e818a8dccb72ea656043701463af8ce3855c2109c613ae6c845e b/packages/media/cpp/cache/images/87/87b742ac4ff1e818a8dccb72ea656043701463af8ce3855c2109c613ae6c845e deleted file mode 100644 index 7e96d48b..00000000 Binary files a/packages/media/cpp/cache/images/87/87b742ac4ff1e818a8dccb72ea656043701463af8ce3855c2109c613ae6c845e and /dev/null differ diff --git a/packages/media/cpp/cache/images/87/87b939398d1a5776618926561629cf1349c4fce00aef46c4e1411487cff4c8c3 b/packages/media/cpp/cache/images/87/87b939398d1a5776618926561629cf1349c4fce00aef46c4e1411487cff4c8c3 deleted file mode 100644 index 569b3983..00000000 Binary files a/packages/media/cpp/cache/images/87/87b939398d1a5776618926561629cf1349c4fce00aef46c4e1411487cff4c8c3 and /dev/null differ diff --git a/packages/media/cpp/cache/images/89/89216fcd47d0cade4084f152a64efdc8aede8c7e4cfe62c112bca1fac6a9c06f b/packages/media/cpp/cache/images/89/89216fcd47d0cade4084f152a64efdc8aede8c7e4cfe62c112bca1fac6a9c06f deleted file mode 100644 index ccef9e68..00000000 Binary files a/packages/media/cpp/cache/images/89/89216fcd47d0cade4084f152a64efdc8aede8c7e4cfe62c112bca1fac6a9c06f and /dev/null differ diff --git a/packages/media/cpp/cache/images/89/893f0326c98bedb7aa690c20a0642a1b54d94f9774524e80b27f3164be4a6b5a b/packages/media/cpp/cache/images/89/893f0326c98bedb7aa690c20a0642a1b54d94f9774524e80b27f3164be4a6b5a deleted file mode 100644 index 56202dcf..00000000 Binary files a/packages/media/cpp/cache/images/89/893f0326c98bedb7aa690c20a0642a1b54d94f9774524e80b27f3164be4a6b5a and /dev/null differ diff --git a/packages/media/cpp/cache/images/89/89f95695dced191406c1fae43176797c9183ce57e452bc4267adf4d5beb269e1 b/packages/media/cpp/cache/images/89/89f95695dced191406c1fae43176797c9183ce57e452bc4267adf4d5beb269e1 deleted file mode 100644 index 9f1e9eba..00000000 Binary files a/packages/media/cpp/cache/images/89/89f95695dced191406c1fae43176797c9183ce57e452bc4267adf4d5beb269e1 and /dev/null differ diff --git a/packages/media/cpp/cache/images/8a/8a434007506f4b0c57da4ead34e2634e14c54121ee63b49abdfe189e01910b02 b/packages/media/cpp/cache/images/8a/8a434007506f4b0c57da4ead34e2634e14c54121ee63b49abdfe189e01910b02 deleted file mode 100644 index 0f885b47..00000000 Binary files a/packages/media/cpp/cache/images/8a/8a434007506f4b0c57da4ead34e2634e14c54121ee63b49abdfe189e01910b02 and /dev/null differ diff --git a/packages/media/cpp/cache/images/8d/8de7a0d7d45e6741f83c8375dc624de6a87ee32c2967f6d407806ec36c92e84e b/packages/media/cpp/cache/images/8d/8de7a0d7d45e6741f83c8375dc624de6a87ee32c2967f6d407806ec36c92e84e deleted file mode 100644 index f193a47d..00000000 Binary files a/packages/media/cpp/cache/images/8d/8de7a0d7d45e6741f83c8375dc624de6a87ee32c2967f6d407806ec36c92e84e and /dev/null differ diff --git a/packages/media/cpp/cache/images/8e/8eaf55cc1f3d1845c6a4f58e1b49a825eb807e905aec8f40bff55dcfde4d73db b/packages/media/cpp/cache/images/8e/8eaf55cc1f3d1845c6a4f58e1b49a825eb807e905aec8f40bff55dcfde4d73db deleted file mode 100644 index e15bf84e..00000000 Binary files a/packages/media/cpp/cache/images/8e/8eaf55cc1f3d1845c6a4f58e1b49a825eb807e905aec8f40bff55dcfde4d73db and /dev/null differ diff --git a/packages/media/cpp/cache/images/8f/8f20d6aa49ef67ed79b69fe1fbadab78cbba9c1b20809ede09b6c919f5b47e07 b/packages/media/cpp/cache/images/8f/8f20d6aa49ef67ed79b69fe1fbadab78cbba9c1b20809ede09b6c919f5b47e07 deleted file mode 100644 index 601fbb04..00000000 Binary files a/packages/media/cpp/cache/images/8f/8f20d6aa49ef67ed79b69fe1fbadab78cbba9c1b20809ede09b6c919f5b47e07 and /dev/null differ diff --git a/packages/media/cpp/cache/images/8f/8f77b6a594a493ac5c25e6b9760f7e6016612c3776784de1a13211e13e5ff1d4 b/packages/media/cpp/cache/images/8f/8f77b6a594a493ac5c25e6b9760f7e6016612c3776784de1a13211e13e5ff1d4 deleted file mode 100644 index 7bd87a69..00000000 Binary files a/packages/media/cpp/cache/images/8f/8f77b6a594a493ac5c25e6b9760f7e6016612c3776784de1a13211e13e5ff1d4 and /dev/null differ diff --git a/packages/media/cpp/cache/images/90/905e729a9cb0304c285f8ddcd0913b044e38a648a6b728112b0ca8d4024e7095 b/packages/media/cpp/cache/images/90/905e729a9cb0304c285f8ddcd0913b044e38a648a6b728112b0ca8d4024e7095 deleted file mode 100644 index 7a6d866e..00000000 Binary files a/packages/media/cpp/cache/images/90/905e729a9cb0304c285f8ddcd0913b044e38a648a6b728112b0ca8d4024e7095 and /dev/null differ diff --git a/packages/media/cpp/cache/images/90/90de37059d751ce916bcd68247e4e58d2d773d8847ea2f168b5e2034109ff14b b/packages/media/cpp/cache/images/90/90de37059d751ce916bcd68247e4e58d2d773d8847ea2f168b5e2034109ff14b deleted file mode 100644 index b301e082..00000000 Binary files a/packages/media/cpp/cache/images/90/90de37059d751ce916bcd68247e4e58d2d773d8847ea2f168b5e2034109ff14b and /dev/null differ diff --git a/packages/media/cpp/cache/images/90/90fa398d0adde0d13d9e1c55e12c495b8ac18f603e2815fcaeb341661343e243 b/packages/media/cpp/cache/images/90/90fa398d0adde0d13d9e1c55e12c495b8ac18f603e2815fcaeb341661343e243 deleted file mode 100644 index 3789ef8f..00000000 Binary files a/packages/media/cpp/cache/images/90/90fa398d0adde0d13d9e1c55e12c495b8ac18f603e2815fcaeb341661343e243 and /dev/null differ diff --git a/packages/media/cpp/cache/images/91/9113025eb15638ce14eaab70a941bd498c98dd0f922af2b4877347c53907dcdd b/packages/media/cpp/cache/images/91/9113025eb15638ce14eaab70a941bd498c98dd0f922af2b4877347c53907dcdd deleted file mode 100644 index 0272c7ef..00000000 Binary files a/packages/media/cpp/cache/images/91/9113025eb15638ce14eaab70a941bd498c98dd0f922af2b4877347c53907dcdd and /dev/null differ diff --git a/packages/media/cpp/cache/images/91/9127e94de281cdb03db1f2d6331a00dd5c1e0a8a0203f6ff86391a68152f8979 b/packages/media/cpp/cache/images/91/9127e94de281cdb03db1f2d6331a00dd5c1e0a8a0203f6ff86391a68152f8979 deleted file mode 100644 index f23900ab..00000000 Binary files a/packages/media/cpp/cache/images/91/9127e94de281cdb03db1f2d6331a00dd5c1e0a8a0203f6ff86391a68152f8979 and /dev/null differ diff --git a/packages/media/cpp/cache/images/91/915bd2b06236a791fc545df27d26d3ac8a957c5700f734ed83e00876560346ce b/packages/media/cpp/cache/images/91/915bd2b06236a791fc545df27d26d3ac8a957c5700f734ed83e00876560346ce deleted file mode 100644 index dffc0c26..00000000 Binary files a/packages/media/cpp/cache/images/91/915bd2b06236a791fc545df27d26d3ac8a957c5700f734ed83e00876560346ce and /dev/null differ diff --git a/packages/media/cpp/cache/images/91/91e5f830a973c747142a0f9666d4a69e1df227f432877e0e12fe57d6a641b062 b/packages/media/cpp/cache/images/91/91e5f830a973c747142a0f9666d4a69e1df227f432877e0e12fe57d6a641b062 deleted file mode 100644 index 6b3574b0..00000000 Binary files a/packages/media/cpp/cache/images/91/91e5f830a973c747142a0f9666d4a69e1df227f432877e0e12fe57d6a641b062 and /dev/null differ diff --git a/packages/media/cpp/cache/images/92/92d9ba4bbffbdb10495c5c35b4aaf55b03ec136903361d6edc8f8d737e1e3016 b/packages/media/cpp/cache/images/92/92d9ba4bbffbdb10495c5c35b4aaf55b03ec136903361d6edc8f8d737e1e3016 deleted file mode 100644 index 59f576b0..00000000 Binary files a/packages/media/cpp/cache/images/92/92d9ba4bbffbdb10495c5c35b4aaf55b03ec136903361d6edc8f8d737e1e3016 and /dev/null differ diff --git a/packages/media/cpp/cache/images/93/93815a475fa041fa5d4068b97e3b66e68030654b9438518e9908417cb370535c b/packages/media/cpp/cache/images/93/93815a475fa041fa5d4068b97e3b66e68030654b9438518e9908417cb370535c deleted file mode 100644 index 93b2da89..00000000 Binary files a/packages/media/cpp/cache/images/93/93815a475fa041fa5d4068b97e3b66e68030654b9438518e9908417cb370535c and /dev/null differ diff --git a/packages/media/cpp/cache/images/95/954a53f8329e8c9955059e28a8e803686463034272fda074425e9f52b91d4653 b/packages/media/cpp/cache/images/95/954a53f8329e8c9955059e28a8e803686463034272fda074425e9f52b91d4653 deleted file mode 100644 index 4d67f58a..00000000 Binary files a/packages/media/cpp/cache/images/95/954a53f8329e8c9955059e28a8e803686463034272fda074425e9f52b91d4653 and /dev/null differ diff --git a/packages/media/cpp/cache/images/96/96258fe4d923c25bfd567d32ca5c6b2b3c2c51c3fbc98dc4c90e91d14a27b02e b/packages/media/cpp/cache/images/96/96258fe4d923c25bfd567d32ca5c6b2b3c2c51c3fbc98dc4c90e91d14a27b02e deleted file mode 100644 index f5e53c42..00000000 Binary files a/packages/media/cpp/cache/images/96/96258fe4d923c25bfd567d32ca5c6b2b3c2c51c3fbc98dc4c90e91d14a27b02e and /dev/null differ diff --git a/packages/media/cpp/cache/images/97/97f0cf70ff7a1476976bf4e19f41f0cbd3fc0a4d5549e7f0448a0ea2e5c4124d b/packages/media/cpp/cache/images/97/97f0cf70ff7a1476976bf4e19f41f0cbd3fc0a4d5549e7f0448a0ea2e5c4124d deleted file mode 100644 index 37efa8c8..00000000 Binary files a/packages/media/cpp/cache/images/97/97f0cf70ff7a1476976bf4e19f41f0cbd3fc0a4d5549e7f0448a0ea2e5c4124d and /dev/null differ diff --git a/packages/media/cpp/cache/images/98/9898fc102af93ad3f7ebdeabc0a896a9ac8e7fb7ba6134a05c02afa33ba902fa b/packages/media/cpp/cache/images/98/9898fc102af93ad3f7ebdeabc0a896a9ac8e7fb7ba6134a05c02afa33ba902fa deleted file mode 100644 index 0ef5effe..00000000 Binary files a/packages/media/cpp/cache/images/98/9898fc102af93ad3f7ebdeabc0a896a9ac8e7fb7ba6134a05c02afa33ba902fa and /dev/null differ diff --git a/packages/media/cpp/cache/images/9a/9a3ba41731f78dac133b11f3cc8c997688bd941aca3b6641b945aba0574ad5b9 b/packages/media/cpp/cache/images/9a/9a3ba41731f78dac133b11f3cc8c997688bd941aca3b6641b945aba0574ad5b9 deleted file mode 100644 index 6ab1970d..00000000 Binary files a/packages/media/cpp/cache/images/9a/9a3ba41731f78dac133b11f3cc8c997688bd941aca3b6641b945aba0574ad5b9 and /dev/null differ diff --git a/packages/media/cpp/cache/images/9a/9aea889ba333744215eefe7e0b6f763548a2cb229c571aee2a9d97111563b3ab b/packages/media/cpp/cache/images/9a/9aea889ba333744215eefe7e0b6f763548a2cb229c571aee2a9d97111563b3ab deleted file mode 100644 index f7d7eb02..00000000 Binary files a/packages/media/cpp/cache/images/9a/9aea889ba333744215eefe7e0b6f763548a2cb229c571aee2a9d97111563b3ab and /dev/null differ diff --git a/packages/media/cpp/cache/images/9a/9af549f85abf4c5b341b690f87d2416ec02280631f75fcab607c5a8e2f0215ac b/packages/media/cpp/cache/images/9a/9af549f85abf4c5b341b690f87d2416ec02280631f75fcab607c5a8e2f0215ac deleted file mode 100644 index 2c733c5f..00000000 Binary files a/packages/media/cpp/cache/images/9a/9af549f85abf4c5b341b690f87d2416ec02280631f75fcab607c5a8e2f0215ac and /dev/null differ diff --git a/packages/media/cpp/cache/images/9b/9bbf8b501d01234537c48e18ee22ecf9ebbd900e3b2c560efa8e8d9e82b26f13 b/packages/media/cpp/cache/images/9b/9bbf8b501d01234537c48e18ee22ecf9ebbd900e3b2c560efa8e8d9e82b26f13 deleted file mode 100644 index 1f60fac0..00000000 Binary files a/packages/media/cpp/cache/images/9b/9bbf8b501d01234537c48e18ee22ecf9ebbd900e3b2c560efa8e8d9e82b26f13 and /dev/null differ diff --git a/packages/media/cpp/cache/images/9d/9d2d0853bc65cd86e23b3d32ca36f3e64145280343fc511ea96d6f868ab9d51a b/packages/media/cpp/cache/images/9d/9d2d0853bc65cd86e23b3d32ca36f3e64145280343fc511ea96d6f868ab9d51a deleted file mode 100644 index 4a159408..00000000 Binary files a/packages/media/cpp/cache/images/9d/9d2d0853bc65cd86e23b3d32ca36f3e64145280343fc511ea96d6f868ab9d51a and /dev/null differ diff --git a/packages/media/cpp/cache/images/9d/9d335651dac8efc42b41cf81004250473334f7395fac0bfa6f638fd2f2c280de b/packages/media/cpp/cache/images/9d/9d335651dac8efc42b41cf81004250473334f7395fac0bfa6f638fd2f2c280de deleted file mode 100644 index 51fa012d..00000000 Binary files a/packages/media/cpp/cache/images/9d/9d335651dac8efc42b41cf81004250473334f7395fac0bfa6f638fd2f2c280de and /dev/null differ diff --git a/packages/media/cpp/cache/images/9d/9dd2b481ba8ae2c870fe516617cb0449a1b7ed74852ce9f7c857ed0d54e41796 b/packages/media/cpp/cache/images/9d/9dd2b481ba8ae2c870fe516617cb0449a1b7ed74852ce9f7c857ed0d54e41796 deleted file mode 100644 index 8915e543..00000000 Binary files a/packages/media/cpp/cache/images/9d/9dd2b481ba8ae2c870fe516617cb0449a1b7ed74852ce9f7c857ed0d54e41796 and /dev/null differ diff --git a/packages/media/cpp/cache/images/9d/9de3fec2aa13d6178c42912f89c8a5d3a6b496690d3013c7f9130f08c25bf90d b/packages/media/cpp/cache/images/9d/9de3fec2aa13d6178c42912f89c8a5d3a6b496690d3013c7f9130f08c25bf90d deleted file mode 100644 index 4f148e3a..00000000 Binary files a/packages/media/cpp/cache/images/9d/9de3fec2aa13d6178c42912f89c8a5d3a6b496690d3013c7f9130f08c25bf90d and /dev/null differ diff --git a/packages/media/cpp/cache/images/9e/9e8c27e96e3d641d8db59f9fc67e9f7208a0a82110080299438a7da82f6a9314 b/packages/media/cpp/cache/images/9e/9e8c27e96e3d641d8db59f9fc67e9f7208a0a82110080299438a7da82f6a9314 deleted file mode 100644 index 9f5f8262..00000000 Binary files a/packages/media/cpp/cache/images/9e/9e8c27e96e3d641d8db59f9fc67e9f7208a0a82110080299438a7da82f6a9314 and /dev/null differ diff --git a/packages/media/cpp/cache/images/9e/9ec818b65f787eacf652a5e4ba760ccc86ea9026a1875c973051cbadba6f5715 b/packages/media/cpp/cache/images/9e/9ec818b65f787eacf652a5e4ba760ccc86ea9026a1875c973051cbadba6f5715 deleted file mode 100644 index 2563e063..00000000 Binary files a/packages/media/cpp/cache/images/9e/9ec818b65f787eacf652a5e4ba760ccc86ea9026a1875c973051cbadba6f5715 and /dev/null differ diff --git a/packages/media/cpp/cache/images/9e/9ec8deb8589728133ec28ca97a5ae61aaa9b5abc2b483785e844755df9afe091 b/packages/media/cpp/cache/images/9e/9ec8deb8589728133ec28ca97a5ae61aaa9b5abc2b483785e844755df9afe091 deleted file mode 100644 index 1b202a22..00000000 Binary files a/packages/media/cpp/cache/images/9e/9ec8deb8589728133ec28ca97a5ae61aaa9b5abc2b483785e844755df9afe091 and /dev/null differ diff --git a/packages/media/cpp/cache/images/9e/9eeaf76a5e3896d6110b9f824905b833650f477d4a67c3b7091098106aaea2fb b/packages/media/cpp/cache/images/9e/9eeaf76a5e3896d6110b9f824905b833650f477d4a67c3b7091098106aaea2fb deleted file mode 100644 index 975ce196..00000000 Binary files a/packages/media/cpp/cache/images/9e/9eeaf76a5e3896d6110b9f824905b833650f477d4a67c3b7091098106aaea2fb and /dev/null differ diff --git a/packages/media/cpp/cache/images/9f/9f28d7d5b517db27dc3c439f5f3585166f08636e16a0d5975a210c157e1a71a5 b/packages/media/cpp/cache/images/9f/9f28d7d5b517db27dc3c439f5f3585166f08636e16a0d5975a210c157e1a71a5 deleted file mode 100644 index b47d970e..00000000 Binary files a/packages/media/cpp/cache/images/9f/9f28d7d5b517db27dc3c439f5f3585166f08636e16a0d5975a210c157e1a71a5 and /dev/null differ diff --git a/packages/media/cpp/cache/images/9f/9fdf958bc91eb27674b33bbb275b7462a890daf1234fa173488171e9bc73a7c0 b/packages/media/cpp/cache/images/9f/9fdf958bc91eb27674b33bbb275b7462a890daf1234fa173488171e9bc73a7c0 deleted file mode 100644 index c3b0b887..00000000 Binary files a/packages/media/cpp/cache/images/9f/9fdf958bc91eb27674b33bbb275b7462a890daf1234fa173488171e9bc73a7c0 and /dev/null differ diff --git a/packages/media/cpp/cache/images/a1/a180d2fc55231da14045512d2e9e0fe253355dbc87a0b5d917e9a44b66ac654d b/packages/media/cpp/cache/images/a1/a180d2fc55231da14045512d2e9e0fe253355dbc87a0b5d917e9a44b66ac654d deleted file mode 100644 index 58fe417e..00000000 Binary files a/packages/media/cpp/cache/images/a1/a180d2fc55231da14045512d2e9e0fe253355dbc87a0b5d917e9a44b66ac654d and /dev/null differ diff --git a/packages/media/cpp/cache/images/a1/a1c52ccad9cd211ace692a96b466f6dbfe47e1e3d1853f1c0ba2e162e1491331 b/packages/media/cpp/cache/images/a1/a1c52ccad9cd211ace692a96b466f6dbfe47e1e3d1853f1c0ba2e162e1491331 deleted file mode 100644 index 5800aeb4..00000000 Binary files a/packages/media/cpp/cache/images/a1/a1c52ccad9cd211ace692a96b466f6dbfe47e1e3d1853f1c0ba2e162e1491331 and /dev/null differ diff --git a/packages/media/cpp/cache/images/a2/a2afd47157c80d748cec7d579be615d064a5aa549efbb9c0b9cd742cf30908dc b/packages/media/cpp/cache/images/a2/a2afd47157c80d748cec7d579be615d064a5aa549efbb9c0b9cd742cf30908dc deleted file mode 100644 index 27c3a47f..00000000 Binary files a/packages/media/cpp/cache/images/a2/a2afd47157c80d748cec7d579be615d064a5aa549efbb9c0b9cd742cf30908dc and /dev/null differ diff --git a/packages/media/cpp/cache/images/a3/a33d19d8631fb74df72a74c37250506c9bce9f80480b1eac65f0e4d6ae926d8b b/packages/media/cpp/cache/images/a3/a33d19d8631fb74df72a74c37250506c9bce9f80480b1eac65f0e4d6ae926d8b deleted file mode 100644 index 976c8ec2..00000000 Binary files a/packages/media/cpp/cache/images/a3/a33d19d8631fb74df72a74c37250506c9bce9f80480b1eac65f0e4d6ae926d8b and /dev/null differ diff --git a/packages/media/cpp/cache/images/a3/a36d5935a2ff2f5348170d1bcc0c010c86af0ba50ed3d2fb74d8cc991d151827 b/packages/media/cpp/cache/images/a3/a36d5935a2ff2f5348170d1bcc0c010c86af0ba50ed3d2fb74d8cc991d151827 deleted file mode 100644 index b140205c..00000000 Binary files a/packages/media/cpp/cache/images/a3/a36d5935a2ff2f5348170d1bcc0c010c86af0ba50ed3d2fb74d8cc991d151827 and /dev/null differ diff --git a/packages/media/cpp/cache/images/a4/a40a3eee7a92dad8d644dcc1ff4033cc5fb84fd7daa98679700bed1a92737eeb b/packages/media/cpp/cache/images/a4/a40a3eee7a92dad8d644dcc1ff4033cc5fb84fd7daa98679700bed1a92737eeb deleted file mode 100644 index 608772a5..00000000 Binary files a/packages/media/cpp/cache/images/a4/a40a3eee7a92dad8d644dcc1ff4033cc5fb84fd7daa98679700bed1a92737eeb and /dev/null differ diff --git a/packages/media/cpp/cache/images/a5/a54cc19a93971391611a2767650e5901b3f6dc15d31e8cb9da294738713c57fe b/packages/media/cpp/cache/images/a5/a54cc19a93971391611a2767650e5901b3f6dc15d31e8cb9da294738713c57fe deleted file mode 100644 index 3d06297f..00000000 Binary files a/packages/media/cpp/cache/images/a5/a54cc19a93971391611a2767650e5901b3f6dc15d31e8cb9da294738713c57fe and /dev/null differ diff --git a/packages/media/cpp/cache/images/a8/a8b3b2fe1b952ec4f8672234ad7b331acace1300fa5feab94af3796efbc456a3 b/packages/media/cpp/cache/images/a8/a8b3b2fe1b952ec4f8672234ad7b331acace1300fa5feab94af3796efbc456a3 deleted file mode 100644 index c5664e13..00000000 Binary files a/packages/media/cpp/cache/images/a8/a8b3b2fe1b952ec4f8672234ad7b331acace1300fa5feab94af3796efbc456a3 and /dev/null differ diff --git a/packages/media/cpp/cache/images/ab/abde5662d57d8a764377af4c001fde61c7c6a42a9e6532628a7dee45f471fe09 b/packages/media/cpp/cache/images/ab/abde5662d57d8a764377af4c001fde61c7c6a42a9e6532628a7dee45f471fe09 deleted file mode 100644 index 0f91da9d..00000000 Binary files a/packages/media/cpp/cache/images/ab/abde5662d57d8a764377af4c001fde61c7c6a42a9e6532628a7dee45f471fe09 and /dev/null differ diff --git a/packages/media/cpp/cache/images/ad/ad38c20cd55a53138c533a81d14e255d2158fac96aaeeafd56f9dc91e484e986 b/packages/media/cpp/cache/images/ad/ad38c20cd55a53138c533a81d14e255d2158fac96aaeeafd56f9dc91e484e986 deleted file mode 100644 index 84f6d726..00000000 Binary files a/packages/media/cpp/cache/images/ad/ad38c20cd55a53138c533a81d14e255d2158fac96aaeeafd56f9dc91e484e986 and /dev/null differ diff --git a/packages/media/cpp/cache/images/b0/b05672ce368404b34c08354c2214737d0c8ae79623dc452957b9ba3b93650775 b/packages/media/cpp/cache/images/b0/b05672ce368404b34c08354c2214737d0c8ae79623dc452957b9ba3b93650775 deleted file mode 100644 index 660b8b86..00000000 Binary files a/packages/media/cpp/cache/images/b0/b05672ce368404b34c08354c2214737d0c8ae79623dc452957b9ba3b93650775 and /dev/null differ diff --git a/packages/media/cpp/cache/images/b1/b182895f57e6ad8084a0514516b6e5bedb5fe4f532cd8f118470005f62b39d1c b/packages/media/cpp/cache/images/b1/b182895f57e6ad8084a0514516b6e5bedb5fe4f532cd8f118470005f62b39d1c deleted file mode 100644 index f2ca8789..00000000 Binary files a/packages/media/cpp/cache/images/b1/b182895f57e6ad8084a0514516b6e5bedb5fe4f532cd8f118470005f62b39d1c and /dev/null differ diff --git a/packages/media/cpp/cache/images/b2/b219684abfd7a324ef6c383443876070b525fcdc33d933dbf01d6a6935e7186b b/packages/media/cpp/cache/images/b2/b219684abfd7a324ef6c383443876070b525fcdc33d933dbf01d6a6935e7186b deleted file mode 100644 index 0d6d169e..00000000 Binary files a/packages/media/cpp/cache/images/b2/b219684abfd7a324ef6c383443876070b525fcdc33d933dbf01d6a6935e7186b and /dev/null differ diff --git a/packages/media/cpp/cache/images/b2/b2a5b653e440315440e7650a79b409c9007fc57793458349da84cb52f7f3e950 b/packages/media/cpp/cache/images/b2/b2a5b653e440315440e7650a79b409c9007fc57793458349da84cb52f7f3e950 deleted file mode 100644 index 758537a8..00000000 Binary files a/packages/media/cpp/cache/images/b2/b2a5b653e440315440e7650a79b409c9007fc57793458349da84cb52f7f3e950 and /dev/null differ diff --git a/packages/media/cpp/cache/images/b3/b3b6afd5a3d58020cf50a238c900ec3259f6ae1aa44449e7ab17f910208f33a3 b/packages/media/cpp/cache/images/b3/b3b6afd5a3d58020cf50a238c900ec3259f6ae1aa44449e7ab17f910208f33a3 deleted file mode 100644 index c5f0399c..00000000 Binary files a/packages/media/cpp/cache/images/b3/b3b6afd5a3d58020cf50a238c900ec3259f6ae1aa44449e7ab17f910208f33a3 and /dev/null differ diff --git a/packages/media/cpp/cache/images/b3/b3d8939c6a04fd1b52e89ea303655daec5899d2ca404686d23a0b202ff3b9c1f b/packages/media/cpp/cache/images/b3/b3d8939c6a04fd1b52e89ea303655daec5899d2ca404686d23a0b202ff3b9c1f deleted file mode 100644 index 10899e36..00000000 Binary files a/packages/media/cpp/cache/images/b3/b3d8939c6a04fd1b52e89ea303655daec5899d2ca404686d23a0b202ff3b9c1f and /dev/null differ diff --git a/packages/media/cpp/cache/images/b4/b41de9722bddea1c4a51a06ca0c3ac8947bd108288b4d4d9dd04a35eae66d8e0 b/packages/media/cpp/cache/images/b4/b41de9722bddea1c4a51a06ca0c3ac8947bd108288b4d4d9dd04a35eae66d8e0 deleted file mode 100644 index 0aba51e3..00000000 Binary files a/packages/media/cpp/cache/images/b4/b41de9722bddea1c4a51a06ca0c3ac8947bd108288b4d4d9dd04a35eae66d8e0 and /dev/null differ diff --git a/packages/media/cpp/cache/images/b4/b477b121eac1de8e302e3507fc38fe7d4f61eb82234f95a585daac7836bd7083 b/packages/media/cpp/cache/images/b4/b477b121eac1de8e302e3507fc38fe7d4f61eb82234f95a585daac7836bd7083 deleted file mode 100644 index 9ce4247b..00000000 Binary files a/packages/media/cpp/cache/images/b4/b477b121eac1de8e302e3507fc38fe7d4f61eb82234f95a585daac7836bd7083 and /dev/null differ diff --git a/packages/media/cpp/cache/images/b4/b4fa197513eb35d600e12d637c014a1021fd839a062f0e98150789e01847abe5 b/packages/media/cpp/cache/images/b4/b4fa197513eb35d600e12d637c014a1021fd839a062f0e98150789e01847abe5 deleted file mode 100644 index ed4e09b0..00000000 Binary files a/packages/media/cpp/cache/images/b4/b4fa197513eb35d600e12d637c014a1021fd839a062f0e98150789e01847abe5 and /dev/null differ diff --git a/packages/media/cpp/cache/images/b5/b50201430c4d4e522fb94acb76538198aacc68ebd1b0506e5e8347a53e4d6c5d b/packages/media/cpp/cache/images/b5/b50201430c4d4e522fb94acb76538198aacc68ebd1b0506e5e8347a53e4d6c5d deleted file mode 100644 index 703b11b7..00000000 Binary files a/packages/media/cpp/cache/images/b5/b50201430c4d4e522fb94acb76538198aacc68ebd1b0506e5e8347a53e4d6c5d and /dev/null differ diff --git a/packages/media/cpp/cache/images/b5/b5f553d6ed2ec29824cf378d036f8e547f3eba27bae33ff50127a06481530dcf b/packages/media/cpp/cache/images/b5/b5f553d6ed2ec29824cf378d036f8e547f3eba27bae33ff50127a06481530dcf deleted file mode 100644 index ab36f753..00000000 Binary files a/packages/media/cpp/cache/images/b5/b5f553d6ed2ec29824cf378d036f8e547f3eba27bae33ff50127a06481530dcf and /dev/null differ diff --git a/packages/media/cpp/cache/images/b7/b72880e434380adacf851cc89d8df06d71c2a08ec180a0adbd8bff5d0948ca3d b/packages/media/cpp/cache/images/b7/b72880e434380adacf851cc89d8df06d71c2a08ec180a0adbd8bff5d0948ca3d deleted file mode 100644 index f58d1569..00000000 Binary files a/packages/media/cpp/cache/images/b7/b72880e434380adacf851cc89d8df06d71c2a08ec180a0adbd8bff5d0948ca3d and /dev/null differ diff --git a/packages/media/cpp/cache/images/b8/b80a4b4a1e9bd72cfd376a92aa178460ce7ae855529a7879e01c816e9c8648fc b/packages/media/cpp/cache/images/b8/b80a4b4a1e9bd72cfd376a92aa178460ce7ae855529a7879e01c816e9c8648fc deleted file mode 100644 index 3b80ae2f..00000000 Binary files a/packages/media/cpp/cache/images/b8/b80a4b4a1e9bd72cfd376a92aa178460ce7ae855529a7879e01c816e9c8648fc and /dev/null differ diff --git a/packages/media/cpp/cache/images/b8/b8e8b468af9246e523cae9ba21a93b6e1710e8df7510ea93e1424ce9a846c434 b/packages/media/cpp/cache/images/b8/b8e8b468af9246e523cae9ba21a93b6e1710e8df7510ea93e1424ce9a846c434 deleted file mode 100644 index c8005388..00000000 Binary files a/packages/media/cpp/cache/images/b8/b8e8b468af9246e523cae9ba21a93b6e1710e8df7510ea93e1424ce9a846c434 and /dev/null differ diff --git a/packages/media/cpp/cache/images/b9/b90491f5f9651040f8d1e33ed72db4863ca942e783d10504263e65c494c338a0 b/packages/media/cpp/cache/images/b9/b90491f5f9651040f8d1e33ed72db4863ca942e783d10504263e65c494c338a0 deleted file mode 100644 index 130a1235..00000000 Binary files a/packages/media/cpp/cache/images/b9/b90491f5f9651040f8d1e33ed72db4863ca942e783d10504263e65c494c338a0 and /dev/null differ diff --git a/packages/media/cpp/cache/images/ba/ba4622fe30ee44c4ad1aa5f26d7265c01c186739646277f8868577e2459fb7c1 b/packages/media/cpp/cache/images/ba/ba4622fe30ee44c4ad1aa5f26d7265c01c186739646277f8868577e2459fb7c1 deleted file mode 100644 index d9e8763c..00000000 Binary files a/packages/media/cpp/cache/images/ba/ba4622fe30ee44c4ad1aa5f26d7265c01c186739646277f8868577e2459fb7c1 and /dev/null differ diff --git a/packages/media/cpp/cache/images/ba/ba666e2d27f56ccb0d27fdeeb71bdb5cd864be0a8c7e334507cd7fe52deb3f88 b/packages/media/cpp/cache/images/ba/ba666e2d27f56ccb0d27fdeeb71bdb5cd864be0a8c7e334507cd7fe52deb3f88 deleted file mode 100644 index 044d1a9f..00000000 Binary files a/packages/media/cpp/cache/images/ba/ba666e2d27f56ccb0d27fdeeb71bdb5cd864be0a8c7e334507cd7fe52deb3f88 and /dev/null differ diff --git a/packages/media/cpp/cache/images/ba/bad3e47c3e1d03d14c0a65a3564ce9b84fb40f57d7267d3f9646062ca9c699ec b/packages/media/cpp/cache/images/ba/bad3e47c3e1d03d14c0a65a3564ce9b84fb40f57d7267d3f9646062ca9c699ec deleted file mode 100644 index 30a64a93..00000000 Binary files a/packages/media/cpp/cache/images/ba/bad3e47c3e1d03d14c0a65a3564ce9b84fb40f57d7267d3f9646062ca9c699ec and /dev/null differ diff --git a/packages/media/cpp/cache/images/ba/bade3aaef17f060eb3457e604a0be5d531851389647523be70aa1cdaefd5db3c b/packages/media/cpp/cache/images/ba/bade3aaef17f060eb3457e604a0be5d531851389647523be70aa1cdaefd5db3c deleted file mode 100644 index 5fcf8085..00000000 Binary files a/packages/media/cpp/cache/images/ba/bade3aaef17f060eb3457e604a0be5d531851389647523be70aa1cdaefd5db3c and /dev/null differ diff --git a/packages/media/cpp/cache/images/ba/bae6de1dd0b811a66c324ba5b007919d67ff8a6ac8be82c2d60876fd163b5039 b/packages/media/cpp/cache/images/ba/bae6de1dd0b811a66c324ba5b007919d67ff8a6ac8be82c2d60876fd163b5039 deleted file mode 100644 index e31b4fd2..00000000 Binary files a/packages/media/cpp/cache/images/ba/bae6de1dd0b811a66c324ba5b007919d67ff8a6ac8be82c2d60876fd163b5039 and /dev/null differ diff --git a/packages/media/cpp/cache/images/bb/bb28b60a2206b8a57e7b7bdc0309f5bd4e2959da5c2f5e19b5901d7ad7634058 b/packages/media/cpp/cache/images/bb/bb28b60a2206b8a57e7b7bdc0309f5bd4e2959da5c2f5e19b5901d7ad7634058 deleted file mode 100644 index 652f1d37..00000000 Binary files a/packages/media/cpp/cache/images/bb/bb28b60a2206b8a57e7b7bdc0309f5bd4e2959da5c2f5e19b5901d7ad7634058 and /dev/null differ diff --git a/packages/media/cpp/cache/images/bd/bdf2aa055b6289a588e051e49e7282aa63ec9ad2ad742dc290f5215fa18d9917 b/packages/media/cpp/cache/images/bd/bdf2aa055b6289a588e051e49e7282aa63ec9ad2ad742dc290f5215fa18d9917 deleted file mode 100644 index 7c7f5ac1..00000000 Binary files a/packages/media/cpp/cache/images/bd/bdf2aa055b6289a588e051e49e7282aa63ec9ad2ad742dc290f5215fa18d9917 and /dev/null differ diff --git a/packages/media/cpp/cache/images/be/be9b3cf2604658b2649c2e4be0f83011e43eced61d64c7deb3c5512b165766cf b/packages/media/cpp/cache/images/be/be9b3cf2604658b2649c2e4be0f83011e43eced61d64c7deb3c5512b165766cf deleted file mode 100644 index 976333bb..00000000 Binary files a/packages/media/cpp/cache/images/be/be9b3cf2604658b2649c2e4be0f83011e43eced61d64c7deb3c5512b165766cf and /dev/null differ diff --git a/packages/media/cpp/cache/images/be/bee6589a2401a464042844550b961bb03a5cf8595a697a18920c0bcb373e708c b/packages/media/cpp/cache/images/be/bee6589a2401a464042844550b961bb03a5cf8595a697a18920c0bcb373e708c deleted file mode 100644 index ae48a021..00000000 Binary files a/packages/media/cpp/cache/images/be/bee6589a2401a464042844550b961bb03a5cf8595a697a18920c0bcb373e708c and /dev/null differ diff --git a/packages/media/cpp/cache/images/bf/bf79e85048129b7739b41127667fd1ce5194eaa0a44bf24b2932bbd46eb77987 b/packages/media/cpp/cache/images/bf/bf79e85048129b7739b41127667fd1ce5194eaa0a44bf24b2932bbd46eb77987 deleted file mode 100644 index aa8f1898..00000000 Binary files a/packages/media/cpp/cache/images/bf/bf79e85048129b7739b41127667fd1ce5194eaa0a44bf24b2932bbd46eb77987 and /dev/null differ diff --git a/packages/media/cpp/cache/images/bf/bfd522d0e6b01e7ad2705e8eceed2556728aacbbd92a0e2a986b45e6e92c683c b/packages/media/cpp/cache/images/bf/bfd522d0e6b01e7ad2705e8eceed2556728aacbbd92a0e2a986b45e6e92c683c deleted file mode 100644 index e8328c80..00000000 Binary files a/packages/media/cpp/cache/images/bf/bfd522d0e6b01e7ad2705e8eceed2556728aacbbd92a0e2a986b45e6e92c683c and /dev/null differ diff --git a/packages/media/cpp/cache/images/c0/c0feb9f2006e450d7c9df9be5f70ff1042629dbe75f5127fd723943059e238a9 b/packages/media/cpp/cache/images/c0/c0feb9f2006e450d7c9df9be5f70ff1042629dbe75f5127fd723943059e238a9 deleted file mode 100644 index 00ebc19f..00000000 Binary files a/packages/media/cpp/cache/images/c0/c0feb9f2006e450d7c9df9be5f70ff1042629dbe75f5127fd723943059e238a9 and /dev/null differ diff --git a/packages/media/cpp/cache/images/c2/c2949ec661d2a36cbf42deb1d4a68851f72b448a9f3bb6a2fca8d75a5b0be3f0 b/packages/media/cpp/cache/images/c2/c2949ec661d2a36cbf42deb1d4a68851f72b448a9f3bb6a2fca8d75a5b0be3f0 deleted file mode 100644 index 0036b09e..00000000 Binary files a/packages/media/cpp/cache/images/c2/c2949ec661d2a36cbf42deb1d4a68851f72b448a9f3bb6a2fca8d75a5b0be3f0 and /dev/null differ diff --git a/packages/media/cpp/cache/images/c3/c3412b94309ff17230fa271d0c5c906b1e4043aa4d8dd57c22e7f070812b3ae4 b/packages/media/cpp/cache/images/c3/c3412b94309ff17230fa271d0c5c906b1e4043aa4d8dd57c22e7f070812b3ae4 deleted file mode 100644 index b863a88f..00000000 Binary files a/packages/media/cpp/cache/images/c3/c3412b94309ff17230fa271d0c5c906b1e4043aa4d8dd57c22e7f070812b3ae4 and /dev/null differ diff --git a/packages/media/cpp/cache/images/c3/c3eb486869520c62350f66f975f7dc7cd3587294d7025bc945f778f7040969c8 b/packages/media/cpp/cache/images/c3/c3eb486869520c62350f66f975f7dc7cd3587294d7025bc945f778f7040969c8 deleted file mode 100644 index a001062d..00000000 Binary files a/packages/media/cpp/cache/images/c3/c3eb486869520c62350f66f975f7dc7cd3587294d7025bc945f778f7040969c8 and /dev/null differ diff --git a/packages/media/cpp/cache/images/c5/c529661852eb6f80c2325bf96cec935ee828967f069527a1524013836d5c0c4b b/packages/media/cpp/cache/images/c5/c529661852eb6f80c2325bf96cec935ee828967f069527a1524013836d5c0c4b deleted file mode 100644 index dc77fe6f..00000000 Binary files a/packages/media/cpp/cache/images/c5/c529661852eb6f80c2325bf96cec935ee828967f069527a1524013836d5c0c4b and /dev/null differ diff --git a/packages/media/cpp/cache/images/c5/c549ffc9899b27000ffa709e3f5d39816a839b50f9b630a2d4150a1221aef22a b/packages/media/cpp/cache/images/c5/c549ffc9899b27000ffa709e3f5d39816a839b50f9b630a2d4150a1221aef22a deleted file mode 100644 index c4bf1106..00000000 Binary files a/packages/media/cpp/cache/images/c5/c549ffc9899b27000ffa709e3f5d39816a839b50f9b630a2d4150a1221aef22a and /dev/null differ diff --git a/packages/media/cpp/cache/images/c6/c692cead0e3e7dcb448e449b89c7b92ded62b31b6c8bfe22856210678c32340a b/packages/media/cpp/cache/images/c6/c692cead0e3e7dcb448e449b89c7b92ded62b31b6c8bfe22856210678c32340a deleted file mode 100644 index 0da08e88..00000000 Binary files a/packages/media/cpp/cache/images/c6/c692cead0e3e7dcb448e449b89c7b92ded62b31b6c8bfe22856210678c32340a and /dev/null differ diff --git a/packages/media/cpp/cache/images/c8/c8f29bf23e102cfb3e06b49ef3bab3af4af63ccd5f6ab772cd88fbab461a4b32 b/packages/media/cpp/cache/images/c8/c8f29bf23e102cfb3e06b49ef3bab3af4af63ccd5f6ab772cd88fbab461a4b32 deleted file mode 100644 index 1ea68578..00000000 Binary files a/packages/media/cpp/cache/images/c8/c8f29bf23e102cfb3e06b49ef3bab3af4af63ccd5f6ab772cd88fbab461a4b32 and /dev/null differ diff --git a/packages/media/cpp/cache/images/c9/c94f77b1e128ae385170606ecbe6f157c2758c935f4ce27cbaf438a45a83096a b/packages/media/cpp/cache/images/c9/c94f77b1e128ae385170606ecbe6f157c2758c935f4ce27cbaf438a45a83096a deleted file mode 100644 index d651dd27..00000000 Binary files a/packages/media/cpp/cache/images/c9/c94f77b1e128ae385170606ecbe6f157c2758c935f4ce27cbaf438a45a83096a and /dev/null differ diff --git a/packages/media/cpp/cache/images/ca/ca0bd0fdddf009068b60c3147f36122165287d4641c1013f0b1ba517a38093b4 b/packages/media/cpp/cache/images/ca/ca0bd0fdddf009068b60c3147f36122165287d4641c1013f0b1ba517a38093b4 deleted file mode 100644 index 83b2b0f1..00000000 Binary files a/packages/media/cpp/cache/images/ca/ca0bd0fdddf009068b60c3147f36122165287d4641c1013f0b1ba517a38093b4 and /dev/null differ diff --git a/packages/media/cpp/cache/images/ce/ce6948cf3eb8712f68b02926acbd009336af0eab72132ea8615112d287d8bc96 b/packages/media/cpp/cache/images/ce/ce6948cf3eb8712f68b02926acbd009336af0eab72132ea8615112d287d8bc96 deleted file mode 100644 index c2044c9a..00000000 Binary files a/packages/media/cpp/cache/images/ce/ce6948cf3eb8712f68b02926acbd009336af0eab72132ea8615112d287d8bc96 and /dev/null differ diff --git a/packages/media/cpp/cache/images/ce/ced7e7485dfaa9e391549a722112ffef44a55e3837c400281164744d0dc08448 b/packages/media/cpp/cache/images/ce/ced7e7485dfaa9e391549a722112ffef44a55e3837c400281164744d0dc08448 deleted file mode 100644 index 83f3d84c..00000000 Binary files a/packages/media/cpp/cache/images/ce/ced7e7485dfaa9e391549a722112ffef44a55e3837c400281164744d0dc08448 and /dev/null differ diff --git a/packages/media/cpp/cache/images/cf/cf6e83fc9c2042c58266ddcb5959f51bafbdbf09b9108c23a4048c1adccc1db8 b/packages/media/cpp/cache/images/cf/cf6e83fc9c2042c58266ddcb5959f51bafbdbf09b9108c23a4048c1adccc1db8 deleted file mode 100644 index bdfbf01c..00000000 Binary files a/packages/media/cpp/cache/images/cf/cf6e83fc9c2042c58266ddcb5959f51bafbdbf09b9108c23a4048c1adccc1db8 and /dev/null differ diff --git a/packages/media/cpp/cache/images/d1/d146942a424b786940a98b1c85624f4fa2dda7e206db5a4c5b0b63e76c45a96e b/packages/media/cpp/cache/images/d1/d146942a424b786940a98b1c85624f4fa2dda7e206db5a4c5b0b63e76c45a96e deleted file mode 100644 index e0d8649a..00000000 Binary files a/packages/media/cpp/cache/images/d1/d146942a424b786940a98b1c85624f4fa2dda7e206db5a4c5b0b63e76c45a96e and /dev/null differ diff --git a/packages/media/cpp/cache/images/d1/d1e670c79704468e74c3d43932880d86cf85db5c44884ffb39d1825ee29bb6ae b/packages/media/cpp/cache/images/d1/d1e670c79704468e74c3d43932880d86cf85db5c44884ffb39d1825ee29bb6ae deleted file mode 100644 index 778cb06a..00000000 Binary files a/packages/media/cpp/cache/images/d1/d1e670c79704468e74c3d43932880d86cf85db5c44884ffb39d1825ee29bb6ae and /dev/null differ diff --git a/packages/media/cpp/cache/images/d2/d2ee0dd029c4fe4f2bfb817df586c1a2101a4d127cebb0cf4b0dbb45a38295bf b/packages/media/cpp/cache/images/d2/d2ee0dd029c4fe4f2bfb817df586c1a2101a4d127cebb0cf4b0dbb45a38295bf deleted file mode 100644 index 17534078..00000000 Binary files a/packages/media/cpp/cache/images/d2/d2ee0dd029c4fe4f2bfb817df586c1a2101a4d127cebb0cf4b0dbb45a38295bf and /dev/null differ diff --git a/packages/media/cpp/cache/images/d4/d48226052ebd847356a0b0f91e11a407c5bc6b12561189b00f60c85b7368d5d5 b/packages/media/cpp/cache/images/d4/d48226052ebd847356a0b0f91e11a407c5bc6b12561189b00f60c85b7368d5d5 deleted file mode 100644 index 3db0345c..00000000 Binary files a/packages/media/cpp/cache/images/d4/d48226052ebd847356a0b0f91e11a407c5bc6b12561189b00f60c85b7368d5d5 and /dev/null differ diff --git a/packages/media/cpp/cache/images/d5/d56b456e2067518a0a8fe034499383c2e471454cc8443956b293905ecff8e205 b/packages/media/cpp/cache/images/d5/d56b456e2067518a0a8fe034499383c2e471454cc8443956b293905ecff8e205 deleted file mode 100644 index 56293f60..00000000 Binary files a/packages/media/cpp/cache/images/d5/d56b456e2067518a0a8fe034499383c2e471454cc8443956b293905ecff8e205 and /dev/null differ diff --git a/packages/media/cpp/cache/images/d5/d5fdad9be3864f4082717d1c00c74ddcc1dab9da3e438134b88bddfdb8a2b280 b/packages/media/cpp/cache/images/d5/d5fdad9be3864f4082717d1c00c74ddcc1dab9da3e438134b88bddfdb8a2b280 deleted file mode 100644 index aacae95f..00000000 Binary files a/packages/media/cpp/cache/images/d5/d5fdad9be3864f4082717d1c00c74ddcc1dab9da3e438134b88bddfdb8a2b280 and /dev/null differ diff --git a/packages/media/cpp/cache/images/d6/d612c7555c679e36a7c60941f5d90a55c3d00a103bd4a500a540edd70ad95f9b b/packages/media/cpp/cache/images/d6/d612c7555c679e36a7c60941f5d90a55c3d00a103bd4a500a540edd70ad95f9b deleted file mode 100644 index d4e55c29..00000000 Binary files a/packages/media/cpp/cache/images/d6/d612c7555c679e36a7c60941f5d90a55c3d00a103bd4a500a540edd70ad95f9b and /dev/null differ diff --git a/packages/media/cpp/cache/images/d6/d6b073161761cfa39937618c7f9d1fe303d7a5fb18ea0b357e04bb31184fec0c b/packages/media/cpp/cache/images/d6/d6b073161761cfa39937618c7f9d1fe303d7a5fb18ea0b357e04bb31184fec0c deleted file mode 100644 index fba42a11..00000000 Binary files a/packages/media/cpp/cache/images/d6/d6b073161761cfa39937618c7f9d1fe303d7a5fb18ea0b357e04bb31184fec0c and /dev/null differ diff --git a/packages/media/cpp/cache/images/d8/d822e71b3823126636ae50a49030412cd06d2a5726fa72c3fb42b7375d2f7363 b/packages/media/cpp/cache/images/d8/d822e71b3823126636ae50a49030412cd06d2a5726fa72c3fb42b7375d2f7363 deleted file mode 100644 index d789a9f6..00000000 Binary files a/packages/media/cpp/cache/images/d8/d822e71b3823126636ae50a49030412cd06d2a5726fa72c3fb42b7375d2f7363 and /dev/null differ diff --git a/packages/media/cpp/cache/images/d9/d947d16bd8fd55cabf589212220da4aae8284e472a0b2aec06021c825904b732 b/packages/media/cpp/cache/images/d9/d947d16bd8fd55cabf589212220da4aae8284e472a0b2aec06021c825904b732 deleted file mode 100644 index 0d1bbfe4..00000000 Binary files a/packages/media/cpp/cache/images/d9/d947d16bd8fd55cabf589212220da4aae8284e472a0b2aec06021c825904b732 and /dev/null differ diff --git a/packages/media/cpp/cache/images/db/db409fdae4ec706e3d34da6c29af59e61fd2f7a593028aa4bc8aba71e46e1bba b/packages/media/cpp/cache/images/db/db409fdae4ec706e3d34da6c29af59e61fd2f7a593028aa4bc8aba71e46e1bba deleted file mode 100644 index d58772f8..00000000 Binary files a/packages/media/cpp/cache/images/db/db409fdae4ec706e3d34da6c29af59e61fd2f7a593028aa4bc8aba71e46e1bba and /dev/null differ diff --git a/packages/media/cpp/cache/images/db/db4386d50a7621597ceeb2a596d73162c7f0227afae9953b63ade8778178f641 b/packages/media/cpp/cache/images/db/db4386d50a7621597ceeb2a596d73162c7f0227afae9953b63ade8778178f641 deleted file mode 100644 index d8a9dee8..00000000 Binary files a/packages/media/cpp/cache/images/db/db4386d50a7621597ceeb2a596d73162c7f0227afae9953b63ade8778178f641 and /dev/null differ diff --git a/packages/media/cpp/cache/images/db/db5835023df6a080b1d067fd5ea1942a4c503505c5ab7cda89a3642120f6ce80 b/packages/media/cpp/cache/images/db/db5835023df6a080b1d067fd5ea1942a4c503505c5ab7cda89a3642120f6ce80 deleted file mode 100644 index 6d9e21f0..00000000 Binary files a/packages/media/cpp/cache/images/db/db5835023df6a080b1d067fd5ea1942a4c503505c5ab7cda89a3642120f6ce80 and /dev/null differ diff --git a/packages/media/cpp/cache/images/db/db95ea6dd344b1c703ee6874e00e11edbc8861007f55ca8c9ee180f5b69add47 b/packages/media/cpp/cache/images/db/db95ea6dd344b1c703ee6874e00e11edbc8861007f55ca8c9ee180f5b69add47 deleted file mode 100644 index 303494b8..00000000 Binary files a/packages/media/cpp/cache/images/db/db95ea6dd344b1c703ee6874e00e11edbc8861007f55ca8c9ee180f5b69add47 and /dev/null differ diff --git a/packages/media/cpp/cache/images/dc/dc9572e33fcd1677dc412614a0d04b28c45b95ade60373e552794a98fae80ba4 b/packages/media/cpp/cache/images/dc/dc9572e33fcd1677dc412614a0d04b28c45b95ade60373e552794a98fae80ba4 deleted file mode 100644 index ac02b5e2..00000000 Binary files a/packages/media/cpp/cache/images/dc/dc9572e33fcd1677dc412614a0d04b28c45b95ade60373e552794a98fae80ba4 and /dev/null differ diff --git a/packages/media/cpp/cache/images/dd/dd9ed4b2525c14b472b92e309e99e9ebb4375c2fb0270a583b2b5cd584b42c37 b/packages/media/cpp/cache/images/dd/dd9ed4b2525c14b472b92e309e99e9ebb4375c2fb0270a583b2b5cd584b42c37 deleted file mode 100644 index bd102019..00000000 Binary files a/packages/media/cpp/cache/images/dd/dd9ed4b2525c14b472b92e309e99e9ebb4375c2fb0270a583b2b5cd584b42c37 and /dev/null differ diff --git a/packages/media/cpp/cache/images/de/dec6965d52e972192c27b8fb7411d23e68e04b3c434e3cc75b182d9fa6ed7e73 b/packages/media/cpp/cache/images/de/dec6965d52e972192c27b8fb7411d23e68e04b3c434e3cc75b182d9fa6ed7e73 deleted file mode 100644 index ec1c3fff..00000000 Binary files a/packages/media/cpp/cache/images/de/dec6965d52e972192c27b8fb7411d23e68e04b3c434e3cc75b182d9fa6ed7e73 and /dev/null differ diff --git a/packages/media/cpp/cache/images/df/df51e5ef69b3a4134f7ac97c1001006de4a6f7ea4b2fb5d360fb9a82e5774cf5 b/packages/media/cpp/cache/images/df/df51e5ef69b3a4134f7ac97c1001006de4a6f7ea4b2fb5d360fb9a82e5774cf5 deleted file mode 100644 index a3c07bb8..00000000 Binary files a/packages/media/cpp/cache/images/df/df51e5ef69b3a4134f7ac97c1001006de4a6f7ea4b2fb5d360fb9a82e5774cf5 and /dev/null differ diff --git a/packages/media/cpp/cache/images/df/df5eeede859aaccfb2d65213e4e8365c1376213102191150155c9fdb8cd3c799 b/packages/media/cpp/cache/images/df/df5eeede859aaccfb2d65213e4e8365c1376213102191150155c9fdb8cd3c799 deleted file mode 100644 index c8e85be5..00000000 Binary files a/packages/media/cpp/cache/images/df/df5eeede859aaccfb2d65213e4e8365c1376213102191150155c9fdb8cd3c799 and /dev/null differ diff --git a/packages/media/cpp/cache/images/df/df655617d7a48d7c717354af6dbd3dbea91378f048afb7dd2a084cfc975b6905 b/packages/media/cpp/cache/images/df/df655617d7a48d7c717354af6dbd3dbea91378f048afb7dd2a084cfc975b6905 deleted file mode 100644 index 98100373..00000000 Binary files a/packages/media/cpp/cache/images/df/df655617d7a48d7c717354af6dbd3dbea91378f048afb7dd2a084cfc975b6905 and /dev/null differ diff --git a/packages/media/cpp/cache/images/e0/e0f409228cba3058437464df54596031d06c686e978c34d2e43c659836f458db b/packages/media/cpp/cache/images/e0/e0f409228cba3058437464df54596031d06c686e978c34d2e43c659836f458db deleted file mode 100644 index 80503c21..00000000 Binary files a/packages/media/cpp/cache/images/e0/e0f409228cba3058437464df54596031d06c686e978c34d2e43c659836f458db and /dev/null differ diff --git a/packages/media/cpp/cache/images/e2/e28ed5287792cb1d023fa43897847c971073a494af094339f5c04469dfa1591c b/packages/media/cpp/cache/images/e2/e28ed5287792cb1d023fa43897847c971073a494af094339f5c04469dfa1591c deleted file mode 100644 index 3ee42e34..00000000 Binary files a/packages/media/cpp/cache/images/e2/e28ed5287792cb1d023fa43897847c971073a494af094339f5c04469dfa1591c and /dev/null differ diff --git a/packages/media/cpp/cache/images/e4/e42e18b72133d6cb7f2c2b9f53706bd589164c200db280899511ac580914fdfc b/packages/media/cpp/cache/images/e4/e42e18b72133d6cb7f2c2b9f53706bd589164c200db280899511ac580914fdfc deleted file mode 100644 index 734d8b1d..00000000 Binary files a/packages/media/cpp/cache/images/e4/e42e18b72133d6cb7f2c2b9f53706bd589164c200db280899511ac580914fdfc and /dev/null differ diff --git a/packages/media/cpp/cache/images/e4/e47f656ca6aebe0acb02a00f4f891c5fa6bd6a0582eed4f22fd39410f5bd6d0f b/packages/media/cpp/cache/images/e4/e47f656ca6aebe0acb02a00f4f891c5fa6bd6a0582eed4f22fd39410f5bd6d0f deleted file mode 100644 index b9bad2a2..00000000 Binary files a/packages/media/cpp/cache/images/e4/e47f656ca6aebe0acb02a00f4f891c5fa6bd6a0582eed4f22fd39410f5bd6d0f and /dev/null differ diff --git a/packages/media/cpp/cache/images/e4/e4f66723e50a43a5792687bf714d9a085b337b8627dbf4af3aec6b88b09fefbf b/packages/media/cpp/cache/images/e4/e4f66723e50a43a5792687bf714d9a085b337b8627dbf4af3aec6b88b09fefbf deleted file mode 100644 index fc44c9f0..00000000 Binary files a/packages/media/cpp/cache/images/e4/e4f66723e50a43a5792687bf714d9a085b337b8627dbf4af3aec6b88b09fefbf and /dev/null differ diff --git a/packages/media/cpp/cache/images/e5/e570c41f051025d3f9324449807e6e7d9d62bd08779310c39da54300698fd790 b/packages/media/cpp/cache/images/e5/e570c41f051025d3f9324449807e6e7d9d62bd08779310c39da54300698fd790 deleted file mode 100644 index 24e2a277..00000000 Binary files a/packages/media/cpp/cache/images/e5/e570c41f051025d3f9324449807e6e7d9d62bd08779310c39da54300698fd790 and /dev/null differ diff --git a/packages/media/cpp/cache/images/e5/e5fb68a867598864cf1d8abbb8a69ca780146e29e25327c530575428863af824 b/packages/media/cpp/cache/images/e5/e5fb68a867598864cf1d8abbb8a69ca780146e29e25327c530575428863af824 deleted file mode 100644 index e331f1a1..00000000 Binary files a/packages/media/cpp/cache/images/e5/e5fb68a867598864cf1d8abbb8a69ca780146e29e25327c530575428863af824 and /dev/null differ diff --git a/packages/media/cpp/cache/images/e6/e6406a434b03d4eecc7e8aa47fff837605c35218d5fc90b4fb4ac6caca36c971 b/packages/media/cpp/cache/images/e6/e6406a434b03d4eecc7e8aa47fff837605c35218d5fc90b4fb4ac6caca36c971 deleted file mode 100644 index 52d4c67b..00000000 Binary files a/packages/media/cpp/cache/images/e6/e6406a434b03d4eecc7e8aa47fff837605c35218d5fc90b4fb4ac6caca36c971 and /dev/null differ diff --git a/packages/media/cpp/cache/images/e8/e838b0a2a38b111dd1e62e0c57c64c1c36e9181b735bb36f7bdc01694be62406 b/packages/media/cpp/cache/images/e8/e838b0a2a38b111dd1e62e0c57c64c1c36e9181b735bb36f7bdc01694be62406 deleted file mode 100644 index 1c13fdeb..00000000 Binary files a/packages/media/cpp/cache/images/e8/e838b0a2a38b111dd1e62e0c57c64c1c36e9181b735bb36f7bdc01694be62406 and /dev/null differ diff --git a/packages/media/cpp/cache/images/ea/ea285710b397aab3e190f724c60c408d9b4cd90c2c0a490fe4d973cd59e9080c b/packages/media/cpp/cache/images/ea/ea285710b397aab3e190f724c60c408d9b4cd90c2c0a490fe4d973cd59e9080c deleted file mode 100644 index 92aca2bc..00000000 Binary files a/packages/media/cpp/cache/images/ea/ea285710b397aab3e190f724c60c408d9b4cd90c2c0a490fe4d973cd59e9080c and /dev/null differ diff --git a/packages/media/cpp/cache/images/ea/ea936138e9d80b1750c543e3996f0bc54eadaef75a3ba24f66d3483be24c4513 b/packages/media/cpp/cache/images/ea/ea936138e9d80b1750c543e3996f0bc54eadaef75a3ba24f66d3483be24c4513 deleted file mode 100644 index cbe7953f..00000000 Binary files a/packages/media/cpp/cache/images/ea/ea936138e9d80b1750c543e3996f0bc54eadaef75a3ba24f66d3483be24c4513 and /dev/null differ diff --git a/packages/media/cpp/cache/images/eb/eb0d80bcdf754ac57b21b3bae612b9f4207d74613ba9cd8036f462654004d6e6 b/packages/media/cpp/cache/images/eb/eb0d80bcdf754ac57b21b3bae612b9f4207d74613ba9cd8036f462654004d6e6 deleted file mode 100644 index d5d31919..00000000 Binary files a/packages/media/cpp/cache/images/eb/eb0d80bcdf754ac57b21b3bae612b9f4207d74613ba9cd8036f462654004d6e6 and /dev/null differ diff --git a/packages/media/cpp/cache/images/ec/ec3eec2b3cf58a15d72736859bdf86be4548afb7220fdc7e604880359cc9bc73 b/packages/media/cpp/cache/images/ec/ec3eec2b3cf58a15d72736859bdf86be4548afb7220fdc7e604880359cc9bc73 deleted file mode 100644 index d2a0e54a..00000000 Binary files a/packages/media/cpp/cache/images/ec/ec3eec2b3cf58a15d72736859bdf86be4548afb7220fdc7e604880359cc9bc73 and /dev/null differ diff --git a/packages/media/cpp/cache/images/ed/edaed93ed7eef8ac9bb3ef5635f0644812330038d6586cbb2a2042c7bc402537 b/packages/media/cpp/cache/images/ed/edaed93ed7eef8ac9bb3ef5635f0644812330038d6586cbb2a2042c7bc402537 deleted file mode 100644 index 7b3f77e3..00000000 Binary files a/packages/media/cpp/cache/images/ed/edaed93ed7eef8ac9bb3ef5635f0644812330038d6586cbb2a2042c7bc402537 and /dev/null differ diff --git a/packages/media/cpp/cache/images/ee/ee8005344649ae428880fd8a23b4c09eb4e30cceb8783ed23793bf1e7a4ec682 b/packages/media/cpp/cache/images/ee/ee8005344649ae428880fd8a23b4c09eb4e30cceb8783ed23793bf1e7a4ec682 deleted file mode 100644 index d9e8763c..00000000 Binary files a/packages/media/cpp/cache/images/ee/ee8005344649ae428880fd8a23b4c09eb4e30cceb8783ed23793bf1e7a4ec682 and /dev/null differ diff --git a/packages/media/cpp/cache/images/ef/efe93fa36262f23326e2b8ba23f2cf4b204c575bdc83a553dfde087fe4328df8 b/packages/media/cpp/cache/images/ef/efe93fa36262f23326e2b8ba23f2cf4b204c575bdc83a553dfde087fe4328df8 deleted file mode 100644 index 692a754a..00000000 Binary files a/packages/media/cpp/cache/images/ef/efe93fa36262f23326e2b8ba23f2cf4b204c575bdc83a553dfde087fe4328df8 and /dev/null differ diff --git a/packages/media/cpp/cache/images/f0/f058ad9c75f4517eea9bb4045cdad052f175e17ea5ed6f7847fd49a36125a34d b/packages/media/cpp/cache/images/f0/f058ad9c75f4517eea9bb4045cdad052f175e17ea5ed6f7847fd49a36125a34d deleted file mode 100644 index f9bc1b75..00000000 Binary files a/packages/media/cpp/cache/images/f0/f058ad9c75f4517eea9bb4045cdad052f175e17ea5ed6f7847fd49a36125a34d and /dev/null differ diff --git a/packages/media/cpp/cache/images/f3/f30fff97a5ecfa3c2f0e883880d89a93c859caa20051042912450dd959a7acc5 b/packages/media/cpp/cache/images/f3/f30fff97a5ecfa3c2f0e883880d89a93c859caa20051042912450dd959a7acc5 deleted file mode 100644 index 8583a3f4..00000000 Binary files a/packages/media/cpp/cache/images/f3/f30fff97a5ecfa3c2f0e883880d89a93c859caa20051042912450dd959a7acc5 and /dev/null differ diff --git a/packages/media/cpp/cache/images/f3/f3b9d16a44c4b63f6c9dd9d8456eb05ad1c650c7a60bc37c51aef0338c317974 b/packages/media/cpp/cache/images/f3/f3b9d16a44c4b63f6c9dd9d8456eb05ad1c650c7a60bc37c51aef0338c317974 deleted file mode 100644 index f2ef5f9b..00000000 Binary files a/packages/media/cpp/cache/images/f3/f3b9d16a44c4b63f6c9dd9d8456eb05ad1c650c7a60bc37c51aef0338c317974 and /dev/null differ diff --git a/packages/media/cpp/cache/images/f4/f40d47e6974e18ee9623b167086a046b0d80f85deace39a0fc5cc3832394e371 b/packages/media/cpp/cache/images/f4/f40d47e6974e18ee9623b167086a046b0d80f85deace39a0fc5cc3832394e371 deleted file mode 100644 index 8b0b1946..00000000 Binary files a/packages/media/cpp/cache/images/f4/f40d47e6974e18ee9623b167086a046b0d80f85deace39a0fc5cc3832394e371 and /dev/null differ diff --git a/packages/media/cpp/cache/images/f4/f4efa20e7383a20f757b06907fea86ee700ec1f097314a37938703ef2b06fc5f b/packages/media/cpp/cache/images/f4/f4efa20e7383a20f757b06907fea86ee700ec1f097314a37938703ef2b06fc5f deleted file mode 100644 index d75856d4..00000000 Binary files a/packages/media/cpp/cache/images/f4/f4efa20e7383a20f757b06907fea86ee700ec1f097314a37938703ef2b06fc5f and /dev/null differ diff --git a/packages/media/cpp/cache/images/f5/f5f28b9e725edb5657bdea3632364255ccd65a352c83e1e737a9f832395e3f1c b/packages/media/cpp/cache/images/f5/f5f28b9e725edb5657bdea3632364255ccd65a352c83e1e737a9f832395e3f1c deleted file mode 100644 index a385cb9a..00000000 Binary files a/packages/media/cpp/cache/images/f5/f5f28b9e725edb5657bdea3632364255ccd65a352c83e1e737a9f832395e3f1c and /dev/null differ diff --git a/packages/media/cpp/cache/images/f6/f69e88ab484ebd81f63a02e713fb4dbdd5123619bcd3abfca5b23070c5fc584a b/packages/media/cpp/cache/images/f6/f69e88ab484ebd81f63a02e713fb4dbdd5123619bcd3abfca5b23070c5fc584a deleted file mode 100644 index 4d4c5254..00000000 Binary files a/packages/media/cpp/cache/images/f6/f69e88ab484ebd81f63a02e713fb4dbdd5123619bcd3abfca5b23070c5fc584a and /dev/null differ diff --git a/packages/media/cpp/cache/images/f7/f7150c7783c2197bf4e34d9f2ddb7cf0a5a1b8d896991fee250782eebf3bd8e2 b/packages/media/cpp/cache/images/f7/f7150c7783c2197bf4e34d9f2ddb7cf0a5a1b8d896991fee250782eebf3bd8e2 deleted file mode 100644 index 8e83f619..00000000 Binary files a/packages/media/cpp/cache/images/f7/f7150c7783c2197bf4e34d9f2ddb7cf0a5a1b8d896991fee250782eebf3bd8e2 and /dev/null differ diff --git a/packages/media/cpp/cache/images/f7/f72e55e43a47060849c19cb70ebb76da594601f69ec81c6db6ec39260e64ef54 b/packages/media/cpp/cache/images/f7/f72e55e43a47060849c19cb70ebb76da594601f69ec81c6db6ec39260e64ef54 deleted file mode 100644 index c6d156b7..00000000 Binary files a/packages/media/cpp/cache/images/f7/f72e55e43a47060849c19cb70ebb76da594601f69ec81c6db6ec39260e64ef54 and /dev/null differ diff --git a/packages/media/cpp/cache/images/f8/f88db18e46cd164a925e73ed7a7f9c9eb1465c685ca9df392b6ad58531d9675b b/packages/media/cpp/cache/images/f8/f88db18e46cd164a925e73ed7a7f9c9eb1465c685ca9df392b6ad58531d9675b deleted file mode 100644 index 6b9900a0..00000000 Binary files a/packages/media/cpp/cache/images/f8/f88db18e46cd164a925e73ed7a7f9c9eb1465c685ca9df392b6ad58531d9675b and /dev/null differ diff --git a/packages/media/cpp/cache/images/f9/f90015e794a2297394367637c5d64764d994aaf416074169b1419376a0ecae9b b/packages/media/cpp/cache/images/f9/f90015e794a2297394367637c5d64764d994aaf416074169b1419376a0ecae9b deleted file mode 100644 index df4fbabf..00000000 Binary files a/packages/media/cpp/cache/images/f9/f90015e794a2297394367637c5d64764d994aaf416074169b1419376a0ecae9b and /dev/null differ diff --git a/packages/media/cpp/cache/images/f9/f90eb3d60365f751e5ad1490b6c1f6be04b2fb5f0f6e0930c4184279a81eacdf b/packages/media/cpp/cache/images/f9/f90eb3d60365f751e5ad1490b6c1f6be04b2fb5f0f6e0930c4184279a81eacdf deleted file mode 100644 index e5099d89..00000000 Binary files a/packages/media/cpp/cache/images/f9/f90eb3d60365f751e5ad1490b6c1f6be04b2fb5f0f6e0930c4184279a81eacdf and /dev/null differ diff --git a/packages/media/cpp/cache/images/f9/f9107837fea9a0e0fec68507944e99d6fa096a3464e9e0c4f12860eb6491d88d b/packages/media/cpp/cache/images/f9/f9107837fea9a0e0fec68507944e99d6fa096a3464e9e0c4f12860eb6491d88d deleted file mode 100644 index 87291e63..00000000 Binary files a/packages/media/cpp/cache/images/f9/f9107837fea9a0e0fec68507944e99d6fa096a3464e9e0c4f12860eb6491d88d and /dev/null differ diff --git a/packages/media/cpp/cache/images/f9/f9cc23f88bc8456dab876070105391eecb2ec105aebadff1fa771fd35e7a1d8b b/packages/media/cpp/cache/images/f9/f9cc23f88bc8456dab876070105391eecb2ec105aebadff1fa771fd35e7a1d8b deleted file mode 100644 index 1925c0ba..00000000 Binary files a/packages/media/cpp/cache/images/f9/f9cc23f88bc8456dab876070105391eecb2ec105aebadff1fa771fd35e7a1d8b and /dev/null differ diff --git a/packages/media/cpp/cache/images/fb/fb4bd720a3f89499c0ac741379516c40d9c7cee57b42047dee8bebea34254032 b/packages/media/cpp/cache/images/fb/fb4bd720a3f89499c0ac741379516c40d9c7cee57b42047dee8bebea34254032 deleted file mode 100644 index 7807c602..00000000 Binary files a/packages/media/cpp/cache/images/fb/fb4bd720a3f89499c0ac741379516c40d9c7cee57b42047dee8bebea34254032 and /dev/null differ diff --git a/packages/media/cpp/cache/images/fb/fbac2f680b833a1ba5c87688dd635dc1b7d42d2629999a7f98b30741edd496ae b/packages/media/cpp/cache/images/fb/fbac2f680b833a1ba5c87688dd635dc1b7d42d2629999a7f98b30741edd496ae deleted file mode 100644 index 521dca3c..00000000 Binary files a/packages/media/cpp/cache/images/fb/fbac2f680b833a1ba5c87688dd635dc1b7d42d2629999a7f98b30741edd496ae and /dev/null differ diff --git a/packages/media/cpp/cache/images/fb/fbfa3951b919c26fbde69c747c6091c39e20d751b14c800ba7935cecece47737 b/packages/media/cpp/cache/images/fb/fbfa3951b919c26fbde69c747c6091c39e20d751b14c800ba7935cecece47737 deleted file mode 100644 index d2bd2ca9..00000000 Binary files a/packages/media/cpp/cache/images/fb/fbfa3951b919c26fbde69c747c6091c39e20d751b14c800ba7935cecece47737 and /dev/null differ diff --git a/packages/media/cpp/cache/images/fc/fc58bdadf18e84515b477d8b69412d9f00bfaa601dcf7a4cc8177eb67cfae43c b/packages/media/cpp/cache/images/fc/fc58bdadf18e84515b477d8b69412d9f00bfaa601dcf7a4cc8177eb67cfae43c deleted file mode 100644 index 78621858..00000000 Binary files a/packages/media/cpp/cache/images/fc/fc58bdadf18e84515b477d8b69412d9f00bfaa601dcf7a4cc8177eb67cfae43c and /dev/null differ diff --git a/packages/media/cpp/cache/images/fc/fcc108878b4f662c5ac1ee21a242e29c294467f4281744f9a722df01bc9873ea b/packages/media/cpp/cache/images/fc/fcc108878b4f662c5ac1ee21a242e29c294467f4281744f9a722df01bc9873ea deleted file mode 100644 index 86ad79b0..00000000 Binary files a/packages/media/cpp/cache/images/fc/fcc108878b4f662c5ac1ee21a242e29c294467f4281744f9a722df01bc9873ea and /dev/null differ diff --git a/packages/media/cpp/cache/images/fd/fd606faec7b4880bbedc29c4203d0cb7ede8e2a75f236ab07c1bfeae636c67e4 b/packages/media/cpp/cache/images/fd/fd606faec7b4880bbedc29c4203d0cb7ede8e2a75f236ab07c1bfeae636c67e4 deleted file mode 100644 index e55c0a50..00000000 Binary files a/packages/media/cpp/cache/images/fd/fd606faec7b4880bbedc29c4203d0cb7ede8e2a75f236ab07c1bfeae636c67e4 and /dev/null differ diff --git a/packages/media/cpp/cache/images/fe/fece0230aafb40e6ed76788e34ac42cf8ed061ac51f8fd358b80ebcd6bc5183d b/packages/media/cpp/cache/images/fe/fece0230aafb40e6ed76788e34ac42cf8ed061ac51f8fd358b80ebcd6bc5183d deleted file mode 100644 index 0ee64b73..00000000 Binary files a/packages/media/cpp/cache/images/fe/fece0230aafb40e6ed76788e34ac42cf8ed061ac51f8fd358b80ebcd6bc5183d and /dev/null differ diff --git a/packages/media/cpp/cache/images/ff/ff2265325812b7f5dbefa47985ecabc1b91437f00c7b36ab93ecf0df453caf2c b/packages/media/cpp/cache/images/ff/ff2265325812b7f5dbefa47985ecabc1b91437f00c7b36ab93ecf0df453caf2c deleted file mode 100644 index 680a080f..00000000 Binary files a/packages/media/cpp/cache/images/ff/ff2265325812b7f5dbefa47985ecabc1b91437f00c7b36ab93ecf0df453caf2c and /dev/null differ diff --git a/packages/media/cpp/cache/images/ff/fff1a8cc15729767419159e87a83aca2cc1fc74ce4fa7c3f092eb35d66bdfbc2 b/packages/media/cpp/cache/images/ff/fff1a8cc15729767419159e87a83aca2cc1fc74ce4fa7c3f092eb35d66bdfbc2 deleted file mode 100644 index e1c91144..00000000 Binary files a/packages/media/cpp/cache/images/ff/fff1a8cc15729767419159e87a83aca2cc1fc74ce4fa7c3f092eb35d66bdfbc2 and /dev/null differ diff --git a/packages/media/cpp/dist/pm-image.exe b/packages/media/cpp/dist/pm-image.exe index 2b8d7564..b1d8cade 100644 Binary files a/packages/media/cpp/dist/pm-image.exe and b/packages/media/cpp/dist/pm-image.exe differ diff --git a/packages/media/cpp/dist/pm-image.pdb b/packages/media/cpp/dist/pm-image.pdb index 79969b13..83f0f0c4 100644 Binary files a/packages/media/cpp/dist/pm-image.pdb and b/packages/media/cpp/dist/pm-image.pdb differ diff --git a/packages/media/cpp/dist/pm-images-setup.exe b/packages/media/cpp/dist/pm-images-setup.exe index 3a8bcee9..b6fde9c9 100644 Binary files a/packages/media/cpp/dist/pm-images-setup.exe and b/packages/media/cpp/dist/pm-images-setup.exe differ diff --git a/packages/media/cpp/docs/integration.md b/packages/media/cpp/docs/integration.md index f2741012..30f8dfff 100644 --- a/packages/media/cpp/docs/integration.md +++ b/packages/media/cpp/docs/integration.md @@ -14,6 +14,17 @@ At startup it loads **`.env` from the current working directory** if present ([d Defaults if you omit flags: `--host 127.0.0.1 -p 8080` for `serve`, and `--host 127.0.0.1 -p 9333` for `ipc` (see `media-img serve --help` / `ipc --help`). +## `serve`: `POST /v1/resize` — JSON vs multipart + +The same path accepts two shapes of request: + +| `Content-Type` | Use case | Response | +|----------------|----------|----------| +| **`application/json`** | Server reads/writes **`input`** and **`output`** paths on the host (shared data dir, batch jobs). | JSON (`ok`, optional batch fields). **Output cache** may apply. | +| **`multipart/form-data`** | Clients upload a file (parts **`file`**, **`image`**, or **`upload`**) plus optional form fields (`max_width`, `format`, …). | **Binary image** body; **no** on-disk cache for these requests (internal temp files only). | + +`GET /health` stays JSON for probes. If you put a **reverse proxy** in front of `serve`, raise **client max body size** for multipart uploads as needed; the cpp-httplib server itself does not read a separate config file for limits. + --- ## Linux: systemd (`systemctl`) @@ -26,7 +37,7 @@ Create `/etc/systemd/system/media-img-serve.service`: ```ini [Unit] -Description=media-img HTTP REST (libvips resize) +Description=media-img HTTP REST (libvips resize; JSON + multipart /v1/resize) After=network.target [Service] diff --git a/packages/media/cpp/docs/product.md b/packages/media/cpp/docs/product.md index deaea336..58a3f0cc 100644 --- a/packages/media/cpp/docs/product.md +++ b/packages/media/cpp/docs/product.md @@ -14,7 +14,7 @@ Whether you batch photos for the web, power a local resize API, or shrink folder - **Developers** who want a **single native binary** (no Node runtime) for resize jobs in scripts, CI, or sidecar services. - **Windows power users** who want **context-menu** resize presets and JPG conversion from File Explorer. -- **Integrators** who need **REST** (`POST /v1/resize`) or **IPC** (one JSON line per request) with the same JSON schema as the CLI. +- **Integrators** who need **REST** (`POST /v1/resize` as **JSON** with server paths, or **multipart** upload with the **resized image** returned in the body) or **IPC** (one JSON line per request) with the same JSON schema as the CLI for path-based jobs. --- @@ -62,7 +62,12 @@ pm-image resize --src './shots/*.jpg' --dst '${SRC_DIR}/${SRC_NAME}_medium.jpg' ### 4. HTTP API -Start the server (`serve`), then `POST` JSON to `/v1/resize` with `input`, `output`, and the same resize fields as the CLI (`max_width`, `max_height`, `fit`, `quality`, etc.). Paths must be readable and writable by the server process. +Start the server (`serve`). **`POST /v1/resize`** supports two modes: + +- **JSON** (`Content-Type: application/json`): **`input`** and **`output`** paths on the machine running the server, plus the same resize fields as the CLI (`max_width`, `max_height`, `fit`, `quality`, glob batch, cache, …). Response is JSON (`ok`, and optionally `count` / `outputs` for batches). +- **Multipart upload** (`Content-Type: multipart/form-data`): send the image in a part named **`file`**, **`image`**, or **`upload`**. Add optional fields (`max_width`, `format`, …) as additional form parts. The **response body is the encoded image** (not JSON), with `Content-Type` set from the output format (default **JPEG** if `format` is omitted). Uploads do not use the on-disk output cache. + +See the **[C++ README](../README.md)** (`serve` — HTTP REST) for `curl` examples. ### 5. Windows — resize from Explorer @@ -79,7 +84,8 @@ On Windows, `pm-image resize --ui` opens a **native** dialog to pick files and o - **libvips-backed** resizing, rotation, flip/flop, EXIF **autorotate**, metadata **strip** (defaults match common web workflows). - **Formats**: JPEG, PNG, WebP, TIFF; **AVIF / HEIC** when your libvips build includes HEIF; other formats depend on libvips loaders/savers. - **HTTP(S) URLs** as `input` (fetched via libcurl) for download-and-resize pipelines. -- **Output cache**: SHA-256 keyed by path, size, mtime, and options — cache hits skip re-encoding. +- **REST multipart** upload: resize without writing `input`/`output` paths — return the image directly to the client. +- **Output cache**: SHA-256 keyed by path, size, mtime, and options — cache hits skip re-encoding (JSON/CLI/IPC path-based jobs; not used for multipart upload responses). For prerequisites, build steps, installer, and the full option tables, see the **[C++ README](../README.md)**. @@ -210,11 +216,20 @@ pm-image resize img.jpg rotated.jpg --max-width 1024 --rotate 90 --flip ### `serve` — HTTP REST ```bash -# Default: http://127.0.0.1:8080 — GET /health, POST /v1/resize with JSON body +# Default: http://127.0.0.1:8080 — GET /health, POST /v1/resize (JSON or multipart) pm-image serve --host 127.0.0.1 -p 8080 ``` -Example resize request (paths must be readable/writable by the server process): +**Multipart** (response = image bytes): + +```bash +curl -s -o thumb.webp -X POST http://127.0.0.1:8080/v1/resize \ + -F "file=@/path/in.png" \ + -F "max_width=400" \ + -F "format=webp" +``` + +**JSON** (paths must be readable/writable by the server process): ```bash curl -s http://127.0.0.1:8080/health @@ -223,7 +238,7 @@ curl -s -X POST http://127.0.0.1:8080/v1/resize \ -d '{"input":"/path/in.png","output":"/path/out.webp","max_width":400,"quality":80}' ``` -Optional: `"cache":false`, `"expand_glob":false`, `"cache_dir":"..."` — see **Batch paths & cache** above. +Optional JSON: `"cache":false`, `"expand_glob":false`, `"cache_dir":"..."` — see **Batch paths & cache** in the [README](../README.md). ### `ipc` — one JSON line per connection (TCP; Unix socket on Linux/macOS) diff --git a/packages/media/cpp/orchestrator/classifier-openrouter-stress.mjs b/packages/media/cpp/orchestrator/classifier-openrouter-stress.mjs deleted file mode 100644 index 0b6d80ce..00000000 --- a/packages/media/cpp/orchestrator/classifier-openrouter-stress.mjs +++ /dev/null @@ -1,8 +0,0 @@ -/** - * OpenRouter classifier + stress defaults: remote router, N batch iterations (see KBOT_CLASSIFIER_STRESS_RUNS). - */ -process.env.KBOT_IPC_CLASSIFIER_LLAMA = '0'; -if (process.env.KBOT_CLASSIFIER_STRESS_RUNS === undefined || process.env.KBOT_CLASSIFIER_STRESS_RUNS === '') { - process.env.KBOT_CLASSIFIER_STRESS_RUNS = '5'; -} -await import('./test-ipc-classifier.mjs'); diff --git a/packages/media/cpp/orchestrator/classifier-openrouter.mjs b/packages/media/cpp/orchestrator/classifier-openrouter.mjs deleted file mode 100644 index 97a536ab..00000000 --- a/packages/media/cpp/orchestrator/classifier-openrouter.mjs +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Sets KBOT_IPC_CLASSIFIER_LLAMA=0 then runs the classifier IPC test against - * KBOT_ROUTER / KBOT_IPC_MODEL (default router: openrouter — see presets.js). - */ -process.env.KBOT_IPC_CLASSIFIER_LLAMA = '0'; -await import('./test-ipc-classifier.mjs'); diff --git a/packages/media/cpp/orchestrator/media-presets.js b/packages/media/cpp/orchestrator/media-presets.js index b5415592..934a4829 100644 --- a/packages/media/cpp/orchestrator/media-presets.js +++ b/packages/media/cpp/orchestrator/media-presets.js @@ -12,7 +12,7 @@ export const platform = { /** Path to media-img binary next to orchestrator/ → ../dist/ */ export function mediaExePath(orchestratorDir = __dirname) { - const name = platform.isWin ? 'pm-image.exe' : 'media-img'; + const name = platform.isWin ? 'pm-image.exe' : 'pm-image'; return resolve(orchestratorDir, '..', 'dist', name); } diff --git a/packages/media/cpp/orchestrator/presets.js b/packages/media/cpp/orchestrator/presets.js deleted file mode 100644 index 0809227c..00000000 --- a/packages/media/cpp/orchestrator/presets.js +++ /dev/null @@ -1,186 +0,0 @@ -/** - * orchestrator/presets.js — defaults for IPC integration tests (extend here as suites grow). - * - * Llama local runner (llama-basics.test.ts): OpenAI-compatible API at http://localhost:8888/v1, - * router `ollama` + `base_url` override, model `default` (server picks loaded GGUF). - */ - -import { dirname, resolve } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { spawn } from 'node:child_process'; -import { existsSync } from 'node:fs'; - -import { probeTcpPort } from './test-commons.js'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); - -export const platform = { - isWin: process.platform === 'win32', -}; - -/** kbot/cpp root (parent of orchestrator/). */ -export const paths = { - orchestratorDir: __dirname, - cppRoot: resolve(__dirname, '..'), - /** Same as packages/kbot/cpp/scripts/run-7b.sh — llama-server on :8888 */ - run7bScript: resolve(__dirname, '../scripts/run-7b.sh'), -}; - -/** Dist binary name for the current OS. */ -export function exeName() { - return platform.isWin ? 'kbot.exe' : 'kbot'; -} - -/** Absolute path to kbot binary given orchestrator/ directory (where test-ipc.mjs lives). */ -export function distExePath(orchestratorDir) { - return resolve(orchestratorDir, '..', 'dist', exeName()); -} - -/** UDS / TCP listen argument passed to `kbot worker --uds `. */ -export const uds = { - tcpPort: 4001, - unixPath: '/tmp/kbot-test-ipc.sock', - /** Value for `--uds` on this OS (Windows: port string; Unix: socket path). */ - workerArg() { - return platform.isWin ? String(this.tcpPort) : this.unixPath; - }, - /** Options for `net.connect` to reach the worker. */ - connectOpts(cppUdsArg) { - return platform.isWin - ? { port: this.tcpPort, host: '127.0.0.1' } - : cppUdsArg; - }, -}; - -/** Millisecond timeouts — tune per step in new tests. */ -export const timeouts = { - ipcDefault: 5000, - kbotAi: 180_000, - /** Llama local arithmetic (same order of magnitude as kbot-ai). */ - llamaKbotAi: 180_000, - /** Max wait for :8888 after spawning run-7b.sh (model load can be slow). */ - llamaServerStart: Number(process.env.KBOT_LLAMA_START_TIMEOUT_MS || 600_000), - connectAttempts: 15, - connectRetryMs: 400, - postShutdownMs: 200, -}; - -export const router = { - default: 'openrouter', - fromEnv() { - return process.env.KBOT_ROUTER || this.default; - }, -}; - -/** - * Local llama.cpp HTTP server — mirrors tests/unit/llama-basics.test.ts (LLAMA_OPTS). - * Uses router `ollama` so api_key resolves to dummy `ollama`; `base_url` points at :8888/v1. - */ -export const llama = { - get port() { - return Number(process.env.KBOT_LLAMA_PORT || 8888); - }, - get host() { - return process.env.KBOT_LLAMA_HOST || '127.0.0.1'; - }, - get baseURL() { - return process.env.KBOT_LLAMA_BASE_URL || `http://localhost:${this.port}/v1`; - }, - router: 'ollama', - get model() { - return process.env.KBOT_LLAMA_MODEL || 'default'; - }, - prompts: { - /** Same idea as llama-basics completion tests. */ - add5_3: 'What is 5 + 3? Reply with just the number, nothing else.', - }, -}; - -/** - * IPC payload for kbot-ai → local llama-server (OpenAI-compatible). - * Pass `base_url` so LLMClient uses port 8888 instead of default ollama :11434. - */ -export function kbotAiPayloadLlamaLocal(overrides = {}) { - const merged = { - prompt: llama.prompts.add5_3, - router: llama.router, - model: llama.model, - base_url: llama.baseURL, - ...overrides, - }; - merged.base_url = merged.base_url ?? merged.baseURL ?? llama.baseURL; - delete merged.baseURL; - return merged; -} - -/** Stock prompts and assertions helpers for LLM smoke tests. */ -export const prompts = { - germanyCapital: 'What is the capital of Germany? Reply in one short sentence.', -}; - -/** Build `kbot-ai` IPC payload from env + presets (OpenRouter-friendly defaults). */ -export function kbotAiPayloadFromEnv() { - const payload = { - prompt: process.env.KBOT_IPC_PROMPT || prompts.germanyCapital, - router: router.fromEnv(), - }; - if (process.env.KBOT_IPC_MODEL) { - payload.model = process.env.KBOT_IPC_MODEL; - } - return payload; -} - -/** True when using the default Germany prompt (for optional Berlin assertion). */ -export function usingDefaultGermanyPrompt() { - return !process.env.KBOT_IPC_PROMPT; -} - -/** - * If nothing listens on llama.port, optionally spawn `scripts/run-7b.sh` (requires `sh` on PATH, e.g. Git Bash on Windows). - * - * @param {{ autostart?: boolean, startTimeoutMs?: number }} [opts] - * @returns {Promise<{ ok: boolean, alreadyRunning: boolean, started?: boolean, pid?: number }>} - */ -export async function ensureLlamaLocalServer(opts = {}) { - const autostart = opts.autostart ?? true; - const startTimeoutMs = opts.startTimeoutMs ?? timeouts.llamaServerStart; - const host = llama.host; - const port = llama.port; - const scriptPath = paths.run7bScript; - - if (await probeTcpPort(host, port, 1500)) { - return { ok: true, alreadyRunning: true }; - } - - if (!autostart) { - throw new Error( - `[llama] Nothing listening on ${host}:${port}. Start the server (e.g. sh scripts/run-7b.sh), or remove KBOT_IPC_LLAMA_AUTOSTART=0 to allow autostart` - ); - } - - if (!existsSync(scriptPath)) { - throw new Error(`[llama] Script missing: ${scriptPath}`); - } - - console.log(`[llama] Port ${port} closed — starting ${scriptPath} (timeout ${startTimeoutMs}ms) …`); - - const child = spawn('sh', [scriptPath], { - detached: true, - stdio: 'ignore', - cwd: dirname(scriptPath), - env: { ...process.env }, - }); - child.unref(); - - const deadline = Date.now() + startTimeoutMs; - while (Date.now() < deadline) { - if (await probeTcpPort(host, port, 1500)) { - return { ok: true, alreadyRunning: false, started: true, pid: child.pid }; - } - await new Promise((r) => setTimeout(r, 1500)); - } - - throw new Error( - `[llama] Server did not open ${host}:${port} within ${startTimeoutMs}ms — check llama-server / GPU / model path` - ); -} diff --git a/packages/media/cpp/orchestrator/reports.js b/packages/media/cpp/orchestrator/reports.js index 43a8686b..f1ec9fae 100644 --- a/packages/media/cpp/orchestrator/reports.js +++ b/packages/media/cpp/orchestrator/reports.js @@ -5,8 +5,9 @@ * On-disk: test-name__HH-mm.json / .md (Windows: no `:` in filenames) */ +import { readFileSync, statSync } from 'node:fs'; import { mkdir, writeFile } from 'node:fs/promises'; -import { join, dirname } from 'node:path'; +import { join, dirname, basename } from 'node:path'; import os from 'node:os'; import { performance } from 'node:perf_hooks'; import { resourceUsage } from 'node:process'; @@ -63,6 +64,57 @@ function formatBytes(n) { return `${x < 10 && i > 0 ? x.toFixed(1) : Math.round(x)} ${u[i]}`; } +/** + * @param {string} filePath + * @returns {number | null} + */ +export function fileByteSize(filePath) { + try { + return statSync(filePath).size; + } catch { + return null; + } +} + +/** + * PNG IHDR width/height (first chunk after 8-byte signature). + * @param {Buffer | Uint8Array} buf + * @returns {{ width: number, height: number } | null} + */ +export function pngDimensionsFromBuffer(buf) { + const b = Buffer.isBuffer(buf) ? buf : Buffer.from(buf); + if (b.length < 24) return null; + if (b[0] !== 0x89 || b[1] !== 0x50 || b[2] !== 0x4e || b[3] !== 0x47) return null; + if (b.slice(12, 16).toString('ascii') !== 'IHDR') return null; + const width = b.readUInt32BE(16); + const height = b.readUInt32BE(20); + if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0 || width > 1e6 || height > 1e6) + return null; + return { width, height }; +} + +/** + * @param {string} filePath + * @returns {{ path: string, name: string, bytes: number | null, widthPx: number | null, heightPx: number | null, kind: string }} + */ +export function describePngFile(filePath) { + const name = basename(filePath); + const bytes = fileByteSize(filePath); + let widthPx = null; + let heightPx = null; + try { + const raw = readFileSync(filePath); + const dim = pngDimensionsFromBuffer(raw); + if (dim) { + widthPx = dim.width; + heightPx = dim.height; + } + } catch { + /* ignore */ + } + return { path: filePath, name, bytes, widthPx, heightPx, kind: 'png' }; +} + /** Snapshot of host / OS (cheap; call anytime). */ export function hostSnapshot() { const cpus = os.cpus(); @@ -144,6 +196,15 @@ export function renderMarkdownReport(payload) { lines.push(`| Result | ${payload.ok === true ? 'PASS' : payload.ok === false ? 'FAIL' : '—'} |`); if (payload.passed != null) lines.push(`| Assertions passed | ${payload.passed} |`); if (payload.failed != null) lines.push(`| Assertions failed | ${payload.failed} |`); + if (payload.abortReason) { + lines.push(`| Aborted | ${String(payload.abortReason).replace(/\|/g, '\\|')} |`); + } + if (payload.uncaughtError) { + const u = String(payload.uncaughtError); + lines.push( + `| Uncaught | ${u.length > 600 ? `${u.slice(0, 600).replace(/\|/g, '\\|')}…` : u.replace(/\|/g, '\\|')} |` + ); + } if (payload.ipcLlm != null) lines.push(`| IPC LLM step | ${payload.ipcLlm ? 'enabled' : 'skipped'} |`); if (payload.ipcLlama != null) { lines.push(`| IPC llama :8888 step | ${payload.ipcLlama ? 'enabled' : 'skipped'} |`); @@ -154,6 +215,18 @@ export function renderMarkdownReport(payload) { ); } lines.push(`| CWD | \`${String(meta.cwd ?? '').replace(/`/g, "'")}\` |`); + if (meta.exe != null && String(meta.exe).length) { + lines.push(`| Test binary | \`${String(meta.exe).replace(/`/g, "'")}\` |`); + } + if (meta.assetsDir != null && String(meta.assetsDir).length) { + lines.push(`| Assets dir | \`${String(meta.assetsDir).replace(/`/g, "'")}\` |`); + } + if (meta.argv != null && String(meta.argv).length) { + lines.push(`| CLI args | \`${String(meta.argv).replace(/`/g, "'")}\` |`); + } + if (meta.wallClockMs != null) { + lines.push(`| Wall clock (total script) | **${meta.wallClockMs} ms** |`); + } lines.push(''); lines.push('## Timing'); @@ -219,6 +292,67 @@ export function renderMarkdownReport(payload) { if (host.osUptimeSec != null) lines.push(`| OS uptime | ${(host.osUptimeSec / 3600).toFixed(2)} h |`); lines.push(''); + const escCell = (s) => + String(s ?? '') + .replace(/\|/g, '\\|') + .replace(/\r\n/g, '
') + .replace(/\n/g, '
'); + + if (Array.isArray(payload.images) && payload.images.length > 0) { + lines.push('## Images & transfers'); + lines.push(''); + lines.push('| Label | Size | Dimensions / detail |'); + lines.push('| --- | --- | --- |'); + for (const row of payload.images) { + const label = escCell(row.label ?? '—'); + const bytes = + row.bytes != null && row.bytes !== '' + ? `${formatBytes(Number(row.bytes))} (${row.bytes} B)` + : '—'; + const parts = []; + if (row.widthPx != null && row.heightPx != null) { + parts.push(`${row.widthPx}×${row.heightPx} px`); + } + if (row.contentType) parts.push(String(row.contentType)); + if (row.note) parts.push(String(row.note)); + if (row.detail) parts.push(String(row.detail)); + const detailCol = parts.length ? escCell(parts.join(' · ')) : '—'; + lines.push(`| ${label} | ${bytes} | ${detailCol} |`); + } + lines.push(''); + } + + if (Array.isArray(payload.mediaSuites) && payload.mediaSuites.length > 0) { + lines.push('## Integration: performance by suite'); + lines.push(''); + for (const s of payload.mediaSuites) { + lines.push(`### ${escCell(s.name)}`); + lines.push(''); + lines.push(`- **Suite wall time:** ${Math.round(s.totalMs * 100) / 100} ms`); + lines.push(''); + if (s.steps && s.steps.length) { + lines.push('| Step | ms | Detail |'); + lines.push('| --- | ---: | --- |'); + for (const st of s.steps) { + lines.push(`| ${escCell(st.label)} | ${st.ms} | ${st.detail ? escCell(st.detail) : '—'} |`); + } + lines.push(''); + } else { + lines.push('*(no step-level timings)*'); + lines.push(''); + } + } + } + + if (Array.isArray(payload.integrationNotes) && payload.integrationNotes.length > 0) { + lines.push('### Integration notes'); + lines.push(''); + for (const n of payload.integrationNotes) { + lines.push(`- ${escCell(n)}`); + } + lines.push(''); + } + const kbotAi = payload.kbotAi; const hasKbotAiMeta = kbotAi && diff --git a/packages/media/cpp/orchestrator/test-gridsearch-ipc-daemon.mjs b/packages/media/cpp/orchestrator/test-gridsearch-ipc-daemon.mjs deleted file mode 100644 index feb501ed..00000000 --- a/packages/media/cpp/orchestrator/test-gridsearch-ipc-daemon.mjs +++ /dev/null @@ -1,204 +0,0 @@ -/** - * orchestrator/test-gridsearch-ipc.mjs - * - * E2E test: spawn the C++ worker, send a gridsearch request - * matching `npm run gridsearch:enrich` defaults, collect IPC events, - * and verify the full event sequence. - * - * Run: node orchestrator/test-gridsearch-ipc.mjs - * Needs: npm run build-debug (or npm run build) - */ - -import { spawnWorker } from './spawn.mjs'; -import { resolve, dirname } from 'node:path'; -import { readFileSync } from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import fs from 'node:fs'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const IS_WIN = process.platform === 'win32'; -const EXE_NAME = IS_WIN ? 'polymech-cli.exe' : 'polymech-cli'; - -const EXE = resolve(__dirname, '..', 'dist', EXE_NAME); -if (!fs.existsSync(EXE)) { - console.error(`❌ No ${EXE_NAME} found in dist. Run npm run build first.`); - process.exit(1); -} -console.log(`Binary: ${EXE}\n`); - -// Load the sample settings (same as gridsearch:enrich) -const sampleConfig = JSON.parse( - readFileSync(resolve(__dirname, '..', 'config', 'gridsearch-sample.json'), 'utf8') -); - -let passed = 0; -let failed = 0; - -function assert(condition, label) { - if (condition) { - console.log(` ✅ ${label}`); - passed++; - } else { - console.error(` ❌ ${label}`); - failed++; - } -} - -// ── Event collector ───────────────────────────────────────────────────────── - -const EXPECTED_EVENTS = [ - 'grid-ready', - 'waypoint-start', - 'area', - 'location', - 'enrich-start', - 'node', - 'nodePage', - // 'node-error' — may or may not occur, depends on network -]; - -function createCollector() { - const events = {}; - for (const t of ['grid-ready', 'waypoint-start', 'area', 'location', - 'enrich-start', 'node', 'node-error', 'nodePage']) { - events[t] = []; - } - return { - events, - handler(msg) { - const t = msg.type; - if (events[t]) { - events[t].push(msg); - } else { - events[t] = [msg]; - } - // Live progress indicator - const d = msg.payload ?? {}; - if (t === 'waypoint-start') { - process.stdout.write(`\r 🔍 Searching waypoint ${(d.index ?? 0) + 1}/${d.total ?? '?'}...`); - } else if (t === 'node') { - process.stdout.write(`\r 📧 Enriched: ${d.title?.substring(0, 40) ?? ''} `); - } else if (t === 'node-error') { - process.stdout.write(`\r ⚠️ Error: ${d.node?.title?.substring(0, 40) ?? ''} `); - } - }, - }; -} - -// ── Main test ─────────────────────────────────────────────────────────────── - -async function run() { - console.log('🧪 Gridsearch IPC E2E Test\n'); - - // ── 1. Spawn worker ─────────────────────────────────────────────────── - console.log('1. Spawn worker in daemon mode'); - const worker = spawnWorker(EXE, ['worker', '--daemon', '--user-uid', '3bb4cfbf-318b-44d3-a9d3-35680e738421']); - const readyMsg = await worker.ready; - assert(readyMsg.type === 'ready', 'Worker sends ready signal'); - - // ── 2. Register event collector ─────────────────────────────────────── - const collector = createCollector(); - worker.onEvent(collector.handler); - - // ── 3. Send gridsearch request (matching gridsearch:enrich) ──────────── - console.log('2. Send gridsearch request (Aruba / recycling / --enrich)'); - const t0 = Date.now(); - - // Very long timeout — enrichment can take minutes - const result = await worker.request( - { - type: 'gridsearch', - payload: { - ...sampleConfig, - enrich: true, - }, - }, - 5 * 60 * 1000 // 5 min timeout - ); - - const elapsed = ((Date.now() - t0) / 1000).toFixed(1); - console.log(`\n\n ⏱️ Completed in ${elapsed}s\n`); - - // ── 4. Verify final result ──────────────────────────────────────────── - console.log('3. Verify job_result'); - assert(result.type === 'job_result', `Response type is "job_result" (got "${result.type}")`); - - const summary = result.payload ?? null; - assert(summary !== null, 'job_result payload is present'); - - if (summary) { - assert(typeof summary.totalMs === 'number', `totalMs is number (${summary.totalMs})`); - assert(typeof summary.searchMs === 'number', `searchMs is number (${summary.searchMs})`); - assert(typeof summary.enrichMs === 'number', `enrichMs is number (${summary.enrichMs})`); - assert(typeof summary.freshApiCalls === 'number', `freshApiCalls is number (${summary.freshApiCalls})`); - assert(typeof summary.waypointCount === 'number', `waypointCount is number (${summary.waypointCount})`); - assert(summary.gridStats && typeof summary.gridStats.validCells === 'number', 'gridStats.validCells present'); - assert(summary.searchStats && typeof summary.searchStats.totalResults === 'number', 'searchStats.totalResults present'); - assert(typeof summary.enrichedOk === 'number', `enrichedOk is number (${summary.enrichedOk})`); - assert(typeof summary.enrichedTotal === 'number', `enrichedTotal is number (${summary.enrichedTotal})`); - } - - // ── 5. Verify event sequence ────────────────────────────────────────── - console.log('4. Verify event stream'); - const e = collector.events; - - assert(e['grid-ready'].length === 1, `Exactly 1 grid-ready event (got ${e['grid-ready'].length})`); - assert(e['waypoint-start'].length > 0, `At least 1 waypoint-start event (got ${e['waypoint-start'].length})`); - assert(e['area'].length > 0, `At least 1 area event (got ${e['area'].length})`); - assert(e['waypoint-start'].length === e['area'].length, `waypoint-start count (${e['waypoint-start'].length}) === area count (${e['area'].length})`); - assert(e['enrich-start'].length === 1, `Exactly 1 enrich-start event (got ${e['enrich-start'].length})`); - - const totalNodes = e['node'].length + e['node-error'].length; - assert(totalNodes > 0, `At least 1 node event (got ${totalNodes}: ${e['node'].length} ok, ${e['node-error'].length} errors)`); - - // Validate grid-ready payload - if (e['grid-ready'].length > 0) { - const gr = e['grid-ready'][0].payload ?? {}; - assert(Array.isArray(gr.areas), 'grid-ready.areas is array'); - assert(typeof gr.total === 'number' && gr.total > 0, `grid-ready.total > 0 (${gr.total})`); - } - - // Validate location events have required fields - if (e['location'].length > 0) { - const loc = e['location'][0].payload ?? {}; - assert(loc.location && typeof loc.location.title === 'string', 'location event has location.title'); - assert(loc.location && typeof loc.location.place_id === 'string', 'location event has location.place_id'); - assert(typeof loc.areaName === 'string', 'location event has areaName'); - } - assert(e['location'].length > 0, `At least 1 location event (got ${e['location'].length})`); - - // Validate node payloads - if (e['node'].length > 0) { - const nd = e['node'][0].payload ?? {}; - assert(typeof nd.placeId === 'string', 'node event has placeId'); - assert(typeof nd.title === 'string', 'node event has title'); - assert(Array.isArray(nd.emails), 'node event has emails array'); - assert(typeof nd.status === 'string', 'node event has status'); - } - - // ── 6. Print event summary ──────────────────────────────────────────── - console.log('\n5. Event summary'); - for (const [type, arr] of Object.entries(e)) { - if (arr.length > 0) console.log(` ${type}: ${arr.length}`); - } - - // ── 7. Shutdown ─────────────────────────────────────────────────────── - console.log('\n6. Graceful shutdown'); - const shutdownRes = await worker.shutdown(); - assert(shutdownRes.type === 'shutdown_ack', 'Shutdown acknowledged'); - - await new Promise(r => setTimeout(r, 500)); - assert(worker.process.exitCode === 0, `Worker exited with code 0 (got ${worker.process.exitCode})`); - - // ── Summary ─────────────────────────────────────────────────────────── - console.log(`\n────────────────────────────────`); - console.log(` Passed: ${passed} Failed: ${failed}`); - console.log(`────────────────────────────────\n`); - - process.exit(failed > 0 ? 1 : 0); -} - -run().catch((err) => { - console.error('Test runner error:', err); - process.exit(1); -}); diff --git a/packages/media/cpp/orchestrator/test-gridsearch-ipc-uds-meta.mjs b/packages/media/cpp/orchestrator/test-gridsearch-ipc-uds-meta.mjs deleted file mode 100644 index a6e7707b..00000000 --- a/packages/media/cpp/orchestrator/test-gridsearch-ipc-uds-meta.mjs +++ /dev/null @@ -1,218 +0,0 @@ -/** - * orchestrator/test-gridsearch-ipc-uds-meta.mjs - * - * E2E test for Unix Domain Sockets / Windows Named Pipes (Meta Enrichment)! - * Spawns the worker in `--uds` mode and tests direct high-throughput - * lock-free JSON binary framing over a net.Socket. - */ - -import { spawn } from 'node:child_process'; -import { resolve, dirname, join } from 'node:path'; -import { readFileSync, existsSync, unlinkSync } from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import net from 'node:net'; -import { tmpdir } from 'node:os'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const IS_WIN = process.platform === 'win32'; -const EXE_NAME = IS_WIN ? 'polymech-cli.exe' : 'polymech-cli'; -const EXE = resolve(__dirname, '..', 'dist', EXE_NAME); -const TEST_CANCEL = false; - -if (!existsSync(EXE)) { - console.error(`❌ Binary not found at ${EXE}`); - process.exit(1); -} - -const PIPE_NAME = 'polymech-test-uds-meta'; -const CPP_UDS_ARG = IS_WIN ? '4001' : join(tmpdir(), `${PIPE_NAME}.sock`); - -if (!IS_WIN && existsSync(CPP_UDS_ARG)) { - unlinkSync(CPP_UDS_ARG); -} - -console.log(`Binary: ${EXE}`); -console.log(`C++ Arg: ${CPP_UDS_ARG}\n`); - -// ── Event collector ───────────────────────────────────────────────────────── -function createCollector() { - const events = {}; - for (const t of ['grid-ready', 'waypoint-start', 'area', 'location', - 'enrich-start', 'node', 'node-error', 'nodePage', 'job_result']) { - events[t] = []; - } - return { - events, - onComplete: null, - handler(msg) { - const t = msg.type; - if (events[t]) events[t].push(msg); - else events[t] = [msg]; - - const d = msg.data ?? {}; - if (t === 'waypoint-start') { - process.stdout.write(`\r 🔍 Searching waypoint ${(d.index ?? 0) + 1}/${d.total ?? '?'}...`); - } else if (t === 'node') { - process.stdout.write(`\r 📧 Enriched: ${d.title?.substring(0, 40) ?? ''} `); - } else if (t === 'node-error') { - process.stdout.write(`\r ⚠️ Error: ${d.node?.title?.substring(0, 40) ?? ''} `); - } else if (t === 'job_result') { - console.log(`\n 🏁 Pipeline complete!`); - if (this.onComplete) this.onComplete(msg); - } - }, - }; -} - -let passed = 0; -let failed = 0; -function assert(condition, label) { - if (condition) { console.log(` ✅ ${label}`); passed++; } - else { console.error(` ❌ ${label}`); failed++; } -} - -async function run() { - console.log('🧪 Gridsearch UDS Meta E2E Test\n'); - - // 1. Spawn worker in UDS mode - console.log('1. Spawning remote C++ Taskflow Daemon'); - const worker = spawn(EXE, ['worker', '--uds', CPP_UDS_ARG, '--daemon'], { stdio: 'inherit' }); - - // Give the daemon a moment to boot - console.log('2. Connecting net.Socket with retries...'); - - let socket; - for (let i = 0; i < 15; i++) { - try { - await new Promise((resolve, reject) => { - if (IS_WIN) { - socket = net.connect({ port: 4001, host: '127.0.0.1' }); - } else { - socket = net.connect(CPP_UDS_ARG); - } - socket.once('connect', resolve); - socket.once('error', reject); - }); - console.log(' ✅ Socket Connected to UDS!'); - break; - } catch (e) { - if (i === 14) throw e; - await new Promise(r => setTimeout(r, 500)); - } - } - - const collector = createCollector(); - let buffer = Buffer.alloc(0); - - // Buffer framing logic (length-prefixed streaming) - socket.on('data', (chunk) => { - buffer = Buffer.concat([buffer, chunk]); - while (buffer.length >= 4) { - const len = buffer.readUInt32LE(0); - if (buffer.length >= 4 + len) { - const payload = buffer.toString('utf8', 4, 4 + len); - buffer = buffer.subarray(4 + len); - try { - const msg = JSON.parse(payload); - collector.handler(msg); - } catch (e) { - console.error("JSON PARSE ERROR:", e, payload); - } - } else { - break; // Wait for more chunks - } - } - }); - - // 3. Send Gridsearch payload - // USE gridsearch-sample.json instead of gridsearch-bcn-universities.json - const sampleConfig = JSON.parse( - readFileSync(resolve(__dirname, '..', 'config', 'gridsearch-sample.json'), 'utf8') - ); - - sampleConfig.configPath = resolve(__dirname, '..', 'config', 'postgres.toml'); - sampleConfig.jobId = 'uds-meta-test-abc'; - sampleConfig.noCache = true; // force re-enrichment even if cached - - console.log('3. Writing serialized IPC Payload over pipe...'); - const jsonStr = JSON.stringify(sampleConfig); - const lenBuf = Buffer.alloc(4); - lenBuf.writeUInt32LE(Buffer.byteLength(jsonStr)); - socket.write(lenBuf); - socket.write(jsonStr); - - // 4. Wait for pipeline completion (job_result event) or timeout - console.log('\n4. Awaiting multi-threaded Execution Pipeline (can take minutes)...\n'); - - await new Promise((resolve) => { - collector.onComplete = () => { - // Send stop command to gracefully shut down the daemon - console.log(' 📤 Sending stop command to daemon...'); - const stopPayload = JSON.stringify({ action: 'stop' }); - const stopLen = Buffer.alloc(4); - stopLen.writeUInt32LE(Buffer.byteLength(stopPayload)); - socket.write(stopLen); - socket.write(stopPayload); - setTimeout(resolve, 1000); // Give daemon a moment to ack - }; - - // Safety timeout - setTimeout(() => { - console.log('\n ⏰ Timeout reached (300s) — forcing shutdown.'); - resolve(); - }, 300000); // Wait up to 5 minutes - }); - - console.log('\n\n5. Event summary'); - for (const [k, v] of Object.entries(collector.events)) { - console.log(` ${k}: ${v.length}`); - } - - // Assertions - const ev = collector.events; - assert(ev['grid-ready'].length === 1, 'grid-ready emitted once'); - assert(ev['waypoint-start'].length > 0, 'waypoint-start events received'); - assert(ev['location'].length > 0, 'location events received'); - assert(ev['enrich-start'].length === 1, 'enrich-start emitted once'); - assert(ev['job_result'].length === 1, 'job_result emitted once'); - - // Verify social profiles and md body - const nodes = ev['node']; - let foundSocial = false; - let foundSiteMd = false; - - for (const n of nodes) { - const d = n.data; - if (!d) continue; - - if (d.socials && d.socials.length > 0) { - foundSocial = true; - } - - if (d.sites && Array.isArray(d.sites) && d.sites.length > 0) { - foundSiteMd = true; - } - } - - if (foundSocial) { - assert(foundSocial, 'At least one enriched node has social media profiles discovered'); - } else { - console.log(' ⚠️ No social media profiles discovered in this run (data-dependent), but pipeline completed.'); - } - - assert(foundSiteMd, 'At least one enriched node has markdown sites mapped'); - - console.log('6. Cleanup'); - socket.destroy(); - worker.kill('SIGTERM'); - - console.log(`\n────────────────────────────────`); - console.log(` Passed: ${passed} Failed: ${failed}`); - console.log(`────────────────────────────────`); - process.exit(failed > 0 ? 1 : 0); -} - -run().catch(e => { - console.error(e); - process.exit(1); -}); diff --git a/packages/media/cpp/orchestrator/test-gridsearch-ipc-uds.mjs b/packages/media/cpp/orchestrator/test-gridsearch-ipc-uds.mjs deleted file mode 100644 index 549d3e0a..00000000 --- a/packages/media/cpp/orchestrator/test-gridsearch-ipc-uds.mjs +++ /dev/null @@ -1,255 +0,0 @@ -/** - * orchestrator/test-gridsearch-ipc-uds.mjs - * - * E2E test for Unix Domain Sockets / Windows Named Pipes! - * Spawns the worker in `--uds` mode and tests direct high-throughput - * lock-free JSON binary framing over a net.Socket. - */ - -import { spawn } from 'node:child_process'; -import { resolve, dirname, join } from 'node:path'; -import { readFileSync, existsSync, unlinkSync } from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import net from 'node:net'; -import { tmpdir } from 'node:os'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const IS_WIN = process.platform === 'win32'; -const EXE_NAME = IS_WIN ? 'polymech-cli.exe' : 'polymech-cli'; -const EXE = resolve(__dirname, '..', 'dist', EXE_NAME); -const TEST_CANCEL = false; - -if (!existsSync(EXE)) { - console.error(`❌ Binary not found at ${EXE}`); - process.exit(1); -} - -const PIPE_NAME = 'polymech-test-uds'; -const CPP_UDS_ARG = IS_WIN ? '4000' : join(tmpdir(), `${PIPE_NAME}.sock`); - -if (!IS_WIN && existsSync(CPP_UDS_ARG)) { - unlinkSync(CPP_UDS_ARG); -} - -console.log(`Binary: ${EXE}`); -console.log(`C++ Arg: ${CPP_UDS_ARG}\n`); - -// ── Event collector ───────────────────────────────────────────────────────── -function createCollector() { - const events = {}; - for (const t of ['grid-ready', 'waypoint-start', 'area', 'location', - 'enrich-start', 'node', 'node-error', 'nodePage', 'job_result']) { - events[t] = []; - } - return { - events, - onComplete: null, - handler(msg) { - const t = msg.type; - if (events[t]) events[t].push(msg); - else events[t] = [msg]; - - const d = msg.data ?? {}; - if (t === 'waypoint-start') { - process.stdout.write(`\r 🔍 Searching waypoint ${(d.index ?? 0) + 1}/${d.total ?? '?'}...`); - } else if (t === 'node') { - process.stdout.write(`\r 📧 Enriched: ${d.title?.substring(0, 40) ?? ''} `); - } else if (t === 'node-error') { - process.stdout.write(`\r ⚠️ Error: ${d.node?.title?.substring(0, 40) ?? ''} `); - } else if (t === 'job_result') { - console.log(`\n 🏁 Pipeline complete!`); - if (this.onComplete) this.onComplete(msg); - } - }, - }; -} - -let passed = 0; -let failed = 0; -function assert(condition, label) { - if (condition) { console.log(` ✅ ${label}`); passed++; } - else { console.error(` ❌ ${label}`); failed++; } -} - -async function run() { - console.log('🧪 Gridsearch UDS / Named Pipe E2E Test\n'); - - // 1. Spawn worker in UDS mode - console.log('1. Spawning remote C++ Taskflow Daemon'); - const worker = spawn(EXE, ['worker', '--uds', CPP_UDS_ARG, '--daemon'], { stdio: 'inherit' }); - - // Give the daemon a moment to boot - console.log('2. Connecting net.Socket with retries...'); - - let socket; - for (let i = 0; i < 15; i++) { - try { - await new Promise((resolve, reject) => { - if (IS_WIN) { - socket = net.connect({ port: 4000, host: '127.0.0.1' }); - } else { - socket = net.connect(CPP_UDS_ARG); - } - socket.once('connect', resolve); - socket.once('error', reject); - }); - console.log(' ✅ Socket Connected to UDS!'); - break; - } catch (e) { - if (i === 14) throw e; - await new Promise(r => setTimeout(r, 500)); - } - } - - const collector = createCollector(); - let buffer = Buffer.alloc(0); - - // Buffer framing logic (length-prefixed streaming) - socket.on('data', (chunk) => { - buffer = Buffer.concat([buffer, chunk]); - while (buffer.length >= 4) { - const len = buffer.readUInt32LE(0); - if (buffer.length >= 4 + len) { - const payload = buffer.toString('utf8', 4, 4 + len); - buffer = buffer.subarray(4 + len); - try { - const msg = JSON.parse(payload); - collector.handler(msg); - } catch (e) { - console.error("JSON PARSE ERROR:", e, payload); - } - } else { - break; // Wait for more chunks - } - } - }); - - // 3. Send Gridsearch payload - const sampleConfig = JSON.parse( - readFileSync(resolve(__dirname, '..', 'config', 'gridsearch-bcn-universities.json'), 'utf8') - ); - - sampleConfig.configPath = resolve(__dirname, '..', 'config', 'postgres.toml'); - sampleConfig.jobId = 'uds-test-cancel-abc'; - - console.log('3. Writing serialized IPC Payload over pipe...'); - const jsonStr = JSON.stringify(sampleConfig); - const lenBuf = Buffer.alloc(4); - lenBuf.writeUInt32LE(Buffer.byteLength(jsonStr)); - socket.write(lenBuf); - socket.write(jsonStr); - - // Send cancellation after 5 seconds - if (TEST_CANCEL) { - setTimeout(() => { - console.log('\n\n--> Testing Dynamic Cancellation (Sending cancel event for uds-test-cancel-abc)...'); - const cancelPayload = JSON.stringify({ action: "cancel", jobId: "uds-test-cancel-abc" }); - const cancelLenBuf = Buffer.alloc(4); - cancelLenBuf.writeUInt32LE(Buffer.byteLength(cancelPayload)); - socket.write(cancelLenBuf); - socket.write(cancelPayload); - }, 5000); - } - - // 4. Wait for pipeline completion (job_result event) or timeout - console.log('\n4. Awaiting multi-threaded Execution Pipeline (can take minutes)...\n'); - - await new Promise((resolve) => { - collector.onComplete = () => { - // Send stop command to gracefully shut down the daemon - console.log(' 📤 Sending stop command to daemon...'); - const stopPayload = JSON.stringify({ action: 'stop' }); - const stopLen = Buffer.alloc(4); - stopLen.writeUInt32LE(Buffer.byteLength(stopPayload)); - socket.write(stopLen); - socket.write(stopPayload); - setTimeout(resolve, 1000); // Give daemon a moment to ack - }; - - // Safety timeout - setTimeout(() => { - console.log('\n ⏰ Timeout reached (120s) — forcing shutdown.'); - resolve(); - }, 120000); - }); - - console.log('\n\n5. Event summary'); - for (const [k, v] of Object.entries(collector.events)) { - console.log(` ${k}: ${v.length}`); - } - - // Assertions - const ev = collector.events; - assert(ev['grid-ready'].length === 1, 'grid-ready emitted once'); - assert(ev['waypoint-start'].length > 0, 'waypoint-start events received'); - assert(ev['location'].length > 0, 'location events received'); - assert(ev['enrich-start'].length === 1, 'enrich-start emitted once'); - assert(ev['job_result'].length === 1, 'job_result emitted once'); - - // Check enrichment skip log (if present in log events) - const logEvents = ev['log'] ?? []; - const skipLog = logEvents.find(l => - typeof l.data === 'string' && l.data.includes('already enriched') - ); - const nodeCount = ev['node'].length + ev['node-error'].length; - if (skipLog) { - console.log(` ℹ️ Pre-enrich skip detected: ${skipLog.data}`); - assert(nodeCount === 0, 'no enrichment needed (all skipped)'); - } else { - console.log(' ℹ️ No pre-enrich skips (all locations are new or unenriched)'); - assert(nodeCount > 0, 'enrichment node events received'); - } - - // Check filterTypes assertions: all locations must have website + matching type - const FILTER_TYPE = 'Recycling center'; - const locations = ev['location']; - const badWebsite = locations.filter(l => { - const loc = l.data?.location; - return !loc?.website; - }); - - assert(badWebsite.length === 0, `all locations have website (${badWebsite.length} missing)`); - - const badType = locations.filter(l => { - const loc = l.data?.location; - const types = loc?.types ?? []; - const type = loc?.type ?? ''; - return !types.includes(FILTER_TYPE) && type !== FILTER_TYPE; - }); - if (badType.length > 0) { - console.log(` ❌ Mismatched locations:`); - badType.slice(0, 3).forEach(l => console.log(JSON.stringify(l.data?.location, null, 2))); - } - assert(badType.length === 0, `all locations match type "${FILTER_TYPE}" (${badType.length} mismatched)`); - - const filterLog = logEvents.find(l => - typeof l.data === 'string' && l.data.includes('locations removed') - ); - if (filterLog) { - console.log(` ℹ️ Filter applied: ${filterLog.data}`); - } - - const filterTypesLog = logEvents.filter(l => - typeof l.data === 'string' && (l.data.includes('filterTypes:') || l.data.includes(' - ')) - ); - if (filterTypesLog.length > 0) { - console.log(` ℹ️ Parsed filterTypes in C++:`); - filterTypesLog.forEach(l => console.log(` ${l.data}`)); - } - - console.log(` ℹ️ Locations after filter: ${locations.length}`); - - console.log('6. Cleanup'); - socket.destroy(); - worker.kill('SIGTERM'); - - console.log(`\n────────────────────────────────`); - console.log(` Passed: ${passed} Failed: ${failed}`); - console.log(`────────────────────────────────`); - process.exit(failed > 0 ? 1 : 0); -} - -run().catch(e => { - console.error(e); - process.exit(1); -}); diff --git a/packages/media/cpp/orchestrator/test-gridsearch-ipc.mjs b/packages/media/cpp/orchestrator/test-gridsearch-ipc.mjs deleted file mode 100644 index 13c93060..00000000 --- a/packages/media/cpp/orchestrator/test-gridsearch-ipc.mjs +++ /dev/null @@ -1,204 +0,0 @@ -/** - * orchestrator/test-gridsearch-ipc.mjs - * - * E2E test: spawn the C++ worker, send a gridsearch request - * matching `npm run gridsearch:enrich` defaults, collect IPC events, - * and verify the full event sequence. - * - * Run: node orchestrator/test-gridsearch-ipc.mjs - * Needs: npm run build-debug (or npm run build) - */ - -import { spawnWorker } from './spawn.mjs'; -import { resolve, dirname } from 'node:path'; -import { readFileSync } from 'node:fs'; -import { fileURLToPath } from 'node:url'; -import fs from 'node:fs'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const IS_WIN = process.platform === 'win32'; -const EXE_NAME = IS_WIN ? 'polymech-cli.exe' : 'polymech-cli'; - -const EXE = resolve(__dirname, '..', 'dist', EXE_NAME); -if (!fs.existsSync(EXE)) { - console.error(`❌ No ${EXE_NAME} found in dist. Run npm run build first.`); - process.exit(1); -} -console.log(`Binary: ${EXE}\n`); - -// Load the sample settings (same as gridsearch:enrich) -const sampleConfig = JSON.parse( - readFileSync(resolve(__dirname, '..', 'config', 'gridsearch-sample.json'), 'utf8') -); - -let passed = 0; -let failed = 0; - -function assert(condition, label) { - if (condition) { - console.log(` ✅ ${label}`); - passed++; - } else { - console.error(` ❌ ${label}`); - failed++; - } -} - -// ── Event collector ───────────────────────────────────────────────────────── - -const EXPECTED_EVENTS = [ - 'grid-ready', - 'waypoint-start', - 'area', - 'location', - 'enrich-start', - 'node', - 'nodePage', - // 'node-error' — may or may not occur, depends on network -]; - -function createCollector() { - const events = {}; - for (const t of ['grid-ready', 'waypoint-start', 'area', 'location', - 'enrich-start', 'node', 'node-error', 'nodePage']) { - events[t] = []; - } - return { - events, - handler(msg) { - const t = msg.type; - if (events[t]) { - events[t].push(msg); - } else { - events[t] = [msg]; - } - // Live progress indicator - const d = msg.payload ?? {}; - if (t === 'waypoint-start') { - process.stdout.write(`\r 🔍 Searching waypoint ${(d.index ?? 0) + 1}/${d.total ?? '?'}...`); - } else if (t === 'node') { - process.stdout.write(`\r 📧 Enriched: ${d.title?.substring(0, 40) ?? ''} `); - } else if (t === 'node-error') { - process.stdout.write(`\r ⚠️ Error: ${d.node?.title?.substring(0, 40) ?? ''} `); - } - }, - }; -} - -// ── Main test ─────────────────────────────────────────────────────────────── - -async function run() { - console.log('🧪 Gridsearch IPC E2E Test\n'); - - // ── 1. Spawn worker ─────────────────────────────────────────────────── - console.log('1. Spawn worker'); - const worker = spawnWorker(EXE); - const readyMsg = await worker.ready; - assert(readyMsg.type === 'ready', 'Worker sends ready signal'); - - // ── 2. Register event collector ─────────────────────────────────────── - const collector = createCollector(); - worker.onEvent(collector.handler); - - // ── 3. Send gridsearch request (matching gridsearch:enrich) ──────────── - console.log('2. Send gridsearch request (Aruba / recycling / --enrich)'); - const t0 = Date.now(); - - // Very long timeout — enrichment can take minutes - const result = await worker.request( - { - type: 'gridsearch', - payload: { - ...sampleConfig, - enrich: true, - }, - }, - 5 * 60 * 1000 // 5 min timeout - ); - - const elapsed = ((Date.now() - t0) / 1000).toFixed(1); - console.log(`\n\n ⏱️ Completed in ${elapsed}s\n`); - - // ── 4. Verify final result ──────────────────────────────────────────── - console.log('3. Verify job_result'); - assert(result.type === 'job_result', `Response type is "job_result" (got "${result.type}")`); - - const summary = result.payload ?? null; - assert(summary !== null, 'job_result payload is present'); - - if (summary) { - assert(typeof summary.totalMs === 'number', `totalMs is number (${summary.totalMs})`); - assert(typeof summary.searchMs === 'number', `searchMs is number (${summary.searchMs})`); - assert(typeof summary.enrichMs === 'number', `enrichMs is number (${summary.enrichMs})`); - assert(typeof summary.freshApiCalls === 'number', `freshApiCalls is number (${summary.freshApiCalls})`); - assert(typeof summary.waypointCount === 'number', `waypointCount is number (${summary.waypointCount})`); - assert(summary.gridStats && typeof summary.gridStats.validCells === 'number', 'gridStats.validCells present'); - assert(summary.searchStats && typeof summary.searchStats.totalResults === 'number', 'searchStats.totalResults present'); - assert(typeof summary.enrichedOk === 'number', `enrichedOk is number (${summary.enrichedOk})`); - assert(typeof summary.enrichedTotal === 'number', `enrichedTotal is number (${summary.enrichedTotal})`); - } - - // ── 5. Verify event sequence ────────────────────────────────────────── - console.log('4. Verify event stream'); - const e = collector.events; - - assert(e['grid-ready'].length === 1, `Exactly 1 grid-ready event (got ${e['grid-ready'].length})`); - assert(e['waypoint-start'].length > 0, `At least 1 waypoint-start event (got ${e['waypoint-start'].length})`); - assert(e['area'].length > 0, `At least 1 area event (got ${e['area'].length})`); - assert(e['waypoint-start'].length === e['area'].length, `waypoint-start count (${e['waypoint-start'].length}) === area count (${e['area'].length})`); - assert(e['enrich-start'].length === 1, `Exactly 1 enrich-start event (got ${e['enrich-start'].length})`); - - const totalNodes = e['node'].length + e['node-error'].length; - assert(totalNodes > 0, `At least 1 node event (got ${totalNodes}: ${e['node'].length} ok, ${e['node-error'].length} errors)`); - - // Validate grid-ready payload - if (e['grid-ready'].length > 0) { - const gr = e['grid-ready'][0].payload ?? {}; - assert(Array.isArray(gr.areas), 'grid-ready.areas is array'); - assert(typeof gr.total === 'number' && gr.total > 0, `grid-ready.total > 0 (${gr.total})`); - } - - // Validate location events have required fields - if (e['location'].length > 0) { - const loc = e['location'][0].payload ?? {}; - assert(loc.location && typeof loc.location.title === 'string', 'location event has location.title'); - assert(loc.location && typeof loc.location.place_id === 'string', 'location event has location.place_id'); - assert(typeof loc.areaName === 'string', 'location event has areaName'); - } - assert(e['location'].length > 0, `At least 1 location event (got ${e['location'].length})`); - - // Validate node payloads - if (e['node'].length > 0) { - const nd = e['node'][0].payload ?? {}; - assert(typeof nd.placeId === 'string', 'node event has placeId'); - assert(typeof nd.title === 'string', 'node event has title'); - assert(Array.isArray(nd.emails), 'node event has emails array'); - assert(typeof nd.status === 'string', 'node event has status'); - } - - // ── 6. Print event summary ──────────────────────────────────────────── - console.log('\n5. Event summary'); - for (const [type, arr] of Object.entries(e)) { - if (arr.length > 0) console.log(` ${type}: ${arr.length}`); - } - - // ── 7. Shutdown ─────────────────────────────────────────────────────── - console.log('\n6. Graceful shutdown'); - const shutdownRes = await worker.shutdown(); - assert(shutdownRes.type === 'shutdown_ack', 'Shutdown acknowledged'); - - await new Promise(r => setTimeout(r, 500)); - assert(worker.process.exitCode === 0, `Worker exited with code 0 (got ${worker.process.exitCode})`); - - // ── Summary ─────────────────────────────────────────────────────────── - console.log(`\n────────────────────────────────`); - console.log(` Passed: ${passed} Failed: ${failed}`); - console.log(`────────────────────────────────\n`); - - process.exit(failed > 0 ? 1 : 0); -} - -run().catch((err) => { - console.error('Test runner error:', err); - process.exit(1); -}); diff --git a/packages/media/cpp/orchestrator/test-media.mjs b/packages/media/cpp/orchestrator/test-media.mjs index 478295de..bf0446d7 100644 --- a/packages/media/cpp/orchestrator/test-media.mjs +++ b/packages/media/cpp/orchestrator/test-media.mjs @@ -9,19 +9,32 @@ * npm run test:media -- --ipc-only * npm run test:media -- --templates-only * npm run test:media -- --glob-batch-only + * npm run test:media:glob:raw (ARW under tests/assets/raw; skips if folder missing or empty) * npm run test:media:url (HTTP URL inputs — needs network) + * npm run test:media:multipart (multipart upload → image body only) * * Fixtures: tests/assets (run `node tests/assets/build-fixtures.mjs` if missing). * + * Each run writes **tests/test-report-last.md** (markdown: summary, per-suite timings, step ms). + * * Env: * MEDIA_IMG_TEST_UNIX — Unix socket path for IPC UDS test (default /tmp/media-img-test.sock) */ import { spawn, spawnSync } from 'node:child_process'; -import { existsSync, mkdtempSync, rmSync, unlinkSync } from 'node:fs'; +import { + existsSync, + mkdirSync, + mkdtempSync, + readdirSync, + readFileSync, + rmSync, + unlinkSync, + writeFileSync, +} from 'node:fs'; import net from 'node:net'; import { tmpdir } from 'node:os'; -import { dirname, join, resolve } from 'node:path'; +import { basename, dirname, join, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; import { @@ -33,8 +46,18 @@ import { } from './media-presets.js'; import { requestLineJson, connectTcp, connectUnix } from './media-line-ipc.js'; import { probeTcpPort, createAssert, pipeWorkerStderr } from './test-commons.js'; +import { + buildMetricsBundle, + createMetricsCollector, + describePngFile, + fileByteSize, + pngDimensionsFromBuffer, + renderMarkdownReport, +} from './reports.js'; const __dirname = dirname(fileURLToPath(import.meta.url)); +/** Last run markdown report (overwritten each invocation). */ +const TEST_REPORT_PATH = join(__dirname, '..', 'tests', 'test-report-last.md'); const EXE = mediaExePath(__dirname); const stats = createAssert(); @@ -44,7 +67,9 @@ const restOnly = process.argv.includes('--rest-only'); const ipcOnly = process.argv.includes('--ipc-only'); const templatesOnly = process.argv.includes('--templates-only'); const globBatchOnly = process.argv.includes('--glob-batch-only'); +const globRaw = process.argv.includes('--glob-raw'); const urlOnly = process.argv.includes('--url-only'); +const multipartOnly = process.argv.includes('--multipart-only'); function getFreePort() { return new Promise((resolvePort, reject) => { @@ -65,7 +90,318 @@ async function waitListen(host, port, label) { throw new Error(`${label}: nothing listening on ${host}:${port}`); } -async function suiteRest(assetsDir) { +function createTestReport() { + return { + meta: {}, + notes: [], + suites: [], + images: [], + _cur: null, + note(text) { + this.notes.push(text); + }, + addImage(row) { + this.images.push(row); + }, + beginSuite(name) { + if (this._cur) this.endSuite(); + this._cur = { name, steps: [], t0: performance.now() }; + }, + endSuite() { + if (!this._cur) return; + this._cur.totalMs = performance.now() - this._cur.t0; + this.suites.push(this._cur); + this._cur = null; + }, + step(label, ms, detail = '') { + if (!this._cur) return; + this._cur.steps.push({ + label, + ms: Math.round(ms * 100) / 100, + detail: detail || '', + }); + }, + finalize(stats, wallMs, exe, assetsDir, extra = {}) { + const prevAbort = this.meta.abortReason; + const prevErr = this.meta.uncaughtError; + this.meta = { + generatedAt: new Date().toISOString(), + node: process.version, + platform: process.platform, + arch: process.arch, + cwd: process.cwd(), + argv: process.argv.slice(2), + exe, + assetsDir: assetsDir || '', + passed: stats.passed, + failed: stats.failed, + wallClockMs: Math.round(wallMs * 100) / 100, + ...(prevAbort ? { abortReason: prevAbort } : {}), + ...(prevErr ? { uncaughtError: prevErr } : {}), + ...extra, + }; + if (this._cur) this.endSuite(); + }, + }; +} + +/** Record main fixture PNGs (bytes + pixel size from IHDR). */ +function registerFixtureImages(rep, assetsDir) { + const entries = [ + ['fixture square-64.png', join(assetsDir, 'square-64.png')], + ['fixture checker-128x128.png', join(assetsDir, 'checker-128x128.png')], + ['fixture glob-in/root.png', join(assetsDir, 'glob-in', 'root.png')], + ['fixture glob-in/sub/leaf.png', join(assetsDir, 'glob-in', 'sub', 'leaf.png')], + ]; + for (const [label, p] of entries) { + if (!existsSync(p)) continue; + const d = describePngFile(p); + rep.addImage({ + label, + bytes: d.bytes, + widthPx: d.widthPx, + heightPx: d.heightPx, + note: 'on-disk fixture', + }); + } +} + +function timeSync(rep, label, fn, detailFn) { + const t0 = performance.now(); + const result = fn(); + const ms = performance.now() - t0; + rep.step(label, ms, detailFn ? detailFn(result) : ''); + return result; +} + +async function timeAsync(rep, label, fn, detailFn) { + const t0 = performance.now(); + const result = await fn(); + const ms = performance.now() - t0; + rep.step(label, ms, detailFn ? detailFn(result) : ''); + return result; +} + +function writeTestReportFile(rep, metricsCollector, startedAtIso) { + mkdirSync(dirname(TEST_REPORT_PATH), { recursive: true }); + const finishedAtIso = new Date().toISOString(); + const metrics = buildMetricsBundle(metricsCollector, startedAtIso, finishedAtIso); + const failed = rep.meta.failed ?? 0; + const ok = + failed === 0 && !rep.meta.abortReason && !rep.meta.uncaughtError; + let md = renderMarkdownReport({ + ok, + passed: rep.meta.passed, + failed, + abortReason: rep.meta.abortReason, + uncaughtError: rep.meta.uncaughtError, + error: rep.meta.uncaughtError, + meta: { + cwd: process.cwd(), + displayName: 'media-img integration', + testName: 'media-img-integration', + writtenAt: finishedAtIso, + generatedAt: rep.meta.generatedAt, + exe: rep.meta.exe, + assetsDir: rep.meta.assetsDir, + argv: Array.isArray(rep.meta.argv) ? rep.meta.argv.join(' ') : String(rep.meta.argv ?? ''), + wallClockMs: rep.meta.wallClockMs, + }, + metrics, + images: rep.images, + mediaSuites: rep.suites, + integrationNotes: rep.notes, + }); + md += `\n---\n\n*Artifact: \`tests/test-report-last.md\` — overwritten on each test run.*\n`; + writeFileSync(TEST_REPORT_PATH, md, 'utf8'); +} + +/** Multipart POST /v1/resize: image bytes in response (not JSON). */ +async function multipartResizeTests(base, inPng, rep) { + const pngBytes = readFileSync(inPng); + const srcDim = pngDimensionsFromBuffer(pngBytes); + rep.addImage({ + label: 'multipart upload source (PNG body in form)', + bytes: pngBytes.length, + widthPx: srcDim?.width ?? null, + heightPx: srcDim?.height ?? null, + note: 'fixture bytes attached to each multipart request', + }); + const blob = () => new Blob([pngBytes], { type: 'image/png' }); + + const form = new FormData(); + form.append('file', blob(), 'square-64.png'); + form.append('max_width', '32'); + form.append('max_height', '32'); + const r1 = await timeAsync( + rep, + 'multipart POST (file → jpeg)', + () => + fetch(`${base}/v1/resize`, { + method: 'POST', + body: form, + signal: AbortSignal.timeout(timeouts.httpMs), + }), + (res) => `HTTP ${res.status}, ${res.headers.get('content-type') ?? ''}`, + ); + assert(r1.ok, 'multipart: field file'); + assert(r1.headers.get('content-type') === 'image/jpeg', 'multipart default format → image/jpeg'); + { + const ab = await r1.arrayBuffer(); + rep.addImage({ + label: 'multipart HTTP response (→ jpeg)', + bytes: ab.byteLength, + contentType: r1.headers.get('content-type') ?? '', + note: 'resized output body', + }); + assert(Buffer.from(ab).length > 0, 'multipart file: non-empty body'); + } + + const fImage = new FormData(); + fImage.append('image', blob(), 'x.png'); + fImage.append('max_width', '24'); + fImage.append('format', 'webp'); + const r2 = await timeAsync( + rep, + 'multipart POST (image → webp)', + () => + fetch(`${base}/v1/resize`, { + method: 'POST', + body: fImage, + signal: AbortSignal.timeout(timeouts.httpMs), + }), + (res) => `HTTP ${res.status}, ${res.headers.get('content-type') ?? ''}`, + ); + assert(r2.ok, 'multipart: field image + format webp'); + assert(r2.headers.get('content-type') === 'image/webp', 'multipart webp → image/webp'); + { + const ab = await r2.arrayBuffer(); + rep.addImage({ + label: 'multipart HTTP response (→ webp)', + bytes: ab.byteLength, + contentType: r2.headers.get('content-type') ?? '', + note: 'resized output body', + }); + assert(Buffer.from(ab).byteLength > 8, 'multipart webp: RIFF/WebP header size'); + } + + const fUpload = new FormData(); + fUpload.append('upload', blob(), 'up.png'); + fUpload.append('max_width', '20'); + const r3 = await timeAsync( + rep, + 'multipart POST (upload alias → jpeg)', + () => + fetch(`${base}/v1/resize`, { + method: 'POST', + body: fUpload, + signal: AbortSignal.timeout(timeouts.httpMs), + }), + (res) => `HTTP ${res.status}, ${res.headers.get('content-type') ?? ''}`, + ); + assert(r3.ok, 'multipart: field upload'); + assert(r3.headers.get('content-type') === 'image/jpeg', 'multipart upload alias → jpeg'); + { + const ab = await r3.arrayBuffer(); + rep.addImage({ + label: 'multipart HTTP response (upload field → jpeg)', + bytes: ab.byteLength, + contentType: r3.headers.get('content-type') ?? '', + note: 'resized output body', + }); + assert(Buffer.from(ab).length > 0, 'multipart upload: non-empty body'); + } + + const fPng = new FormData(); + fPng.append('file', blob(), 'square-64.png'); + fPng.append('max_width', '16'); + fPng.append('format', 'png'); + const r4 = await timeAsync( + rep, + 'multipart POST (file → png)', + () => + fetch(`${base}/v1/resize`, { + method: 'POST', + body: fPng, + signal: AbortSignal.timeout(timeouts.httpMs), + }), + (res) => `HTTP ${res.status}, ${res.headers.get('content-type') ?? ''}`, + ); + assert(r4.ok, 'multipart: format png'); + assert(r4.headers.get('content-type') === 'image/png', 'multipart png → image/png'); + { + const ab = await r4.arrayBuffer(); + const dim = pngDimensionsFromBuffer(Buffer.from(ab)); + rep.addImage({ + label: 'multipart HTTP response (→ png)', + bytes: ab.byteLength, + widthPx: dim?.width ?? null, + heightPx: dim?.height ?? null, + contentType: r4.headers.get('content-type') ?? '', + note: 'resized output body', + }); + } + + const noFile = new FormData(); + noFile.append('max_width', '10'); + const r5 = await timeAsync( + rep, + 'multipart POST (no file → 400)', + () => + fetch(`${base}/v1/resize`, { + method: 'POST', + body: noFile, + signal: AbortSignal.timeout(timeouts.httpMs), + }), + (res) => `HTTP ${res.status}`, + ); + assert(r5.status === 400, 'multipart without image → 400'); + const errText = await r5.text(); + rep.addImage({ + label: 'multipart HTTP 400 error body', + bytes: Buffer.byteLength(errText, 'utf8'), + contentType: r5.headers.get('content-type') ?? '', + note: 'JSON error', + }); + const jErr = JSON.parse(errText); + assert(jErr?.error && typeof jErr.error === 'string', 'multipart 400 JSON error body'); +} + +async function suiteMultipartOnly(assetsDir, rep) { + console.log('\n── REST: multipart POST /v1/resize only ──\n'); + + const inPng = resolve(assetsDir, 'square-64.png'); + assert(existsSync(inPng), `fixture ${inPng}`); + + const port = await getFreePort(); + const proc = spawn(EXE, ['serve', '--host', '127.0.0.1', '--port', String(port)], { + stdio: ['ignore', 'pipe', 'pipe'], + }); + pipeWorkerStderr(proc, '[media-img:serve:multipart]'); + + rep.beginSuite('REST: multipart POST /v1/resize only'); + try { + await timeAsync(rep, 'wait until HTTP server accepts', () => waitListen('127.0.0.1', port, 'serve'), () => `127.0.0.1:${port}`); + const base = `http://127.0.0.1:${port}`; + const h = await timeAsync( + rep, + 'GET /health', + () => fetch(`${base}/health`, { signal: AbortSignal.timeout(timeouts.httpMs) }), + (res) => `HTTP ${res.status}`, + ); + assert(h.ok, 'GET /health ok'); + const hj = await h.json(); + assert(hj?.ok === true && hj?.service === 'media-img', 'GET /health JSON'); + + await multipartResizeTests(base, inPng, rep); + } finally { + rep.endSuite(); + proc.kill(); + await new Promise((r) => setTimeout(r, 150)); + } +} + +async function suiteRest(assetsDir, rep) { console.log('\n── REST (media-img serve) ──\n'); const inPng = resolve(assetsDir, 'square-64.png'); @@ -77,64 +413,112 @@ async function suiteRest(assetsDir) { }); pipeWorkerStderr(proc, '[media-img:serve]'); + rep.beginSuite('REST (media-img serve)'); try { - await waitListen('127.0.0.1', port, 'serve'); + await timeAsync(rep, 'wait until HTTP server accepts', () => waitListen('127.0.0.1', port, 'serve'), () => `127.0.0.1:${port}`); const base = `http://127.0.0.1:${port}`; - const h = await fetch(`${base}/health`, { signal: AbortSignal.timeout(timeouts.httpMs) }); + const h = await timeAsync( + rep, + 'GET /health', + () => fetch(`${base}/health`, { signal: AbortSignal.timeout(timeouts.httpMs) }), + (res) => `HTTP ${res.status}`, + ); assert(h.ok, 'GET /health ok'); const hj = await h.json(); assert(hj?.ok === true && hj?.service === 'media-img', 'GET /health JSON'); const outDir = mkdtempSync(join(tmpdir(), 'media-rest-')); const outPng = join(outDir, 'out-32.png'); - const r1 = await fetch(`${base}/v1/resize`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - input: inPng, - output: outPng, - max_width: 32, - max_height: 32, - }), - signal: AbortSignal.timeout(timeouts.httpMs), - }); + const r1 = await timeAsync( + rep, + 'POST /v1/resize JSON → PNG on disk', + () => + fetch(`${base}/v1/resize`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + input: inPng, + output: outPng, + max_width: 32, + max_height: 32, + }), + signal: AbortSignal.timeout(timeouts.httpMs), + }), + (res) => `HTTP ${res.status}`, + ); assert(r1.ok, 'POST /v1/resize ok'); const j1 = await r1.json(); assert(j1?.ok === true, 'resize response ok'); assert(existsSync(outPng), 'output png exists'); + { + const d = describePngFile(outPng); + rep.addImage({ + label: 'REST JSON → disk (out-32.png)', + bytes: d.bytes, + widthPx: d.widthPx, + heightPx: d.heightPx, + note: 'server wrote from JSON resize', + }); + } const outJpg = join(outDir, 'out.jpg'); - const r2 = await fetch(`${base}/v1/resize`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - input: inPng, - output: outJpg, - max_width: 48, - format: 'jpeg', - }), - signal: AbortSignal.timeout(timeouts.httpMs), - }); + const r2 = await timeAsync( + rep, + 'POST /v1/resize JSON → JPEG on disk', + () => + fetch(`${base}/v1/resize`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + input: inPng, + output: outJpg, + max_width: 48, + format: 'jpeg', + }), + signal: AbortSignal.timeout(timeouts.httpMs), + }), + (res) => `HTTP ${res.status}`, + ); assert(r2.ok, 'POST /v1/resize jpeg'); assert(existsSync(outJpg), 'output jpg exists'); + { + const b = fileByteSize(outJpg); + if (b != null) { + rep.addImage({ + label: 'REST JSON → disk (out.jpg)', + bytes: b, + contentType: 'image/jpeg', + note: 'server wrote from JSON resize', + }); + } + } - const bad = await fetch(`${base}/v1/resize`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ input: '/nope/nope.png', output: join(outDir, 'x.png') }), - signal: AbortSignal.timeout(timeouts.httpMs), - }); + await multipartResizeTests(base, inPng, rep); + + const bad = await timeAsync( + rep, + 'POST /v1/resize JSON missing input file → 500', + () => + fetch(`${base}/v1/resize`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ input: '/nope/nope.png', output: join(outDir, 'x.png') }), + signal: AbortSignal.timeout(timeouts.httpMs), + }), + (res) => `HTTP ${res.status}`, + ); assert(bad.status === 500, 'POST /v1/resize missing file → 500'); rmSync(outDir, { recursive: true, force: true }); } finally { + rep.endSuite(); proc.kill(); await new Promise((r) => setTimeout(r, 150)); } } -async function suiteDstTemplateRest(assetsDir) { +async function suiteDstTemplateRest(assetsDir, rep) { console.log('\n── REST: dst path templates (${SRC_DIR}, ${SRC_NAME}, …) ──\n'); const inPng = resolve(assetsDir, 'square-64.png'); @@ -146,23 +530,30 @@ async function suiteDstTemplateRest(assetsDir) { }); pipeWorkerStderr(proc, '[media-img:serve:tpl]'); + rep.beginSuite('REST: dst path templates (${SRC_DIR}, ${SRC_NAME}, …)'); try { - await waitListen('127.0.0.1', port, 'serve'); + await timeAsync(rep, 'wait until HTTP server accepts', () => waitListen('127.0.0.1', port, 'serve'), () => `port ${port}`); const base = `http://127.0.0.1:${port}`; const outDir = mkdtempSync(join(tmpdir(), 'media-dst-rest-')); const outPattern = join(outDir, '${SRC_NAME}_thumb.webp'); - const rt = await fetch(`${base}/v1/resize`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - input: inPng, - output: outPattern, - max_width: 24, - format: 'webp', - }), - signal: AbortSignal.timeout(timeouts.httpMs), - }); + const rt = await timeAsync( + rep, + 'POST ${SRC_NAME}_thumb.webp template', + () => + fetch(`${base}/v1/resize`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + input: inPng, + output: outPattern, + max_width: 24, + format: 'webp', + }), + signal: AbortSignal.timeout(timeouts.httpMs), + }), + (res) => `HTTP ${res.status}`, + ); assert(rt.ok, 'POST /v1/resize template ok'); const jt = await rt.json(); assert(jt?.ok === true, 'template resize JSON ok'); @@ -170,48 +561,66 @@ async function suiteDstTemplateRest(assetsDir) { assert(existsSync(expectedWebp), `expected ${expectedWebp}`); const outAmp = join(outDir, '&{SRC_NAME}_tiny.png'); - const r2 = await fetch(`${base}/v1/resize`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - input: inPng, - output: outAmp, - expand_glob: false, - max_width: 16, - }), - signal: AbortSignal.timeout(timeouts.httpMs), - }); + const r2 = await timeAsync( + rep, + 'POST &{SRC_NAME} + expand_glob false', + () => + fetch(`${base}/v1/resize`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + input: inPng, + output: outAmp, + expand_glob: false, + max_width: 16, + }), + signal: AbortSignal.timeout(timeouts.httpMs), + }), + (res) => `HTTP ${res.status}`, + ); assert(r2.ok, 'template + expand_glob false'); assert(existsSync(join(outDir, 'square-64_tiny.png')), 'ampersand template output'); const subDir = join(assetsDir, 'tpl-sub'); const outNested = join(subDir, '${SRC_NAME}_nested.png'); - const rn = await fetch(`${base}/v1/resize`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - input: inPng, - output: outNested, - max_width: 12, - }), - signal: AbortSignal.timeout(timeouts.httpMs), - }); + const rn = await timeAsync( + rep, + 'POST nested ${SRC_NAME} template', + () => + fetch(`${base}/v1/resize`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + input: inPng, + output: outNested, + max_width: 12, + }), + signal: AbortSignal.timeout(timeouts.httpMs), + }), + (res) => `HTTP ${res.status}`, + ); assert(rn.ok, 'POST nested subdir + ${SRC_NAME}'); const expectedNested = join(subDir, 'square-64_nested.png'); assert(existsSync(expectedNested), `nested template ${expectedNested}`); const outViaSrcDir = '${SRC_DIR}/tpl-from-srcdir/${SRC_NAME}_sd.webp'; - const rsd = await fetch(`${base}/v1/resize`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - input: inPng, - output: outViaSrcDir, - max_width: 10, - format: 'webp', - }), - signal: AbortSignal.timeout(timeouts.httpMs), - }); + const rsd = await timeAsync( + rep, + 'POST ${SRC_DIR} in output path', + () => + fetch(`${base}/v1/resize`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + input: inPng, + output: outViaSrcDir, + max_width: 10, + format: 'webp', + }), + signal: AbortSignal.timeout(timeouts.httpMs), + }), + (res) => `HTTP ${res.status}`, + ); assert(rsd.ok, 'POST ${SRC_DIR} in output path'); const fromSrcDir = join(assetsDir, 'tpl-from-srcdir', 'square-64_sd.webp'); assert(existsSync(fromSrcDir), `expected ${fromSrcDir}`); @@ -220,12 +629,13 @@ async function suiteDstTemplateRest(assetsDir) { rmSync(subDir, { recursive: true, force: true }); rmSync(join(assetsDir, 'tpl-from-srcdir'), { recursive: true, force: true }); } finally { + rep.endSuite(); proc.kill(); await new Promise((r) => setTimeout(r, 150)); } } -async function suiteIpcTcp(assetsDir) { +async function suiteIpcTcp(assetsDir, rep) { console.log('\n── IPC TCP (media-img ipc --host --port) ──\n'); const inPng = resolve(assetsDir, 'square-64.png'); @@ -237,44 +647,64 @@ async function suiteIpcTcp(assetsDir) { }); pipeWorkerStderr(proc, '[media-img:ipc]'); + rep.beginSuite('IPC TCP (media-img ipc --host --port)'); try { - await waitListen('127.0.0.1', port, 'ipc'); + await timeAsync(rep, 'wait until IPC TCP accepts', () => waitListen('127.0.0.1', port, 'ipc'), () => `port ${port}`); const outDir = mkdtempSync(join(tmpdir(), 'media-ipc-tcp-')); const outPng = join(outDir, 'ipc-out.png'); - const sock = await connectTcp('127.0.0.1', port); - const res = await requestLineJson( - sock, - { - input: inPng, - output: outPng, - max_width: 32, - max_height: 32, - }, - timeouts.ipcReadMs, + const sock = await timeAsync(rep, 'TCP connect (line 1)', () => connectTcp('127.0.0.1', port), () => ''); + const res = await timeAsync( + rep, + 'IPC JSON line (ok resize)', + () => + requestLineJson( + sock, + { + input: inPng, + output: outPng, + max_width: 32, + max_height: 32, + }, + timeouts.ipcReadMs, + ), + (r) => (r && typeof r === 'object' ? `ok=${r.ok}` : ''), ); sock.destroy(); assert(res?.ok === true, 'IPC line JSON ok'); assert(existsSync(outPng), 'IPC output file exists'); + { + const d = describePngFile(outPng); + rep.addImage({ + label: 'IPC TCP → disk (ipc-out.png)', + bytes: d.bytes, + widthPx: d.widthPx, + heightPx: d.heightPx, + note: 'line-JSON resize', + }); + } - const sock2 = await connectTcp('127.0.0.1', port); - const res2 = await requestLineJson( - sock2, - { input: '/not/found.png', output: join(outDir, 'bad.png') }, - timeouts.ipcReadMs, + const sock2 = await timeAsync(rep, 'TCP connect (line 2)', () => connectTcp('127.0.0.1', port), () => ''); + const res2 = await timeAsync( + rep, + 'IPC JSON line (missing input)', + () => + requestLineJson(sock2, { input: '/not/found.png', output: join(outDir, 'bad.png') }, timeouts.ipcReadMs), + (r) => (r && typeof r === 'object' ? `ok=${r.ok}` : ''), ); sock2.destroy(); assert(res2?.ok === false, 'IPC error path ok=false'); rmSync(outDir, { recursive: true, force: true }); } finally { + rep.endSuite(); proc.kill(); await new Promise((r) => setTimeout(r, 150)); } } -async function suiteDstTemplateIpcTcp(assetsDir) { +async function suiteDstTemplateIpcTcp(assetsDir, rep) { console.log('\n── IPC TCP: dst templates ──\n'); const inPng = resolve(assetsDir, 'square-64.png'); @@ -286,21 +716,28 @@ async function suiteDstTemplateIpcTcp(assetsDir) { }); pipeWorkerStderr(proc, '[media-img:ipc:tpl]'); + rep.beginSuite('IPC TCP: dst templates'); try { - await waitListen('127.0.0.1', port, 'ipc'); + await timeAsync(rep, 'wait until IPC TCP accepts', () => waitListen('127.0.0.1', port, 'ipc'), () => `port ${port}`); const outDir = mkdtempSync(join(tmpdir(), 'media-dst-ipc-')); const outPattern = join(outDir, '${SRC_NAME}_ipc.webp'); - const sock = await connectTcp('127.0.0.1', port); - const res = await requestLineJson( - sock, - { - input: inPng, - output: outPattern, - max_width: 20, - format: 'webp', - }, - timeouts.ipcReadMs, + const sock = await timeAsync(rep, 'TCP connect', () => connectTcp('127.0.0.1', port), () => ''); + const res = await timeAsync( + rep, + 'IPC JSON line (${SRC_NAME}_ipc.webp)', + () => + requestLineJson( + sock, + { + input: inPng, + output: outPattern, + max_width: 20, + format: 'webp', + }, + timeouts.ipcReadMs, + ), + (r) => (r && typeof r === 'object' ? `ok=${r.ok}` : ''), ); sock.destroy(); assert(res?.ok === true, 'IPC template ok'); @@ -308,12 +745,13 @@ async function suiteDstTemplateIpcTcp(assetsDir) { rmSync(outDir, { recursive: true, force: true }); } finally { + rep.endSuite(); proc.kill(); await new Promise((r) => setTimeout(r, 150)); } } -function suiteDstTemplateCli(assetsDir) { +function suiteDstTemplateCli(assetsDir, rep) { console.log('\n── CLI: resize --src / --dst templates ──\n'); const inPng = resolve(assetsDir, 'square-64.png'); @@ -322,27 +760,31 @@ function suiteDstTemplateCli(assetsDir) { const outDir = mkdtempSync(join(tmpdir(), 'media-dst-cli-')); const dst = join(outDir, '&{SRC_NAME}_cli.jpg'); - const r = spawnSync( - EXE, - ['resize', '--src', inPng, '--dst', dst, '--max-width', '18', '--format', 'jpeg'], - { encoding: 'utf8' }, - ); - assert(r.status === 0, `CLI template exit 0, stderr: ${r.stderr}`); - assert(existsSync(join(outDir, 'square-64_cli.jpg')), 'CLI template output'); + rep.beginSuite('CLI: resize --src / --dst templates'); + try { + const r = timeSync( + rep, + 'spawnSync resize (template dst)', + () => + spawnSync(EXE, ['resize', '--src', inPng, '--dst', dst, '--max-width', '18', '--format', 'jpeg'], { + encoding: 'utf8', + }), + (x) => `exit ${x.status}`, + ); + assert(r.status === 0, `CLI template exit 0, stderr: ${r.stderr}`); + assert(existsSync(join(outDir, 'square-64_cli.jpg')), 'CLI template output'); - rmSync(outDir, { recursive: true, force: true }); + rmSync(outDir, { recursive: true, force: true }); + } finally { + rep.endSuite(); + } } -/** - * Recursive glob under tests/assets/glob-in, dst `${SRC_DIR}/out/${SRC_NAME}_medium.jpg` - * (TS-style `.+(jpg)` / bare `{SRC}` are not supported — use `_medium.jpg` and `${SRC_*}`). - * Does not delete outputs (see tests/assets/.gitignore); inspect on disk after the run. - */ /** * HTTPS fetch + default output basename under cwd (picsum → 200.jpg, 1600.jpg). * Requires network; can be slow. */ -function suiteUrlResizeCli() { +function suiteUrlResizeCli(rep) { console.log('\n── CLI: resize https://picsum.photos (default cwd output) ──\n'); const tmp = mkdtempSync(join(tmpdir(), 'media-url-')); @@ -351,6 +793,7 @@ function suiteUrlResizeCli() { { url: 'https://picsum.photos/1600', expect: '1600.jpg' }, ]; + rep.beginSuite('CLI: resize HTTPS URL (picsum.photos)'); try { for (const { url, expect } of cases) { const outPath = join(tmp, expect); @@ -361,34 +804,32 @@ function suiteUrlResizeCli() { /* ignore */ } } - const r = spawnSync( - EXE, - [ - 'resize', - url, - '--max-width', - '64', - '--max-height', - '64', - '--no-cache', - '--url-timeout', - '45', - ], - { - cwd: tmp, - encoding: 'utf8', - timeout: 120_000, - }, + const r = timeSync( + rep, + `spawnSync resize URL → ${expect}`, + () => + spawnSync( + EXE, + ['resize', url, '--max-width', '64', '--max-height', '64', '--no-cache', '--url-timeout', '45'], + { + cwd: tmp, + encoding: 'utf8', + timeout: 120_000, + }, + ), + (x) => `exit ${x.status}, network+libvips`, ); assert(r.status === 0, `resize URL exit 0 (${expect}): ${r.stderr || r.stdout}`); assert(existsSync(outPath), `expected output ${outPath}`); } } finally { + rep.endSuite(); rmSync(tmp, { recursive: true, force: true }); } } -function suiteGlobBatchCli(assetsDir) { +/** Recursive glob under tests/assets/glob-in; outputs kept for manual inspection (see tests/assets/.gitignore). */ +function suiteGlobBatchCli(assetsDir, rep) { console.log('\n── CLI: **/*.png glob + ${SRC_DIR}/out/${SRC_NAME}_medium.jpg ──\n'); console.log(' (outputs under glob-in/**/out/ are kept for manual verification)\n'); @@ -400,20 +841,97 @@ function suiteGlobBatchCli(assetsDir) { const globIn = join(assetsDir, 'glob-in', '**', '*.png').replace(/\\/g, '/'); const dstTmpl = '${SRC_DIR}/out/${SRC_NAME}_medium.jpg'; - const r = spawnSync( - EXE, - ['resize', '--src', globIn, '--dst', dstTmpl, '--max-width', '40', '--format', 'jpeg'], - { encoding: 'utf8' }, - ); - assert(r.status === 0, `glob batch exit 0, stderr: ${r.stderr}`); + rep.beginSuite('CLI: recursive glob batch + dst templates'); + try { + const r = timeSync( + rep, + 'spawnSync resize (glob **/*.png → _medium.jpg)', + () => + spawnSync(EXE, ['resize', '--src', globIn, '--dst', dstTmpl, '--max-width', '40', '--format', 'jpeg'], { + encoding: 'utf8', + }), + (x) => `exit ${x.status}, 2 files`, + ); + assert(r.status === 0, `glob batch exit 0, stderr: ${r.stderr}`); - const rootOut = join(assetsDir, 'glob-in', 'out', 'root_medium.jpg'); - const leafOut = join(assetsDir, 'glob-in', 'sub', 'out', 'leaf_medium.jpg'); - assert(existsSync(rootOut), `expected ${rootOut}`); - assert(existsSync(leafOut), `expected ${leafOut}`); + const rootOut = join(assetsDir, 'glob-in', 'out', 'root_medium.jpg'); + const leafOut = join(assetsDir, 'glob-in', 'sub', 'out', 'leaf_medium.jpg'); + assert(existsSync(rootOut), `expected ${rootOut}`); + assert(existsSync(leafOut), `expected ${leafOut}`); + } finally { + rep.endSuite(); + } } -async function suiteIpcUnix(assetsDir) { +function collectArwPathsRecursive(rawDir) { + const out = []; + function walk(d) { + let entries; + try { + entries = readdirSync(d, { withFileTypes: true }); + } catch { + return; + } + for (const ent of entries) { + const p = join(d, ent.name); + if (ent.isDirectory()) { + if (ent.name === 'out') continue; + walk(p); + } else if (/\.arw$/i.test(ent.name)) out.push(p); + } + } + walk(rawDir); + return out; +} + +/** Recursive glob under tests/assets/raw for *.arw (user-supplied; gitignored). */ +function suiteGlobBatchRawArw(assetsDir, rep) { + const rawRoot = join(assetsDir, 'raw'); + console.log('\n── CLI: **/*.arw glob (tests/assets/raw) + ${SRC_DIR}/out/${SRC_NAME}_medium.jpg ──\n'); + console.log(' (outputs under raw/**/out/ are kept for manual verification)\n'); + + if (!existsSync(rawRoot)) { + console.log(' (skip: tests/assets/raw does not exist — create it and add .arw files)\n'); + rep.note('CLI glob batch (raw ARW): skipped (tests/assets/raw missing)'); + return; + } + + const arwFiles = collectArwPathsRecursive(rawRoot); + if (arwFiles.length === 0) { + console.log(' (skip: no .arw files under tests/assets/raw)\n'); + rep.note('CLI glob batch (raw ARW): skipped (no .arw files)'); + return; + } + + // Explicit --src list: recursive *.arw glob is case-sensitive; enumerate paths so .ARW matches. + const absSrc = arwFiles.map((p) => resolve(p).replace(/\\/g, '/')); + const srcArgs = absSrc.flatMap((p) => ['--src', p]); + const dstTmpl = '${SRC_DIR}/out/${SRC_NAME}_medium.jpg'; + + rep.beginSuite('CLI: recursive glob batch (raw **/*.arw) + dst templates'); + try { + const r = timeSync( + rep, + `spawnSync resize (${arwFiles.length}× --src .arw/.ARW → _medium.jpg)`, + () => + spawnSync(EXE, ['resize', ...srcArgs, '--dst', dstTmpl, '--max-width', '40', '--format', 'jpeg'], { + encoding: 'utf8', + }), + (x) => `exit ${x.status}, ${arwFiles.length} file(s)`, + ); + assert(r.status === 0, `glob batch raw exit 0, stderr: ${r.stderr}`); + + for (const arwPath of arwFiles) { + const stem = basename(arwPath).replace(/\.arw$/i, ''); + const expected = join(dirname(arwPath), 'out', `${stem}_medium.jpg`); + assert(existsSync(expected), `expected ${expected}`); + } + } finally { + rep.endSuite(); + } +} + +async function suiteIpcUnix(assetsDir, rep) { console.log('\n── IPC Unix (media-img ipc --unix) ──\n'); const path = ipcUnixPath(); @@ -436,36 +954,58 @@ async function suiteIpcUnix(assetsDir) { const outDir = mkdtempSync(join(tmpdir(), 'media-ipc-uds-')); const outPng = join(outDir, 'uds-out.png'); + rep.beginSuite('IPC Unix (media-img ipc --unix)'); try { - for (let i = 0; i < timeouts.connectAttempts; i++) { - if (existsSync(path)) break; - await new Promise((r) => setTimeout(r, timeouts.connectRetryMs)); - } - assert(existsSync(path), 'unix socket path exists'); - - let sock; - for (let i = 0; i < timeouts.connectAttempts; i++) { - try { - sock = await connectUnix(path); - break; - } catch { - if (i === timeouts.connectAttempts - 1) throw new Error('connect unix failed'); + await timeAsync(rep, 'wait for UDS path', async () => { + for (let i = 0; i < timeouts.connectAttempts; i++) { + if (existsSync(path)) return; await new Promise((r) => setTimeout(r, timeouts.connectRetryMs)); } - } - const res = await requestLineJson( - sock, - { - input: inPng, - output: outPng, - max_width: 64, + throw new Error('unix socket path did not appear'); + }, () => path); + + const res = await timeAsync( + rep, + 'Unix connect + IPC JSON line', + async () => { + let sock; + for (let i = 0; i < timeouts.connectAttempts; i++) { + try { + sock = await connectUnix(path); + break; + } catch { + if (i === timeouts.connectAttempts - 1) throw new Error('connect unix failed'); + await new Promise((r) => setTimeout(r, timeouts.connectRetryMs)); + } + } + const lineRes = await requestLineJson( + sock, + { + input: inPng, + output: outPng, + max_width: 64, + }, + timeouts.ipcReadMs, + ); + sock.destroy(); + return lineRes; }, - timeouts.ipcReadMs, + (r) => (r && typeof r === 'object' ? `ok=${r.ok}` : ''), ); - sock.destroy(); assert(res?.ok === true, 'UDS line JSON ok'); assert(existsSync(outPng), 'UDS output file exists'); + { + const d = describePngFile(outPng); + rep.addImage({ + label: 'IPC Unix → disk (uds-out.png)', + bytes: d.bytes, + widthPx: d.widthPx, + heightPx: d.heightPx, + note: 'UDS line-JSON resize', + }); + } } finally { + rep.endSuite(); proc.kill(); try { if (existsSync(path)) unlinkSync(path); @@ -478,70 +1018,111 @@ async function suiteIpcUnix(assetsDir) { } async function run() { - const assetsDir = resolve(defaultAssetsDir(__dirname)); + const wallStart = performance.now(); + const rep = createTestReport(); + const metricsCollector = createMetricsCollector(); + const startedAtIso = new Date().toISOString(); + let exitCode = 1; + let assetsDir = ''; - if (!existsSync(EXE)) { - console.error(`Binary not found: ${EXE}`); - process.exit(1); - } + try { + assetsDir = resolve(defaultAssetsDir(__dirname)); - const need = ['square-64.png', 'checker-128x128.png', 'glob-in/root.png', 'glob-in/sub/leaf.png']; - const missing = need.filter((f) => !existsSync(join(assetsDir, f))); - if (missing.length) { - console.error(`Missing fixtures under ${assetsDir}: ${missing.join(', ')}`); - console.error('Run: node tests/assets/build-fixtures.mjs'); - process.exit(1); - } - - console.log(`\nmedia-img integration tests\n binary: ${EXE}\n assets: ${assetsDir}\n`); - - if (templatesOnly) { - await suiteDstTemplateRest(assetsDir); - await suiteDstTemplateIpcTcp(assetsDir); - suiteDstTemplateCli(assetsDir); - console.log(`\nDone (templates only). Passed: ${stats.passed} Failed: ${stats.failed}\n`); - process.exit(stats.failed > 0 ? 1 : 0); - return; - } - - if (globBatchOnly) { - suiteGlobBatchCli(assetsDir); - console.log(`\nDone (glob batch only). Passed: ${stats.passed} Failed: ${stats.failed}\n`); - process.exit(stats.failed > 0 ? 1 : 0); - return; - } - - if (urlOnly) { - suiteUrlResizeCli(); - console.log(`\nDone (URL only). Passed: ${stats.passed} Failed: ${stats.failed}\n`); - process.exit(stats.failed > 0 ? 1 : 0); - return; - } - - const runRest = !ipcOnly; - const runIpc = !restOnly; - - if (runRest) { - await suiteRest(assetsDir); - await suiteDstTemplateRest(assetsDir); - } - if (runIpc) { - await suiteIpcTcp(assetsDir); - await suiteDstTemplateIpcTcp(assetsDir); - if (!platform.isWin) { - await suiteIpcUnix(assetsDir); - } else { - console.log('\n── IPC Unix (media-img ipc --unix) ──\n'); - console.log(' (skipped on Windows — use TCP IPC or run tests on Linux/macOS)\n'); + if (!existsSync(EXE)) { + rep.meta.abortReason = `Binary not found: ${EXE}`; + console.error(rep.meta.abortReason); + return; } - } - if (!ipcOnly) { - suiteDstTemplateCli(assetsDir); - suiteGlobBatchCli(assetsDir); - } - console.log(`\nDone. Passed: ${stats.passed} Failed: ${stats.failed}\n`); - process.exit(stats.failed > 0 ? 1 : 0); + if (!(globBatchOnly && globRaw)) { + const need = ['square-64.png', 'checker-128x128.png', 'glob-in/root.png', 'glob-in/sub/leaf.png']; + const missing = need.filter((f) => !existsSync(join(assetsDir, f))); + if (missing.length) { + rep.meta.abortReason = `Missing fixtures under ${assetsDir}: ${missing.join(', ')} (run: node tests/assets/build-fixtures.mjs)`; + console.error(`Missing fixtures under ${assetsDir}: ${missing.join(', ')}`); + console.error('Run: node tests/assets/build-fixtures.mjs'); + return; + } + } + + console.log(`\nmedia-img integration tests\n binary: ${EXE}\n assets: ${assetsDir}\n`); + + registerFixtureImages(rep, assetsDir); + + if (templatesOnly) { + await suiteDstTemplateRest(assetsDir, rep); + await suiteDstTemplateIpcTcp(assetsDir, rep); + suiteDstTemplateCli(assetsDir, rep); + console.log(`\nDone (templates only). Passed: ${stats.passed} Failed: ${stats.failed}\n`); + exitCode = stats.failed > 0 ? 1 : 0; + return; + } + + if (globBatchOnly) { + if (globRaw) { + suiteGlobBatchRawArw(assetsDir, rep); + console.log(`\nDone (glob batch raw only). Passed: ${stats.passed} Failed: ${stats.failed}\n`); + } else { + suiteGlobBatchCli(assetsDir, rep); + console.log(`\nDone (glob batch only). Passed: ${stats.passed} Failed: ${stats.failed}\n`); + } + exitCode = stats.failed > 0 ? 1 : 0; + return; + } + + if (urlOnly) { + suiteUrlResizeCli(rep); + console.log(`\nDone (URL only). Passed: ${stats.passed} Failed: ${stats.failed}\n`); + exitCode = stats.failed > 0 ? 1 : 0; + return; + } + + if (multipartOnly) { + await suiteMultipartOnly(assetsDir, rep); + console.log(`\nDone (multipart only). Passed: ${stats.passed} Failed: ${stats.failed}\n`); + exitCode = stats.failed > 0 ? 1 : 0; + return; + } + + const runRest = !ipcOnly; + const runIpc = !restOnly; + + if (runRest) { + await suiteRest(assetsDir, rep); + await suiteDstTemplateRest(assetsDir, rep); + } + if (runIpc) { + await suiteIpcTcp(assetsDir, rep); + await suiteDstTemplateIpcTcp(assetsDir, rep); + if (!platform.isWin) { + await suiteIpcUnix(assetsDir, rep); + } else { + console.log('\n── IPC Unix (media-img ipc --unix) ──\n'); + console.log(' (skipped on Windows — use TCP IPC or run tests on Linux/macOS)\n'); + rep.note('IPC Unix suite skipped on this platform (Windows).'); + } + } + if (!ipcOnly) { + suiteDstTemplateCli(assetsDir, rep); + suiteGlobBatchCli(assetsDir, rep); + } + + console.log(`\nDone. Passed: ${stats.passed} Failed: ${stats.failed}\n`); + exitCode = stats.failed > 0 ? 1 : 0; + } catch (e) { + rep.meta.uncaughtError = String(e?.stack || e); + console.error(e); + exitCode = 1; + } finally { + rep.finalize(stats, performance.now() - wallStart, EXE, assetsDir); + try { + writeTestReportFile(rep, metricsCollector, startedAtIso); + console.log(`Test report written: ${TEST_REPORT_PATH}`); + } catch (e) { + console.error('Failed to write test report:', e); + } + process.exit(exitCode); + } } run().catch((e) => { diff --git a/packages/media/cpp/package.json b/packages/media/cpp/package.json index bbea6bc4..9974e393 100644 --- a/packages/media/cpp/package.json +++ b/packages/media/cpp/package.json @@ -12,14 +12,18 @@ "build": "cmake --preset dev && cmake --build --preset dev", "build:release": "cmake --preset release && cmake --build --preset release", "build:installer": "npm run build:release && makensis -V2 installer.nsi", + "release": "npm run build:release && npm run build:installer", "clean": "cmake -E rm -rf build dist", "rebuild": "npm run clean && npm run build", "generate:assets": "node tests/assets/build-fixtures.mjs", "setup:vips": "powershell -ExecutionPolicy Bypass -File scripts/fetch-vips-windows.ps1", + "test:all": "npm run test:media && npm run test:media:templates && npm run test:media:glob && npm run test:media:rest && npm run test:media:multipart && npm run test:media:ipc && npm run test:media:url", "test:media": "node orchestrator/test-media.mjs", "test:media:templates": "node orchestrator/test-media.mjs --templates-only", "test:media:glob": "node orchestrator/test-media.mjs --glob-batch-only", + "test:media:glob:raw": "node orchestrator/test-media.mjs --glob-batch-only --glob-raw", "test:media:rest": "node orchestrator/test-media.mjs --rest-only", + "test:media:multipart": "node orchestrator/test-media.mjs --multipart-only", "test:media:ipc": "node orchestrator/test-media.mjs --ipc-only", "test:media:url": "node orchestrator/test-media.mjs --url-only", "run": "node scripts/invoke-media-img.mjs --help", diff --git a/packages/media/cpp/src/http/serve.cpp b/packages/media/cpp/src/http/serve.cpp index 87240765..953c6e9f 100644 --- a/packages/media/cpp/src/http/serve.cpp +++ b/packages/media/cpp/src/http/serve.cpp @@ -3,13 +3,170 @@ #include #include +#include +#include #include +#include +#include +#include #include "core/glob_paths.hpp" #include "core/resize.hpp" +namespace fs = std::filesystem; + namespace media::http { +namespace { + +std::string multipart_field_text(const httplib::Request &req, const std::string &key) { + if (!req.has_file(key)) + return {}; + return req.get_file_value(key).content; +} + +void to_lower_ascii(std::string &s) { + for (char &c : s) { + if (c >= 'A' && c <= 'Z') + c = static_cast(c - 'A' + 'a'); + } +} + +std::string extension_from_filename(const std::string &fn) { + const auto dot = fn.rfind('.'); + if (dot == std::string::npos || dot + 1 >= fn.size()) + return {}; + return fn.substr(dot); +} + +/** Output file extension (with dot) for temp path; default .jpg when format unset. */ +std::string dot_ext_for_format(const std::string &fmt_raw) { + std::string fmt = fmt_raw; + to_lower_ascii(fmt); + if (fmt.empty()) + return ".jpg"; + if (fmt == "jpeg") + return ".jpg"; + return std::string(".") + fmt; +} + +std::string mime_for_format(const std::string &fmt_raw) { + std::string fmt = fmt_raw; + to_lower_ascii(fmt); + if (fmt == "jpg" || fmt == "jpeg") + return "image/jpeg"; + if (fmt == "png") + return "image/png"; + if (fmt == "webp") + return "image/webp"; + if (fmt == "gif") + return "image/gif"; + if (fmt == "avif" || fmt == "heic" || fmt == "heif") + return "image/avif"; + if (fmt == "tif" || fmt == "tiff") + return "image/tiff"; + if (fmt.empty()) + return "image/jpeg"; + return "application/octet-stream"; +} + +nlohmann::json resize_options_json_from_multipart(const httplib::Request &req) { + nlohmann::json j; + auto add_int = [&](const char *key) { + const std::string s = multipart_field_text(req, key); + if (s.empty()) + return; + try { + j[key] = std::stoi(s); + } catch (...) { + } + }; + auto add_str = [&](const char *key) { + const std::string s = multipart_field_text(req, key); + if (!s.empty()) + j[key] = s; + }; + auto add_bool = [&](const char *key) { + const std::string s = multipart_field_text(req, key); + if (s.empty()) + return; + const std::string l = [&] { + std::string x = s; + to_lower_ascii(x); + return x; + }(); + if (l == "1" || l == "true" || l == "yes" || l == "on") + j[key] = true; + else if (l == "0" || l == "false" || l == "no" || l == "off") + j[key] = false; + }; + + add_int("max_width"); + add_int("max_height"); + add_str("format"); + add_str("fit"); + add_str("position"); + add_str("kernel"); + add_int("quality"); + add_int("png_compression"); + add_int("rotate"); + add_str("background"); + add_bool("without_enlargement"); + add_bool("autorotate"); + add_bool("strip_metadata"); + add_bool("flip"); + add_bool("flop"); + return j; +} + +bool pick_multipart_image(const httplib::Request &req, httplib::MultipartFormData &out) { + for (const char *key : {"file", "image", "upload"}) { + if (!req.has_file(key)) + continue; + out = req.get_file_value(key); + if (!out.content.empty()) + return true; + } + static const char *skip[] = {"max_width", "max_height", "format", "fit", "position", + "kernel", "quality", "png_compression", "rotate", "background", + "without_enlargement", "autorotate", "strip_metadata", "flip", "flop"}; + for (const auto &kv : req.files) { + bool is_skip = false; + for (const char *s : skip) { + if (kv.first == s) { + is_skip = true; + break; + } + } + if (is_skip) + continue; + if (!kv.second.content.empty()) { + out = kv.second; + return true; + } + } + return false; +} + +fs::path unique_temp_path(const std::string &suffix) { + std::error_code ec; + fs::path base = fs::temp_directory_path(ec); + if (ec) + return {}; + static std::mutex mtx; + static std::mt19937_64 rng{std::random_device{}()}; + std::lock_guard lock(mtx); + std::uniform_int_distribution dist; + for (int i = 0; i < 64; ++i) { + fs::path p = base / ("pm-image-upload-" + std::to_string(dist(rng)) + suffix); + if (!fs::exists(p, ec)) + return p; + } + return base / ("pm-image-upload-" + std::to_string(dist(rng)) + suffix); +} + +} // namespace + int run_server(const std::string &host, int port, const CacheServerDefaults &cache_defaults) { httplib::Server svr; @@ -18,6 +175,87 @@ int run_server(const std::string &host, int port, const CacheServerDefaults &cac }); svr.Post("/v1/resize", [cache_defaults](const httplib::Request &req, httplib::Response &res) { + if (req.is_multipart_form_data()) { + httplib::MultipartFormData upload; + if (!pick_multipart_image(req, upload)) { + res.status = 400; + res.set_content( + "{\"error\":\"multipart image required; use form field file, image, or upload\"}", + "application/json"); + return; + } + + nlohmann::json jopt = resize_options_json_from_multipart(req); + media::ResizeOptions opt; + media::apply_resize_options_from_json(jopt, opt); + opt.cache_enabled = false; + + std::string in_ext = extension_from_filename(upload.filename); + if (in_ext.empty()) + in_ext = ".bin"; + const fs::path tmp_in = unique_temp_path(in_ext); + const std::string out_ext = dot_ext_for_format(opt.format); + const fs::path tmp_out = unique_temp_path(out_ext); + + if (tmp_in.empty() || tmp_out.empty()) { + res.status = 500; + res.set_content(R"({"error":"temp path failed"})", "application/json"); + return; + } + + { + std::ofstream ofs(tmp_in, std::ios::binary); + if (!ofs || !ofs.write(upload.content.data(), static_cast(upload.content.size())) || + !ofs.flush()) { + std::error_code ec_rm; + fs::remove(tmp_in, ec_rm); + fs::remove(tmp_out, ec_rm); + res.status = 500; + res.set_content(R"({"error":"could not write temp input"})", "application/json"); + return; + } + } + + { + std::string err; + if (!media::resize_file(tmp_in.string(), tmp_out.string(), opt, err)) { + std::error_code ec_rm; + fs::remove(tmp_in, ec_rm); + fs::remove(tmp_out, ec_rm); + res.status = 500; + nlohmann::json je{{"error", err}}; + res.set_content(je.dump(), "application/json"); + return; + } + } + + { + std::error_code ec_rm; + fs::remove(tmp_in, ec_rm); + } + + std::string bytes; + { + std::ifstream ifs(tmp_out, std::ios::binary); + if (!ifs) { + std::error_code ec_rm; + fs::remove(tmp_out, ec_rm); + res.status = 500; + res.set_content(R"({"error":"could not read resized output"})", "application/json"); + return; + } + bytes.assign(std::istreambuf_iterator(ifs), std::istreambuf_iterator()); + } + { + std::error_code ec_rm; + fs::remove(tmp_out, ec_rm); + } + + res.set_header("Content-Disposition", "inline; filename=\"resized" + out_ext + "\""); + res.set_content(std::move(bytes), mime_for_format(opt.format)); + return; + } + nlohmann::json body; try { body = nlohmann::json::parse(req.body.empty() ? "{}" : req.body); diff --git a/packages/media/cpp/tests/assets/raw/.gitignore b/packages/media/cpp/tests/assets/raw/.gitignore new file mode 100644 index 00000000..1194f3aa --- /dev/null +++ b/packages/media/cpp/tests/assets/raw/.gitignore @@ -0,0 +1,4 @@ +# User-supplied Sony RAW samples; glob-batch outputs for manual inspection +*.arw +*.ARW +**/out/ diff --git a/packages/media/cpp/tests/assets/raw/.gitkeep b/packages/media/cpp/tests/assets/raw/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/packages/media/cpp/tests/test-report-last.md b/packages/media/cpp/tests/test-report-last.md new file mode 100644 index 00000000..99c7a218 --- /dev/null +++ b/packages/media/cpp/tests/test-report-last.md @@ -0,0 +1,83 @@ +# Test report: media-img integration + +## Summary + +| Key | Value | +| --- | --- | +| Result | PASS | +| Assertions passed | 4 | +| Assertions failed | 0 | +| CWD | `C:\Users\zx\Desktop\polymech\polymech-mono\packages\media\cpp` | +| Test binary | `C:\Users\zx\Desktop\polymech\polymech-mono\packages\media\cpp\dist\pm-image.exe` | +| Assets dir | `C:\Users\zx\Desktop\polymech\polymech-mono\packages\media\cpp\tests\assets` | +| CLI args | `--url-only` | +| Wall clock (total script) | **1221.57 ms** | + +## Timing + +| Metric | Value | +| --- | --- | +| Started (ISO) | 2026-04-14T11:31:18.200Z | +| Finished (ISO) | 2026-04-14T11:31:19.422Z | +| Wall time (perf) | 1225.109 ms | +| Wall time (clock) | 1225 ms | + +## Process (Node) + +| Metric | Value | +| --- | --- | +| PID | 33980 | +| Node | v24.13.0 | +| process.uptime() | 1.266 s | +| CPU user (process.cpuUsage Δ) | 0.000 ms (0 µs) | +| CPU system (process.cpuUsage Δ) | 0.000 ms (0 µs) | +| CPU user (resourceUsage) | 62.000 ms | +| CPU system (resourceUsage) | 15.000 ms | +| Max RSS (resourceUsage) | 39 MB | +| RSS | 39 MB (40816640 B) | +| Heap used | 6.0 MB | +| Heap total | 11 MB | +| External | 2.2 MB | +| Array buffers | 16 KB | + +## Host + +| Metric | Value | +| --- | --- | +| Hostname | DESKTOP-QH14L5F | +| OS | win32 10.0.18363 | +| Arch | x64 | +| CPUs | 16 | +| CPU model | AMD Ryzen 7 3700X 8-Core Processor | +| RAM total | 64 GB | +| RAM free | 38 GB | +| RAM used | 26 GB | +| Load avg (1/5/15) | 0.00 / 0.00 / 0.00 | +| OS uptime | 123.71 h | + +## Images & transfers + +| Label | Size | Dimensions / detail | +| --- | --- | --- | +| fixture square-64.png | 551 B (551 B) | 64×64 px · on-disk fixture | +| fixture checker-128x128.png | 455 B (455 B) | 128×128 px · on-disk fixture | +| fixture glob-in/root.png | 384 B (384 B) | 48×48 px · on-disk fixture | +| fixture glob-in/sub/leaf.png | 88 B (88 B) | 24×24 px · on-disk fixture | + +## Integration: performance by suite + +### CLI: resize HTTPS URL (picsum.photos) + +- **Suite wall time:** 1216.33 ms + +| Step | ms | Detail | +| --- | ---: | --- | +| spawnSync resize URL → 200.jpg | 251.58 | exit 0, network+libvips | +| spawnSync resize URL → 1600.jpg | 963.61 | exit 0, network+libvips | + +--- +*Written 2026-04-14T11:31:19.422Z* + +--- + +*Artifact: `tests/test-report-last.md` — overwritten on each test run.*