diff --git a/harnesses/gtauri/Cargo.lock b/harnesses/gtauri/Cargo.lock index 6fcee0f..f1b5365 100644 --- a/harnesses/gtauri/Cargo.lock +++ b/harnesses/gtauri/Cargo.lock @@ -790,6 +790,16 @@ dependencies = [ "typeid", ] +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -1223,6 +1233,7 @@ dependencies = [ "tauri", "tauri-build", "tauri-runtime-wry", + "tempfile", "turbojpeg", ] @@ -1917,6 +1928,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + [[package]] name = "litemap" version = "0.8.3" @@ -2790,6 +2807,19 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5e76742e5294153d4dde1207dbec5bdd81eef6fabdc0d2118babadabfd858aa" +dependencies = [ + "bitflags 2.13.2", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + [[package]] name = "rustversion" version = "1.0.23" @@ -3559,6 +3589,19 @@ dependencies = [ "toml 1.1.8+spec-1.1.0", ] +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand", + "getrandom 0.4.3", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + [[package]] name = "tendril" version = "0.5.1" diff --git a/harnesses/gtauri/Cargo.toml b/harnesses/gtauri/Cargo.toml index d4352c3..659dbbd 100644 --- a/harnesses/gtauri/Cargo.toml +++ b/harnesses/gtauri/Cargo.toml @@ -30,3 +30,6 @@ image = { version = "0.25", default-features = false, features = ["png", "webp", # Android uses the MediaStore ContentObserver instead — see MainActivity.kt. [target.'cfg(not(target_os = "android"))'.dependencies] notify = "8" + +[dev-dependencies] +tempfile = "3" diff --git a/harnesses/gtauri/frontend/dist/index.html b/harnesses/gtauri/frontend/dist/index.html index 5758208..18f5c6f 100644 --- a/harnesses/gtauri/frontend/dist/index.html +++ b/harnesses/gtauri/frontend/dist/index.html @@ -63,7 +63,7 @@ touch-action: none; } #viewer.open { display: block; } - #vimg { + #vimg, #vimg2 { position: absolute; left: 50%; top: 50%; max-width: none; transform-origin: 0 0; @@ -96,6 +96,7 @@
+
×
@@ -108,6 +109,7 @@ const band = document.getElementById("band"); const stext = document.getElementById("stext"); const viewer = document.getElementById("viewer"); const vimg = document.getElementById("vimg"); +const vimg2 = document.getElementById("vimg2"); const vload = document.getElementById("vload"); const COLS = 3, GAP = 4, PAD = 4, BUFFER_ROWS = 12; @@ -383,6 +385,42 @@ let viewerId = null, vFullTimer = null, vFullDone = false, vFullSeq = 0; let slideFrom = null; // pending slide start offset for a swiped-in image +/* Live swipe preview: while a horizontal drag is in flight at fit + scale, the picture being swiped IN renders on the page strip + (vimg2) and follows the finger — no blank side. Its grid thumb is + a mem hit (~1 ms) in the common case (the grid already requested + its neighbors' thumbs). */ +let nav = null; // {id, dir(+1 = right/next, -1 = left/prev), w, h, scale, ready} +function navSet(id, dir) { + if (nav && nav.id === id) return; + navHide(); + if (id == null) return; + nav = { id, dir, w: 0, h: 0, scale: 1, ready: false }; + vimg2.style.visibility = "hidden"; + vimg2.onload = () => { + if (!nav || nav.id !== id || vimg2.naturalWidth <= 2) return; + nav.w = vimg2.naturalWidth; nav.h = vimg2.naturalHeight; + nav.scale = Math.min(innerWidth / nav.w, innerHeight / nav.h); + nav.ready = true; + vimg2.style.width = nav.w + "px"; + vimg2.style.height = nav.h + "px"; + vimg2.style.visibility = "visible"; + navLayout(); + }; + vimg2.src = "http://gallery.localhost/thumb/" + id; +} +function navHide() { + nav = null; + vimg2.style.visibility = "hidden"; +} +function navLayout() { + if (!nav || !nav.ready) return; + const s = nav.scale; + vimg2.style.transform = + "translate(" + (vTx + nav.dir * innerWidth - nav.w * s / 2) + "px," + + (0 - nav.h * s / 2) + "px) scale(" + s + ")"; +} + function fitViewer(w, h) { base.w = w; base.h = h; vScale = Math.min(innerWidth / w, innerHeight / h); @@ -421,6 +459,7 @@ function tryShow(id, url, isFull) { function openViewer(id, fromX) { viewerId = id; + navHide(); // the incoming image takes over from the preview slideFrom = (fromX == null) ? null : fromX; vFullDone = false; vScale = 1; vTx = 0; vTy = 0; @@ -453,6 +492,7 @@ function openViewer(id, fromX) { function closeViewer() { viewerId = null; vFullDone = false; + navHide(); if (vFullTimer) { clearInterval(vFullTimer); vFullTimer = null; } viewer.classList.remove("open"); vimg.src = ""; @@ -487,7 +527,8 @@ function applyTransform() { } /// Ease-out tween of the view transform to (tx, ty) over `ms`. -function tweenTo(tx, ty, ms) { +/// The swipe preview (if any) tracks the primary image each frame. +function tweenTo(tx, ty, ms, onDone) { if (tween) cancelAnimationFrame(tween.raf); const x0 = vTx, y0 = vTy, t0 = performance.now(); const step = (now) => { @@ -496,8 +537,9 @@ function tweenTo(tx, ty, ms) { vTx = x0 + (tx - x0) * e; vTy = y0 + (ty - y0) * e; applyTransform(); + navLayout(); if (t < 1) tween.raf = requestAnimationFrame(step); - else { tween = null; vTx = tx; vTy = ty; } + else { tween = null; vTx = tx; vTy = ty; if (onDone) onDone(); } }; tween = { raf: requestAnimationFrame(step) }; } @@ -519,6 +561,7 @@ viewer.addEventListener("pointerdown", (e) => { pts.set(e.pointerId, { x: e.clientX, y: e.clientY }); if (pts.size === 2) { gesture = null; + navHide(); // pinch cancels the swipe preview const [a, b] = [...pts.values()]; pinchMid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 }; pinchDist = Math.hypot(a.x - b.x, a.y - b.y); @@ -551,7 +594,15 @@ viewer.addEventListener("pointermove", (e) => { const w = innerWidth; vTx = Math.abs(dx) > w ? Math.sign(dx) * (w + (Math.abs(dx) - w) * 0.4) : dx; vTy = 0; + // Live preview of the picture being swiped in (page strip). + if (Math.abs(dx) > 24) { + const dir = dx < 0 ? +1 : -1; + const i = ids.indexOf(viewerId); + const ni = i + dir; + navSet(ni >= 0 && ni < ids.length ? ids[ni] : null, dir); + } applyTransform(); + navLayout(); } return; } @@ -591,7 +642,7 @@ const endPt = (e) => { const w = innerWidth; if (dx < -w * 0.25 || g.vx < -0.35) navigate(+1); else if (dx > w * 0.25 || g.vx > 0.35) navigate(-1); - else tweenTo(0, 0, 120); // not far enough: snap back + else tweenTo(0, 0, 120, navHide); // not far enough: snap back } gesture = null; }; diff --git a/harnesses/gtauri/gen/android/app/src/main/java/wow/gmp/gallery/MainActivity.kt b/harnesses/gtauri/gen/android/app/src/main/java/wow/gmp/gallery/MainActivity.kt index cb5d5d0..46a2397 100644 --- a/harnesses/gtauri/gen/android/app/src/main/java/wow/gmp/gallery/MainActivity.kt +++ b/harnesses/gtauri/gen/android/app/src/main/java/wow/gmp/gallery/MainActivity.kt @@ -18,7 +18,11 @@ import java.util.concurrent.Executors class MainActivity : TauriActivity() { private var observer: ContentObserver? = null - private val fileObservers = mutableListOf() + // One FileObserver per watched directory (inotify has no recursive + // mode on Android). Touches come from onCreate (main) and from new- + // dir CREATE events (observer threads) — hence synchronized. + private val fileObservers = + java.util.Collections.synchronizedList(mutableListOf()) // MediaStore event path: the OS tells us WHICH URI changed; we query // that one row (~ms) and hand the result to Rust via a payload file + @@ -79,48 +83,95 @@ class MainActivity : TauriActivity() { } } + companion object { + private val IMAGE_EXTS = setOf( + "jpg", "jpeg", "png", "webp", "heic", "heif", "bmp", "tif", "tiff" + ) + } + + private fun isImageFile(f: java.io.File): Boolean = f.extension.lowercase() in IMAGE_EXTS + private fun startFileObservers() { val roots = listOf( android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_PICTURES), android.os.Environment.getExternalStoragePublicDirectory(android.os.Environment.DIRECTORY_DCIM) ) for (root in roots) { - if (root != null && root.exists()) { - val dirs = mutableListOf(root) - root.listFiles()?.forEach { if (it.isDirectory) dirs.add(it) } - for (dir in dirs) { - try { - val observer = object : FileObserver(dir.absolutePath, CLOSE_WRITE or DELETE or MOVED_TO or MOVED_FROM) { - override fun onEvent(event: Int, path: String?) { - if (path.isNullOrEmpty()) return - if (path.startsWith(".")) return - val fullPath = java.io.File(dir, path).absolutePath - val ext = fullPath.substringAfterLast('.', "").lowercase() - val imageExts = setOf("jpg", "jpeg", "png", "webp", "heic", "heif", "bmp") - if (!imageExts.contains(ext)) return + if (root != null) watchDirTree(root) + } + synchronized(fileObservers) { + android.util.Log.i("gallery-ms", "file observers: " + fileObservers.size) + } + } + /** Watch `root` and, recursively, every existing subdirectory. */ + private fun watchDirTree(root: java.io.File) { + val stack = ArrayDeque() + stack.add(root) + var processed = 0 + while (stack.isNotEmpty() && processed < 5000) { + val dir = stack.removeFirst() + if (watchDir(dir)) { + dir.listFiles()?.forEach { + if (it.isDirectory && !it.name.startsWith(".")) stack.add(it) + } + } + processed++ + } + } + + /** Start one FileObserver on `dir`. Returns true when the dir exists. + * A photo event in this dir becomes a payload line pushed to Rust: + * CLOSE_WRITE / MOVED_TO → A (added or finished being written) + * DELETE / MOVED_FROM → D_PATH (removed) + * CREATE / MOVED_TO on a DIRECTORY → new observer (the tree grows + * so nested and later-created dirs are pushed too). + */ + private fun watchDir(dir: java.io.File): Boolean { + if (!dir.isDirectory) return false + try { + val observer = object : FileObserver( + dir.absolutePath, + CREATE or CLOSE_WRITE or DELETE or MOVED_TO or MOVED_FROM + ) { + override fun onEvent(event: Int, path: String?) { + if (path.isNullOrEmpty() || path.startsWith(".")) return + val f = java.io.File(dir, path) + when (event and FileObserver.ALL_EVENTS) { + FileObserver.CREATE, FileObserver.MOVED_TO -> { + if (f.isDirectory) { + watchDir(f) + } else if (isImageFile(f)) { fsExecutor.execute { - when (event and FileObserver.ALL_EVENTS) { - FileObserver.CLOSE_WRITE, FileObserver.MOVED_TO -> { - val f = java.io.File(fullPath) - if (f.exists() && f.length() > 0) { - deliver("A|0|$fullPath|${f.length()}") - } - } - FileObserver.DELETE, FileObserver.MOVED_FROM -> { - deliver("D_PATH|$fullPath") - } + if (f.exists() && f.length() > 0) { + deliver("A|0|${f.absolutePath}|${f.length()}") } } } } - observer.startWatching() - fileObservers.add(observer) - } catch (e: Exception) { - android.util.Log.w("gallery-ms", "FileObserver error: " + e) + FileObserver.CLOSE_WRITE -> { + if (isImageFile(f)) { + fsExecutor.execute { + if (f.exists() && f.length() > 0) { + deliver("A|0|${f.absolutePath}|${f.length()}") + } + } + } + } + FileObserver.DELETE, FileObserver.MOVED_FROM -> { + if (isImageFile(f)) { + fsExecutor.execute { deliver("D_PATH|${f.absolutePath}") } + } + } } } } + observer.startWatching() + fileObservers.add(observer) + return true + } catch (e: Exception) { + android.util.Log.w("gallery-ms", "FileObserver error: " + e) + return false } } /** Handle ONE changed URI: query that exact MediaStore row. diff --git a/harnesses/gtauri/src/db.rs b/harnesses/gtauri/src/db.rs index c5b168b..15d8be8 100644 --- a/harnesses/gtauri/src/db.rs +++ b/harnesses/gtauri/src/db.rs @@ -217,16 +217,6 @@ pub fn upsert_ms( Ok(changed) } -/// Delete the row for a MediaStore `_id` (the row is gone from -/// MediaStore — the media file was removed). Returns rows affected. -pub fn delete_by_media_id( - conn: &mut Connection, - media_id: i64, -) -> Result { - let n = conn.execute("DELETE FROM items WHERE media_id = ?1", params![media_id])?; - Ok(n) -} - /// Record a MediaStore id → path mapping (every add event, even for /// size-0 mid-write rows that don't get an items row). pub fn map_media( @@ -282,46 +272,10 @@ pub fn unmap_media( Ok(()) } -/// Number of rows in the DB. -pub fn count(conn: &mut Connection) -> Result { - let n: i64 = conn.query_row("SELECT COUNT(*) FROM items", [], |r| r.get(0))?; - Ok(n) -} - -/// All known entries, newest first. -pub fn list_entries(conn: &mut Connection) -> Result, rusqlite::Error> { - let mut st = conn.prepare("SELECT path, mtime, size FROM items ORDER BY mtime DESC, path ASC")?; - let rows = st.query_map([], |r| { - Ok(Entry { path: r.get(0)?, mtime: r.get(1)?, size: r.get(2)? }) - })?; - let mut out = Vec::new(); - for row in rows { - out.push(row?); - } - Ok(out) -} - -/// Update the derived thumbnail columns once the pool has finished a job. -pub fn set_thumb( - conn: &mut Connection, - path: &str, - width: i64, - height: i64, - orientation: i64, - thumb_path: &str, -) -> Result<(), rusqlite::Error> { - conn.execute( - "UPDATE items SET width = ?2, height = ?3, orientation = ?4, thumb_path = ?5 \ - WHERE path = ?1", - params![path, width, height, orientation, thumb_path], - )?; - Ok(()) -} - #[cfg(test)] mod tests { use super::*; - use crate::scan::{walk, Entry}; + use crate::scan::{walk_stream, Entry}; fn entry(path: &str, mtime: i64, size: i64) -> Entry { Entry { path: path.into(), mtime, size } @@ -347,21 +301,25 @@ mod tests { .unwrap(); assert_eq!((i, u, d), (1, 1, 1)); - let list = list_entries(&mut conn).unwrap(); - let paths: Vec<&str> = list.iter().map(|e| e.path.as_str()).collect(); - assert_eq!(paths, vec!["/a/1.jpg", "/a/3.jpg"]); + let paths: Vec = { + let mut st = conn.prepare("SELECT path FROM items ORDER BY path").unwrap(); + st.query_map([], |r| r.get::<_, String>(0)) + .unwrap() + .collect::>() + .unwrap() + }; + assert_eq!(paths, vec!["/a/1.jpg".to_string(), "/a/3.jpg".to_string()]); } #[test] - fn set_thumb_updates_row_and_invalidation() { + fn mtime_change_invalidates_derived_columns() { let dir = tempfile::tempdir().unwrap(); let mut conn = open(&dir.path().join("t.db")).unwrap(); apply(&mut conn, &[entry("/a/1.jpg", 1, 10)]).unwrap(); - set_thumb(&mut conn, "/a/1.jpg", 8000, 6016, 6, "/cache/abc.jpg").unwrap(); - let thumb: String = conn - .query_row("SELECT thumb_path FROM items WHERE path = '/a/1.jpg'", [], |r| r.get(0)) - .unwrap(); - assert_eq!(thumb, "/cache/abc.jpg"); + conn.execute( + "UPDATE items SET thumb_path = '/cache/abc.jpg' WHERE path = '/a/1.jpg'", [], + ) + .unwrap(); // mtime change → apply() invalidates the derived columns. let (i, u, d) = apply(&mut conn, &[entry("/a/1.jpg", 2, 12)]).unwrap(); @@ -382,13 +340,12 @@ mod tests { let db_dir = tempfile::tempdir().unwrap(); let mut conn = open(&db_dir.path().join("t.db")).unwrap(); - let entries = walk(&[dir.path().to_path_buf()], &|_| {}).unwrap(); + let entries = walk_stream(&[dir.path().to_path_buf()], &|_| {}).unwrap(); let (i, u, d) = apply(&mut conn, &entries).unwrap(); assert_eq!((i, u, d), (2, 0, 0)); - let list = list_entries(&mut conn).unwrap(); - assert_eq!(list.len(), 2); - assert!(list.iter().all(|e| e.path.contains(dir.path().to_str().unwrap()))); + let n: i64 = conn.query_row("SELECT COUNT(*) FROM items", [], |r| r.get(0)).unwrap(); + assert_eq!(n, 2); } #[test] @@ -405,9 +362,13 @@ mod tests { // Second row for a different id. upsert_ms(&mut conn, "/x/b.jpg", 100, 10, 8).unwrap(); - assert_eq!(path_by_media_id(&mut conn, 7).unwrap().as_deref(), Some("/x/a.jpg")); - assert_eq!(delete_by_media_id(&mut conn, 7).unwrap(), 1); - assert_eq!(delete_by_media_id(&mut conn, 7).unwrap(), 0); // idempotent - assert_eq!(count(&mut conn).unwrap(), 1); + // Delete path: resolve id → path, delete by path (production + // sequence), idempotent on the second pass. + let path = path_for_media(&mut conn, 7).unwrap().unwrap(); + assert_eq!(path, "/x/a.jpg"); + assert_eq!(delete_by_path(&mut conn, &path).unwrap(), 1); + assert_eq!(path_for_media(&mut conn, 7).unwrap(), None); + let n: i64 = conn.query_row("SELECT COUNT(*) FROM items", [], |r| r.get(0)).unwrap(); + assert_eq!(n, 1); } } diff --git a/harnesses/gtauri/src/images.rs b/harnesses/gtauri/src/images.rs index 4dfb13f..522c6b5 100644 --- a/harnesses/gtauri/src/images.rs +++ b/harnesses/gtauri/src/images.rs @@ -28,26 +28,6 @@ pub struct Thumb { pub rgb: Vec, pub width: u32, pub height: u32, - /// Source dimensions after orientation is applied (full resolution). - pub src_width: u32, - pub src_height: u32, - /// EXIF orientation 1..8 (1 = none). - pub orientation: u8, -} - -/// Decode a file at full (1/1) size to RGBA8. Used only for small JPEGs in the -/// disk cache on a cache hit. -pub fn decode_jpeg(path: &Path) -> Result { - let data = std::fs::read(path).map_err(|e| format!("read {}: {e}", path.display()))?; - let (rgb, w, h) = decode_jpeg_scaled(&data, ScalingFactor::ONE)?; - Ok(Thumb { - rgb, - width: w, - height: h, - src_width: w, - src_height: h, - orientation: 1, - }) } /// Decode JPEG bytes at a fixed scaling factor to RGB8. @@ -117,7 +97,7 @@ pub fn generic_decode(path: &Path, target: u32) -> Result { .map_err(|e| format!("decode {}: {e}", path.display()))?; let rgb = img.to_rgb8(); let (w, h) = (rgb.width(), rgb.height()); - Ok(fit_to_target(rgb.into_raw(), w, h, target, w, h, 1)) + Ok(fit_to_target(rgb.into_raw(), w, h, target)) } fn thumb_jpeg(path: &Path, target: u32) -> Result { @@ -132,19 +112,7 @@ fn thumb_jpeg(path: &Path, target: u32) -> Result { let scale = pick_scale(src_w.max(src_h), target); let (rgb, w, h) = decode_jpeg_scaled(&data, scale)?; let (rgb, w, h) = apply_orientation(rgb, w, h, orientation); - Ok(fit_to_target(rgb, w, h, target, src_w, src_h, orientation)) -} - -fn thumb_png(path: &Path, target: u32) -> Result { - let img = image::ImageReader::open(path) - .map_err(|e| format!("open {}: {e}", path.display()))? - .with_guessed_format() - .map_err(|e| e.to_string())? - .decode() - .map_err(|e| format!("png decode: {e}"))?; - let rgb = img.to_rgb8(); - let (w, h) = (rgb.width(), rgb.height()); - Ok(fit_to_target(rgb.into_raw(), w, h, target, w, h, 1)) + Ok(fit_to_target(rgb, w, h, target)) } /// Largest shrink (1/8, 1/4, 1/2) whose result is still >= `target` on the @@ -206,15 +174,7 @@ pub fn apply_orientation(rgb: Vec, w: u32, h: u32, orientation: u8) -> (Vec< } /// Fit into the `target` box (aspect preserved, no upscaling). -fn fit_to_target( - rgb: Vec, - w: u32, - h: u32, - target: u32, - src_w: u32, - src_h: u32, - orientation: u8, -) -> Thumb { +fn fit_to_target(rgb: Vec, w: u32, h: u32, target: u32) -> Thumb { let (w, h, rgb) = if w.max(h) > target { let (nw, nh) = if w >= h { (target, (h as f64 * target as f64 / w as f64).max(1.0).round() as u32) @@ -228,5 +188,5 @@ fn fit_to_target( } else { (w, h, rgb) }; - Thumb { rgb, width: w, height: h, src_width: src_w, src_height: src_h, orientation } + Thumb { rgb, width: w, height: h } } diff --git a/harnesses/gtauri/src/lib.rs b/harnesses/gtauri/src/lib.rs index f221cd0..8803b20 100644 --- a/harnesses/gtauri/src/lib.rs +++ b/harnesses/gtauri/src/lib.rs @@ -406,7 +406,7 @@ fn init_logcat() { Level::Info => 4, _ => 3, }; - let mut s = format!("{}\0", record.args()); + let s = format!("{}\0", record.args()); unsafe { __android_log_write(prio, b"gtauri\0".as_ptr(), s.as_ptr()); } @@ -751,9 +751,11 @@ impl Drop for RescanGuard { /// Full rescan: walk the roots, diff against the DB (insert new / /// update changed / delete removed), refresh META, emit the list. -/// Used by the startup scan AND the 5-minute reconciliation pass. +/// The ONLY full pass: the startup baseline that builds/refreshes the +/// DB from disk. Live changes after that arrive as pushes (Kotlin +/// FileObserver / MediaStore ContentObserver payloads). /// If the walk fails, nothing is applied — an error is not "those -/// files are gone"; the next pass retries. +/// files are gone"; the next launch retries. fn rescan(app: &tauri::AppHandle) { let _guard = RescanGuard::new(); let entries = match walk_once(app) { @@ -800,129 +802,6 @@ fn mtime_ns(m: &std::fs::Metadata) -> i64 { .unwrap_or(0) } -/// Tree signature: (dir, mtime) for every directory under the roots. -/// Verified on the phone: Android's FUSE DOES update a directory's -/// mtime when files are added/removed inside it (stat before/after a -/// copy showed the change). Cost per tick: one stat per DIRECTORY and -/// one readdir per directory — no per-FILE stat. (The old version -/// called is_dir() on every entry: 10k stats per second on a 10k-file -/// Camera dir, which put a 10 s I/O floor under every event.) -fn dir_sig(roots: &[PathBuf]) -> HashMap { - let mut out = HashMap::new(); - let mut stack: Vec = roots.iter().filter(|r| r.is_dir()).cloned().collect(); - while let Some(dir) = stack.pop() { - let Ok(m) = std::fs::metadata(&dir) else { continue }; - out.insert(dir.clone(), mtime_ns(&m)); - match std::fs::read_dir(&dir) { - Ok(rd) => { - for ent in rd.flatten() { - let p = ent.path(); - // file_type() uses the d_type from getdents (no - // syscall); is_dir() would stat the entry. - let Ok(ft) = ent.file_type() else { continue }; - if ft.is_symlink() || !ft.is_dir() { - continue; - } - if p.file_name().map_or(false, |n| n.to_string_lossy().starts_with('.')) { - continue; - } - stack.push(p); - } - } - // A directory we cannot read this tick: skip it; the next - // tick or the full pass will pick up anything that changed. - Err(_) => {} - } - } - out -} - -/// Above 2000 files, stat'ing every file on FUSE costs tens of seconds; -/// for such directories a change event is handled readdir-only (adds and -/// deletes are still detected exactly; in-place edits wait for the -/// periodic full pass). Small directories are walked with stat so edits -/// are caught too. -const BIG_DIR: usize = 2000; - -/// Incremental rescan limited to the changed directory subtrees. -/// Everything outside the changed trees keeps its DB metadata, so the -/// walk cost is proportional to the change, not the library. -fn rescan_subtrees(app: &tauri::AppHandle, changed: &[PathBuf]) { - let mut conn = match db::open(&db::db_path()) { - Ok(c) => c, - Err(e) => { - log::warn!("incr db: {e}"); - return; - } - }; - let existing = match db::list_entries(&mut conn) { - Ok(v) => v, - Err(e) => { - log::warn!("incr list: {e}"); - return; - } - }; - let mut fresh: Vec = Vec::new(); - for d in changed { - let prefix = d.to_string_lossy().into_owned() + "/"; - let under: Vec<&scan::Entry> = - existing.iter().filter(|e| e.path.starts_with(&prefix)).collect(); - let known: HashMap<&str, &scan::Entry> = - under.iter().map(|e| (e.path.as_str(), *e)).collect(); - if under.len() <= BIG_DIR { - // Small: full walk with stat — adds, deletes AND edits. - if let Err(e) = scan::walk_dir_into(d, &mut fresh) { - tr(&format!("incr: walk {d:?} FAILED ({e}) — not applying")); - log::warn!("incr walk failed: {e}"); - return; // a failed subtree must not be applied as empty - } - } else { - // Huge: readdir-only. New files get stat'd; known files keep - // their DB mtime/size (an in-place edit there is caught by - // the 5-minute full pass). - if let Err(e) = scan::walk_dir_nostats(d, &mut |p| { - let ps = p.to_string_lossy(); - let entry = match known.get(ps.as_ref()) { - Some(old) => scan::Entry { - path: ps.into_owned(), - mtime: old.mtime, - size: old.size, - }, - None => match std::fs::metadata(p) { - Ok(md) => scan::Entry { - path: ps.into_owned(), - mtime: mtime_ns(&md), - size: md.len() as i64, - }, - Err(_) => return, // file vanished mid-walk — normal race - }, - }; - fresh.push(entry); - }) { - tr(&format!("incr: walk {d:?} FAILED ({e}) — not applying")); - log::warn!("incr walk failed: {e}"); - return; - } - } - } - let mut all = existing - .into_iter() - .filter(|e| !changed.iter().any(|d| e.path.starts_with(&*(d.to_string_lossy().into_owned() + "/")))) - .collect::>(); - let added = fresh.len(); - all.extend(fresh); - if let Err(e) = db::apply(&mut conn, &all) { - log::warn!("incr apply: {e}"); - return; - } - if let Err(e) = load_meta(&mut conn) { - log::warn!("incr meta: {e}"); - return; - } - emit_files(app, false, all.len()); - tr(&format!("watch: incr changed={} fresh={added}", changed.len())); -} - // --------------------------------------------------------------------- // MediaStore fast path (Android). MainActivity's ContentObserver gets // the CHANGED URI(s) directly from the OS; it queries that exact row @@ -939,10 +818,12 @@ fn rescan_subtrees(app: &tauri::AppHandle, changed: &[PathBuf]) { /// line was applied (the watch loop uses this to decide whether the /// OS event was fully handled by the payload path). #[cfg(target_os = "android")] -fn apply_mediasotre_payload(app: &tauri::AppHandle) -> bool { - // Consume every pending .ms_recent.* event file (oldest first). +fn apply_mediasotre_payload(app: &tauri::AppHandle) { + // Consume every pending .ms_recent.* event file (oldest first) in ONE + // connection and emit ONCE: a burst of N changed files is one DB + // batch and one grid update, not N of each. let dir = external_files_dir(); - let Ok(rd) = std::fs::read_dir(&dir) else { return false }; + let Ok(rd) = std::fs::read_dir(&dir) else { return }; let mut files: Vec = rd .flatten() .filter(|e| { @@ -953,10 +834,18 @@ fn apply_mediasotre_payload(app: &tauri::AppHandle) -> bool { .map(|e| e.path()) .collect(); if files.is_empty() { - return false; + return; } files.sort(); - let mut applied = false; + let mut conn = match db::open(&db::db_path()) { + Ok(c) => c, + Err(e) => { + log::warn!("mediastore db: {e}"); + return; + } + }; + let mut changed = 0usize; + let mut removed = 0usize; for f in files { let name = f.file_name().map(|s| s.to_string_lossy().into_owned()).unwrap_or_default(); let Ok(text) = std::fs::read_to_string(&f) else { continue }; @@ -965,25 +854,24 @@ fn apply_mediasotre_payload(app: &tauri::AppHandle) -> bool { continue; } tr(&format!("mediastore event {name}: {} lines", text.lines().count())); - applied |= mediastore_apply(app, &text); + let (c, r) = apply_lines(&mut conn, &text); + changed += c; + removed += r; } - applied -} - -#[cfg(not(target_os = "android"))] -fn apply_mediasotre_payload(_app: &tauri::AppHandle) -> bool { - false -} - -#[cfg(target_os = "android")] -fn mediastore_apply(app: &tauri::AppHandle, text: &str) -> bool { - let mut conn = match db::open(&db::db_path()) { - Ok(c) => c, - Err(e) => { - log::warn!("mediastore db: {e}"); - return false; + if changed + removed > 0 { + tr(&format!("mediastore applied +{changed} -{removed}")); + if let Err(e) = load_meta(&mut conn) { + log::warn!("mediastore meta: {e}"); } - }; + emit_files(app, false, META.read().unwrap().len()); + } +} + +/// Apply one batch of payload lines to an already-open connection. +/// Returns (adds, removals). No DB open, no emit — the caller batches +/// and emits once per wake. +#[cfg(target_os = "android")] +fn apply_lines(conn: &mut db::Connection, text: &str) -> (usize, usize) { let mut changed = 0usize; let mut removed = 0usize; for line in text.lines() { @@ -1002,7 +890,7 @@ fn mediastore_apply(app: &tauri::AppHandle, text: &str) -> bool { // event must be resolvable even for rows created by a // filesystem walk (no media_id) or never created at all // (the size-0 mid-write row below). - if let Err(e) = db::map_media(&mut conn, id, path) { + if let Err(e) = db::map_media(conn, id, path) { log::warn!("mediastore map: {e}"); } // Trust the DISK, not the provider row: the scanner can @@ -1011,7 +899,7 @@ fn mediastore_apply(app: &tauri::AppHandle, text: &str) -> bool { // size (content change resets the decode state). let Ok(md) = std::fs::metadata(path) else { continue }; let mtime = mtime_ns(&md); - match db::upsert_ms(&mut conn, path, mtime, md.len() as i64, id) { + match db::upsert_ms(conn, path, mtime, md.len() as i64, id) { Ok(content_changed) => { // Row id → the rowid is what the grid/queue use; // clear decode-failure state only after a real @@ -1040,7 +928,7 @@ fn mediastore_apply(app: &tauri::AppHandle, text: &str) -> bool { // filesystem walk, which doesn't store the media id. "D" => { let Ok(id) = f.next().unwrap_or("").parse::() else { continue }; - let path = match db::path_for_media(&mut conn, id) { + let path = match db::path_for_media(conn, id) { Ok(p) => p, Err(e) => { log::warn!("mediastore dlookup: {e}"); @@ -1059,13 +947,13 @@ fn mediastore_apply(app: &tauri::AppHandle, text: &str) -> bool { { FAILS.lock().unwrap().remove(&rid); } - if let Ok(n) = db::delete_by_path(&mut conn, &path) { + if let Ok(n) = db::delete_by_path(conn, &path) { removed += n; if n > 0 { tr(&format!("mediastore del id={id} {path}")); } } - let _ = db::unmap_media(&mut conn, id); + let _ = db::unmap_media(conn, id); } } "D_PATH" => { @@ -1080,7 +968,7 @@ fn mediastore_apply(app: &tauri::AppHandle, text: &str) -> bool { { FAILS.lock().unwrap().remove(&rid); } - if let Ok(n) = db::delete_by_path(&mut conn, path) { + if let Ok(n) = db::delete_by_path(conn, path) { removed += n; if n > 0 { tr(&format!("mediastore del path={path}")); @@ -1090,27 +978,13 @@ fn mediastore_apply(app: &tauri::AppHandle, text: &str) -> bool { _ => {} } } - if changed + removed > 0 { - tr(&format!("mediastore applied +{changed} -{removed}")); - if let Err(e) = load_meta(&mut conn) { - log::warn!("mediastore meta: {e}"); - } - emit_files(app, false, META.read().unwrap().len()); - } - changed + removed > 0 + (changed, removed) } -/// Watcher wake events. -#[derive(Debug, Clone, Copy)] -enum WEvent { - /// The OS said the filesystem changed (ContentObserver on Android, - /// inotify/FSEvents on desktop). - Fs, - /// Periodic full-pass timer. - Full, -} - -static WATCH_TX: LazyLock>>> = +/// One unit per "the OS said the filesystem changed" push (Kotlin +/// FileObserver / MediaStore ContentObserver on Android, inotify/FSEvents +/// on desktop). +static WATCH_TX: LazyLock>>> = LazyLock::new(|| Mutex::new(None)); /// Android: called by MainActivity's ContentObserver via JNI (and after @@ -1124,7 +998,7 @@ pub extern "system" fn Java_wow_gmp_gallery_MainActivity_nativeFsChange( _obj: *mut std::ffi::c_void, ) { if let Some(tx) = WATCH_TX.lock().unwrap().as_ref() { - let _ = tx.send(WEvent::Fs); + let _ = tx.send(()); } } @@ -1160,154 +1034,49 @@ fn spawn_fs_watcher(tx: mpsc::Sender) { }); } -fn collect_watched_dirs(roots: &[PathBuf]) -> HashSet { - let mut dirs = HashSet::new(); - for r in roots { - if r.is_dir() { - dirs.insert(r.clone()); - if let Ok(rd) = std::fs::read_dir(r) { - for ent in rd.flatten() { - if let Ok(ft) = ent.file_type() { - if ft.is_dir() { - let p = ent.path(); - if !p.file_name().map_or(false, |n| n.to_string_lossy().starts_with('.')) { - dirs.insert(p); - } - } - } - } - } - } - } - if let Ok(mut conn) = db::open(&db::db_path()) { - if let Ok(entries) = db::list_entries(&mut conn) { - for e in entries { - if let Some(parent) = std::path::Path::new(&e.path).parent() { - dirs.insert(parent.to_path_buf()); - } - } - } - } - dirs -} - -fn fast_dir_sig(dirs: &HashSet) -> HashMap { - let mut out = HashMap::new(); - for d in dirs { - if let Ok(m) = std::fs::metadata(d) { - out.insert(d.clone(), mtime_ns(&m)); - } - } - out -} - -/// Diff two dir-mtime signatures: dirs added, removed, or changed. -fn changed_dirs( - old: &HashMap, - next: &HashMap, -) -> Vec { - let mut v: Vec = next - .iter() - .filter(|(d, t)| old.get(d.as_path()) != Some(t)) - .map(|(d, _)| d.clone()) - .collect(); - for d in old.keys() { - if !next.contains_key(d) { - v.push(d.clone()); - } - } - v -} - -/// Live file watching — EVENT-DRIVEN, no tree polling: -/// - Android: MainActivity's MediaStore ContentObserver → JNI → this -/// thread (camera saves, media-scanner indexing, indexed writes). -/// - Desktop: inotify/FSEvents via `notify` on the scan roots. -/// - On wake: coalesce the burst, debounce for the write to settle, -/// diff dir mtimes (a few stats), and rescan ONLY the changed -/// subtrees. A 5-minute full pass is the safety net (in-place edits -/// in the huge dir, anything the OS never reported). -/// - The 1 s recv timeout doubles as a cheap secondary detector -/// (dir-mtime diff, ~0.05 ms): raw out-of-band copies that the media -/// scanner hasn't indexed yet are still caught within ~1 s. +/// Live file watching — PURE PUSH, zero polling: +/// - Android: MainActivity's FileObserver (kernel inotify, every watched +/// directory) and MediaStore ContentObserver each write a payload line +/// and push one unit here via JNI. This thread blocks on recv() and +/// consumes the payload batch the instant a push lands. It burns zero +/// CPU while idle and does no directory statting at all. +/// - Desktop: inotify/FSEvents via `notify` on the scan roots; a burst is +/// coalesced and answered with a full rescan (desktop is secondary). +/// There is no periodic re-scan: the startup walk is the only full pass +/// (it rebuilds the DB baseline), and every live change arrives as a push. fn watch_files(app: tauri::AppHandle) { - let (tx, rx) = mpsc::channel::(); + let (tx, rx) = mpsc::channel::<()>(); *WATCH_TX.lock().unwrap() = Some(tx.clone()); - std::thread::spawn(move || { - loop { - std::thread::sleep(std::time::Duration::from_secs(300)); - let _ = tx.send(WEvent::Full); - } - }); #[cfg(not(target_os = "android"))] spawn_fs_watcher(tx); - let mut watched_dirs = collect_watched_dirs(&scan::roots()); - let mut sig = fast_dir_sig(&watched_dirs); - let mut baseline = true; - let mut last_dir_refresh = std::time::Instant::now(); - let mut last_full = std::time::Instant::now(); - loop { - let woke = match rx.recv_timeout(std::time::Duration::from_millis(100)) { - Ok(e) => Some(e), - Err(mpsc::RecvTimeoutError::Timeout) => None, - Err(mpsc::RecvTimeoutError::Disconnected) => break, - }; - let do_full = matches!(woke, Some(WEvent::Full)); - if let Some(WEvent::Fs) = woke { - #[cfg(target_os = "android")] - { + match rx.recv() { + Ok(()) => { + #[cfg(not(target_os = "android"))] + { + // Coalesce the burst, let the writes settle, coalesce + // again, then rescan (desktop has no payload channel). + while rx.try_recv().is_ok() {} + std::thread::sleep(std::time::Duration::from_millis(600)); + while rx.try_recv().is_ok() {} + rescan(&app); + continue; + } + // Android: wait out an in-flight walk (startup baseline + // only) — a delete applied before its DB apply would be + // re-added by the walk's stale snapshot. + while RESCANNING.load(std::sync::atomic::Ordering::Relaxed) { + std::thread::sleep(std::time::Duration::from_millis(50)); + } + // Coalesce the burst: pushes for N copied files land a + // few ms apart; give the stragglers 50 ms to arrive so + // the whole batch is one connection + ONE emit, not N. + std::thread::sleep(std::time::Duration::from_millis(50)); + while rx.try_recv().is_ok() {} apply_mediasotre_payload(&app); - continue; } - #[cfg(not(target_os = "android"))] - { - while rx.try_recv().is_ok() {} - std::thread::sleep(std::time::Duration::from_millis(600)); - while rx.try_recv().is_ok() {} - } - } - if do_full { - tr("watch: full rescan (5min)"); - rescan(&app); - watched_dirs = collect_watched_dirs(&scan::roots()); - sig = fast_dir_sig(&watched_dirs); - last_full = std::time::Instant::now(); - continue; - } - - // Refresh watched dirs periodically (every 30s) to pick up new subdirs - if last_dir_refresh.elapsed() >= std::time::Duration::from_secs(30) { - watched_dirs = collect_watched_dirs(&scan::roots()); - last_dir_refresh = std::time::Instant::now(); - } - - // MediaStore event path (Android): MainActivity drops a one-line - // payload per changed URI and wakes us via nativeFsChange. - let _applied_ms = if RESCANNING.load(std::sync::atomic::Ordering::Relaxed) { - false - } else { - apply_mediasotre_payload(&app) - }; - - // Fast directory mtime-diff watch (Android and desktop): catches - // out-of-band filesystem adds/removes within ~1 second without - // scanning 10k files. - let next = fast_dir_sig(&watched_dirs); - let changed = if baseline { - baseline = false; - Vec::new() - } else { - changed_dirs(&sig, &next) - }; - sig = next; - - if !changed.is_empty() { - tr(&format!("watch: {} changed dir(s)", changed.len())); - rescan_subtrees(&app, &changed); - watched_dirs = collect_watched_dirs(&scan::roots()); - sig = fast_dir_sig(&watched_dirs); + Err(_) => break, } } } @@ -1419,9 +1188,8 @@ pub fn run() { // Warm the first two screens before Chromium's lazy loader gets // to them (it requests ~30 at once; we'd rather be ahead). set_prefetch_window(0, 36); - // (The startup MediaStore fast path is triggered by - // MainActivity.onCreate — it pushes via - // nativeMediaStoreResults ~1.5 s in.) + // (MainActivity.onCreate's startup catch-up pushes any + // recently indexed media as a payload ~1.5 s in.) spawn_scan(handle.clone()); // New photos appear in the grid ~2 s after being written. std::thread::spawn(move || watch_files(handle)); diff --git a/harnesses/gtauri/src/scan.rs b/harnesses/gtauri/src/scan.rs index b982bfb..279cb3f 100644 --- a/harnesses/gtauri/src/scan.rs +++ b/harnesses/gtauri/src/scan.rs @@ -10,11 +10,11 @@ //! - a **per-file failure is skipped** — a file vanishing between //! readdir and stat is a normal race on an actively used //! directory (the user deleting while we walk), not a walk -//! failure. Aborting on this killed deletion detection: every -//! incremental rescan of a busy 10k-file directory aborted. -//! Both walks (with-stat and readdir-only) filter to image -//! extensions: library directories hold thousands of videos, and -//! enumerating them would inject non-image rows into the DB. +//! failure. Aborting on this killed deletion detection: a rescan +//! of a busy 10k-file directory aborted on the first deleted file. +//! The walk filters to image extensions: library directories hold +//! thousands of videos too, and enumerating them would inject +//! non-image rows into the DB (phantom blank cells, count swings). use std::io; use std::path::{Path, PathBuf}; @@ -81,17 +81,14 @@ fn file_metadata(p: &Path) -> io::Result<(i64, i64)> { Ok((mtime, md.len() as i64)) } -/// Recursively collect all image entries below `roots`. -/// `on_progress(n)` is called every 512 files found. +/// Recursively collect all image entries below `roots`, streaming +/// progress: `on_batch(&entries)` receives ALL entries collected so far +/// every 512 new files, so the UI can show results while the scan is +/// still running (first launch must not wait for the full DB build). +/// `on_batch(&entries)` receives ALL entries collected so far every +/// 512 new files, so the UI can show results while the scan is still +/// running (first launch must not wait for the full DB build). /// Any filesystem error fails the walk (see module docs). -pub fn walk(roots: &[PathBuf], on_progress: &dyn Fn(usize)) -> io::Result> { - walk_stream(roots, &|batch| on_progress(batch.len())) -} - -/// Like `walk`, but streams progress: `on_batch(&entries)` receives ALL -/// entries collected so far every 512 new files, so the UI can show -/// results while the scan is still running (first launch must not wait -/// for the full DB build). pub fn walk_stream( roots: &[PathBuf], on_batch: &dyn Fn(&[Entry]), @@ -105,53 +102,6 @@ pub fn walk_stream( Ok(out) } -/// Full walk (with stat) of ONE directory subtree. -pub fn walk_dir_into(dir: &Path, out: &mut Vec) -> io::Result<()> { - if dir.is_dir() { - walk_dir(dir, out, &|_| {})?; - } - Ok(()) -} - -/// Readdir-only walk (NO per-file stat) of ONE directory subtree — for -/// huge FUSE directories where stat'ing every file costs ~30 s; the -/// caller supplies metadata for new files and keeps DB metadata for -/// known ones. -/// -/// FILTERS TO IMAGE EXTENSIONS (critical: a library directory holds -/// thousands of videos too — enumerating them would inject non-image -/// rows into the DB: phantom blank grid cells and count swings). -/// A read_dir error fails the walk; per-file failures (file vanishing -/// mid-walk — a normal race) are skipped. -pub fn walk_dir_nostats(dir: &Path, cb: &mut dyn FnMut(&Path)) -> io::Result<()> { - if !dir.is_dir() { - return Ok(()); - } - let mut stack = vec![dir.to_path_buf()]; - while let Some(d) = stack.pop() { - for ent in std::fs::read_dir(&d)? { - let ent = ent?; - let p = ent.path(); - let Ok(ft) = ent.file_type() else { continue }; - if ft.is_dir() { - if p.is_symlink() { - continue; - } - if p.file_name().map_or(false, |n| n.to_string_lossy().starts_with('.')) { - continue; - } - stack.push(p); - } else if ft.is_file() { - let ps = p.to_string_lossy(); - if is_image_path(&ps) { - cb(&p); - } - } - } - } - Ok(()) -} - /// Full stat walk. Error semantics: a read_dir error fails the walk /// (the result would be incomplete — must never be applied); per-file /// failures (a file vanishing between readdir and stat — a normal race @@ -221,7 +171,7 @@ mod tests { std::fs::write(dir.path().join("c.txt"), b"x").unwrap(); std::fs::create_dir_all(dir.path().join("d")).unwrap(); std::fs::write(dir.path().join("d").join("e.heic"), b"x").unwrap(); - let out = walk(&[dir.path().to_path_buf()], &|_| {}).unwrap(); + let out = walk_stream(&[dir.path().to_path_buf()], &|_| {}).unwrap(); assert_eq!(out.len(), 3); assert!(out.iter().all(|e| e.size == 1)); } @@ -231,7 +181,7 @@ mod tests { let dir = tempfile::tempdir().unwrap(); make_tree(dir.path(), 5000, 8); let t = std::time::Instant::now(); - let out = walk(&[dir.path().to_path_buf()], &|_| {}).unwrap(); + let out = walk_stream(&[dir.path().to_path_buf()], &|_| {}).unwrap(); let elapsed = t.elapsed(); assert_eq!(out.len(), 5000); assert!( @@ -245,7 +195,7 @@ mod tests { fn missing_root_dir_is_an_error() { let r = vec![PathBuf::from("/nonexistent/gallery-test-xyz")]; // is_dir() false → the root is skipped, empty result, no error. - let out = walk(&r, &|_| {}).unwrap(); + let out = walk_stream(&r, &|_| {}).unwrap(); assert!(out.is_empty()); } } diff --git a/harnesses/ttimg/.tauriignore b/harnesses/ttimg/.tauriignore new file mode 100644 index 0000000..5f22405 --- /dev/null +++ b/harnesses/ttimg/.tauriignore @@ -0,0 +1 @@ +frontend/dist/img/ diff --git a/harnesses/ttimg/Cargo.lock b/harnesses/ttimg/Cargo.lock new file mode 100644 index 0000000..61bbcdb --- /dev/null +++ b/harnesses/ttimg/Cargo.lock @@ -0,0 +1,4305 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2fb6cfd47bf496ff64095c20eaba0c201404ee38714d4142fcfa1dc334fcc7a" + +[[package]] +name = "alloc-stdlib" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5c1865780388bfa186411ab5f247819487fc4864c6e9c3106611fa347586e1" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +dependencies = [ + "serde_core", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "brotli" +version = "9.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "627b7cfb0578f0eafce087a90fcd40add1231900b69e4d4de2d456260a4f5d81" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "6.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34c6783f42c21c952ad7112b354f0ba2f10760e9decea5b1b60523d6e270faaf" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.13.2", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbad30e4b4c14a39e3cc8aed085a12a327257c316619c93581e017bc52be591" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.21", +] + +[[package]] +name = "cargo_toml" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f4b26e751e711a5302649417f2da046dce6391b2ea30a4820f37462314f0b9" +dependencies = [ + "semver", + "serde", + "toml 1.1.8+spec-1.1.0", +] + +[[package]] +name = "cc" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86e055fa6e3e40ad6187ba25b6855eeb635d5271f8e0f0e1e9a5826b8d75bea0" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a347dcabdae9c31b0825fd6a8bed285ec9c2acb89c47827126d52fa4f59cece3" +dependencies = [ + "fnv", + "uuid", + "web-time", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "combine" +version = "4.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4356eba6976435498d05a311ee9fc486da3bc81c200d3f0d7dd9703b41913f92" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "cookie" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" +dependencies = [ + "bitflags 2.13.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ba106e844045ddc02c20768ac4b0b7cb45f2cc2ecbd833ac9f5dacb183c2055" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9cdaae01d5ed7882b04d795e7f752f46ff52d2fa3b50a20d28c464510bba98" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf", + "smallvec", +] + +[[package]] +name = "cssparser-macros" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d045de693cb712d0b22c6a64be5b953f67b3ce00ab5ad3dd5d8b441886ab8e1a" +dependencies = [ + "quote", + "syn 3.0.9", +] + +[[package]] +name = "ctor" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914a755b7c2d4af2bdcff7ce1739e2db9a1b81a9b07123d8015786ae03c0980d" + +[[package]] +name = "darling" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 3.0.9", +] + +[[package]] +name = "darling_macro" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785" +dependencies = [ + "darling_core", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "dbus" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "defmt" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a0795ac740cb54d7b3775c9c17345f6aaecf884c01733b39d6017738e0e3e1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "840bb056bd99c495c9188198a258ab787c79f306d864db3e6e8451442d6d8366" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "defmt-parser" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71958f69fb2de856c5dd51ac9377e986ca1aa5919f931bf5395a807277f889a0" +dependencies = [ + "thiserror 2.0.21", +] + +[[package]] +name = "deranged" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9de72ce2ad1f90dc62fa25f0f430ef85eb4b0d8fa0be4f30373bc40a21d28e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d57d423b3c82e89b9a24ca3091fee61f456a26edbd28d26c65906f4bc1dcd8f" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.2", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "dlopen2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "dom_query" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fac5fca71e65e94cc718a6e2af65d6e0f9c6027751c2aa562fbb5087fda639bc" +dependencies = [ + "bit-set", + "cssparser", + "foldhash", + "html5ever", + "precomputed-hash", + "selectors", + "tendril", +] + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "embed-resource" +version = "3.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6168487b5e7eb2673e6efe1200b1848016e436a6ca0b8031bf04bd9d493a249f" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.8+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "equivalent" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" + +[[package]] +name = "erased-serde" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e59b668157f32d3459d4bd634861a06ffa2503a461ca5f0916b9f0252605e66" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48" + +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide 0.9.1", + "zlib-rs", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.13.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" +dependencies = [ + "log", + "markup5ever", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c" +dependencies = [ + "atomic-waker", + "bytes", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-util" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" +dependencies = [ + "base64 0.23.1", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75e94d66081e4d8dcd098bd8dc5254800fea14a26389b298410158d834de167" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc" + +[[package]] +name = "icu_properties" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf" + +[[package]] +name = "icu_provider" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "infer" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4200d433cbd5178df7797c9c2e75b348b728e39631cf14520d1e2fc424201f4" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jiff" +version = "0.2.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b005715dcbeb0089a3c0dab99f2ff1cc3b2525323552703d648585d342a383" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link", +] + +[[package]] +name = "jiff-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e52fe76043ccecc9005d2305ebaadf7d7fc0cc89ca6baa10a94d6bc68c7128c" +dependencies = [ + "defmt", + "log", +] + +[[package]] +name = "jiff-static" +version = "0.2.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cc9817253cf7c7ee4684451bd327e88d6f3658014e54a29198625590650695c" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa8377070c6bae868759445e5a77f66d84f0b72f3a054bfb00e6d038b8282da7" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys 0.3.1", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "js-sys" +version = "0.3.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dc09d2154098bbf4ef54eab6b117a3c24cbbffe94046b16ee6d6d4510584d3a" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7421438de105a0827e44fadd05377727847d717c80ce29a229f85fd04c427b72" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 2.0.21", +] + +[[package]] +name = "jsonptr" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5a3cc660ba5d72bce0b3bb295bf20847ccbb40fd423f3f05b61273672e561fe" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" +dependencies = [ + "bitflags 2.13.2", + "serde", +] + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.191" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a" + +[[package]] +name = "libdbus-sys" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043" +dependencies = [ + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" +dependencies = [ + "libc", +] + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d15f86d12da44cd8d4ec3c73984537eb7f4cadcb9776a575a0a8a05ca11005c" + +[[package]] +name = "markup5ever" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" +dependencies = [ + "log", + "tendril", + "web_atoms", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "muda" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cca139e57da4383727f189e43e66e84fa372347027fc996f9f1a007ec0a37996" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.21", + "windows-sys 0.61.2", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.13.2", + "jni-sys 0.3.1", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "num-conv" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "objc2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08849bbd4767dfae9457696856ae1c84fe4e0281bbe4a7abff2d0e06fb7981f8" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.2", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.13.2", + "dispatch2", + "objc2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-location", + "objc2-core-text", + "objc2-foundation", + "objc2-quartz-core", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros", + "phf_shared", + "serde", +] + +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared", +] + +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "plist" +version = "1.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327a4cb2ad49dc48adfdc9da89e22c64d488b508c67a044d71ba729e4521a285" +dependencies = [ + "base64 0.23.1", + "indexmap 2.14.2", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.17+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "redox_users" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0" +dependencies = [ + "libredox", + "thiserror 2.0.21", +] + +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "reqwest" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16a1cfa75cc186dd73d5818e510e042e40927bccc9c236b061cea97e1eb08029" +dependencies = [ + "base64 0.23.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab508826f74a77ca9d5aba6ff19b522583ee3eaf28a19384ff3d0e5835fadf6e" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.119", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8adfa1c298912827b8a28b223b3b874357397ae706e6190acd9bf28cee99114d" +dependencies = [ + "bitflags 2.13.2", + "cssparser", + "derive_more", + "log", + "new_debug_unreachable", + "phf", + "phf_codegen", + "precomputed-hash", + "rustc-hash", + "servo_arc", + "smallvec", +] + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +dependencies = [ + "serde", + "serde_core", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "serde_json" +version = "1.0.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7523beb55eece201a2356bee0bbca0d1ab466c14c07703b2e0ee6d42cb0c2c" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_with" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9adc193c780ef8f159aee8b61e2d5801aaa555e6eb0947fe45530ec506296f" +dependencies = [ + "base64 0.23.1", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.2", + "jiff", + "schemars 0.9.0", + "schemars 1.2.3", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e17bbc68e28663bbbb90df47e058aa7eda4fb445b89fe70457bb94fbccf6e49" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "servo_arc" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "siphasher" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.16.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "softbuffer" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +dependencies = [ + "bytemuck", + "js-sys", + "ndk", + "objc2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "redox_syscall", + "tracing", + "wasm-bindgen", + "web-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_vcruntime" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff7589a1859b09232522bb9edf076ca7fcf14ded96685d3fa629db73023ffbb7" + +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "swift-rs" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cefd87076fd385308ee4aff597256c902f1fbb4d031de1558efc12f8ffefadd9" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.37.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5777b06fe6435126ae8d816eba269e050e1e10d302cf5461e9c49eccabc3548" +dependencies = [ + "bitflags 2.13.2", + "block2", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dbus", + "dispatch2", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fb0244332cfb9cee7e2a568bf5da29a36ed8fdbd717f6f47a66b6b7b358c072" +dependencies = [ + "anyhow", + "bytes", + "cookie", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.4", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.21", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adddb0e648752aaac5da9c3c3c6a68e1e87cab55e3b757b18a9441ef8c3ac614" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "static_vcruntime", + "strsim", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb37631cf71dab5e8ab55e1bdd701e18a52653d90b78e71d0e5598b1e0a61316" +dependencies = [ + "base64 0.23.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.119", + "tauri-utils", + "thiserror 2.0.21", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc38db58854c10fb5f91a887ed8bf82d3239bb92b5d8db86eda09e96d9963d1" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c55766d99cea69055904d1735b93c2049302b2e09effd462120deb5581d78e9" +dependencies = [ + "cookie", + "dpi", + "gtk", + "http", + "jni", + "objc2", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.21", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1aa9d8b7a120f879f44fdc1053f7b7dbf416bf0bbc6a72b714dec46b782b52f" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2", + "objc2-app-kit", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "362ab21cd4cc713f2a02b1a9b5688198b1541cfb6907c4281e9190e0f0ef4aa3" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dom_query", + "dunce", + "glob", + "http", + "infer", + "json-patch", + "log", + "memchr", + "phf", + "plist", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.21", + "toml 1.1.8+spec-1.1.0", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c52bb6904475a6ca662f15ef787f18ade61d5740a1ee12c45d3b748efdb6f796" +dependencies = [ + "dunce", + "embed-resource", + "toml 1.1.8+spec-1.1.0", +] + +[[package]] +name = "tendril" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08" +dependencies = [ + "new_debug_unreachable", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl 2.0.21", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "time" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde_core", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" + +[[package]] +name = "time-macros" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" + +[[package]] +name = "tokio" +version = "1.54.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-util" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e464cf451ba96ebfc6f9b6542f17ee8b8956e33f1e40d9690624e59d7a7f8a4b" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "1.1.8+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20489e00e4d8741d6be680764cc12e270655e375a20d1011e844a9c3379e678d" +dependencies = [ + "indexmap 2.14.2", + "serde_core", + "serde_spanned 1.1.2", + "toml_datetime 1.1.2+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.14.2", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.14.2", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.25.17+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3641d5bbb5349a79e1020a242d251efbc546ad8048d133958323ce9c40a9c9c" +dependencies = [ + "indexmap 2.14.2", + "toml_datetime 1.1.2+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_writer" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06bdbd8cfc056b8d2e2e85f29b56a3bdbecb527cef81eb39e3e7b98af4652770" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" +dependencies = [ + "bitflags 2.13.2", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", + "url", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b9c52859a94554803ccd4a24b98f74148ebc73b90676d783f3490b1bff9d72" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation", + "once_cell", + "png", + "serde", + "thiserror 2.0.21", + "windows-sys 0.61.2", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttimg" +version = "0.1.0" +dependencies = [ + "log", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-runtime-wry", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "unicode-ident" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "urlpattern" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df16f50ef4cc145211879a3867ba757076b25dfee812040dcb0658bd9ae7904b" +dependencies = [ + "icu_properties", + "regex", + "serde", + "url", +] + +[[package]] +name = "utf8_iter" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af3bd9d3e571c26fcce9d033b87ea5ab061b8d2ffe9b7a5675d810d68f03edf0" +dependencies = [ + "utf_types", +] + +[[package]] +name = "utf_types" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3b425286980a367278453f3b6d28cdcb134b574e5a35824a6ff5eebad50bb6" + +[[package]] +name = "uuid" +version = "1.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0e2d11620c50695fe12bbbfde96b3477fe606e7284c22d505c12ce51214514" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0181c14ddd6c7b8b0b0132a5f1ea2f32be0d893cd3ea97b6e3b28886b8a3d1c" +dependencies = [ + "cfg-if", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e14e0327cb5368ad60ccb22d04a9827a693c95a926d8d125e9fa39e0baec501" +dependencies = [ + "js-sys", + "tokio", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e931a02a39abdbf66966fc35902b5ed58344750a70885bed4ebb3d8eaf28ed9" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ca4b54280e455bd831e33a6b8e734baf432fe63fbc35c42ac14ce67a043a53a" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.9", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b1f9c3798725016c6ee5f2f57869ec0831e8bbc0ab0310a86e787e97f41389e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7d179596ff5ec0f6de4db64d54011bde6289cc49603d3a6e4ce3f329207ab88" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web_atoms" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba8b815c1b593dc0baf78dd0f4fc8fdb2de53198fb1163738093e9a311c33fb3" +dependencies = [ + "phf", + "phf_codegen", + "string_cache", + "string_cache_codegen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webview2-com" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f89fca7a704cee10dcb3654c1dbb8941d1783132f1917358af75bec37a7d7e6" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "webview2-com-sys" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a07132775117d6065853d9d1178157b8c90e228de47129d6bce2c7edebedfb" +dependencies = [ + "thiserror 2.0.21", + "windows", + "windows-core", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111e51caca442cafd9bab396628ac4d814880eaea4e63dfd76a12e9f342b5580" +dependencies = [ + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-quartz-core", + "raw-window-handle", + "windows-sys 0.61.2", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections", + "windows-core", + "windows-future", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" +dependencies = [ + "windows-core", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d6f32a0ff4a9f6f01231eb2059cc85479330739333e0e58cadf03b6af2cca10" +dependencies = [ + "cfg-if", + "windows-sys 0.61.2", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "wry" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759c50ddad0ef9913bb5496cb9d509a50433a3b78cb0238d61105526589cf0e9" +dependencies = [ + "base64 0.23.1", + "block2", + "cookie", + "crossbeam-channel", + "dirs", + "dom_query", + "dpi", + "dunce", + "gdkx11", + "gtk", + "http", + "javascriptcore-rs", + "jni", + "libc", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.21", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + +[[package]] +name = "zlib-rs" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/harnesses/ttimg/Cargo.toml b/harnesses/ttimg/Cargo.toml new file mode 100644 index 0000000..fe43839 --- /dev/null +++ b/harnesses/ttimg/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "ttimg" +version = "0.1.0" +edition = "2021" + +# Tauri v2 mobile (Android): the CLI builds a cdylib .so loaded by the +# Tauri activity; staticlib/rlib for the template's other targets. +[lib] +name = "ttimg_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +tauri-runtime-wry = "2" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +log = { version = "0.4", features = ["std"] } diff --git a/harnesses/ttimg/app-icon.png b/harnesses/ttimg/app-icon.png new file mode 100644 index 0000000..784f320 Binary files /dev/null and b/harnesses/ttimg/app-icon.png differ diff --git a/harnesses/ttimg/build.rs b/harnesses/ttimg/build.rs new file mode 100644 index 0000000..d860e1e --- /dev/null +++ b/harnesses/ttimg/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/harnesses/ttimg/capabilities/default.json b/harnesses/ttimg/capabilities/default.json new file mode 100644 index 0000000..4c8eddd --- /dev/null +++ b/harnesses/ttimg/capabilities/default.json @@ -0,0 +1,11 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "tttest: FR batching + lifecycle logs from the webview", + "windows": [ + "main" + ], + "permissions": [ + "core:default" + ] +} \ No newline at end of file diff --git a/harnesses/ttimg/frontend/dist/img/000.jpg b/harnesses/ttimg/frontend/dist/img/000.jpg new file mode 100644 index 0000000..1236c42 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/000.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/001.jpg b/harnesses/ttimg/frontend/dist/img/001.jpg new file mode 100644 index 0000000..dabf8c5 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/001.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/002.jpg b/harnesses/ttimg/frontend/dist/img/002.jpg new file mode 100644 index 0000000..107dede Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/002.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/003.jpg b/harnesses/ttimg/frontend/dist/img/003.jpg new file mode 100644 index 0000000..6d8d694 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/003.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/004.jpg b/harnesses/ttimg/frontend/dist/img/004.jpg new file mode 100644 index 0000000..53884f4 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/004.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/005.jpg b/harnesses/ttimg/frontend/dist/img/005.jpg new file mode 100644 index 0000000..161d5b2 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/005.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/006.jpg b/harnesses/ttimg/frontend/dist/img/006.jpg new file mode 100644 index 0000000..179f269 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/006.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/007.jpg b/harnesses/ttimg/frontend/dist/img/007.jpg new file mode 100644 index 0000000..bf469d1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/007.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/008.jpg b/harnesses/ttimg/frontend/dist/img/008.jpg new file mode 100644 index 0000000..fe21453 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/008.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/009.jpg b/harnesses/ttimg/frontend/dist/img/009.jpg new file mode 100644 index 0000000..8d44752 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/009.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/010.jpg b/harnesses/ttimg/frontend/dist/img/010.jpg new file mode 100644 index 0000000..6c951b2 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/010.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/011.jpg b/harnesses/ttimg/frontend/dist/img/011.jpg new file mode 100644 index 0000000..ddfdb79 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/011.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/012.jpg b/harnesses/ttimg/frontend/dist/img/012.jpg new file mode 100644 index 0000000..e1addd1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/012.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/013.jpg b/harnesses/ttimg/frontend/dist/img/013.jpg new file mode 100644 index 0000000..e5e2069 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/013.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/014.jpg b/harnesses/ttimg/frontend/dist/img/014.jpg new file mode 100644 index 0000000..e58c15c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/014.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/015.jpg b/harnesses/ttimg/frontend/dist/img/015.jpg new file mode 100644 index 0000000..7da20ae Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/015.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/016.jpg b/harnesses/ttimg/frontend/dist/img/016.jpg new file mode 100644 index 0000000..32e0b04 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/016.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/017.jpg b/harnesses/ttimg/frontend/dist/img/017.jpg new file mode 100644 index 0000000..f21878f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/017.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/018.jpg b/harnesses/ttimg/frontend/dist/img/018.jpg new file mode 100644 index 0000000..1cb684b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/018.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/019.jpg b/harnesses/ttimg/frontend/dist/img/019.jpg new file mode 100644 index 0000000..ace62dd Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/019.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/020.jpg b/harnesses/ttimg/frontend/dist/img/020.jpg new file mode 100644 index 0000000..fa6832e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/020.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/021.jpg b/harnesses/ttimg/frontend/dist/img/021.jpg new file mode 100644 index 0000000..0b6ce0c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/021.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/022.jpg b/harnesses/ttimg/frontend/dist/img/022.jpg new file mode 100644 index 0000000..c486250 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/022.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/023.jpg b/harnesses/ttimg/frontend/dist/img/023.jpg new file mode 100644 index 0000000..2c81615 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/023.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/024.jpg b/harnesses/ttimg/frontend/dist/img/024.jpg new file mode 100644 index 0000000..1c91698 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/024.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/025.jpg b/harnesses/ttimg/frontend/dist/img/025.jpg new file mode 100644 index 0000000..69abde3 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/025.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/026.jpg b/harnesses/ttimg/frontend/dist/img/026.jpg new file mode 100644 index 0000000..165d4e2 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/026.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/027.jpg b/harnesses/ttimg/frontend/dist/img/027.jpg new file mode 100644 index 0000000..df939ee Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/027.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/028.jpg b/harnesses/ttimg/frontend/dist/img/028.jpg new file mode 100644 index 0000000..2752af2 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/028.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/029.jpg b/harnesses/ttimg/frontend/dist/img/029.jpg new file mode 100644 index 0000000..f751e40 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/029.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/030.jpg b/harnesses/ttimg/frontend/dist/img/030.jpg new file mode 100644 index 0000000..4dc4653 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/030.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/031.jpg b/harnesses/ttimg/frontend/dist/img/031.jpg new file mode 100644 index 0000000..f6887af Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/031.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/032.jpg b/harnesses/ttimg/frontend/dist/img/032.jpg new file mode 100644 index 0000000..1e3a2e5 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/032.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/033.jpg b/harnesses/ttimg/frontend/dist/img/033.jpg new file mode 100644 index 0000000..bc87571 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/033.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/034.jpg b/harnesses/ttimg/frontend/dist/img/034.jpg new file mode 100644 index 0000000..b8c556b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/034.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/035.jpg b/harnesses/ttimg/frontend/dist/img/035.jpg new file mode 100644 index 0000000..f5ef78b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/035.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/036.jpg b/harnesses/ttimg/frontend/dist/img/036.jpg new file mode 100644 index 0000000..7891819 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/036.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/037.jpg b/harnesses/ttimg/frontend/dist/img/037.jpg new file mode 100644 index 0000000..a432b93 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/037.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/038.jpg b/harnesses/ttimg/frontend/dist/img/038.jpg new file mode 100644 index 0000000..cd6f4a1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/038.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/039.jpg b/harnesses/ttimg/frontend/dist/img/039.jpg new file mode 100644 index 0000000..c403800 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/039.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/040.jpg b/harnesses/ttimg/frontend/dist/img/040.jpg new file mode 100644 index 0000000..c53b08b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/040.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/041.jpg b/harnesses/ttimg/frontend/dist/img/041.jpg new file mode 100644 index 0000000..3ad9a1a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/041.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/042.jpg b/harnesses/ttimg/frontend/dist/img/042.jpg new file mode 100644 index 0000000..0e85183 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/042.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/043.jpg b/harnesses/ttimg/frontend/dist/img/043.jpg new file mode 100644 index 0000000..5d2fc2c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/043.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/044.jpg b/harnesses/ttimg/frontend/dist/img/044.jpg new file mode 100644 index 0000000..30ecee9 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/044.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/045.jpg b/harnesses/ttimg/frontend/dist/img/045.jpg new file mode 100644 index 0000000..6333e33 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/045.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/046.jpg b/harnesses/ttimg/frontend/dist/img/046.jpg new file mode 100644 index 0000000..7907dc8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/046.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/047.jpg b/harnesses/ttimg/frontend/dist/img/047.jpg new file mode 100644 index 0000000..0801273 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/047.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/048.jpg b/harnesses/ttimg/frontend/dist/img/048.jpg new file mode 100644 index 0000000..6ae8975 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/048.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/049.jpg b/harnesses/ttimg/frontend/dist/img/049.jpg new file mode 100644 index 0000000..eb66484 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/049.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/050.jpg b/harnesses/ttimg/frontend/dist/img/050.jpg new file mode 100644 index 0000000..e634ae9 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/050.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/051.jpg b/harnesses/ttimg/frontend/dist/img/051.jpg new file mode 100644 index 0000000..00ca024 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/051.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/052.jpg b/harnesses/ttimg/frontend/dist/img/052.jpg new file mode 100644 index 0000000..a7468a9 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/052.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/053.jpg b/harnesses/ttimg/frontend/dist/img/053.jpg new file mode 100644 index 0000000..dfee9aa Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/053.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/054.jpg b/harnesses/ttimg/frontend/dist/img/054.jpg new file mode 100644 index 0000000..ca7bd30 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/054.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/055.jpg b/harnesses/ttimg/frontend/dist/img/055.jpg new file mode 100644 index 0000000..fafd645 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/055.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/056.jpg b/harnesses/ttimg/frontend/dist/img/056.jpg new file mode 100644 index 0000000..5c59fcb Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/056.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/057.jpg b/harnesses/ttimg/frontend/dist/img/057.jpg new file mode 100644 index 0000000..22e8e24 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/057.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/058.jpg b/harnesses/ttimg/frontend/dist/img/058.jpg new file mode 100644 index 0000000..8fd2002 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/058.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/059.jpg b/harnesses/ttimg/frontend/dist/img/059.jpg new file mode 100644 index 0000000..51633df Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/059.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/060.jpg b/harnesses/ttimg/frontend/dist/img/060.jpg new file mode 100644 index 0000000..5d5a977 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/060.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/061.jpg b/harnesses/ttimg/frontend/dist/img/061.jpg new file mode 100644 index 0000000..4ae146b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/061.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/062.jpg b/harnesses/ttimg/frontend/dist/img/062.jpg new file mode 100644 index 0000000..3a3d6bc Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/062.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/063.jpg b/harnesses/ttimg/frontend/dist/img/063.jpg new file mode 100644 index 0000000..98267c3 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/063.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/064.jpg b/harnesses/ttimg/frontend/dist/img/064.jpg new file mode 100644 index 0000000..03c5452 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/064.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/065.jpg b/harnesses/ttimg/frontend/dist/img/065.jpg new file mode 100644 index 0000000..22dd269 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/065.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/066.jpg b/harnesses/ttimg/frontend/dist/img/066.jpg new file mode 100644 index 0000000..6e833cc Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/066.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/067.jpg b/harnesses/ttimg/frontend/dist/img/067.jpg new file mode 100644 index 0000000..668e611 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/067.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/068.jpg b/harnesses/ttimg/frontend/dist/img/068.jpg new file mode 100644 index 0000000..0723817 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/068.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/069.jpg b/harnesses/ttimg/frontend/dist/img/069.jpg new file mode 100644 index 0000000..23056d5 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/069.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/070.jpg b/harnesses/ttimg/frontend/dist/img/070.jpg new file mode 100644 index 0000000..2e71f16 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/070.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/071.jpg b/harnesses/ttimg/frontend/dist/img/071.jpg new file mode 100644 index 0000000..c844f19 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/071.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/072.jpg b/harnesses/ttimg/frontend/dist/img/072.jpg new file mode 100644 index 0000000..c5b542d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/072.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/073.jpg b/harnesses/ttimg/frontend/dist/img/073.jpg new file mode 100644 index 0000000..8842b6f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/073.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/074.jpg b/harnesses/ttimg/frontend/dist/img/074.jpg new file mode 100644 index 0000000..491b787 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/074.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/075.jpg b/harnesses/ttimg/frontend/dist/img/075.jpg new file mode 100644 index 0000000..0d14115 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/075.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/076.jpg b/harnesses/ttimg/frontend/dist/img/076.jpg new file mode 100644 index 0000000..af6128f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/076.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/077.jpg b/harnesses/ttimg/frontend/dist/img/077.jpg new file mode 100644 index 0000000..22132ec Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/077.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/078.jpg b/harnesses/ttimg/frontend/dist/img/078.jpg new file mode 100644 index 0000000..29f7059 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/078.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/079.jpg b/harnesses/ttimg/frontend/dist/img/079.jpg new file mode 100644 index 0000000..2fae328 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/079.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/080.jpg b/harnesses/ttimg/frontend/dist/img/080.jpg new file mode 100644 index 0000000..9f91a40 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/080.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/081.jpg b/harnesses/ttimg/frontend/dist/img/081.jpg new file mode 100644 index 0000000..362b422 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/081.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/082.jpg b/harnesses/ttimg/frontend/dist/img/082.jpg new file mode 100644 index 0000000..11c0a09 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/082.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/083.jpg b/harnesses/ttimg/frontend/dist/img/083.jpg new file mode 100644 index 0000000..171259b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/083.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/084.jpg b/harnesses/ttimg/frontend/dist/img/084.jpg new file mode 100644 index 0000000..f6702bc Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/084.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/085.jpg b/harnesses/ttimg/frontend/dist/img/085.jpg new file mode 100644 index 0000000..978aa0d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/085.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/086.jpg b/harnesses/ttimg/frontend/dist/img/086.jpg new file mode 100644 index 0000000..3e1679e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/086.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/087.jpg b/harnesses/ttimg/frontend/dist/img/087.jpg new file mode 100644 index 0000000..7f9177f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/087.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/088.jpg b/harnesses/ttimg/frontend/dist/img/088.jpg new file mode 100644 index 0000000..e0b0fe7 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/088.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/089.jpg b/harnesses/ttimg/frontend/dist/img/089.jpg new file mode 100644 index 0000000..d2f1856 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/089.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/090.jpg b/harnesses/ttimg/frontend/dist/img/090.jpg new file mode 100644 index 0000000..f341b81 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/090.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/091.jpg b/harnesses/ttimg/frontend/dist/img/091.jpg new file mode 100644 index 0000000..adebe5a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/091.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/092.jpg b/harnesses/ttimg/frontend/dist/img/092.jpg new file mode 100644 index 0000000..38dc969 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/092.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/093.jpg b/harnesses/ttimg/frontend/dist/img/093.jpg new file mode 100644 index 0000000..900e7ae Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/093.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/094.jpg b/harnesses/ttimg/frontend/dist/img/094.jpg new file mode 100644 index 0000000..700a6de Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/094.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/095.jpg b/harnesses/ttimg/frontend/dist/img/095.jpg new file mode 100644 index 0000000..1e7f21e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/095.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/096.jpg b/harnesses/ttimg/frontend/dist/img/096.jpg new file mode 100644 index 0000000..3cf45aa Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/096.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/097.jpg b/harnesses/ttimg/frontend/dist/img/097.jpg new file mode 100644 index 0000000..130435d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/097.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/098.jpg b/harnesses/ttimg/frontend/dist/img/098.jpg new file mode 100644 index 0000000..19c1f0f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/098.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/099.jpg b/harnesses/ttimg/frontend/dist/img/099.jpg new file mode 100644 index 0000000..e88a24b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/099.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/100.jpg b/harnesses/ttimg/frontend/dist/img/100.jpg new file mode 100644 index 0000000..659983f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/100.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/101.jpg b/harnesses/ttimg/frontend/dist/img/101.jpg new file mode 100644 index 0000000..5f8d343 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/101.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/102.jpg b/harnesses/ttimg/frontend/dist/img/102.jpg new file mode 100644 index 0000000..4a08d12 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/102.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/103.jpg b/harnesses/ttimg/frontend/dist/img/103.jpg new file mode 100644 index 0000000..189f6d8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/103.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/104.jpg b/harnesses/ttimg/frontend/dist/img/104.jpg new file mode 100644 index 0000000..c77a308 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/104.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/105.jpg b/harnesses/ttimg/frontend/dist/img/105.jpg new file mode 100644 index 0000000..c9c4de2 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/105.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/106.jpg b/harnesses/ttimg/frontend/dist/img/106.jpg new file mode 100644 index 0000000..41fbd01 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/106.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/107.jpg b/harnesses/ttimg/frontend/dist/img/107.jpg new file mode 100644 index 0000000..4a94218 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/107.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/108.jpg b/harnesses/ttimg/frontend/dist/img/108.jpg new file mode 100644 index 0000000..9ff840c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/108.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/109.jpg b/harnesses/ttimg/frontend/dist/img/109.jpg new file mode 100644 index 0000000..f8c3e71 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/109.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/110.jpg b/harnesses/ttimg/frontend/dist/img/110.jpg new file mode 100644 index 0000000..149448d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/110.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/111.jpg b/harnesses/ttimg/frontend/dist/img/111.jpg new file mode 100644 index 0000000..975b5c1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/111.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/112.jpg b/harnesses/ttimg/frontend/dist/img/112.jpg new file mode 100644 index 0000000..c81fd67 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/112.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/113.jpg b/harnesses/ttimg/frontend/dist/img/113.jpg new file mode 100644 index 0000000..3c700f1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/113.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/114.jpg b/harnesses/ttimg/frontend/dist/img/114.jpg new file mode 100644 index 0000000..21f8977 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/114.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/115.jpg b/harnesses/ttimg/frontend/dist/img/115.jpg new file mode 100644 index 0000000..7b96f8b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/115.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/116.jpg b/harnesses/ttimg/frontend/dist/img/116.jpg new file mode 100644 index 0000000..bdeaab5 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/116.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/117.jpg b/harnesses/ttimg/frontend/dist/img/117.jpg new file mode 100644 index 0000000..d718b2d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/117.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/118.jpg b/harnesses/ttimg/frontend/dist/img/118.jpg new file mode 100644 index 0000000..b61b9c8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/118.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/119.jpg b/harnesses/ttimg/frontend/dist/img/119.jpg new file mode 100644 index 0000000..541818d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/119.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/120.jpg b/harnesses/ttimg/frontend/dist/img/120.jpg new file mode 100644 index 0000000..4c2e82e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/120.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/121.jpg b/harnesses/ttimg/frontend/dist/img/121.jpg new file mode 100644 index 0000000..0ef05f8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/121.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/122.jpg b/harnesses/ttimg/frontend/dist/img/122.jpg new file mode 100644 index 0000000..9575859 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/122.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/123.jpg b/harnesses/ttimg/frontend/dist/img/123.jpg new file mode 100644 index 0000000..d7e5287 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/123.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/124.jpg b/harnesses/ttimg/frontend/dist/img/124.jpg new file mode 100644 index 0000000..47e1a6f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/124.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/125.jpg b/harnesses/ttimg/frontend/dist/img/125.jpg new file mode 100644 index 0000000..32de754 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/125.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/126.jpg b/harnesses/ttimg/frontend/dist/img/126.jpg new file mode 100644 index 0000000..db2fa1f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/126.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/127.jpg b/harnesses/ttimg/frontend/dist/img/127.jpg new file mode 100644 index 0000000..9fff447 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/127.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/128.jpg b/harnesses/ttimg/frontend/dist/img/128.jpg new file mode 100644 index 0000000..f59316c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/128.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/129.jpg b/harnesses/ttimg/frontend/dist/img/129.jpg new file mode 100644 index 0000000..d8d058e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/129.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/130.jpg b/harnesses/ttimg/frontend/dist/img/130.jpg new file mode 100644 index 0000000..5bf7ac4 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/130.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/131.jpg b/harnesses/ttimg/frontend/dist/img/131.jpg new file mode 100644 index 0000000..820a899 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/131.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/132.jpg b/harnesses/ttimg/frontend/dist/img/132.jpg new file mode 100644 index 0000000..6f88ceb Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/132.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/133.jpg b/harnesses/ttimg/frontend/dist/img/133.jpg new file mode 100644 index 0000000..c00554b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/133.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/134.jpg b/harnesses/ttimg/frontend/dist/img/134.jpg new file mode 100644 index 0000000..464ddfb Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/134.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/135.jpg b/harnesses/ttimg/frontend/dist/img/135.jpg new file mode 100644 index 0000000..de7d013 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/135.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/136.jpg b/harnesses/ttimg/frontend/dist/img/136.jpg new file mode 100644 index 0000000..a9b3a86 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/136.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/137.jpg b/harnesses/ttimg/frontend/dist/img/137.jpg new file mode 100644 index 0000000..3b7f034 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/137.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/138.jpg b/harnesses/ttimg/frontend/dist/img/138.jpg new file mode 100644 index 0000000..9d5ed31 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/138.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/139.jpg b/harnesses/ttimg/frontend/dist/img/139.jpg new file mode 100644 index 0000000..3ea1de8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/139.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/140.jpg b/harnesses/ttimg/frontend/dist/img/140.jpg new file mode 100644 index 0000000..cff9596 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/140.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/141.jpg b/harnesses/ttimg/frontend/dist/img/141.jpg new file mode 100644 index 0000000..314cde7 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/141.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/142.jpg b/harnesses/ttimg/frontend/dist/img/142.jpg new file mode 100644 index 0000000..851ac53 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/142.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/143.jpg b/harnesses/ttimg/frontend/dist/img/143.jpg new file mode 100644 index 0000000..8420030 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/143.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/144.jpg b/harnesses/ttimg/frontend/dist/img/144.jpg new file mode 100644 index 0000000..3db135d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/144.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/145.jpg b/harnesses/ttimg/frontend/dist/img/145.jpg new file mode 100644 index 0000000..e8dd52c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/145.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/146.jpg b/harnesses/ttimg/frontend/dist/img/146.jpg new file mode 100644 index 0000000..9fb0395 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/146.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/147.jpg b/harnesses/ttimg/frontend/dist/img/147.jpg new file mode 100644 index 0000000..f162493 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/147.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/148.jpg b/harnesses/ttimg/frontend/dist/img/148.jpg new file mode 100644 index 0000000..f1bdb50 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/148.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/149.jpg b/harnesses/ttimg/frontend/dist/img/149.jpg new file mode 100644 index 0000000..12f5453 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/149.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/150.jpg b/harnesses/ttimg/frontend/dist/img/150.jpg new file mode 100644 index 0000000..c3fd108 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/150.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/151.jpg b/harnesses/ttimg/frontend/dist/img/151.jpg new file mode 100644 index 0000000..d2df22d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/151.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/152.jpg b/harnesses/ttimg/frontend/dist/img/152.jpg new file mode 100644 index 0000000..65d13ad Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/152.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/153.jpg b/harnesses/ttimg/frontend/dist/img/153.jpg new file mode 100644 index 0000000..9d1b68f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/153.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/154.jpg b/harnesses/ttimg/frontend/dist/img/154.jpg new file mode 100644 index 0000000..65912f1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/154.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/155.jpg b/harnesses/ttimg/frontend/dist/img/155.jpg new file mode 100644 index 0000000..198db68 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/155.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/156.jpg b/harnesses/ttimg/frontend/dist/img/156.jpg new file mode 100644 index 0000000..58e1750 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/156.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/157.jpg b/harnesses/ttimg/frontend/dist/img/157.jpg new file mode 100644 index 0000000..8852e43 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/157.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/158.jpg b/harnesses/ttimg/frontend/dist/img/158.jpg new file mode 100644 index 0000000..3686bc9 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/158.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/159.jpg b/harnesses/ttimg/frontend/dist/img/159.jpg new file mode 100644 index 0000000..2b8fe68 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/159.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/160.jpg b/harnesses/ttimg/frontend/dist/img/160.jpg new file mode 100644 index 0000000..8521e5e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/160.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/161.jpg b/harnesses/ttimg/frontend/dist/img/161.jpg new file mode 100644 index 0000000..e6625ef Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/161.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/162.jpg b/harnesses/ttimg/frontend/dist/img/162.jpg new file mode 100644 index 0000000..a5319a5 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/162.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/163.jpg b/harnesses/ttimg/frontend/dist/img/163.jpg new file mode 100644 index 0000000..8f05ce3 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/163.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/164.jpg b/harnesses/ttimg/frontend/dist/img/164.jpg new file mode 100644 index 0000000..6af71fd Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/164.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/165.jpg b/harnesses/ttimg/frontend/dist/img/165.jpg new file mode 100644 index 0000000..af249f6 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/165.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/166.jpg b/harnesses/ttimg/frontend/dist/img/166.jpg new file mode 100644 index 0000000..088b78f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/166.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/167.jpg b/harnesses/ttimg/frontend/dist/img/167.jpg new file mode 100644 index 0000000..79a6327 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/167.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/168.jpg b/harnesses/ttimg/frontend/dist/img/168.jpg new file mode 100644 index 0000000..3a35e41 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/168.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/169.jpg b/harnesses/ttimg/frontend/dist/img/169.jpg new file mode 100644 index 0000000..1cb6217 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/169.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/170.jpg b/harnesses/ttimg/frontend/dist/img/170.jpg new file mode 100644 index 0000000..9288d13 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/170.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/171.jpg b/harnesses/ttimg/frontend/dist/img/171.jpg new file mode 100644 index 0000000..f2ebc28 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/171.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/172.jpg b/harnesses/ttimg/frontend/dist/img/172.jpg new file mode 100644 index 0000000..1e01e2e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/172.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/173.jpg b/harnesses/ttimg/frontend/dist/img/173.jpg new file mode 100644 index 0000000..f7cb5ac Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/173.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/174.jpg b/harnesses/ttimg/frontend/dist/img/174.jpg new file mode 100644 index 0000000..1bdf4d4 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/174.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/175.jpg b/harnesses/ttimg/frontend/dist/img/175.jpg new file mode 100644 index 0000000..fe6e0c3 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/175.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/176.jpg b/harnesses/ttimg/frontend/dist/img/176.jpg new file mode 100644 index 0000000..1808212 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/176.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/177.jpg b/harnesses/ttimg/frontend/dist/img/177.jpg new file mode 100644 index 0000000..22a1962 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/177.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/178.jpg b/harnesses/ttimg/frontend/dist/img/178.jpg new file mode 100644 index 0000000..8bb9f1d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/178.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/179.jpg b/harnesses/ttimg/frontend/dist/img/179.jpg new file mode 100644 index 0000000..48800e3 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/179.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/180.jpg b/harnesses/ttimg/frontend/dist/img/180.jpg new file mode 100644 index 0000000..b4aacd1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/180.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/181.jpg b/harnesses/ttimg/frontend/dist/img/181.jpg new file mode 100644 index 0000000..0297671 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/181.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/182.jpg b/harnesses/ttimg/frontend/dist/img/182.jpg new file mode 100644 index 0000000..3ba7d5f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/182.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/183.jpg b/harnesses/ttimg/frontend/dist/img/183.jpg new file mode 100644 index 0000000..cd89f1c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/183.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/184.jpg b/harnesses/ttimg/frontend/dist/img/184.jpg new file mode 100644 index 0000000..7d39a2e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/184.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/185.jpg b/harnesses/ttimg/frontend/dist/img/185.jpg new file mode 100644 index 0000000..c5c9cce Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/185.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/186.jpg b/harnesses/ttimg/frontend/dist/img/186.jpg new file mode 100644 index 0000000..8057358 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/186.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/187.jpg b/harnesses/ttimg/frontend/dist/img/187.jpg new file mode 100644 index 0000000..9f58a3c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/187.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/188.jpg b/harnesses/ttimg/frontend/dist/img/188.jpg new file mode 100644 index 0000000..304d924 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/188.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/189.jpg b/harnesses/ttimg/frontend/dist/img/189.jpg new file mode 100644 index 0000000..f84cdc4 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/189.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/190.jpg b/harnesses/ttimg/frontend/dist/img/190.jpg new file mode 100644 index 0000000..24790e7 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/190.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/191.jpg b/harnesses/ttimg/frontend/dist/img/191.jpg new file mode 100644 index 0000000..d1e9eb8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/191.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/192.jpg b/harnesses/ttimg/frontend/dist/img/192.jpg new file mode 100644 index 0000000..1e12638 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/192.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/193.jpg b/harnesses/ttimg/frontend/dist/img/193.jpg new file mode 100644 index 0000000..2d19310 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/193.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/194.jpg b/harnesses/ttimg/frontend/dist/img/194.jpg new file mode 100644 index 0000000..5c61da9 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/194.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/195.jpg b/harnesses/ttimg/frontend/dist/img/195.jpg new file mode 100644 index 0000000..88be400 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/195.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/196.jpg b/harnesses/ttimg/frontend/dist/img/196.jpg new file mode 100644 index 0000000..96e92d7 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/196.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/197.jpg b/harnesses/ttimg/frontend/dist/img/197.jpg new file mode 100644 index 0000000..08ded87 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/197.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/198.jpg b/harnesses/ttimg/frontend/dist/img/198.jpg new file mode 100644 index 0000000..609072f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/198.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/199.jpg b/harnesses/ttimg/frontend/dist/img/199.jpg new file mode 100644 index 0000000..81552ac Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/199.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/200.jpg b/harnesses/ttimg/frontend/dist/img/200.jpg new file mode 100644 index 0000000..6b70e9f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/200.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/201.jpg b/harnesses/ttimg/frontend/dist/img/201.jpg new file mode 100644 index 0000000..137e707 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/201.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/202.jpg b/harnesses/ttimg/frontend/dist/img/202.jpg new file mode 100644 index 0000000..9e56630 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/202.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/203.jpg b/harnesses/ttimg/frontend/dist/img/203.jpg new file mode 100644 index 0000000..3fe853c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/203.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/204.jpg b/harnesses/ttimg/frontend/dist/img/204.jpg new file mode 100644 index 0000000..31600d0 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/204.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/205.jpg b/harnesses/ttimg/frontend/dist/img/205.jpg new file mode 100644 index 0000000..3170fa5 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/205.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/206.jpg b/harnesses/ttimg/frontend/dist/img/206.jpg new file mode 100644 index 0000000..9c55d4d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/206.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/207.jpg b/harnesses/ttimg/frontend/dist/img/207.jpg new file mode 100644 index 0000000..a98f5d6 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/207.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/208.jpg b/harnesses/ttimg/frontend/dist/img/208.jpg new file mode 100644 index 0000000..c8474e1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/208.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/209.jpg b/harnesses/ttimg/frontend/dist/img/209.jpg new file mode 100644 index 0000000..f7328db Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/209.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/210.jpg b/harnesses/ttimg/frontend/dist/img/210.jpg new file mode 100644 index 0000000..55f99c5 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/210.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/211.jpg b/harnesses/ttimg/frontend/dist/img/211.jpg new file mode 100644 index 0000000..ca79658 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/211.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/212.jpg b/harnesses/ttimg/frontend/dist/img/212.jpg new file mode 100644 index 0000000..cf1979c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/212.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/213.jpg b/harnesses/ttimg/frontend/dist/img/213.jpg new file mode 100644 index 0000000..2b3fbb8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/213.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/214.jpg b/harnesses/ttimg/frontend/dist/img/214.jpg new file mode 100644 index 0000000..c232df0 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/214.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/215.jpg b/harnesses/ttimg/frontend/dist/img/215.jpg new file mode 100644 index 0000000..865040b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/215.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/216.jpg b/harnesses/ttimg/frontend/dist/img/216.jpg new file mode 100644 index 0000000..83d049a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/216.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/217.jpg b/harnesses/ttimg/frontend/dist/img/217.jpg new file mode 100644 index 0000000..6b6f68c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/217.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/218.jpg b/harnesses/ttimg/frontend/dist/img/218.jpg new file mode 100644 index 0000000..4919343 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/218.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/219.jpg b/harnesses/ttimg/frontend/dist/img/219.jpg new file mode 100644 index 0000000..4bb8684 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/219.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/220.jpg b/harnesses/ttimg/frontend/dist/img/220.jpg new file mode 100644 index 0000000..94b92ad Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/220.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/221.jpg b/harnesses/ttimg/frontend/dist/img/221.jpg new file mode 100644 index 0000000..1fca732 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/221.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/222.jpg b/harnesses/ttimg/frontend/dist/img/222.jpg new file mode 100644 index 0000000..08fa63b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/222.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/223.jpg b/harnesses/ttimg/frontend/dist/img/223.jpg new file mode 100644 index 0000000..5664262 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/223.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/224.jpg b/harnesses/ttimg/frontend/dist/img/224.jpg new file mode 100644 index 0000000..897442d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/224.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/225.jpg b/harnesses/ttimg/frontend/dist/img/225.jpg new file mode 100644 index 0000000..1e15b48 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/225.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/226.jpg b/harnesses/ttimg/frontend/dist/img/226.jpg new file mode 100644 index 0000000..fe4ab06 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/226.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/227.jpg b/harnesses/ttimg/frontend/dist/img/227.jpg new file mode 100644 index 0000000..284f63e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/227.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/228.jpg b/harnesses/ttimg/frontend/dist/img/228.jpg new file mode 100644 index 0000000..78e22af Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/228.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/229.jpg b/harnesses/ttimg/frontend/dist/img/229.jpg new file mode 100644 index 0000000..bc8097f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/229.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/230.jpg b/harnesses/ttimg/frontend/dist/img/230.jpg new file mode 100644 index 0000000..f0930c3 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/230.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/231.jpg b/harnesses/ttimg/frontend/dist/img/231.jpg new file mode 100644 index 0000000..9f6aa42 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/231.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/232.jpg b/harnesses/ttimg/frontend/dist/img/232.jpg new file mode 100644 index 0000000..1a17033 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/232.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/233.jpg b/harnesses/ttimg/frontend/dist/img/233.jpg new file mode 100644 index 0000000..969374b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/233.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/234.jpg b/harnesses/ttimg/frontend/dist/img/234.jpg new file mode 100644 index 0000000..abe4314 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/234.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/235.jpg b/harnesses/ttimg/frontend/dist/img/235.jpg new file mode 100644 index 0000000..4984980 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/235.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/236.jpg b/harnesses/ttimg/frontend/dist/img/236.jpg new file mode 100644 index 0000000..e58cce9 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/236.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/237.jpg b/harnesses/ttimg/frontend/dist/img/237.jpg new file mode 100644 index 0000000..af948d2 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/237.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/238.jpg b/harnesses/ttimg/frontend/dist/img/238.jpg new file mode 100644 index 0000000..de3a234 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/238.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/239.jpg b/harnesses/ttimg/frontend/dist/img/239.jpg new file mode 100644 index 0000000..abbafcd Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/239.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/240.jpg b/harnesses/ttimg/frontend/dist/img/240.jpg new file mode 100644 index 0000000..1faece8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/240.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/241.jpg b/harnesses/ttimg/frontend/dist/img/241.jpg new file mode 100644 index 0000000..d69a8d4 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/241.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/242.jpg b/harnesses/ttimg/frontend/dist/img/242.jpg new file mode 100644 index 0000000..0239ad9 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/242.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/243.jpg b/harnesses/ttimg/frontend/dist/img/243.jpg new file mode 100644 index 0000000..49d2e79 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/243.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/244.jpg b/harnesses/ttimg/frontend/dist/img/244.jpg new file mode 100644 index 0000000..6415a8f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/244.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/245.jpg b/harnesses/ttimg/frontend/dist/img/245.jpg new file mode 100644 index 0000000..81bab27 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/245.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/246.jpg b/harnesses/ttimg/frontend/dist/img/246.jpg new file mode 100644 index 0000000..10a0d0d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/246.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/247.jpg b/harnesses/ttimg/frontend/dist/img/247.jpg new file mode 100644 index 0000000..a58a58b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/247.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/248.jpg b/harnesses/ttimg/frontend/dist/img/248.jpg new file mode 100644 index 0000000..7acd02c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/248.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/249.jpg b/harnesses/ttimg/frontend/dist/img/249.jpg new file mode 100644 index 0000000..45a1cc7 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/249.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/250.jpg b/harnesses/ttimg/frontend/dist/img/250.jpg new file mode 100644 index 0000000..ea21339 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/250.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/251.jpg b/harnesses/ttimg/frontend/dist/img/251.jpg new file mode 100644 index 0000000..7ef804e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/251.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/252.jpg b/harnesses/ttimg/frontend/dist/img/252.jpg new file mode 100644 index 0000000..d353375 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/252.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/253.jpg b/harnesses/ttimg/frontend/dist/img/253.jpg new file mode 100644 index 0000000..e66c51a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/253.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/254.jpg b/harnesses/ttimg/frontend/dist/img/254.jpg new file mode 100644 index 0000000..afd3b80 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/254.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/255.jpg b/harnesses/ttimg/frontend/dist/img/255.jpg new file mode 100644 index 0000000..90fa7b2 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/255.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/256.jpg b/harnesses/ttimg/frontend/dist/img/256.jpg new file mode 100644 index 0000000..84f362a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/256.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/257.jpg b/harnesses/ttimg/frontend/dist/img/257.jpg new file mode 100644 index 0000000..4ef2e8c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/257.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/258.jpg b/harnesses/ttimg/frontend/dist/img/258.jpg new file mode 100644 index 0000000..e906abd Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/258.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/259.jpg b/harnesses/ttimg/frontend/dist/img/259.jpg new file mode 100644 index 0000000..e113cf6 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/259.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/260.jpg b/harnesses/ttimg/frontend/dist/img/260.jpg new file mode 100644 index 0000000..1a8668a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/260.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/261.jpg b/harnesses/ttimg/frontend/dist/img/261.jpg new file mode 100644 index 0000000..96d295a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/261.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/262.jpg b/harnesses/ttimg/frontend/dist/img/262.jpg new file mode 100644 index 0000000..8fd6cdd Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/262.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/263.jpg b/harnesses/ttimg/frontend/dist/img/263.jpg new file mode 100644 index 0000000..68875a9 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/263.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/264.jpg b/harnesses/ttimg/frontend/dist/img/264.jpg new file mode 100644 index 0000000..6b95aee Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/264.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/265.jpg b/harnesses/ttimg/frontend/dist/img/265.jpg new file mode 100644 index 0000000..ea6d04c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/265.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/266.jpg b/harnesses/ttimg/frontend/dist/img/266.jpg new file mode 100644 index 0000000..83cdd86 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/266.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/267.jpg b/harnesses/ttimg/frontend/dist/img/267.jpg new file mode 100644 index 0000000..7d67dfc Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/267.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/268.jpg b/harnesses/ttimg/frontend/dist/img/268.jpg new file mode 100644 index 0000000..40a88ad Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/268.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/269.jpg b/harnesses/ttimg/frontend/dist/img/269.jpg new file mode 100644 index 0000000..24d0956 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/269.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/270.jpg b/harnesses/ttimg/frontend/dist/img/270.jpg new file mode 100644 index 0000000..1cc73fd Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/270.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/271.jpg b/harnesses/ttimg/frontend/dist/img/271.jpg new file mode 100644 index 0000000..97b9895 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/271.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/272.jpg b/harnesses/ttimg/frontend/dist/img/272.jpg new file mode 100644 index 0000000..f142663 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/272.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/273.jpg b/harnesses/ttimg/frontend/dist/img/273.jpg new file mode 100644 index 0000000..db4d3fe Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/273.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/274.jpg b/harnesses/ttimg/frontend/dist/img/274.jpg new file mode 100644 index 0000000..6eada8c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/274.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/275.jpg b/harnesses/ttimg/frontend/dist/img/275.jpg new file mode 100644 index 0000000..b9228ee Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/275.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/276.jpg b/harnesses/ttimg/frontend/dist/img/276.jpg new file mode 100644 index 0000000..d842c5d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/276.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/277.jpg b/harnesses/ttimg/frontend/dist/img/277.jpg new file mode 100644 index 0000000..a838e22 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/277.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/278.jpg b/harnesses/ttimg/frontend/dist/img/278.jpg new file mode 100644 index 0000000..59e429e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/278.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/279.jpg b/harnesses/ttimg/frontend/dist/img/279.jpg new file mode 100644 index 0000000..17458fe Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/279.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/280.jpg b/harnesses/ttimg/frontend/dist/img/280.jpg new file mode 100644 index 0000000..7b2a9cd Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/280.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/281.jpg b/harnesses/ttimg/frontend/dist/img/281.jpg new file mode 100644 index 0000000..e560770 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/281.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/282.jpg b/harnesses/ttimg/frontend/dist/img/282.jpg new file mode 100644 index 0000000..5033f1c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/282.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/283.jpg b/harnesses/ttimg/frontend/dist/img/283.jpg new file mode 100644 index 0000000..b882944 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/283.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/284.jpg b/harnesses/ttimg/frontend/dist/img/284.jpg new file mode 100644 index 0000000..51c6ce8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/284.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/285.jpg b/harnesses/ttimg/frontend/dist/img/285.jpg new file mode 100644 index 0000000..282fc5b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/285.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/286.jpg b/harnesses/ttimg/frontend/dist/img/286.jpg new file mode 100644 index 0000000..b610b7e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/286.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/287.jpg b/harnesses/ttimg/frontend/dist/img/287.jpg new file mode 100644 index 0000000..4339486 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/287.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/288.jpg b/harnesses/ttimg/frontend/dist/img/288.jpg new file mode 100644 index 0000000..04c6054 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/288.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/289.jpg b/harnesses/ttimg/frontend/dist/img/289.jpg new file mode 100644 index 0000000..734ee37 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/289.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/290.jpg b/harnesses/ttimg/frontend/dist/img/290.jpg new file mode 100644 index 0000000..c13607f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/290.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/291.jpg b/harnesses/ttimg/frontend/dist/img/291.jpg new file mode 100644 index 0000000..30b698f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/291.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/292.jpg b/harnesses/ttimg/frontend/dist/img/292.jpg new file mode 100644 index 0000000..107ec3d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/292.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/293.jpg b/harnesses/ttimg/frontend/dist/img/293.jpg new file mode 100644 index 0000000..d39ba44 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/293.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/294.jpg b/harnesses/ttimg/frontend/dist/img/294.jpg new file mode 100644 index 0000000..160e614 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/294.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/295.jpg b/harnesses/ttimg/frontend/dist/img/295.jpg new file mode 100644 index 0000000..96c08fe Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/295.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/296.jpg b/harnesses/ttimg/frontend/dist/img/296.jpg new file mode 100644 index 0000000..ec87929 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/296.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/297.jpg b/harnesses/ttimg/frontend/dist/img/297.jpg new file mode 100644 index 0000000..0e44406 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/297.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/298.jpg b/harnesses/ttimg/frontend/dist/img/298.jpg new file mode 100644 index 0000000..a804f62 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/298.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/299.jpg b/harnesses/ttimg/frontend/dist/img/299.jpg new file mode 100644 index 0000000..53be16a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/299.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/300.jpg b/harnesses/ttimg/frontend/dist/img/300.jpg new file mode 100644 index 0000000..0719f82 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/300.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/301.jpg b/harnesses/ttimg/frontend/dist/img/301.jpg new file mode 100644 index 0000000..b167595 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/301.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/302.jpg b/harnesses/ttimg/frontend/dist/img/302.jpg new file mode 100644 index 0000000..c23af4b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/302.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/303.jpg b/harnesses/ttimg/frontend/dist/img/303.jpg new file mode 100644 index 0000000..034b76e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/303.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/304.jpg b/harnesses/ttimg/frontend/dist/img/304.jpg new file mode 100644 index 0000000..5bfbbdf Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/304.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/305.jpg b/harnesses/ttimg/frontend/dist/img/305.jpg new file mode 100644 index 0000000..9f45163 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/305.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/306.jpg b/harnesses/ttimg/frontend/dist/img/306.jpg new file mode 100644 index 0000000..edafae6 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/306.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/307.jpg b/harnesses/ttimg/frontend/dist/img/307.jpg new file mode 100644 index 0000000..78c5c0e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/307.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/308.jpg b/harnesses/ttimg/frontend/dist/img/308.jpg new file mode 100644 index 0000000..b712e9f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/308.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/309.jpg b/harnesses/ttimg/frontend/dist/img/309.jpg new file mode 100644 index 0000000..dce81fd Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/309.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/310.jpg b/harnesses/ttimg/frontend/dist/img/310.jpg new file mode 100644 index 0000000..9f039f7 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/310.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/311.jpg b/harnesses/ttimg/frontend/dist/img/311.jpg new file mode 100644 index 0000000..de8a457 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/311.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/312.jpg b/harnesses/ttimg/frontend/dist/img/312.jpg new file mode 100644 index 0000000..37c8cf2 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/312.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/313.jpg b/harnesses/ttimg/frontend/dist/img/313.jpg new file mode 100644 index 0000000..ee68bf4 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/313.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/314.jpg b/harnesses/ttimg/frontend/dist/img/314.jpg new file mode 100644 index 0000000..2041a72 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/314.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/315.jpg b/harnesses/ttimg/frontend/dist/img/315.jpg new file mode 100644 index 0000000..ba9c0a8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/315.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/316.jpg b/harnesses/ttimg/frontend/dist/img/316.jpg new file mode 100644 index 0000000..5f7c2b7 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/316.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/317.jpg b/harnesses/ttimg/frontend/dist/img/317.jpg new file mode 100644 index 0000000..9ba7f75 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/317.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/318.jpg b/harnesses/ttimg/frontend/dist/img/318.jpg new file mode 100644 index 0000000..a14d5c4 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/318.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/319.jpg b/harnesses/ttimg/frontend/dist/img/319.jpg new file mode 100644 index 0000000..98f471d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/319.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/320.jpg b/harnesses/ttimg/frontend/dist/img/320.jpg new file mode 100644 index 0000000..59fc766 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/320.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/321.jpg b/harnesses/ttimg/frontend/dist/img/321.jpg new file mode 100644 index 0000000..0f68677 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/321.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/322.jpg b/harnesses/ttimg/frontend/dist/img/322.jpg new file mode 100644 index 0000000..c3fef2e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/322.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/323.jpg b/harnesses/ttimg/frontend/dist/img/323.jpg new file mode 100644 index 0000000..941914b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/323.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/324.jpg b/harnesses/ttimg/frontend/dist/img/324.jpg new file mode 100644 index 0000000..8dd3eb1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/324.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/325.jpg b/harnesses/ttimg/frontend/dist/img/325.jpg new file mode 100644 index 0000000..dd4404f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/325.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/326.jpg b/harnesses/ttimg/frontend/dist/img/326.jpg new file mode 100644 index 0000000..58a3bc8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/326.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/327.jpg b/harnesses/ttimg/frontend/dist/img/327.jpg new file mode 100644 index 0000000..3d86a39 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/327.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/328.jpg b/harnesses/ttimg/frontend/dist/img/328.jpg new file mode 100644 index 0000000..3576e7d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/328.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/329.jpg b/harnesses/ttimg/frontend/dist/img/329.jpg new file mode 100644 index 0000000..5e406f0 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/329.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/330.jpg b/harnesses/ttimg/frontend/dist/img/330.jpg new file mode 100644 index 0000000..351d42a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/330.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/331.jpg b/harnesses/ttimg/frontend/dist/img/331.jpg new file mode 100644 index 0000000..bca42d5 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/331.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/332.jpg b/harnesses/ttimg/frontend/dist/img/332.jpg new file mode 100644 index 0000000..5c0c837 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/332.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/333.jpg b/harnesses/ttimg/frontend/dist/img/333.jpg new file mode 100644 index 0000000..c179162 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/333.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/334.jpg b/harnesses/ttimg/frontend/dist/img/334.jpg new file mode 100644 index 0000000..358088a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/334.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/335.jpg b/harnesses/ttimg/frontend/dist/img/335.jpg new file mode 100644 index 0000000..0687be1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/335.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/336.jpg b/harnesses/ttimg/frontend/dist/img/336.jpg new file mode 100644 index 0000000..acbd6a3 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/336.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/337.jpg b/harnesses/ttimg/frontend/dist/img/337.jpg new file mode 100644 index 0000000..11bf2a0 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/337.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/338.jpg b/harnesses/ttimg/frontend/dist/img/338.jpg new file mode 100644 index 0000000..afe1a1f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/338.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/339.jpg b/harnesses/ttimg/frontend/dist/img/339.jpg new file mode 100644 index 0000000..3198fde Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/339.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/340.jpg b/harnesses/ttimg/frontend/dist/img/340.jpg new file mode 100644 index 0000000..32fc394 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/340.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/341.jpg b/harnesses/ttimg/frontend/dist/img/341.jpg new file mode 100644 index 0000000..bf5ae56 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/341.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/342.jpg b/harnesses/ttimg/frontend/dist/img/342.jpg new file mode 100644 index 0000000..f01b202 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/342.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/343.jpg b/harnesses/ttimg/frontend/dist/img/343.jpg new file mode 100644 index 0000000..f8a2360 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/343.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/344.jpg b/harnesses/ttimg/frontend/dist/img/344.jpg new file mode 100644 index 0000000..b3c7d78 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/344.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/345.jpg b/harnesses/ttimg/frontend/dist/img/345.jpg new file mode 100644 index 0000000..e585d53 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/345.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/346.jpg b/harnesses/ttimg/frontend/dist/img/346.jpg new file mode 100644 index 0000000..6708d82 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/346.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/347.jpg b/harnesses/ttimg/frontend/dist/img/347.jpg new file mode 100644 index 0000000..305d1cc Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/347.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/348.jpg b/harnesses/ttimg/frontend/dist/img/348.jpg new file mode 100644 index 0000000..a049044 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/348.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/349.jpg b/harnesses/ttimg/frontend/dist/img/349.jpg new file mode 100644 index 0000000..3597fdd Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/349.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/350.jpg b/harnesses/ttimg/frontend/dist/img/350.jpg new file mode 100644 index 0000000..8efdc56 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/350.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/351.jpg b/harnesses/ttimg/frontend/dist/img/351.jpg new file mode 100644 index 0000000..cd7c5cc Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/351.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/352.jpg b/harnesses/ttimg/frontend/dist/img/352.jpg new file mode 100644 index 0000000..9f63fd8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/352.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/353.jpg b/harnesses/ttimg/frontend/dist/img/353.jpg new file mode 100644 index 0000000..4602920 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/353.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/354.jpg b/harnesses/ttimg/frontend/dist/img/354.jpg new file mode 100644 index 0000000..421a1ed Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/354.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/355.jpg b/harnesses/ttimg/frontend/dist/img/355.jpg new file mode 100644 index 0000000..cac8244 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/355.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/356.jpg b/harnesses/ttimg/frontend/dist/img/356.jpg new file mode 100644 index 0000000..b2fc907 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/356.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/357.jpg b/harnesses/ttimg/frontend/dist/img/357.jpg new file mode 100644 index 0000000..ff0e890 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/357.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/358.jpg b/harnesses/ttimg/frontend/dist/img/358.jpg new file mode 100644 index 0000000..c46eb2e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/358.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/359.jpg b/harnesses/ttimg/frontend/dist/img/359.jpg new file mode 100644 index 0000000..cb3bf56 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/359.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/360.jpg b/harnesses/ttimg/frontend/dist/img/360.jpg new file mode 100644 index 0000000..ee7faa3 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/360.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/361.jpg b/harnesses/ttimg/frontend/dist/img/361.jpg new file mode 100644 index 0000000..c85a853 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/361.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/362.jpg b/harnesses/ttimg/frontend/dist/img/362.jpg new file mode 100644 index 0000000..ba0186b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/362.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/363.jpg b/harnesses/ttimg/frontend/dist/img/363.jpg new file mode 100644 index 0000000..0765f1d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/363.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/364.jpg b/harnesses/ttimg/frontend/dist/img/364.jpg new file mode 100644 index 0000000..e67026b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/364.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/365.jpg b/harnesses/ttimg/frontend/dist/img/365.jpg new file mode 100644 index 0000000..f433bca Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/365.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/366.jpg b/harnesses/ttimg/frontend/dist/img/366.jpg new file mode 100644 index 0000000..b530e53 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/366.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/367.jpg b/harnesses/ttimg/frontend/dist/img/367.jpg new file mode 100644 index 0000000..a3e6f58 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/367.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/368.jpg b/harnesses/ttimg/frontend/dist/img/368.jpg new file mode 100644 index 0000000..6fb7c35 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/368.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/369.jpg b/harnesses/ttimg/frontend/dist/img/369.jpg new file mode 100644 index 0000000..51884c8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/369.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/370.jpg b/harnesses/ttimg/frontend/dist/img/370.jpg new file mode 100644 index 0000000..e9c2b94 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/370.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/371.jpg b/harnesses/ttimg/frontend/dist/img/371.jpg new file mode 100644 index 0000000..7cd9fed Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/371.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/372.jpg b/harnesses/ttimg/frontend/dist/img/372.jpg new file mode 100644 index 0000000..03ef2b8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/372.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/373.jpg b/harnesses/ttimg/frontend/dist/img/373.jpg new file mode 100644 index 0000000..28093c0 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/373.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/374.jpg b/harnesses/ttimg/frontend/dist/img/374.jpg new file mode 100644 index 0000000..9d6e335 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/374.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/375.jpg b/harnesses/ttimg/frontend/dist/img/375.jpg new file mode 100644 index 0000000..45223fa Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/375.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/376.jpg b/harnesses/ttimg/frontend/dist/img/376.jpg new file mode 100644 index 0000000..cd30242 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/376.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/377.jpg b/harnesses/ttimg/frontend/dist/img/377.jpg new file mode 100644 index 0000000..1507644 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/377.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/378.jpg b/harnesses/ttimg/frontend/dist/img/378.jpg new file mode 100644 index 0000000..bf5e9f9 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/378.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/379.jpg b/harnesses/ttimg/frontend/dist/img/379.jpg new file mode 100644 index 0000000..84ef362 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/379.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/380.jpg b/harnesses/ttimg/frontend/dist/img/380.jpg new file mode 100644 index 0000000..518a323 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/380.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/381.jpg b/harnesses/ttimg/frontend/dist/img/381.jpg new file mode 100644 index 0000000..1ff98c5 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/381.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/382.jpg b/harnesses/ttimg/frontend/dist/img/382.jpg new file mode 100644 index 0000000..f0fda3f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/382.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/383.jpg b/harnesses/ttimg/frontend/dist/img/383.jpg new file mode 100644 index 0000000..a890dea Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/383.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/384.jpg b/harnesses/ttimg/frontend/dist/img/384.jpg new file mode 100644 index 0000000..9186fc1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/384.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/385.jpg b/harnesses/ttimg/frontend/dist/img/385.jpg new file mode 100644 index 0000000..1ba3d3d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/385.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/386.jpg b/harnesses/ttimg/frontend/dist/img/386.jpg new file mode 100644 index 0000000..dc9847e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/386.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/387.jpg b/harnesses/ttimg/frontend/dist/img/387.jpg new file mode 100644 index 0000000..7d8229f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/387.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/388.jpg b/harnesses/ttimg/frontend/dist/img/388.jpg new file mode 100644 index 0000000..88fbfd8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/388.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/389.jpg b/harnesses/ttimg/frontend/dist/img/389.jpg new file mode 100644 index 0000000..23a659e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/389.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/390.jpg b/harnesses/ttimg/frontend/dist/img/390.jpg new file mode 100644 index 0000000..3e2bffa Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/390.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/391.jpg b/harnesses/ttimg/frontend/dist/img/391.jpg new file mode 100644 index 0000000..d1aaab6 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/391.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/392.jpg b/harnesses/ttimg/frontend/dist/img/392.jpg new file mode 100644 index 0000000..19c19bc Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/392.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/393.jpg b/harnesses/ttimg/frontend/dist/img/393.jpg new file mode 100644 index 0000000..9f7009f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/393.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/394.jpg b/harnesses/ttimg/frontend/dist/img/394.jpg new file mode 100644 index 0000000..3f7e78d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/394.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/395.jpg b/harnesses/ttimg/frontend/dist/img/395.jpg new file mode 100644 index 0000000..1cf003f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/395.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/396.jpg b/harnesses/ttimg/frontend/dist/img/396.jpg new file mode 100644 index 0000000..fb8e06e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/396.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/397.jpg b/harnesses/ttimg/frontend/dist/img/397.jpg new file mode 100644 index 0000000..ee1b582 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/397.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/398.jpg b/harnesses/ttimg/frontend/dist/img/398.jpg new file mode 100644 index 0000000..5b48524 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/398.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/399.jpg b/harnesses/ttimg/frontend/dist/img/399.jpg new file mode 100644 index 0000000..c89afc9 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/399.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/400.jpg b/harnesses/ttimg/frontend/dist/img/400.jpg new file mode 100644 index 0000000..85b71c4 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/400.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/401.jpg b/harnesses/ttimg/frontend/dist/img/401.jpg new file mode 100644 index 0000000..4a7390b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/401.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/402.jpg b/harnesses/ttimg/frontend/dist/img/402.jpg new file mode 100644 index 0000000..014401a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/402.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/403.jpg b/harnesses/ttimg/frontend/dist/img/403.jpg new file mode 100644 index 0000000..334065c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/403.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/404.jpg b/harnesses/ttimg/frontend/dist/img/404.jpg new file mode 100644 index 0000000..6b7940d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/404.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/405.jpg b/harnesses/ttimg/frontend/dist/img/405.jpg new file mode 100644 index 0000000..9bf0198 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/405.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/406.jpg b/harnesses/ttimg/frontend/dist/img/406.jpg new file mode 100644 index 0000000..487f829 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/406.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/407.jpg b/harnesses/ttimg/frontend/dist/img/407.jpg new file mode 100644 index 0000000..6dedb51 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/407.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/408.jpg b/harnesses/ttimg/frontend/dist/img/408.jpg new file mode 100644 index 0000000..7e3fac7 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/408.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/409.jpg b/harnesses/ttimg/frontend/dist/img/409.jpg new file mode 100644 index 0000000..6331c92 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/409.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/410.jpg b/harnesses/ttimg/frontend/dist/img/410.jpg new file mode 100644 index 0000000..33cab35 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/410.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/411.jpg b/harnesses/ttimg/frontend/dist/img/411.jpg new file mode 100644 index 0000000..aaf8ab2 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/411.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/412.jpg b/harnesses/ttimg/frontend/dist/img/412.jpg new file mode 100644 index 0000000..ea50821 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/412.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/413.jpg b/harnesses/ttimg/frontend/dist/img/413.jpg new file mode 100644 index 0000000..1b7f589 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/413.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/414.jpg b/harnesses/ttimg/frontend/dist/img/414.jpg new file mode 100644 index 0000000..c686a80 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/414.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/415.jpg b/harnesses/ttimg/frontend/dist/img/415.jpg new file mode 100644 index 0000000..d0f3971 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/415.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/416.jpg b/harnesses/ttimg/frontend/dist/img/416.jpg new file mode 100644 index 0000000..2760508 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/416.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/417.jpg b/harnesses/ttimg/frontend/dist/img/417.jpg new file mode 100644 index 0000000..1018bb0 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/417.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/418.jpg b/harnesses/ttimg/frontend/dist/img/418.jpg new file mode 100644 index 0000000..51fe9e1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/418.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/419.jpg b/harnesses/ttimg/frontend/dist/img/419.jpg new file mode 100644 index 0000000..1ed34a8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/419.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/420.jpg b/harnesses/ttimg/frontend/dist/img/420.jpg new file mode 100644 index 0000000..482d2c1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/420.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/421.jpg b/harnesses/ttimg/frontend/dist/img/421.jpg new file mode 100644 index 0000000..f42b0cc Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/421.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/422.jpg b/harnesses/ttimg/frontend/dist/img/422.jpg new file mode 100644 index 0000000..690f2ba Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/422.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/423.jpg b/harnesses/ttimg/frontend/dist/img/423.jpg new file mode 100644 index 0000000..8dc0c7a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/423.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/424.jpg b/harnesses/ttimg/frontend/dist/img/424.jpg new file mode 100644 index 0000000..9cb7c5c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/424.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/425.jpg b/harnesses/ttimg/frontend/dist/img/425.jpg new file mode 100644 index 0000000..c152953 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/425.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/426.jpg b/harnesses/ttimg/frontend/dist/img/426.jpg new file mode 100644 index 0000000..338804e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/426.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/427.jpg b/harnesses/ttimg/frontend/dist/img/427.jpg new file mode 100644 index 0000000..aa29859 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/427.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/428.jpg b/harnesses/ttimg/frontend/dist/img/428.jpg new file mode 100644 index 0000000..dcd95a1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/428.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/429.jpg b/harnesses/ttimg/frontend/dist/img/429.jpg new file mode 100644 index 0000000..54da97f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/429.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/430.jpg b/harnesses/ttimg/frontend/dist/img/430.jpg new file mode 100644 index 0000000..e5df583 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/430.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/431.jpg b/harnesses/ttimg/frontend/dist/img/431.jpg new file mode 100644 index 0000000..42d391f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/431.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/432.jpg b/harnesses/ttimg/frontend/dist/img/432.jpg new file mode 100644 index 0000000..27651ae Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/432.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/433.jpg b/harnesses/ttimg/frontend/dist/img/433.jpg new file mode 100644 index 0000000..eb97725 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/433.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/434.jpg b/harnesses/ttimg/frontend/dist/img/434.jpg new file mode 100644 index 0000000..fc5756b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/434.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/435.jpg b/harnesses/ttimg/frontend/dist/img/435.jpg new file mode 100644 index 0000000..ca1dff0 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/435.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/436.jpg b/harnesses/ttimg/frontend/dist/img/436.jpg new file mode 100644 index 0000000..c3ada24 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/436.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/437.jpg b/harnesses/ttimg/frontend/dist/img/437.jpg new file mode 100644 index 0000000..1f54cae Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/437.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/438.jpg b/harnesses/ttimg/frontend/dist/img/438.jpg new file mode 100644 index 0000000..bbd514b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/438.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/439.jpg b/harnesses/ttimg/frontend/dist/img/439.jpg new file mode 100644 index 0000000..bfca1e1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/439.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/440.jpg b/harnesses/ttimg/frontend/dist/img/440.jpg new file mode 100644 index 0000000..88d648d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/440.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/441.jpg b/harnesses/ttimg/frontend/dist/img/441.jpg new file mode 100644 index 0000000..0884013 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/441.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/442.jpg b/harnesses/ttimg/frontend/dist/img/442.jpg new file mode 100644 index 0000000..ce8d5d3 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/442.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/443.jpg b/harnesses/ttimg/frontend/dist/img/443.jpg new file mode 100644 index 0000000..76cd821 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/443.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/444.jpg b/harnesses/ttimg/frontend/dist/img/444.jpg new file mode 100644 index 0000000..f9d50b3 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/444.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/445.jpg b/harnesses/ttimg/frontend/dist/img/445.jpg new file mode 100644 index 0000000..bd913a0 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/445.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/446.jpg b/harnesses/ttimg/frontend/dist/img/446.jpg new file mode 100644 index 0000000..2294da6 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/446.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/447.jpg b/harnesses/ttimg/frontend/dist/img/447.jpg new file mode 100644 index 0000000..c0aafe4 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/447.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/448.jpg b/harnesses/ttimg/frontend/dist/img/448.jpg new file mode 100644 index 0000000..874f7ee Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/448.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/449.jpg b/harnesses/ttimg/frontend/dist/img/449.jpg new file mode 100644 index 0000000..fea9a9c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/449.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/450.jpg b/harnesses/ttimg/frontend/dist/img/450.jpg new file mode 100644 index 0000000..be98c80 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/450.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/451.jpg b/harnesses/ttimg/frontend/dist/img/451.jpg new file mode 100644 index 0000000..cbde60b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/451.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/452.jpg b/harnesses/ttimg/frontend/dist/img/452.jpg new file mode 100644 index 0000000..a064371 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/452.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/453.jpg b/harnesses/ttimg/frontend/dist/img/453.jpg new file mode 100644 index 0000000..bd054fb Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/453.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/454.jpg b/harnesses/ttimg/frontend/dist/img/454.jpg new file mode 100644 index 0000000..4bec89a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/454.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/455.jpg b/harnesses/ttimg/frontend/dist/img/455.jpg new file mode 100644 index 0000000..befa218 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/455.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/456.jpg b/harnesses/ttimg/frontend/dist/img/456.jpg new file mode 100644 index 0000000..b317b3a Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/456.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/457.jpg b/harnesses/ttimg/frontend/dist/img/457.jpg new file mode 100644 index 0000000..2fbe006 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/457.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/458.jpg b/harnesses/ttimg/frontend/dist/img/458.jpg new file mode 100644 index 0000000..c04d8e2 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/458.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/459.jpg b/harnesses/ttimg/frontend/dist/img/459.jpg new file mode 100644 index 0000000..21455aa Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/459.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/460.jpg b/harnesses/ttimg/frontend/dist/img/460.jpg new file mode 100644 index 0000000..f864942 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/460.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/461.jpg b/harnesses/ttimg/frontend/dist/img/461.jpg new file mode 100644 index 0000000..a57d3dc Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/461.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/462.jpg b/harnesses/ttimg/frontend/dist/img/462.jpg new file mode 100644 index 0000000..845c1b0 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/462.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/463.jpg b/harnesses/ttimg/frontend/dist/img/463.jpg new file mode 100644 index 0000000..d3f28e6 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/463.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/464.jpg b/harnesses/ttimg/frontend/dist/img/464.jpg new file mode 100644 index 0000000..25ba8ca Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/464.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/465.jpg b/harnesses/ttimg/frontend/dist/img/465.jpg new file mode 100644 index 0000000..b99fd87 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/465.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/466.jpg b/harnesses/ttimg/frontend/dist/img/466.jpg new file mode 100644 index 0000000..760ef49 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/466.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/467.jpg b/harnesses/ttimg/frontend/dist/img/467.jpg new file mode 100644 index 0000000..5386687 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/467.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/468.jpg b/harnesses/ttimg/frontend/dist/img/468.jpg new file mode 100644 index 0000000..0f44316 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/468.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/469.jpg b/harnesses/ttimg/frontend/dist/img/469.jpg new file mode 100644 index 0000000..068cf71 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/469.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/470.jpg b/harnesses/ttimg/frontend/dist/img/470.jpg new file mode 100644 index 0000000..c43181d Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/470.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/471.jpg b/harnesses/ttimg/frontend/dist/img/471.jpg new file mode 100644 index 0000000..624f674 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/471.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/472.jpg b/harnesses/ttimg/frontend/dist/img/472.jpg new file mode 100644 index 0000000..69edde1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/472.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/473.jpg b/harnesses/ttimg/frontend/dist/img/473.jpg new file mode 100644 index 0000000..41fd3d0 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/473.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/474.jpg b/harnesses/ttimg/frontend/dist/img/474.jpg new file mode 100644 index 0000000..85a558e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/474.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/475.jpg b/harnesses/ttimg/frontend/dist/img/475.jpg new file mode 100644 index 0000000..0127bf8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/475.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/476.jpg b/harnesses/ttimg/frontend/dist/img/476.jpg new file mode 100644 index 0000000..4154ee8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/476.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/477.jpg b/harnesses/ttimg/frontend/dist/img/477.jpg new file mode 100644 index 0000000..ece16a4 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/477.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/478.jpg b/harnesses/ttimg/frontend/dist/img/478.jpg new file mode 100644 index 0000000..b09d5fb Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/478.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/479.jpg b/harnesses/ttimg/frontend/dist/img/479.jpg new file mode 100644 index 0000000..c115098 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/479.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/480.jpg b/harnesses/ttimg/frontend/dist/img/480.jpg new file mode 100644 index 0000000..9d1f10b Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/480.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/481.jpg b/harnesses/ttimg/frontend/dist/img/481.jpg new file mode 100644 index 0000000..061b1ef Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/481.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/482.jpg b/harnesses/ttimg/frontend/dist/img/482.jpg new file mode 100644 index 0000000..4fb1efa Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/482.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/483.jpg b/harnesses/ttimg/frontend/dist/img/483.jpg new file mode 100644 index 0000000..2a5e948 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/483.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/484.jpg b/harnesses/ttimg/frontend/dist/img/484.jpg new file mode 100644 index 0000000..97b2509 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/484.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/485.jpg b/harnesses/ttimg/frontend/dist/img/485.jpg new file mode 100644 index 0000000..ea99275 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/485.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/486.jpg b/harnesses/ttimg/frontend/dist/img/486.jpg new file mode 100644 index 0000000..7ef6fcd Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/486.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/487.jpg b/harnesses/ttimg/frontend/dist/img/487.jpg new file mode 100644 index 0000000..65abca3 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/487.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/488.jpg b/harnesses/ttimg/frontend/dist/img/488.jpg new file mode 100644 index 0000000..b92094c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/488.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/489.jpg b/harnesses/ttimg/frontend/dist/img/489.jpg new file mode 100644 index 0000000..351cbf9 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/489.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/490.jpg b/harnesses/ttimg/frontend/dist/img/490.jpg new file mode 100644 index 0000000..4105514 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/490.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/491.jpg b/harnesses/ttimg/frontend/dist/img/491.jpg new file mode 100644 index 0000000..bacb54c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/491.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/492.jpg b/harnesses/ttimg/frontend/dist/img/492.jpg new file mode 100644 index 0000000..3d0c206 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/492.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/493.jpg b/harnesses/ttimg/frontend/dist/img/493.jpg new file mode 100644 index 0000000..dfa529c Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/493.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/494.jpg b/harnesses/ttimg/frontend/dist/img/494.jpg new file mode 100644 index 0000000..0056598 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/494.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/495.jpg b/harnesses/ttimg/frontend/dist/img/495.jpg new file mode 100644 index 0000000..9d07e39 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/495.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/496.jpg b/harnesses/ttimg/frontend/dist/img/496.jpg new file mode 100644 index 0000000..7586381 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/496.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/497.jpg b/harnesses/ttimg/frontend/dist/img/497.jpg new file mode 100644 index 0000000..0100009 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/497.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/498.jpg b/harnesses/ttimg/frontend/dist/img/498.jpg new file mode 100644 index 0000000..48f32f1 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/498.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/499.jpg b/harnesses/ttimg/frontend/dist/img/499.jpg new file mode 100644 index 0000000..149ee05 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/499.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/500.jpg b/harnesses/ttimg/frontend/dist/img/500.jpg new file mode 100644 index 0000000..8029d46 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/500.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/501.jpg b/harnesses/ttimg/frontend/dist/img/501.jpg new file mode 100644 index 0000000..a5b0981 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/501.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/502.jpg b/harnesses/ttimg/frontend/dist/img/502.jpg new file mode 100644 index 0000000..4786965 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/502.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/503.jpg b/harnesses/ttimg/frontend/dist/img/503.jpg new file mode 100644 index 0000000..cbe1a9f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/503.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/504.jpg b/harnesses/ttimg/frontend/dist/img/504.jpg new file mode 100644 index 0000000..c38675e Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/504.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/505.jpg b/harnesses/ttimg/frontend/dist/img/505.jpg new file mode 100644 index 0000000..acda32f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/505.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/506.jpg b/harnesses/ttimg/frontend/dist/img/506.jpg new file mode 100644 index 0000000..293f846 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/506.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/507.jpg b/harnesses/ttimg/frontend/dist/img/507.jpg new file mode 100644 index 0000000..11965d2 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/507.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/508.jpg b/harnesses/ttimg/frontend/dist/img/508.jpg new file mode 100644 index 0000000..eb56ec6 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/508.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/509.jpg b/harnesses/ttimg/frontend/dist/img/509.jpg new file mode 100644 index 0000000..f00bcc8 Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/509.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/510.jpg b/harnesses/ttimg/frontend/dist/img/510.jpg new file mode 100644 index 0000000..c8cb6fc Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/510.jpg differ diff --git a/harnesses/ttimg/frontend/dist/img/511.jpg b/harnesses/ttimg/frontend/dist/img/511.jpg new file mode 100644 index 0000000..3e8357f Binary files /dev/null and b/harnesses/ttimg/frontend/dist/img/511.jpg differ diff --git a/harnesses/ttimg/frontend/dist/index.html b/harnesses/ttimg/frontend/dist/index.html new file mode 100644 index 0000000..2a41ed3 --- /dev/null +++ b/harnesses/ttimg/frontend/dist/index.html @@ -0,0 +1,105 @@ + + + + + +ttimg + + + +
+ + + diff --git a/harnesses/ttimg/gen/android/.editorconfig b/harnesses/ttimg/gen/android/.editorconfig new file mode 100644 index 0000000..ebe51d3 --- /dev/null +++ b/harnesses/ttimg/gen/android/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = false +insert_final_newline = false \ No newline at end of file diff --git a/harnesses/ttimg/gen/android/.gitignore b/harnesses/ttimg/gen/android/.gitignore new file mode 100644 index 0000000..1c636c3 --- /dev/null +++ b/harnesses/ttimg/gen/android/.gitignore @@ -0,0 +1,20 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +build +/captures +.externalNativeBuild +.cxx +local.properties +key.properties +keystore.properties + +/.tauri +/tauri.settings.gradle \ No newline at end of file diff --git a/harnesses/ttimg/gen/android/app/.gitignore b/harnesses/ttimg/gen/android/app/.gitignore new file mode 100644 index 0000000..6c4d56b --- /dev/null +++ b/harnesses/ttimg/gen/android/app/.gitignore @@ -0,0 +1,6 @@ +/src/main/**/generated +/src/main/jniLibs/**/*.so +/src/main/assets/tauri.conf.json +/tauri.build.gradle.kts +/proguard-tauri.pro +/tauri.properties \ No newline at end of file diff --git a/harnesses/ttimg/gen/android/app/build.gradle.kts b/harnesses/ttimg/gen/android/app/build.gradle.kts new file mode 100644 index 0000000..07883f1 --- /dev/null +++ b/harnesses/ttimg/gen/android/app/build.gradle.kts @@ -0,0 +1,83 @@ +import java.util.Properties +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("rust") +} + +val tauriProperties = Properties().apply { + val propFile = file("tauri.properties") + if (propFile.exists()) { + propFile.inputStream().use { load(it) } + } +} + +android { + compileSdk = 37 + namespace = "wow.gmp.ttimg" + defaultConfig { + manifestPlaceholders["usesCleartextTraffic"] = "false" + applicationId = "wow.gmp.ttimg" + minSdk = 24 + targetSdk = 37 + versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt() + versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0") + } + buildTypes { + getByName("debug") { + manifestPlaceholders["usesCleartextTraffic"] = "true" + isDebuggable = true + isJniDebuggable = true + isMinifyEnabled = false + packaging { + jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so") + jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so") + jniLibs.keepDebugSymbols.add("*/x86/*.so") + jniLibs.keepDebugSymbols.add("*/x86_64/*.so") + } + } + getByName("release") { + optimization { + enable = true + } + proguardFiles( + *fileTree(".") { + include("**/*.pro") + exclude("build/**") + }.files.toTypedArray() + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + buildFeatures { + buildConfig = true + } +} + +kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + } +} + +rust { + rootDirRel = "../../../" +} + +dependencies { + implementation("androidx.webkit:webkit:1.14.0") + implementation("androidx.appcompat:appcompat:1.7.1") + implementation("androidx.activity:activity-ktx:1.10.1") + implementation("com.google.android.material:material:1.12.0") + implementation("androidx.lifecycle:lifecycle-process:2.10.0") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.4") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0") +} + +apply(from = file("tauri.build.gradle.kts")) diff --git a/harnesses/ttimg/gen/android/app/proguard-rules.pro b/harnesses/ttimg/gen/android/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/harnesses/ttimg/gen/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/harnesses/ttimg/gen/android/app/src/main/AndroidManifest.xml b/harnesses/ttimg/gen/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a7ca722 --- /dev/null +++ b/harnesses/ttimg/gen/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/harnesses/ttimg/gen/android/app/src/main/java/wow/gmp/ttimg/MainActivity.kt b/harnesses/ttimg/gen/android/app/src/main/java/wow/gmp/ttimg/MainActivity.kt new file mode 100644 index 0000000..025d4f3 --- /dev/null +++ b/harnesses/ttimg/gen/android/app/src/main/java/wow/gmp/ttimg/MainActivity.kt @@ -0,0 +1,11 @@ +package wow.gmp.ttimg + +import android.os.Bundle +import androidx.activity.enableEdgeToEdge + +class MainActivity : TauriActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + enableEdgeToEdge() + super.onCreate(savedInstanceState) + } +} diff --git a/harnesses/ttimg/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/harnesses/ttimg/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/harnesses/ttimg/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/harnesses/ttimg/gen/android/app/src/main/res/drawable/ic_launcher_background.xml b/harnesses/ttimg/gen/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/harnesses/ttimg/gen/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/harnesses/ttimg/gen/android/app/src/main/res/layout/activity_main.xml b/harnesses/ttimg/gen/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..4fc2444 --- /dev/null +++ b/harnesses/ttimg/gen/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..28f1aa1 Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..85d0c88 Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..28f1aa1 Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..73e48db Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..13dd214 Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..73e48db Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..1d98044 Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..a888b33 Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..1d98044 Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..0818324 Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..a2a838e Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..0818324 Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..b18bceb Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..3f8a57f Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b18bceb Binary files /dev/null and b/harnesses/ttimg/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/harnesses/ttimg/gen/android/app/src/main/res/values-night/themes.xml b/harnesses/ttimg/gen/android/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..ff60ebb --- /dev/null +++ b/harnesses/ttimg/gen/android/app/src/main/res/values-night/themes.xml @@ -0,0 +1,6 @@ + + + + diff --git a/harnesses/ttimg/gen/android/app/src/main/res/values/colors.xml b/harnesses/ttimg/gen/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f8c6127 --- /dev/null +++ b/harnesses/ttimg/gen/android/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/harnesses/ttimg/gen/android/app/src/main/res/values/strings.xml b/harnesses/ttimg/gen/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..2d831d3 --- /dev/null +++ b/harnesses/ttimg/gen/android/app/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + "ttimg" + "ttimg" + \ No newline at end of file diff --git a/harnesses/ttimg/gen/android/app/src/main/res/values/themes.xml b/harnesses/ttimg/gen/android/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..ff60ebb --- /dev/null +++ b/harnesses/ttimg/gen/android/app/src/main/res/values/themes.xml @@ -0,0 +1,6 @@ + + + + diff --git a/harnesses/ttimg/gen/android/app/src/main/res/xml/file_paths.xml b/harnesses/ttimg/gen/android/app/src/main/res/xml/file_paths.xml new file mode 100644 index 0000000..782d63b --- /dev/null +++ b/harnesses/ttimg/gen/android/app/src/main/res/xml/file_paths.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/harnesses/ttimg/gen/android/build.gradle.kts b/harnesses/ttimg/gen/android/build.gradle.kts new file mode 100644 index 0000000..7bd0788 --- /dev/null +++ b/harnesses/ttimg/gen/android/build.gradle.kts @@ -0,0 +1,22 @@ +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath("com.android.tools.build:gradle:9.3.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.10") + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +tasks.register("clean").configure { + delete("build") +} + diff --git a/harnesses/ttimg/gen/android/buildSrc/build.gradle.kts b/harnesses/ttimg/gen/android/buildSrc/build.gradle.kts new file mode 100644 index 0000000..cc18ea8 --- /dev/null +++ b/harnesses/ttimg/gen/android/buildSrc/build.gradle.kts @@ -0,0 +1,23 @@ +plugins { + `kotlin-dsl` +} + +gradlePlugin { + plugins { + create("pluginsForCoolKids") { + id = "rust" + implementationClass = "RustPlugin" + } + } +} + +repositories { + google() + mavenCentral() +} + +dependencies { + compileOnly(gradleApi()) + implementation("com.android.tools.build:gradle:9.3.1") +} + diff --git a/harnesses/ttimg/gen/android/buildSrc/src/main/java/wow/gmp/ttimg/kotlin/BuildTask.kt b/harnesses/ttimg/gen/android/buildSrc/src/main/java/wow/gmp/ttimg/kotlin/BuildTask.kt new file mode 100644 index 0000000..6fcc049 --- /dev/null +++ b/harnesses/ttimg/gen/android/buildSrc/src/main/java/wow/gmp/ttimg/kotlin/BuildTask.kt @@ -0,0 +1,81 @@ +import java.io.File +import org.apache.tools.ant.taskdefs.condition.Os +import org.gradle.api.DefaultTask +import org.gradle.api.GradleException +import org.gradle.api.logging.LogLevel +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction +import javax.inject.Inject +import org.gradle.process.ExecOperations + +abstract class BuildTask : DefaultTask() { + @get:Inject + abstract val execOperations: ExecOperations + + @Input + var rootDirRel: String? = null + @Input + var projectDir: String? = null + @Input + var target: String? = null + @Input + var release: Boolean? = null + + @TaskAction + fun assemble() { + // EDIT (harness workaround): the cargo-tauri CLI dies on this host + // because the per-user inotify watch quota is exhausted (standalone + // syncthing holds 65k/65536), and every cargo-tauri subcommand starts + // an inotify debouncer. The shim reproduces android-studio-script's + // effect with a plain cargo build (no inotify). Revert to "cargo" + // once the host quota is fixed. + val executable = System.getenv("TAURI_CARGO_SHIM") ?: "/mnt/Backup/prog/android/gallery/harnesses/ttimg/scripts/cargo-shim"; + try { + runTauriCli(executable) + } catch (e: Exception) { + if (Os.isFamily(Os.FAMILY_WINDOWS)) { + // Try different Windows-specific extensions + val fallbacks = listOf( + "$executable.exe", + "$executable.cmd", + "$executable.bat", + ) + + var lastException: Exception = e + for (fallback in fallbacks) { + try { + runTauriCli(fallback) + return + } catch (fallbackException: Exception) { + lastException = fallbackException + } + } + throw lastException + } else { + throw e; + } + } + } + + fun runTauriCli(executable: String) { + val rootDirRel = rootDirRel ?: throw GradleException("rootDirRel cannot be null") + val target = target ?: throw GradleException("target cannot be null") + val release = release ?: throw GradleException("release cannot be null") + val args = listOf("tauri", "android", "android-studio-script"); + + execOperations.exec { + workingDir(File(projectDir, rootDirRel)) + executable(executable) + args(args) + if (logger.isEnabled(LogLevel.DEBUG)) { + args("-vv") + } else if (logger.isEnabled(LogLevel.INFO)) { + args("-v") + } + if (release) { + args("--release") + } + args(listOf("--target", target)) + }.assertNormalExitValue() + } +} \ No newline at end of file diff --git a/harnesses/ttimg/gen/android/buildSrc/src/main/java/wow/gmp/ttimg/kotlin/RustPlugin.kt b/harnesses/ttimg/gen/android/buildSrc/src/main/java/wow/gmp/ttimg/kotlin/RustPlugin.kt new file mode 100644 index 0000000..3309f1c --- /dev/null +++ b/harnesses/ttimg/gen/android/buildSrc/src/main/java/wow/gmp/ttimg/kotlin/RustPlugin.kt @@ -0,0 +1,86 @@ +import com.android.build.api.dsl.ApplicationExtension +import org.gradle.api.DefaultTask +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.get + +const val TASK_GROUP = "rust" + +open class Config { + lateinit var rootDirRel: String +} + +open class RustPlugin : Plugin { + private lateinit var config: Config + + override fun apply(project: Project) = with(project) { + config = extensions.create("rust", Config::class.java) + + val defaultAbiList = listOf("arm64-v8a", "armeabi-v7a", "x86", "x86_64"); + val abiList = (findProperty("abiList") as? String)?.split(',') ?: defaultAbiList + + val defaultArchList = listOf("arm64", "arm", "x86", "x86_64"); + val archList = (findProperty("archList") as? String)?.split(',') ?: defaultArchList + + val targetsList = (findProperty("targetList") as? String)?.split(',') ?: listOf("aarch64", "armv7", "i686", "x86_64") + + extensions.configure { + @Suppress("UnstableApiUsage") + flavorDimensions.add("abi") + productFlavors { + create("universal") { + dimension = "abi" + ndk { + abiFilters += abiList + } + } + defaultArchList.forEachIndexed { index, arch -> + create(arch) { + dimension = "abi" + ndk { + abiFilters.add(defaultAbiList[index]) + } + } + } + } + } + + afterEvaluate { + for (profile in listOf("debug", "release")) { + val profileCapitalized = profile.replaceFirstChar { it.uppercase() } + val buildTask = tasks.maybeCreate( + "rustBuildUniversal$profileCapitalized", + DefaultTask::class.java + ).apply { + group = TASK_GROUP + description = "Build dynamic library in $profile mode for all targets" + } + + tasks["mergeUniversal${profileCapitalized}JniLibFolders"].dependsOn(buildTask) + + for (targetPair in targetsList.withIndex()) { + val targetName = targetPair.value + val targetArch = archList[targetPair.index] + val targetArchCapitalized = targetArch.replaceFirstChar { it.uppercase() } + val targetBuildTask = project.tasks.register( + "rustBuild$targetArchCapitalized$profileCapitalized", + BuildTask::class.java + ) { + group = TASK_GROUP + description = "Build dynamic library in $profile mode for $targetArch" + rootDirRel = config.rootDirRel + projectDir = project.projectDir.path + target = targetName + release = profile == "release" + } + + buildTask.dependsOn(targetBuildTask) + tasks["merge$targetArchCapitalized${profileCapitalized}JniLibFolders"].dependsOn( + targetBuildTask + ) + } + } + } + } +} \ No newline at end of file diff --git a/harnesses/ttimg/gen/android/gradle.properties b/harnesses/ttimg/gen/android/gradle.properties new file mode 100644 index 0000000..9e6e7b9 --- /dev/null +++ b/harnesses/ttimg/gen/android/gradle.properties @@ -0,0 +1,26 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +org.gradle.configuration-cache=true +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official + +# Our old plugin template had a bug that caused missing `consumer-rules.pro` files +# so we have to disable it for now. +# See https://github.com/tauri-apps/tauri/pull/15828#issuecomment-5199937796 +android.proguard.failOnMissingFiles=false + +# Keeping Gradle 9 compatible with current plugins +# TODO: Remove this in v3 +android.builtInKotlin=false +android.newDsl=false diff --git a/harnesses/ttimg/gen/android/gradle/wrapper/gradle-wrapper.jar b/harnesses/ttimg/gen/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..b1b8ef5 Binary files /dev/null and b/harnesses/ttimg/gen/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/harnesses/ttimg/gen/android/gradle/wrapper/gradle-wrapper.properties b/harnesses/ttimg/gen/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..b2ee479 --- /dev/null +++ b/harnesses/ttimg/gen/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue May 10 19:22:52 CST 2022 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/harnesses/ttimg/gen/android/gradlew b/harnesses/ttimg/gen/android/gradlew new file mode 100755 index 0000000..249efbb --- /dev/null +++ b/harnesses/ttimg/gen/android/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# gradlew start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh gradlew +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/harnesses/ttimg/gen/android/gradlew.bat b/harnesses/ttimg/gen/android/gradlew.bat new file mode 100644 index 0000000..a51ec4f --- /dev/null +++ b/harnesses/ttimg/gen/android/gradlew.bat @@ -0,0 +1,82 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem gradlew startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +"%COMSPEC%" /c exit 1 + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +"%COMSPEC%" /c exit 1 + +:execute +@rem Setup the command line + + + +@rem Execute gradlew +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel + +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/harnesses/ttimg/gen/android/settings.gradle b/harnesses/ttimg/gen/android/settings.gradle new file mode 100644 index 0000000..3939116 --- /dev/null +++ b/harnesses/ttimg/gen/android/settings.gradle @@ -0,0 +1,3 @@ +include ':app' + +apply from: 'tauri.settings.gradle' diff --git a/harnesses/ttimg/gen/schemas/acl-manifests.json b/harnesses/ttimg/gen/schemas/acl-manifests.json new file mode 100644 index 0000000..2ebbc8d --- /dev/null +++ b/harnesses/ttimg/gen/schemas/acl-manifests.json @@ -0,0 +1 @@ +{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier","allow-bundle-type","allow-register-listener","allow-remove-listener","allow-supports-multiple-windows"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-bundle-type":{"identifier":"allow-bundle-type","description":"Enables the bundle_type command without any pre-configured scope.","commands":{"allow":["bundle_type"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-remove-listener":{"identifier":"allow-remove-listener","description":"Enables the remove_listener command without any pre-configured scope.","commands":{"allow":["remove_listener"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-set-dock-visibility":{"identifier":"allow-set-dock-visibility","description":"Enables the set_dock_visibility command without any pre-configured scope.","commands":{"allow":["set_dock_visibility"],"deny":[]}},"allow-supports-multiple-windows":{"identifier":"allow-supports-multiple-windows","description":"Enables the supports_multiple_windows command without any pre-configured scope.","commands":{"allow":["supports_multiple_windows"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-bundle-type":{"identifier":"deny-bundle-type","description":"Denies the bundle_type command without any pre-configured scope.","commands":{"allow":[],"deny":["bundle_type"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"Denies the identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["identifier"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-data-store":{"identifier":"deny-remove-data-store","description":"Denies the remove_data_store command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_data_store"]}},"deny-remove-listener":{"identifier":"deny-remove-listener","description":"Denies the remove_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_listener"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-set-dock-visibility":{"identifier":"deny-set-dock-visibility","description":"Denies the set_dock_visibility command without any pre-configured scope.","commands":{"allow":[],"deny":["set_dock_visibility"]}},"deny-supports-multiple-windows":{"identifier":"deny-supports-multiple-windows","description":"Denies the supports_multiple_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["supports_multiple_windows"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-icon-with-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-icon-with-as-template":{"identifier":"allow-set-icon-with-as-template","description":"Enables the set_icon_with_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_with_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-icon-with-as-template":{"identifier":"deny-set-icon-with-as-template","description":"Denies the set_icon_with_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_with_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-auto-resize":{"identifier":"allow-set-webview-auto-resize","description":"Enables the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":["set_webview_auto_resize"],"deny":[]}},"allow-set-webview-background-color":{"identifier":"allow-set-webview-background-color","description":"Enables the set_webview_background_color command without any pre-configured scope.","commands":{"allow":["set_webview_background_color"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-auto-resize":{"identifier":"deny-set-webview-auto-resize","description":"Denies the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_auto_resize"]}},"deny-set-webview-background-color":{"identifier":"deny-set-webview-background-color","description":"Denies the set_webview_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_background_color"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-is-always-on-top","allow-activity-name","allow-scene-identifier","allow-internal-toggle-maximize"]},"permissions":{"allow-activity-name":{"identifier":"allow-activity-name","description":"Enables the activity_name command without any pre-configured scope.","commands":{"allow":["activity_name"],"deny":[]}},"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-always-on-top":{"identifier":"allow-is-always-on-top","description":"Enables the is_always_on_top command without any pre-configured scope.","commands":{"allow":["is_always_on_top"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-scene-identifier":{"identifier":"allow-scene-identifier","description":"Enables the scene_identifier command without any pre-configured scope.","commands":{"allow":["scene_identifier"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-background-color":{"identifier":"allow-set-background-color","description":"Enables the set_background_color command without any pre-configured scope.","commands":{"allow":["set_background_color"],"deny":[]}},"allow-set-badge-count":{"identifier":"allow-set-badge-count","description":"Enables the set_badge_count command without any pre-configured scope.","commands":{"allow":["set_badge_count"],"deny":[]}},"allow-set-badge-label":{"identifier":"allow-set-badge-label","description":"Enables the set_badge_label command without any pre-configured scope.","commands":{"allow":["set_badge_label"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-focusable":{"identifier":"allow-set-focusable","description":"Enables the set_focusable command without any pre-configured scope.","commands":{"allow":["set_focusable"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-fullscreen-on-monitor":{"identifier":"allow-set-fullscreen-on-monitor","description":"Enables the set_fullscreen_on_monitor command without any pre-configured scope.","commands":{"allow":["set_fullscreen_on_monitor"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-overlay-icon":{"identifier":"allow-set-overlay-icon","description":"Enables the set_overlay_icon command without any pre-configured scope.","commands":{"allow":["set_overlay_icon"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-simple-fullscreen":{"identifier":"allow-set-simple-fullscreen","description":"Enables the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":["set_simple_fullscreen"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-activity-name":{"identifier":"deny-activity-name","description":"Denies the activity_name command without any pre-configured scope.","commands":{"allow":[],"deny":["activity_name"]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-always-on-top":{"identifier":"deny-is-always-on-top","description":"Denies the is_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["is_always_on_top"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-scene-identifier":{"identifier":"deny-scene-identifier","description":"Denies the scene_identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["scene_identifier"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-background-color":{"identifier":"deny-set-background-color","description":"Denies the set_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_background_color"]}},"deny-set-badge-count":{"identifier":"deny-set-badge-count","description":"Denies the set_badge_count command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_count"]}},"deny-set-badge-label":{"identifier":"deny-set-badge-label","description":"Denies the set_badge_label command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_label"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-focusable":{"identifier":"deny-set-focusable","description":"Denies the set_focusable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focusable"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-fullscreen-on-monitor":{"identifier":"deny-set-fullscreen-on-monitor","description":"Denies the set_fullscreen_on_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen_on_monitor"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-overlay-icon":{"identifier":"deny-set-overlay-icon","description":"Denies the set_overlay_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_overlay_icon"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-simple-fullscreen":{"identifier":"deny-set-simple-fullscreen","description":"Denies the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_simple_fullscreen"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file diff --git a/harnesses/ttimg/gen/schemas/android-schema.json b/harnesses/ttimg/gen/schemas/android-schema.json new file mode 100644 index 0000000..1ef1225 --- /dev/null +++ b/harnesses/ttimg/gen/schemas/android-schema.json @@ -0,0 +1,2316 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapabilityFile", + "description": "Capability formats accepted in a capability file.", + "anyOf": [ + { + "description": "A single capability.", + "allOf": [ + { + "$ref": "#/definitions/Capability" + } + ] + }, + { + "description": "A list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + }, + { + "description": "A list of capabilities.", + "type": "object", + "required": [ + "capabilities" + ], + "properties": { + "capabilities": { + "description": "The list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + } + } + } + ], + "definitions": { + "Capability": { + "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", + "type": "object", + "required": [ + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", + "type": "string" + }, + "description": { + "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.", + "default": "", + "type": "string" + }, + "remote": { + "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", + "anyOf": [ + { + "$ref": "#/definitions/CapabilityRemote" + }, + { + "type": "null" + } + ] + }, + "local": { + "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", + "default": true, + "type": "boolean" + }, + "windows": { + "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "webviews": { + "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "permissions": { + "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionEntry" + }, + "uniqueItems": true + }, + "platforms": { + "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "CapabilityRemote": { + "description": "Configuration for remote URLs that are associated with the capability.", + "type": "object", + "required": [ + "urls" + ], + "properties": { + "urls": { + "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionEntry": { + "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", + "anyOf": [ + { + "description": "Reference a permission or permission set by identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + { + "description": "Reference a permission or permission set by identifier and extends its scope.", + "type": "object", + "allOf": [ + { + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "allow": { + "description": "Data that defines what is allowed by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + }, + "deny": { + "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + } + } + } + ], + "required": [ + "identifier" + ] + } + ] + }, + "Identifier": { + "description": "Permission identifier", + "oneOf": [ + { + "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", + "type": "string", + "const": "core:default", + "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`" + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`", + "type": "string", + "const": "core:app:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`" + }, + { + "description": "Enables the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-hide", + "markdownDescription": "Enables the app_hide command without any pre-configured scope." + }, + { + "description": "Enables the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-show", + "markdownDescription": "Enables the app_show command without any pre-configured scope." + }, + { + "description": "Enables the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-bundle-type", + "markdownDescription": "Enables the bundle_type command without any pre-configured scope." + }, + { + "description": "Enables the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-default-window-icon", + "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." + }, + { + "description": "Enables the exit command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-exit", + "markdownDescription": "Enables the exit command without any pre-configured scope." + }, + { + "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-fetch-data-store-identifiers", + "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Enables the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-identifier", + "markdownDescription": "Enables the identifier command without any pre-configured scope." + }, + { + "description": "Enables the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-name", + "markdownDescription": "Enables the name command without any pre-configured scope." + }, + { + "description": "Enables the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-register-listener", + "markdownDescription": "Enables the register_listener command without any pre-configured scope." + }, + { + "description": "Enables the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-data-store", + "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." + }, + { + "description": "Enables the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-listener", + "markdownDescription": "Enables the remove_listener command without any pre-configured scope." + }, + { + "description": "Enables the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-app-theme", + "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-dock-visibility", + "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Enables the supports_multiple_windows command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-supports-multiple-windows", + "markdownDescription": "Enables the supports_multiple_windows command without any pre-configured scope." + }, + { + "description": "Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-tauri-version", + "markdownDescription": "Enables the tauri_version command without any pre-configured scope." + }, + { + "description": "Enables the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-version", + "markdownDescription": "Enables the version command without any pre-configured scope." + }, + { + "description": "Denies the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-hide", + "markdownDescription": "Denies the app_hide command without any pre-configured scope." + }, + { + "description": "Denies the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-show", + "markdownDescription": "Denies the app_show command without any pre-configured scope." + }, + { + "description": "Denies the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-bundle-type", + "markdownDescription": "Denies the bundle_type command without any pre-configured scope." + }, + { + "description": "Denies the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-default-window-icon", + "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." + }, + { + "description": "Denies the exit command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-exit", + "markdownDescription": "Denies the exit command without any pre-configured scope." + }, + { + "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-fetch-data-store-identifiers", + "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Denies the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-identifier", + "markdownDescription": "Denies the identifier command without any pre-configured scope." + }, + { + "description": "Denies the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-name", + "markdownDescription": "Denies the name command without any pre-configured scope." + }, + { + "description": "Denies the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-register-listener", + "markdownDescription": "Denies the register_listener command without any pre-configured scope." + }, + { + "description": "Denies the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-data-store", + "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." + }, + { + "description": "Denies the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-listener", + "markdownDescription": "Denies the remove_listener command without any pre-configured scope." + }, + { + "description": "Denies the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-app-theme", + "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-dock-visibility", + "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Denies the supports_multiple_windows command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-supports-multiple-windows", + "markdownDescription": "Denies the supports_multiple_windows command without any pre-configured scope." + }, + { + "description": "Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-tauri-version", + "markdownDescription": "Denies the tauri_version command without any pre-configured scope." + }, + { + "description": "Denies the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-version", + "markdownDescription": "Denies the version command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", + "type": "string", + "const": "core:event:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" + }, + { + "description": "Enables the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit", + "markdownDescription": "Enables the emit command without any pre-configured scope." + }, + { + "description": "Enables the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit-to", + "markdownDescription": "Enables the emit_to command without any pre-configured scope." + }, + { + "description": "Enables the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-listen", + "markdownDescription": "Enables the listen command without any pre-configured scope." + }, + { + "description": "Enables the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-unlisten", + "markdownDescription": "Enables the unlisten command without any pre-configured scope." + }, + { + "description": "Denies the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit", + "markdownDescription": "Denies the emit command without any pre-configured scope." + }, + { + "description": "Denies the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit-to", + "markdownDescription": "Denies the emit_to command without any pre-configured scope." + }, + { + "description": "Denies the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-listen", + "markdownDescription": "Denies the listen command without any pre-configured scope." + }, + { + "description": "Denies the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-unlisten", + "markdownDescription": "Denies the unlisten command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", + "type": "string", + "const": "core:image:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" + }, + { + "description": "Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-bytes", + "markdownDescription": "Enables the from_bytes command without any pre-configured scope." + }, + { + "description": "Enables the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-path", + "markdownDescription": "Enables the from_path command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-rgba", + "markdownDescription": "Enables the rgba command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-bytes", + "markdownDescription": "Denies the from_bytes command without any pre-configured scope." + }, + { + "description": "Denies the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-path", + "markdownDescription": "Denies the from_path command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-rgba", + "markdownDescription": "Denies the rgba command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", + "type": "string", + "const": "core:menu:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" + }, + { + "description": "Enables the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-append", + "markdownDescription": "Enables the append command without any pre-configured scope." + }, + { + "description": "Enables the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-create-default", + "markdownDescription": "Enables the create_default command without any pre-configured scope." + }, + { + "description": "Enables the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-get", + "markdownDescription": "Enables the get command without any pre-configured scope." + }, + { + "description": "Enables the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-insert", + "markdownDescription": "Enables the insert command without any pre-configured scope." + }, + { + "description": "Enables the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-checked", + "markdownDescription": "Enables the is_checked command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-items", + "markdownDescription": "Enables the items command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-popup", + "markdownDescription": "Enables the popup command without any pre-configured scope." + }, + { + "description": "Enables the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-prepend", + "markdownDescription": "Enables the prepend command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove-at", + "markdownDescription": "Enables the remove_at command without any pre-configured scope." + }, + { + "description": "Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-accelerator", + "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." + }, + { + "description": "Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-app-menu", + "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-help-menu-for-nsapp", + "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-window-menu", + "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-windows-menu-for-nsapp", + "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-checked", + "markdownDescription": "Enables the set_checked command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-text", + "markdownDescription": "Enables the set_text command without any pre-configured scope." + }, + { + "description": "Enables the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-text", + "markdownDescription": "Enables the text command without any pre-configured scope." + }, + { + "description": "Denies the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-append", + "markdownDescription": "Denies the append command without any pre-configured scope." + }, + { + "description": "Denies the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-create-default", + "markdownDescription": "Denies the create_default command without any pre-configured scope." + }, + { + "description": "Denies the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-get", + "markdownDescription": "Denies the get command without any pre-configured scope." + }, + { + "description": "Denies the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-insert", + "markdownDescription": "Denies the insert command without any pre-configured scope." + }, + { + "description": "Denies the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-checked", + "markdownDescription": "Denies the is_checked command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-items", + "markdownDescription": "Denies the items command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-popup", + "markdownDescription": "Denies the popup command without any pre-configured scope." + }, + { + "description": "Denies the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-prepend", + "markdownDescription": "Denies the prepend command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove-at", + "markdownDescription": "Denies the remove_at command without any pre-configured scope." + }, + { + "description": "Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-accelerator", + "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." + }, + { + "description": "Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-app-menu", + "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-help-menu-for-nsapp", + "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-window-menu", + "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-windows-menu-for-nsapp", + "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-checked", + "markdownDescription": "Denies the set_checked command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-text", + "markdownDescription": "Denies the set_text command without any pre-configured scope." + }, + { + "description": "Denies the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-text", + "markdownDescription": "Denies the text command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", + "type": "string", + "const": "core:path:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" + }, + { + "description": "Enables the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-basename", + "markdownDescription": "Enables the basename command without any pre-configured scope." + }, + { + "description": "Enables the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-dirname", + "markdownDescription": "Enables the dirname command without any pre-configured scope." + }, + { + "description": "Enables the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-extname", + "markdownDescription": "Enables the extname command without any pre-configured scope." + }, + { + "description": "Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-is-absolute", + "markdownDescription": "Enables the is_absolute command without any pre-configured scope." + }, + { + "description": "Enables the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-join", + "markdownDescription": "Enables the join command without any pre-configured scope." + }, + { + "description": "Enables the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-normalize", + "markdownDescription": "Enables the normalize command without any pre-configured scope." + }, + { + "description": "Enables the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve", + "markdownDescription": "Enables the resolve command without any pre-configured scope." + }, + { + "description": "Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve-directory", + "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." + }, + { + "description": "Denies the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-basename", + "markdownDescription": "Denies the basename command without any pre-configured scope." + }, + { + "description": "Denies the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-dirname", + "markdownDescription": "Denies the dirname command without any pre-configured scope." + }, + { + "description": "Denies the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-extname", + "markdownDescription": "Denies the extname command without any pre-configured scope." + }, + { + "description": "Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-is-absolute", + "markdownDescription": "Denies the is_absolute command without any pre-configured scope." + }, + { + "description": "Denies the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-join", + "markdownDescription": "Denies the join command without any pre-configured scope." + }, + { + "description": "Denies the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-normalize", + "markdownDescription": "Denies the normalize command without any pre-configured scope." + }, + { + "description": "Denies the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve", + "markdownDescription": "Denies the resolve command without any pre-configured scope." + }, + { + "description": "Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve-directory", + "markdownDescription": "Denies the resolve_directory command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`", + "type": "string", + "const": "core:resources:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`", + "type": "string", + "const": "core:tray:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`" + }, + { + "description": "Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-get-by-id", + "markdownDescription": "Enables the get_by_id command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-remove-by-id", + "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-as-template", + "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Enables the set_icon_with_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-with-as-template", + "markdownDescription": "Enables the set_icon_with_as_template command without any pre-configured scope." + }, + { + "description": "Enables the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-menu", + "markdownDescription": "Enables the set_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-show-menu-on-left-click", + "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-temp-dir-path", + "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-tooltip", + "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." + }, + { + "description": "Enables the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-visible", + "markdownDescription": "Enables the set_visible command without any pre-configured scope." + }, + { + "description": "Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-get-by-id", + "markdownDescription": "Denies the get_by_id command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-remove-by-id", + "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-as-template", + "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Denies the set_icon_with_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-with-as-template", + "markdownDescription": "Denies the set_icon_with_as_template command without any pre-configured scope." + }, + { + "description": "Denies the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-menu", + "markdownDescription": "Denies the set_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-show-menu-on-left-click", + "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-temp-dir-path", + "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-tooltip", + "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." + }, + { + "description": "Denies the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-visible", + "markdownDescription": "Denies the set_visible command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", + "type": "string", + "const": "core:webview:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" + }, + { + "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-clear-all-browsing-data", + "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Enables the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview", + "markdownDescription": "Enables the create_webview command without any pre-configured scope." + }, + { + "description": "Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview-window", + "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." + }, + { + "description": "Enables the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-get-all-webviews", + "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-internal-toggle-devtools", + "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Enables the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-print", + "markdownDescription": "Enables the print command without any pre-configured scope." + }, + { + "description": "Enables the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-reparent", + "markdownDescription": "Enables the reparent command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-auto-resize", + "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-background-color", + "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-focus", + "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-position", + "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-size", + "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-zoom", + "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Enables the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-close", + "markdownDescription": "Enables the webview_close command without any pre-configured scope." + }, + { + "description": "Enables the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-hide", + "markdownDescription": "Enables the webview_hide command without any pre-configured scope." + }, + { + "description": "Enables the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-position", + "markdownDescription": "Enables the webview_position command without any pre-configured scope." + }, + { + "description": "Enables the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-show", + "markdownDescription": "Enables the webview_show command without any pre-configured scope." + }, + { + "description": "Enables the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-size", + "markdownDescription": "Enables the webview_size command without any pre-configured scope." + }, + { + "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-clear-all-browsing-data", + "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Denies the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview", + "markdownDescription": "Denies the create_webview command without any pre-configured scope." + }, + { + "description": "Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview-window", + "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." + }, + { + "description": "Denies the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-get-all-webviews", + "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-internal-toggle-devtools", + "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Denies the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-print", + "markdownDescription": "Denies the print command without any pre-configured scope." + }, + { + "description": "Denies the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-reparent", + "markdownDescription": "Denies the reparent command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-auto-resize", + "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-background-color", + "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-focus", + "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-position", + "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-size", + "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-zoom", + "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Denies the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-close", + "markdownDescription": "Denies the webview_close command without any pre-configured scope." + }, + { + "description": "Denies the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-hide", + "markdownDescription": "Denies the webview_hide command without any pre-configured scope." + }, + { + "description": "Denies the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-position", + "markdownDescription": "Denies the webview_position command without any pre-configured scope." + }, + { + "description": "Denies the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-show", + "markdownDescription": "Denies the webview_show command without any pre-configured scope." + }, + { + "description": "Denies the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-size", + "markdownDescription": "Denies the webview_size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`", + "type": "string", + "const": "core:window:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`" + }, + { + "description": "Enables the activity_name command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-activity-name", + "markdownDescription": "Enables the activity_name command without any pre-configured scope." + }, + { + "description": "Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-available-monitors", + "markdownDescription": "Enables the available_monitors command without any pre-configured scope." + }, + { + "description": "Enables the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-center", + "markdownDescription": "Enables the center command without any pre-configured scope." + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-current-monitor", + "markdownDescription": "Enables the current_monitor command without any pre-configured scope." + }, + { + "description": "Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-cursor-position", + "markdownDescription": "Enables the cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-destroy", + "markdownDescription": "Enables the destroy command without any pre-configured scope." + }, + { + "description": "Enables the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-get-all-windows", + "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." + }, + { + "description": "Enables the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-hide", + "markdownDescription": "Enables the hide command without any pre-configured scope." + }, + { + "description": "Enables the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-position", + "markdownDescription": "Enables the inner_position command without any pre-configured scope." + }, + { + "description": "Enables the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-size", + "markdownDescription": "Enables the inner_size command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-internal-toggle-maximize", + "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-always-on-top", + "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-closable", + "markdownDescription": "Enables the is_closable command without any pre-configured scope." + }, + { + "description": "Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-decorated", + "markdownDescription": "Enables the is_decorated command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-focused", + "markdownDescription": "Enables the is_focused command without any pre-configured scope." + }, + { + "description": "Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-fullscreen", + "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximizable", + "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximized", + "markdownDescription": "Enables the is_maximized command without any pre-configured scope." + }, + { + "description": "Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimizable", + "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimized", + "markdownDescription": "Enables the is_minimized command without any pre-configured scope." + }, + { + "description": "Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-resizable", + "markdownDescription": "Enables the is_resizable command without any pre-configured scope." + }, + { + "description": "Enables the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-visible", + "markdownDescription": "Enables the is_visible command without any pre-configured scope." + }, + { + "description": "Enables the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-maximize", + "markdownDescription": "Enables the maximize command without any pre-configured scope." + }, + { + "description": "Enables the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-minimize", + "markdownDescription": "Enables the minimize command without any pre-configured scope." + }, + { + "description": "Enables the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-monitor-from-point", + "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Enables the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-position", + "markdownDescription": "Enables the outer_position command without any pre-configured scope." + }, + { + "description": "Enables the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-size", + "markdownDescription": "Enables the outer_size command without any pre-configured scope." + }, + { + "description": "Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-primary-monitor", + "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." + }, + { + "description": "Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-request-user-attention", + "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." + }, + { + "description": "Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scale-factor", + "markdownDescription": "Enables the scale_factor command without any pre-configured scope." + }, + { + "description": "Enables the scene_identifier command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scene-identifier", + "markdownDescription": "Enables the scene_identifier command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-bottom", + "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-top", + "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-background-color", + "markdownDescription": "Enables the set_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-count", + "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-label", + "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." + }, + { + "description": "Enables the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-closable", + "markdownDescription": "Enables the set_closable command without any pre-configured scope." + }, + { + "description": "Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-content-protected", + "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-grab", + "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-icon", + "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-position", + "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-visible", + "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-decorations", + "markdownDescription": "Enables the set_decorations command without any pre-configured scope." + }, + { + "description": "Enables the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-effects", + "markdownDescription": "Enables the set_effects command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focus", + "markdownDescription": "Enables the set_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focusable", + "markdownDescription": "Enables the set_focusable command without any pre-configured scope." + }, + { + "description": "Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-fullscreen", + "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_fullscreen_on_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-fullscreen-on-monitor", + "markdownDescription": "Enables the set_fullscreen_on_monitor command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-ignore-cursor-events", + "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-max-size", + "markdownDescription": "Enables the set_max_size command without any pre-configured scope." + }, + { + "description": "Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-maximizable", + "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-min-size", + "markdownDescription": "Enables the set_min_size command without any pre-configured scope." + }, + { + "description": "Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-minimizable", + "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-overlay-icon", + "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-position", + "markdownDescription": "Enables the set_position command without any pre-configured scope." + }, + { + "description": "Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-progress-bar", + "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-resizable", + "markdownDescription": "Enables the set_resizable command without any pre-configured scope." + }, + { + "description": "Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-shadow", + "markdownDescription": "Enables the set_shadow command without any pre-configured scope." + }, + { + "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-simple-fullscreen", + "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size", + "markdownDescription": "Enables the set_size command without any pre-configured scope." + }, + { + "description": "Enables the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size-constraints", + "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-skip-taskbar", + "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Enables the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-theme", + "markdownDescription": "Enables the set_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title-bar-style", + "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-visible-on-all-workspaces", + "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Enables the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-show", + "markdownDescription": "Enables the show command without any pre-configured scope." + }, + { + "description": "Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-dragging", + "markdownDescription": "Enables the start_dragging command without any pre-configured scope." + }, + { + "description": "Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-resize-dragging", + "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Enables the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-theme", + "markdownDescription": "Enables the theme command without any pre-configured scope." + }, + { + "description": "Enables the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-title", + "markdownDescription": "Enables the title command without any pre-configured scope." + }, + { + "description": "Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-toggle-maximize", + "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unmaximize", + "markdownDescription": "Enables the unmaximize command without any pre-configured scope." + }, + { + "description": "Enables the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unminimize", + "markdownDescription": "Enables the unminimize command without any pre-configured scope." + }, + { + "description": "Denies the activity_name command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-activity-name", + "markdownDescription": "Denies the activity_name command without any pre-configured scope." + }, + { + "description": "Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-available-monitors", + "markdownDescription": "Denies the available_monitors command without any pre-configured scope." + }, + { + "description": "Denies the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-center", + "markdownDescription": "Denies the center command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-current-monitor", + "markdownDescription": "Denies the current_monitor command without any pre-configured scope." + }, + { + "description": "Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-cursor-position", + "markdownDescription": "Denies the cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-destroy", + "markdownDescription": "Denies the destroy command without any pre-configured scope." + }, + { + "description": "Denies the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-get-all-windows", + "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." + }, + { + "description": "Denies the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-hide", + "markdownDescription": "Denies the hide command without any pre-configured scope." + }, + { + "description": "Denies the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-position", + "markdownDescription": "Denies the inner_position command without any pre-configured scope." + }, + { + "description": "Denies the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-size", + "markdownDescription": "Denies the inner_size command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-internal-toggle-maximize", + "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-always-on-top", + "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-closable", + "markdownDescription": "Denies the is_closable command without any pre-configured scope." + }, + { + "description": "Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-decorated", + "markdownDescription": "Denies the is_decorated command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-focused", + "markdownDescription": "Denies the is_focused command without any pre-configured scope." + }, + { + "description": "Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-fullscreen", + "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximizable", + "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximized", + "markdownDescription": "Denies the is_maximized command without any pre-configured scope." + }, + { + "description": "Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimizable", + "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimized", + "markdownDescription": "Denies the is_minimized command without any pre-configured scope." + }, + { + "description": "Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-resizable", + "markdownDescription": "Denies the is_resizable command without any pre-configured scope." + }, + { + "description": "Denies the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-visible", + "markdownDescription": "Denies the is_visible command without any pre-configured scope." + }, + { + "description": "Denies the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-maximize", + "markdownDescription": "Denies the maximize command without any pre-configured scope." + }, + { + "description": "Denies the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-minimize", + "markdownDescription": "Denies the minimize command without any pre-configured scope." + }, + { + "description": "Denies the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-monitor-from-point", + "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Denies the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-position", + "markdownDescription": "Denies the outer_position command without any pre-configured scope." + }, + { + "description": "Denies the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-size", + "markdownDescription": "Denies the outer_size command without any pre-configured scope." + }, + { + "description": "Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-primary-monitor", + "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." + }, + { + "description": "Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-request-user-attention", + "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." + }, + { + "description": "Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scale-factor", + "markdownDescription": "Denies the scale_factor command without any pre-configured scope." + }, + { + "description": "Denies the scene_identifier command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scene-identifier", + "markdownDescription": "Denies the scene_identifier command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-bottom", + "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-top", + "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-background-color", + "markdownDescription": "Denies the set_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-count", + "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-label", + "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." + }, + { + "description": "Denies the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-closable", + "markdownDescription": "Denies the set_closable command without any pre-configured scope." + }, + { + "description": "Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-content-protected", + "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-grab", + "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-icon", + "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-position", + "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-visible", + "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-decorations", + "markdownDescription": "Denies the set_decorations command without any pre-configured scope." + }, + { + "description": "Denies the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-effects", + "markdownDescription": "Denies the set_effects command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focus", + "markdownDescription": "Denies the set_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focusable", + "markdownDescription": "Denies the set_focusable command without any pre-configured scope." + }, + { + "description": "Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-fullscreen", + "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_fullscreen_on_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-fullscreen-on-monitor", + "markdownDescription": "Denies the set_fullscreen_on_monitor command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-ignore-cursor-events", + "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-max-size", + "markdownDescription": "Denies the set_max_size command without any pre-configured scope." + }, + { + "description": "Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-maximizable", + "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-min-size", + "markdownDescription": "Denies the set_min_size command without any pre-configured scope." + }, + { + "description": "Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-minimizable", + "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-overlay-icon", + "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-position", + "markdownDescription": "Denies the set_position command without any pre-configured scope." + }, + { + "description": "Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-progress-bar", + "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-resizable", + "markdownDescription": "Denies the set_resizable command without any pre-configured scope." + }, + { + "description": "Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-shadow", + "markdownDescription": "Denies the set_shadow command without any pre-configured scope." + }, + { + "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-simple-fullscreen", + "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size", + "markdownDescription": "Denies the set_size command without any pre-configured scope." + }, + { + "description": "Denies the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size-constraints", + "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-skip-taskbar", + "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Denies the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-theme", + "markdownDescription": "Denies the set_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title-bar-style", + "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-visible-on-all-workspaces", + "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Denies the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-show", + "markdownDescription": "Denies the show command without any pre-configured scope." + }, + { + "description": "Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-dragging", + "markdownDescription": "Denies the start_dragging command without any pre-configured scope." + }, + { + "description": "Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-resize-dragging", + "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Denies the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-theme", + "markdownDescription": "Denies the theme command without any pre-configured scope." + }, + { + "description": "Denies the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-title", + "markdownDescription": "Denies the title command without any pre-configured scope." + }, + { + "description": "Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-toggle-maximize", + "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unmaximize", + "markdownDescription": "Denies the unmaximize command without any pre-configured scope." + }, + { + "description": "Denies the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unminimize", + "markdownDescription": "Denies the unminimize command without any pre-configured scope." + } + ] + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + } + } +} \ No newline at end of file diff --git a/harnesses/ttimg/gen/schemas/capabilities.json b/harnesses/ttimg/gen/schemas/capabilities.json new file mode 100644 index 0000000..ea22560 --- /dev/null +++ b/harnesses/ttimg/gen/schemas/capabilities.json @@ -0,0 +1 @@ +{"default":{"identifier":"default","description":"tttest: FR batching + lifecycle logs from the webview","local":true,"windows":["main"],"permissions":["core:default"]}} \ No newline at end of file diff --git a/harnesses/ttimg/gen/schemas/mobile-schema.json b/harnesses/ttimg/gen/schemas/mobile-schema.json new file mode 100644 index 0000000..1ef1225 --- /dev/null +++ b/harnesses/ttimg/gen/schemas/mobile-schema.json @@ -0,0 +1,2316 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "CapabilityFile", + "description": "Capability formats accepted in a capability file.", + "anyOf": [ + { + "description": "A single capability.", + "allOf": [ + { + "$ref": "#/definitions/Capability" + } + ] + }, + { + "description": "A list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + }, + { + "description": "A list of capabilities.", + "type": "object", + "required": [ + "capabilities" + ], + "properties": { + "capabilities": { + "description": "The list of capabilities.", + "type": "array", + "items": { + "$ref": "#/definitions/Capability" + } + } + } + } + ], + "definitions": { + "Capability": { + "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", + "type": "object", + "required": [ + "identifier", + "permissions" + ], + "properties": { + "identifier": { + "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", + "type": "string" + }, + "description": { + "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.", + "default": "", + "type": "string" + }, + "remote": { + "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", + "anyOf": [ + { + "$ref": "#/definitions/CapabilityRemote" + }, + { + "type": "null" + } + ] + }, + "local": { + "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", + "default": true, + "type": "boolean" + }, + "windows": { + "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "webviews": { + "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", + "type": "array", + "items": { + "type": "string" + } + }, + "permissions": { + "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", + "type": "array", + "items": { + "$ref": "#/definitions/PermissionEntry" + }, + "uniqueItems": true + }, + "platforms": { + "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Target" + } + } + } + }, + "CapabilityRemote": { + "description": "Configuration for remote URLs that are associated with the capability.", + "type": "object", + "required": [ + "urls" + ], + "properties": { + "urls": { + "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "PermissionEntry": { + "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", + "anyOf": [ + { + "description": "Reference a permission or permission set by identifier.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + { + "description": "Reference a permission or permission set by identifier and extends its scope.", + "type": "object", + "allOf": [ + { + "properties": { + "identifier": { + "description": "Identifier of the permission or permission set.", + "allOf": [ + { + "$ref": "#/definitions/Identifier" + } + ] + }, + "allow": { + "description": "Data that defines what is allowed by the scope.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + }, + "deny": { + "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Value" + } + } + } + } + ], + "required": [ + "identifier" + ] + } + ] + }, + "Identifier": { + "description": "Permission identifier", + "oneOf": [ + { + "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", + "type": "string", + "const": "core:default", + "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`" + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`", + "type": "string", + "const": "core:app:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`" + }, + { + "description": "Enables the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-hide", + "markdownDescription": "Enables the app_hide command without any pre-configured scope." + }, + { + "description": "Enables the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-app-show", + "markdownDescription": "Enables the app_show command without any pre-configured scope." + }, + { + "description": "Enables the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-bundle-type", + "markdownDescription": "Enables the bundle_type command without any pre-configured scope." + }, + { + "description": "Enables the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-default-window-icon", + "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." + }, + { + "description": "Enables the exit command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-exit", + "markdownDescription": "Enables the exit command without any pre-configured scope." + }, + { + "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-fetch-data-store-identifiers", + "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Enables the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-identifier", + "markdownDescription": "Enables the identifier command without any pre-configured scope." + }, + { + "description": "Enables the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-name", + "markdownDescription": "Enables the name command without any pre-configured scope." + }, + { + "description": "Enables the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-register-listener", + "markdownDescription": "Enables the register_listener command without any pre-configured scope." + }, + { + "description": "Enables the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-data-store", + "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." + }, + { + "description": "Enables the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-remove-listener", + "markdownDescription": "Enables the remove_listener command without any pre-configured scope." + }, + { + "description": "Enables the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-app-theme", + "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-set-dock-visibility", + "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Enables the supports_multiple_windows command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-supports-multiple-windows", + "markdownDescription": "Enables the supports_multiple_windows command without any pre-configured scope." + }, + { + "description": "Enables the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-tauri-version", + "markdownDescription": "Enables the tauri_version command without any pre-configured scope." + }, + { + "description": "Enables the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-version", + "markdownDescription": "Enables the version command without any pre-configured scope." + }, + { + "description": "Denies the app_hide command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-hide", + "markdownDescription": "Denies the app_hide command without any pre-configured scope." + }, + { + "description": "Denies the app_show command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-app-show", + "markdownDescription": "Denies the app_show command without any pre-configured scope." + }, + { + "description": "Denies the bundle_type command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-bundle-type", + "markdownDescription": "Denies the bundle_type command without any pre-configured scope." + }, + { + "description": "Denies the default_window_icon command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-default-window-icon", + "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." + }, + { + "description": "Denies the exit command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-exit", + "markdownDescription": "Denies the exit command without any pre-configured scope." + }, + { + "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-fetch-data-store-identifiers", + "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." + }, + { + "description": "Denies the identifier command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-identifier", + "markdownDescription": "Denies the identifier command without any pre-configured scope." + }, + { + "description": "Denies the name command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-name", + "markdownDescription": "Denies the name command without any pre-configured scope." + }, + { + "description": "Denies the register_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-register-listener", + "markdownDescription": "Denies the register_listener command without any pre-configured scope." + }, + { + "description": "Denies the remove_data_store command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-data-store", + "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." + }, + { + "description": "Denies the remove_listener command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-remove-listener", + "markdownDescription": "Denies the remove_listener command without any pre-configured scope." + }, + { + "description": "Denies the set_app_theme command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-app-theme", + "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_dock_visibility command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-set-dock-visibility", + "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." + }, + { + "description": "Denies the supports_multiple_windows command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-supports-multiple-windows", + "markdownDescription": "Denies the supports_multiple_windows command without any pre-configured scope." + }, + { + "description": "Denies the tauri_version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-tauri-version", + "markdownDescription": "Denies the tauri_version command without any pre-configured scope." + }, + { + "description": "Denies the version command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-version", + "markdownDescription": "Denies the version command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", + "type": "string", + "const": "core:event:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" + }, + { + "description": "Enables the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit", + "markdownDescription": "Enables the emit command without any pre-configured scope." + }, + { + "description": "Enables the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-emit-to", + "markdownDescription": "Enables the emit_to command without any pre-configured scope." + }, + { + "description": "Enables the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-listen", + "markdownDescription": "Enables the listen command without any pre-configured scope." + }, + { + "description": "Enables the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:allow-unlisten", + "markdownDescription": "Enables the unlisten command without any pre-configured scope." + }, + { + "description": "Denies the emit command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit", + "markdownDescription": "Denies the emit command without any pre-configured scope." + }, + { + "description": "Denies the emit_to command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-emit-to", + "markdownDescription": "Denies the emit_to command without any pre-configured scope." + }, + { + "description": "Denies the listen command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-listen", + "markdownDescription": "Denies the listen command without any pre-configured scope." + }, + { + "description": "Denies the unlisten command without any pre-configured scope.", + "type": "string", + "const": "core:event:deny-unlisten", + "markdownDescription": "Denies the unlisten command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", + "type": "string", + "const": "core:image:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" + }, + { + "description": "Enables the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-bytes", + "markdownDescription": "Enables the from_bytes command without any pre-configured scope." + }, + { + "description": "Enables the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-from-path", + "markdownDescription": "Enables the from_path command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-rgba", + "markdownDescription": "Enables the rgba command without any pre-configured scope." + }, + { + "description": "Enables the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:allow-size", + "markdownDescription": "Enables the size command without any pre-configured scope." + }, + { + "description": "Denies the from_bytes command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-bytes", + "markdownDescription": "Denies the from_bytes command without any pre-configured scope." + }, + { + "description": "Denies the from_path command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-from-path", + "markdownDescription": "Denies the from_path command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the rgba command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-rgba", + "markdownDescription": "Denies the rgba command without any pre-configured scope." + }, + { + "description": "Denies the size command without any pre-configured scope.", + "type": "string", + "const": "core:image:deny-size", + "markdownDescription": "Denies the size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", + "type": "string", + "const": "core:menu:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" + }, + { + "description": "Enables the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-append", + "markdownDescription": "Enables the append command without any pre-configured scope." + }, + { + "description": "Enables the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-create-default", + "markdownDescription": "Enables the create_default command without any pre-configured scope." + }, + { + "description": "Enables the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-get", + "markdownDescription": "Enables the get command without any pre-configured scope." + }, + { + "description": "Enables the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-insert", + "markdownDescription": "Enables the insert command without any pre-configured scope." + }, + { + "description": "Enables the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-checked", + "markdownDescription": "Enables the is_checked command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-items", + "markdownDescription": "Enables the items command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-popup", + "markdownDescription": "Enables the popup command without any pre-configured scope." + }, + { + "description": "Enables the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-prepend", + "markdownDescription": "Enables the prepend command without any pre-configured scope." + }, + { + "description": "Enables the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." + }, + { + "description": "Enables the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-remove-at", + "markdownDescription": "Enables the remove_at command without any pre-configured scope." + }, + { + "description": "Enables the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-accelerator", + "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." + }, + { + "description": "Enables the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-app-menu", + "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-help-menu-for-nsapp", + "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-window-menu", + "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-as-windows-menu-for-nsapp", + "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Enables the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-checked", + "markdownDescription": "Enables the set_checked command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-set-text", + "markdownDescription": "Enables the set_text command without any pre-configured scope." + }, + { + "description": "Enables the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:allow-text", + "markdownDescription": "Enables the text command without any pre-configured scope." + }, + { + "description": "Denies the append command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-append", + "markdownDescription": "Denies the append command without any pre-configured scope." + }, + { + "description": "Denies the create_default command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-create-default", + "markdownDescription": "Denies the create_default command without any pre-configured scope." + }, + { + "description": "Denies the get command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-get", + "markdownDescription": "Denies the get command without any pre-configured scope." + }, + { + "description": "Denies the insert command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-insert", + "markdownDescription": "Denies the insert command without any pre-configured scope." + }, + { + "description": "Denies the is_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-checked", + "markdownDescription": "Denies the is_checked command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the items command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-items", + "markdownDescription": "Denies the items command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the popup command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-popup", + "markdownDescription": "Denies the popup command without any pre-configured scope." + }, + { + "description": "Denies the prepend command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-prepend", + "markdownDescription": "Denies the prepend command without any pre-configured scope." + }, + { + "description": "Denies the remove command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." + }, + { + "description": "Denies the remove_at command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-remove-at", + "markdownDescription": "Denies the remove_at command without any pre-configured scope." + }, + { + "description": "Denies the set_accelerator command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-accelerator", + "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." + }, + { + "description": "Denies the set_as_app_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-app-menu", + "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-help-menu-for-nsapp", + "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_as_window_menu command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-window-menu", + "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-as-windows-menu-for-nsapp", + "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." + }, + { + "description": "Denies the set_checked command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-checked", + "markdownDescription": "Denies the set_checked command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-set-text", + "markdownDescription": "Denies the set_text command without any pre-configured scope." + }, + { + "description": "Denies the text command without any pre-configured scope.", + "type": "string", + "const": "core:menu:deny-text", + "markdownDescription": "Denies the text command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", + "type": "string", + "const": "core:path:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" + }, + { + "description": "Enables the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-basename", + "markdownDescription": "Enables the basename command without any pre-configured scope." + }, + { + "description": "Enables the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-dirname", + "markdownDescription": "Enables the dirname command without any pre-configured scope." + }, + { + "description": "Enables the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-extname", + "markdownDescription": "Enables the extname command without any pre-configured scope." + }, + { + "description": "Enables the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-is-absolute", + "markdownDescription": "Enables the is_absolute command without any pre-configured scope." + }, + { + "description": "Enables the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-join", + "markdownDescription": "Enables the join command without any pre-configured scope." + }, + { + "description": "Enables the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-normalize", + "markdownDescription": "Enables the normalize command without any pre-configured scope." + }, + { + "description": "Enables the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve", + "markdownDescription": "Enables the resolve command without any pre-configured scope." + }, + { + "description": "Enables the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:allow-resolve-directory", + "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." + }, + { + "description": "Denies the basename command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-basename", + "markdownDescription": "Denies the basename command without any pre-configured scope." + }, + { + "description": "Denies the dirname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-dirname", + "markdownDescription": "Denies the dirname command without any pre-configured scope." + }, + { + "description": "Denies the extname command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-extname", + "markdownDescription": "Denies the extname command without any pre-configured scope." + }, + { + "description": "Denies the is_absolute command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-is-absolute", + "markdownDescription": "Denies the is_absolute command without any pre-configured scope." + }, + { + "description": "Denies the join command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-join", + "markdownDescription": "Denies the join command without any pre-configured scope." + }, + { + "description": "Denies the normalize command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-normalize", + "markdownDescription": "Denies the normalize command without any pre-configured scope." + }, + { + "description": "Denies the resolve command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve", + "markdownDescription": "Denies the resolve command without any pre-configured scope." + }, + { + "description": "Denies the resolve_directory command without any pre-configured scope.", + "type": "string", + "const": "core:path:deny-resolve-directory", + "markdownDescription": "Denies the resolve_directory command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`", + "type": "string", + "const": "core:resources:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:resources:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`", + "type": "string", + "const": "core:tray:default", + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`" + }, + { + "description": "Enables the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-get-by-id", + "markdownDescription": "Enables the get_by_id command without any pre-configured scope." + }, + { + "description": "Enables the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-new", + "markdownDescription": "Enables the new command without any pre-configured scope." + }, + { + "description": "Enables the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-remove-by-id", + "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-as-template", + "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Enables the set_icon_with_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-with-as-template", + "markdownDescription": "Enables the set_icon_with_as_template command without any pre-configured scope." + }, + { + "description": "Enables the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-menu", + "markdownDescription": "Enables the set_menu command without any pre-configured scope." + }, + { + "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-show-menu-on-left-click", + "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Enables the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-temp-dir-path", + "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-tooltip", + "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." + }, + { + "description": "Enables the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-visible", + "markdownDescription": "Enables the set_visible command without any pre-configured scope." + }, + { + "description": "Denies the get_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-get-by-id", + "markdownDescription": "Denies the get_by_id command without any pre-configured scope." + }, + { + "description": "Denies the new command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-new", + "markdownDescription": "Denies the new command without any pre-configured scope." + }, + { + "description": "Denies the remove_by_id command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-remove-by-id", + "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_icon_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-as-template", + "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." + }, + { + "description": "Denies the set_icon_with_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-with-as-template", + "markdownDescription": "Denies the set_icon_with_as_template command without any pre-configured scope." + }, + { + "description": "Denies the set_menu command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-menu", + "markdownDescription": "Denies the set_menu command without any pre-configured scope." + }, + { + "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-show-menu-on-left-click", + "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." + }, + { + "description": "Denies the set_temp_dir_path command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-temp-dir-path", + "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_tooltip command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-tooltip", + "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." + }, + { + "description": "Denies the set_visible command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-visible", + "markdownDescription": "Denies the set_visible command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", + "type": "string", + "const": "core:webview:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" + }, + { + "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-clear-all-browsing-data", + "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Enables the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview", + "markdownDescription": "Enables the create_webview command without any pre-configured scope." + }, + { + "description": "Enables the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-create-webview-window", + "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." + }, + { + "description": "Enables the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-get-all-webviews", + "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-internal-toggle-devtools", + "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Enables the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-print", + "markdownDescription": "Enables the print command without any pre-configured scope." + }, + { + "description": "Enables the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-reparent", + "markdownDescription": "Enables the reparent command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-auto-resize", + "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-background-color", + "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-focus", + "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-position", + "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-size", + "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." + }, + { + "description": "Enables the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-set-webview-zoom", + "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Enables the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-close", + "markdownDescription": "Enables the webview_close command without any pre-configured scope." + }, + { + "description": "Enables the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-hide", + "markdownDescription": "Enables the webview_hide command without any pre-configured scope." + }, + { + "description": "Enables the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-position", + "markdownDescription": "Enables the webview_position command without any pre-configured scope." + }, + { + "description": "Enables the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-show", + "markdownDescription": "Enables the webview_show command without any pre-configured scope." + }, + { + "description": "Enables the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:allow-webview-size", + "markdownDescription": "Enables the webview_size command without any pre-configured scope." + }, + { + "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-clear-all-browsing-data", + "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." + }, + { + "description": "Denies the create_webview command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview", + "markdownDescription": "Denies the create_webview command without any pre-configured scope." + }, + { + "description": "Denies the create_webview_window command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-create-webview-window", + "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." + }, + { + "description": "Denies the get_all_webviews command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-get-all-webviews", + "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-internal-toggle-devtools", + "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." + }, + { + "description": "Denies the print command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-print", + "markdownDescription": "Denies the print command without any pre-configured scope." + }, + { + "description": "Denies the reparent command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-reparent", + "markdownDescription": "Denies the reparent command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_auto_resize command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-auto-resize", + "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-background-color", + "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_focus command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-focus", + "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-position", + "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-size", + "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." + }, + { + "description": "Denies the set_webview_zoom command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-set-webview-zoom", + "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." + }, + { + "description": "Denies the webview_close command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-close", + "markdownDescription": "Denies the webview_close command without any pre-configured scope." + }, + { + "description": "Denies the webview_hide command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-hide", + "markdownDescription": "Denies the webview_hide command without any pre-configured scope." + }, + { + "description": "Denies the webview_position command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-position", + "markdownDescription": "Denies the webview_position command without any pre-configured scope." + }, + { + "description": "Denies the webview_show command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-show", + "markdownDescription": "Denies the webview_show command without any pre-configured scope." + }, + { + "description": "Denies the webview_size command without any pre-configured scope.", + "type": "string", + "const": "core:webview:deny-webview-size", + "markdownDescription": "Denies the webview_size command without any pre-configured scope." + }, + { + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`", + "type": "string", + "const": "core:window:default", + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`" + }, + { + "description": "Enables the activity_name command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-activity-name", + "markdownDescription": "Enables the activity_name command without any pre-configured scope." + }, + { + "description": "Enables the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-available-monitors", + "markdownDescription": "Enables the available_monitors command without any pre-configured scope." + }, + { + "description": "Enables the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-center", + "markdownDescription": "Enables the center command without any pre-configured scope." + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-close", + "markdownDescription": "Enables the close command without any pre-configured scope." + }, + { + "description": "Enables the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-create", + "markdownDescription": "Enables the create command without any pre-configured scope." + }, + { + "description": "Enables the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-current-monitor", + "markdownDescription": "Enables the current_monitor command without any pre-configured scope." + }, + { + "description": "Enables the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-cursor-position", + "markdownDescription": "Enables the cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-destroy", + "markdownDescription": "Enables the destroy command without any pre-configured scope." + }, + { + "description": "Enables the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-get-all-windows", + "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." + }, + { + "description": "Enables the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-hide", + "markdownDescription": "Enables the hide command without any pre-configured scope." + }, + { + "description": "Enables the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-position", + "markdownDescription": "Enables the inner_position command without any pre-configured scope." + }, + { + "description": "Enables the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-inner-size", + "markdownDescription": "Enables the inner_size command without any pre-configured scope." + }, + { + "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-internal-toggle-maximize", + "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-always-on-top", + "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-closable", + "markdownDescription": "Enables the is_closable command without any pre-configured scope." + }, + { + "description": "Enables the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-decorated", + "markdownDescription": "Enables the is_decorated command without any pre-configured scope." + }, + { + "description": "Enables the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-enabled", + "markdownDescription": "Enables the is_enabled command without any pre-configured scope." + }, + { + "description": "Enables the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-focused", + "markdownDescription": "Enables the is_focused command without any pre-configured scope." + }, + { + "description": "Enables the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-fullscreen", + "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximizable", + "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-maximized", + "markdownDescription": "Enables the is_maximized command without any pre-configured scope." + }, + { + "description": "Enables the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimizable", + "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-minimized", + "markdownDescription": "Enables the is_minimized command without any pre-configured scope." + }, + { + "description": "Enables the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-resizable", + "markdownDescription": "Enables the is_resizable command without any pre-configured scope." + }, + { + "description": "Enables the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-is-visible", + "markdownDescription": "Enables the is_visible command without any pre-configured scope." + }, + { + "description": "Enables the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-maximize", + "markdownDescription": "Enables the maximize command without any pre-configured scope." + }, + { + "description": "Enables the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-minimize", + "markdownDescription": "Enables the minimize command without any pre-configured scope." + }, + { + "description": "Enables the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-monitor-from-point", + "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Enables the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-position", + "markdownDescription": "Enables the outer_position command without any pre-configured scope." + }, + { + "description": "Enables the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-outer-size", + "markdownDescription": "Enables the outer_size command without any pre-configured scope." + }, + { + "description": "Enables the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-primary-monitor", + "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." + }, + { + "description": "Enables the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-request-user-attention", + "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." + }, + { + "description": "Enables the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scale-factor", + "markdownDescription": "Enables the scale_factor command without any pre-configured scope." + }, + { + "description": "Enables the scene_identifier command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scene-identifier", + "markdownDescription": "Enables the scene_identifier command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-bottom", + "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Enables the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-always-on-top", + "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Enables the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-background-color", + "markdownDescription": "Enables the set_background_color command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-count", + "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." + }, + { + "description": "Enables the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-badge-label", + "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." + }, + { + "description": "Enables the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-closable", + "markdownDescription": "Enables the set_closable command without any pre-configured scope." + }, + { + "description": "Enables the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-content-protected", + "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-grab", + "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-icon", + "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-position", + "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Enables the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-cursor-visible", + "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Enables the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-decorations", + "markdownDescription": "Enables the set_decorations command without any pre-configured scope." + }, + { + "description": "Enables the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-effects", + "markdownDescription": "Enables the set_effects command without any pre-configured scope." + }, + { + "description": "Enables the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-enabled", + "markdownDescription": "Enables the set_enabled command without any pre-configured scope." + }, + { + "description": "Enables the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focus", + "markdownDescription": "Enables the set_focus command without any pre-configured scope." + }, + { + "description": "Enables the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-focusable", + "markdownDescription": "Enables the set_focusable command without any pre-configured scope." + }, + { + "description": "Enables the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-fullscreen", + "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_fullscreen_on_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-fullscreen-on-monitor", + "markdownDescription": "Enables the set_fullscreen_on_monitor command without any pre-configured scope." + }, + { + "description": "Enables the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-icon", + "markdownDescription": "Enables the set_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-ignore-cursor-events", + "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Enables the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-max-size", + "markdownDescription": "Enables the set_max_size command without any pre-configured scope." + }, + { + "description": "Enables the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-maximizable", + "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." + }, + { + "description": "Enables the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-min-size", + "markdownDescription": "Enables the set_min_size command without any pre-configured scope." + }, + { + "description": "Enables the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-minimizable", + "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." + }, + { + "description": "Enables the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-overlay-icon", + "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Enables the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-position", + "markdownDescription": "Enables the set_position command without any pre-configured scope." + }, + { + "description": "Enables the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-progress-bar", + "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Enables the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-resizable", + "markdownDescription": "Enables the set_resizable command without any pre-configured scope." + }, + { + "description": "Enables the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-shadow", + "markdownDescription": "Enables the set_shadow command without any pre-configured scope." + }, + { + "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-simple-fullscreen", + "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Enables the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size", + "markdownDescription": "Enables the set_size command without any pre-configured scope." + }, + { + "description": "Enables the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-size-constraints", + "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Enables the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-skip-taskbar", + "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Enables the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-theme", + "markdownDescription": "Enables the set_theme command without any pre-configured scope." + }, + { + "description": "Enables the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title", + "markdownDescription": "Enables the set_title command without any pre-configured scope." + }, + { + "description": "Enables the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-title-bar-style", + "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-set-visible-on-all-workspaces", + "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Enables the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-show", + "markdownDescription": "Enables the show command without any pre-configured scope." + }, + { + "description": "Enables the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-dragging", + "markdownDescription": "Enables the start_dragging command without any pre-configured scope." + }, + { + "description": "Enables the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-start-resize-dragging", + "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Enables the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-theme", + "markdownDescription": "Enables the theme command without any pre-configured scope." + }, + { + "description": "Enables the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-title", + "markdownDescription": "Enables the title command without any pre-configured scope." + }, + { + "description": "Enables the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-toggle-maximize", + "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Enables the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unmaximize", + "markdownDescription": "Enables the unmaximize command without any pre-configured scope." + }, + { + "description": "Enables the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-unminimize", + "markdownDescription": "Enables the unminimize command without any pre-configured scope." + }, + { + "description": "Denies the activity_name command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-activity-name", + "markdownDescription": "Denies the activity_name command without any pre-configured scope." + }, + { + "description": "Denies the available_monitors command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-available-monitors", + "markdownDescription": "Denies the available_monitors command without any pre-configured scope." + }, + { + "description": "Denies the center command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-center", + "markdownDescription": "Denies the center command without any pre-configured scope." + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-close", + "markdownDescription": "Denies the close command without any pre-configured scope." + }, + { + "description": "Denies the create command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-create", + "markdownDescription": "Denies the create command without any pre-configured scope." + }, + { + "description": "Denies the current_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-current-monitor", + "markdownDescription": "Denies the current_monitor command without any pre-configured scope." + }, + { + "description": "Denies the cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-cursor-position", + "markdownDescription": "Denies the cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the destroy command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-destroy", + "markdownDescription": "Denies the destroy command without any pre-configured scope." + }, + { + "description": "Denies the get_all_windows command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-get-all-windows", + "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." + }, + { + "description": "Denies the hide command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-hide", + "markdownDescription": "Denies the hide command without any pre-configured scope." + }, + { + "description": "Denies the inner_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-position", + "markdownDescription": "Denies the inner_position command without any pre-configured scope." + }, + { + "description": "Denies the inner_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-inner-size", + "markdownDescription": "Denies the inner_size command without any pre-configured scope." + }, + { + "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-internal-toggle-maximize", + "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the is_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-always-on-top", + "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the is_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-closable", + "markdownDescription": "Denies the is_closable command without any pre-configured scope." + }, + { + "description": "Denies the is_decorated command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-decorated", + "markdownDescription": "Denies the is_decorated command without any pre-configured scope." + }, + { + "description": "Denies the is_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-enabled", + "markdownDescription": "Denies the is_enabled command without any pre-configured scope." + }, + { + "description": "Denies the is_focused command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-focused", + "markdownDescription": "Denies the is_focused command without any pre-configured scope." + }, + { + "description": "Denies the is_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-fullscreen", + "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the is_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximizable", + "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the is_maximized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-maximized", + "markdownDescription": "Denies the is_maximized command without any pre-configured scope." + }, + { + "description": "Denies the is_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimizable", + "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the is_minimized command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-minimized", + "markdownDescription": "Denies the is_minimized command without any pre-configured scope." + }, + { + "description": "Denies the is_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-resizable", + "markdownDescription": "Denies the is_resizable command without any pre-configured scope." + }, + { + "description": "Denies the is_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-is-visible", + "markdownDescription": "Denies the is_visible command without any pre-configured scope." + }, + { + "description": "Denies the maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-maximize", + "markdownDescription": "Denies the maximize command without any pre-configured scope." + }, + { + "description": "Denies the minimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-minimize", + "markdownDescription": "Denies the minimize command without any pre-configured scope." + }, + { + "description": "Denies the monitor_from_point command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-monitor-from-point", + "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." + }, + { + "description": "Denies the outer_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-position", + "markdownDescription": "Denies the outer_position command without any pre-configured scope." + }, + { + "description": "Denies the outer_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-outer-size", + "markdownDescription": "Denies the outer_size command without any pre-configured scope." + }, + { + "description": "Denies the primary_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-primary-monitor", + "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." + }, + { + "description": "Denies the request_user_attention command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-request-user-attention", + "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." + }, + { + "description": "Denies the scale_factor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scale-factor", + "markdownDescription": "Denies the scale_factor command without any pre-configured scope." + }, + { + "description": "Denies the scene_identifier command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scene-identifier", + "markdownDescription": "Denies the scene_identifier command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_bottom command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-bottom", + "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." + }, + { + "description": "Denies the set_always_on_top command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-always-on-top", + "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." + }, + { + "description": "Denies the set_background_color command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-background-color", + "markdownDescription": "Denies the set_background_color command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_count command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-count", + "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." + }, + { + "description": "Denies the set_badge_label command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-badge-label", + "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." + }, + { + "description": "Denies the set_closable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-closable", + "markdownDescription": "Denies the set_closable command without any pre-configured scope." + }, + { + "description": "Denies the set_content_protected command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-content-protected", + "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_grab command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-grab", + "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-icon", + "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-position", + "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." + }, + { + "description": "Denies the set_cursor_visible command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-cursor-visible", + "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." + }, + { + "description": "Denies the set_decorations command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-decorations", + "markdownDescription": "Denies the set_decorations command without any pre-configured scope." + }, + { + "description": "Denies the set_effects command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-effects", + "markdownDescription": "Denies the set_effects command without any pre-configured scope." + }, + { + "description": "Denies the set_enabled command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-enabled", + "markdownDescription": "Denies the set_enabled command without any pre-configured scope." + }, + { + "description": "Denies the set_focus command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focus", + "markdownDescription": "Denies the set_focus command without any pre-configured scope." + }, + { + "description": "Denies the set_focusable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-focusable", + "markdownDescription": "Denies the set_focusable command without any pre-configured scope." + }, + { + "description": "Denies the set_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-fullscreen", + "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_fullscreen_on_monitor command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-fullscreen-on-monitor", + "markdownDescription": "Denies the set_fullscreen_on_monitor command without any pre-configured scope." + }, + { + "description": "Denies the set_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-icon", + "markdownDescription": "Denies the set_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-ignore-cursor-events", + "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." + }, + { + "description": "Denies the set_max_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-max-size", + "markdownDescription": "Denies the set_max_size command without any pre-configured scope." + }, + { + "description": "Denies the set_maximizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-maximizable", + "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." + }, + { + "description": "Denies the set_min_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-min-size", + "markdownDescription": "Denies the set_min_size command without any pre-configured scope." + }, + { + "description": "Denies the set_minimizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-minimizable", + "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." + }, + { + "description": "Denies the set_overlay_icon command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-overlay-icon", + "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." + }, + { + "description": "Denies the set_position command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-position", + "markdownDescription": "Denies the set_position command without any pre-configured scope." + }, + { + "description": "Denies the set_progress_bar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-progress-bar", + "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." + }, + { + "description": "Denies the set_resizable command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-resizable", + "markdownDescription": "Denies the set_resizable command without any pre-configured scope." + }, + { + "description": "Denies the set_shadow command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-shadow", + "markdownDescription": "Denies the set_shadow command without any pre-configured scope." + }, + { + "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-simple-fullscreen", + "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." + }, + { + "description": "Denies the set_size command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size", + "markdownDescription": "Denies the set_size command without any pre-configured scope." + }, + { + "description": "Denies the set_size_constraints command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-size-constraints", + "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." + }, + { + "description": "Denies the set_skip_taskbar command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-skip-taskbar", + "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." + }, + { + "description": "Denies the set_theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-theme", + "markdownDescription": "Denies the set_theme command without any pre-configured scope." + }, + { + "description": "Denies the set_title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title", + "markdownDescription": "Denies the set_title command without any pre-configured scope." + }, + { + "description": "Denies the set_title_bar_style command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-title-bar-style", + "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." + }, + { + "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-set-visible-on-all-workspaces", + "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." + }, + { + "description": "Denies the show command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-show", + "markdownDescription": "Denies the show command without any pre-configured scope." + }, + { + "description": "Denies the start_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-dragging", + "markdownDescription": "Denies the start_dragging command without any pre-configured scope." + }, + { + "description": "Denies the start_resize_dragging command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-start-resize-dragging", + "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." + }, + { + "description": "Denies the theme command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-theme", + "markdownDescription": "Denies the theme command without any pre-configured scope." + }, + { + "description": "Denies the title command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-title", + "markdownDescription": "Denies the title command without any pre-configured scope." + }, + { + "description": "Denies the toggle_maximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-toggle-maximize", + "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." + }, + { + "description": "Denies the unmaximize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unmaximize", + "markdownDescription": "Denies the unmaximize command without any pre-configured scope." + }, + { + "description": "Denies the unminimize command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-unminimize", + "markdownDescription": "Denies the unminimize command without any pre-configured scope." + } + ] + }, + "Value": { + "description": "All supported ACL values.", + "anyOf": [ + { + "description": "Represents a null JSON value.", + "type": "null" + }, + { + "description": "Represents a [`bool`].", + "type": "boolean" + }, + { + "description": "Represents a valid ACL [`Number`].", + "allOf": [ + { + "$ref": "#/definitions/Number" + } + ] + }, + { + "description": "Represents a [`String`].", + "type": "string" + }, + { + "description": "Represents a list of other [`Value`]s.", + "type": "array", + "items": { + "$ref": "#/definitions/Value" + } + }, + { + "description": "Represents a map of [`String`] keys to [`Value`]s.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Value" + } + } + ] + }, + "Number": { + "description": "A valid ACL number.", + "anyOf": [ + { + "description": "Represents an [`i64`].", + "type": "integer", + "format": "int64" + }, + { + "description": "Represents a [`f64`].", + "type": "number", + "format": "double" + } + ] + }, + "Target": { + "description": "Platform target.", + "oneOf": [ + { + "description": "MacOS.", + "type": "string", + "enum": [ + "macOS" + ] + }, + { + "description": "Windows.", + "type": "string", + "enum": [ + "windows" + ] + }, + { + "description": "Linux.", + "type": "string", + "enum": [ + "linux" + ] + }, + { + "description": "Android.", + "type": "string", + "enum": [ + "android" + ] + }, + { + "description": "iOS.", + "type": "string", + "enum": [ + "iOS" + ] + } + ] + } + } +} \ No newline at end of file diff --git a/harnesses/ttimg/icons/128x128.png b/harnesses/ttimg/icons/128x128.png new file mode 100644 index 0000000..b0aae3c Binary files /dev/null and b/harnesses/ttimg/icons/128x128.png differ diff --git a/harnesses/ttimg/icons/128x128@2x.png b/harnesses/ttimg/icons/128x128@2x.png new file mode 100644 index 0000000..6b193a1 Binary files /dev/null and b/harnesses/ttimg/icons/128x128@2x.png differ diff --git a/harnesses/ttimg/icons/32x32.png b/harnesses/ttimg/icons/32x32.png new file mode 100644 index 0000000..29f2677 Binary files /dev/null and b/harnesses/ttimg/icons/32x32.png differ diff --git a/harnesses/ttimg/icons/64x64.png b/harnesses/ttimg/icons/64x64.png new file mode 100644 index 0000000..d6b3b1f Binary files /dev/null and b/harnesses/ttimg/icons/64x64.png differ diff --git a/harnesses/ttimg/icons/Square107x107Logo.png b/harnesses/ttimg/icons/Square107x107Logo.png new file mode 100644 index 0000000..97ca18a Binary files /dev/null and b/harnesses/ttimg/icons/Square107x107Logo.png differ diff --git a/harnesses/ttimg/icons/Square142x142Logo.png b/harnesses/ttimg/icons/Square142x142Logo.png new file mode 100644 index 0000000..45e933c Binary files /dev/null and b/harnesses/ttimg/icons/Square142x142Logo.png differ diff --git a/harnesses/ttimg/icons/Square150x150Logo.png b/harnesses/ttimg/icons/Square150x150Logo.png new file mode 100644 index 0000000..569cb2f Binary files /dev/null and b/harnesses/ttimg/icons/Square150x150Logo.png differ diff --git a/harnesses/ttimg/icons/Square284x284Logo.png b/harnesses/ttimg/icons/Square284x284Logo.png new file mode 100644 index 0000000..e0dbf3b Binary files /dev/null and b/harnesses/ttimg/icons/Square284x284Logo.png differ diff --git a/harnesses/ttimg/icons/Square30x30Logo.png b/harnesses/ttimg/icons/Square30x30Logo.png new file mode 100644 index 0000000..2f01aa2 Binary files /dev/null and b/harnesses/ttimg/icons/Square30x30Logo.png differ diff --git a/harnesses/ttimg/icons/Square310x310Logo.png b/harnesses/ttimg/icons/Square310x310Logo.png new file mode 100644 index 0000000..70f8fe3 Binary files /dev/null and b/harnesses/ttimg/icons/Square310x310Logo.png differ diff --git a/harnesses/ttimg/icons/Square44x44Logo.png b/harnesses/ttimg/icons/Square44x44Logo.png new file mode 100644 index 0000000..c11a45f Binary files /dev/null and b/harnesses/ttimg/icons/Square44x44Logo.png differ diff --git a/harnesses/ttimg/icons/Square71x71Logo.png b/harnesses/ttimg/icons/Square71x71Logo.png new file mode 100644 index 0000000..8a688df Binary files /dev/null and b/harnesses/ttimg/icons/Square71x71Logo.png differ diff --git a/harnesses/ttimg/icons/Square89x89Logo.png b/harnesses/ttimg/icons/Square89x89Logo.png new file mode 100644 index 0000000..116b2dd Binary files /dev/null and b/harnesses/ttimg/icons/Square89x89Logo.png differ diff --git a/harnesses/ttimg/icons/StoreLogo.png b/harnesses/ttimg/icons/StoreLogo.png new file mode 100644 index 0000000..7c6845d Binary files /dev/null and b/harnesses/ttimg/icons/StoreLogo.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/harnesses/ttimg/icons/android/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..2ffbf24 --- /dev/null +++ b/harnesses/ttimg/icons/android/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/harnesses/ttimg/icons/android/mipmap-hdpi/ic_launcher.png b/harnesses/ttimg/icons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..3565539 Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-hdpi/ic_launcher.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/harnesses/ttimg/icons/android/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..a67fddf Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-hdpi/ic_launcher_round.png b/harnesses/ttimg/icons/android/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..61469b6 Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-hdpi/ic_launcher_round.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-mdpi/ic_launcher.png b/harnesses/ttimg/icons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..3e7bb90 Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-mdpi/ic_launcher.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/harnesses/ttimg/icons/android/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..0a7835c Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-mdpi/ic_launcher_round.png b/harnesses/ttimg/icons/android/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..2516401 Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-mdpi/ic_launcher_round.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-xhdpi/ic_launcher.png b/harnesses/ttimg/icons/android/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..de8fd2f Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-xhdpi/ic_launcher.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/harnesses/ttimg/icons/android/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..d95ab6c Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-xhdpi/ic_launcher_round.png b/harnesses/ttimg/icons/android/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..78e7dc4 Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-xxhdpi/ic_launcher.png b/harnesses/ttimg/icons/android/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..3c610bd Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-xxhdpi/ic_launcher.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/harnesses/ttimg/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..67d45b1 Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/harnesses/ttimg/icons/android/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..5a72997 Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-xxxhdpi/ic_launcher.png b/harnesses/ttimg/icons/android/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..08d0e59 Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/harnesses/ttimg/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..5186b10 Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/harnesses/ttimg/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/harnesses/ttimg/icons/android/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..92be653 Binary files /dev/null and b/harnesses/ttimg/icons/android/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/harnesses/ttimg/icons/android/values/ic_launcher_background.xml b/harnesses/ttimg/icons/android/values/ic_launcher_background.xml new file mode 100644 index 0000000..16cdd5a --- /dev/null +++ b/harnesses/ttimg/icons/android/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/harnesses/ttimg/icons/icon.icns b/harnesses/ttimg/icons/icon.icns new file mode 100644 index 0000000..8526c17 Binary files /dev/null and b/harnesses/ttimg/icons/icon.icns differ diff --git a/harnesses/ttimg/icons/icon.ico b/harnesses/ttimg/icons/icon.ico new file mode 100644 index 0000000..29e9149 Binary files /dev/null and b/harnesses/ttimg/icons/icon.ico differ diff --git a/harnesses/ttimg/icons/icon.png b/harnesses/ttimg/icons/icon.png new file mode 100644 index 0000000..5cfd7e6 Binary files /dev/null and b/harnesses/ttimg/icons/icon.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-20x20@1x.png b/harnesses/ttimg/icons/ios/AppIcon-20x20@1x.png new file mode 100644 index 0000000..7d825ac Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-20x20@1x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-20x20@2x-1.png b/harnesses/ttimg/icons/ios/AppIcon-20x20@2x-1.png new file mode 100644 index 0000000..bfdd5d8 Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-20x20@2x-1.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-20x20@2x.png b/harnesses/ttimg/icons/ios/AppIcon-20x20@2x.png new file mode 100644 index 0000000..bfdd5d8 Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-20x20@2x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-20x20@3x.png b/harnesses/ttimg/icons/ios/AppIcon-20x20@3x.png new file mode 100644 index 0000000..ce2783f Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-20x20@3x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-29x29@1x.png b/harnesses/ttimg/icons/ios/AppIcon-29x29@1x.png new file mode 100644 index 0000000..f6faebf Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-29x29@1x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-29x29@2x-1.png b/harnesses/ttimg/icons/ios/AppIcon-29x29@2x-1.png new file mode 100644 index 0000000..c9f2b12 Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-29x29@2x-1.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-29x29@2x.png b/harnesses/ttimg/icons/ios/AppIcon-29x29@2x.png new file mode 100644 index 0000000..c9f2b12 Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-29x29@2x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-29x29@3x.png b/harnesses/ttimg/icons/ios/AppIcon-29x29@3x.png new file mode 100644 index 0000000..4759be0 Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-29x29@3x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-40x40@1x.png b/harnesses/ttimg/icons/ios/AppIcon-40x40@1x.png new file mode 100644 index 0000000..bfdd5d8 Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-40x40@1x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-40x40@2x-1.png b/harnesses/ttimg/icons/ios/AppIcon-40x40@2x-1.png new file mode 100644 index 0000000..b3952b4 Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-40x40@2x-1.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-40x40@2x.png b/harnesses/ttimg/icons/ios/AppIcon-40x40@2x.png new file mode 100644 index 0000000..b3952b4 Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-40x40@2x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-40x40@3x.png b/harnesses/ttimg/icons/ios/AppIcon-40x40@3x.png new file mode 100644 index 0000000..54ff85b Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-40x40@3x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-512@2x.png b/harnesses/ttimg/icons/ios/AppIcon-512@2x.png new file mode 100644 index 0000000..2a706ad Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-512@2x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-60x60@2x.png b/harnesses/ttimg/icons/ios/AppIcon-60x60@2x.png new file mode 100644 index 0000000..54ff85b Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-60x60@2x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-60x60@3x.png b/harnesses/ttimg/icons/ios/AppIcon-60x60@3x.png new file mode 100644 index 0000000..4acaafa Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-60x60@3x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-76x76@1x.png b/harnesses/ttimg/icons/ios/AppIcon-76x76@1x.png new file mode 100644 index 0000000..627ff6e Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-76x76@1x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-76x76@2x.png b/harnesses/ttimg/icons/ios/AppIcon-76x76@2x.png new file mode 100644 index 0000000..907df45 Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-76x76@2x.png differ diff --git a/harnesses/ttimg/icons/ios/AppIcon-83.5x83.5@2x.png b/harnesses/ttimg/icons/ios/AppIcon-83.5x83.5@2x.png new file mode 100644 index 0000000..b84968c Binary files /dev/null and b/harnesses/ttimg/icons/ios/AppIcon-83.5x83.5@2x.png differ diff --git a/harnesses/ttimg/scripts/build.sh b/harnesses/ttimg/scripts/build.sh new file mode 100755 index 0000000..7205f09 --- /dev/null +++ b/harnesses/ttimg/scripts/build.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +# ttimg build: Tauri v2 scroll-jank testbed (sltest port). +# +# ./scripts/build.sh # aarch64 (phone) +# ./scripts/build.sh x86_64 # emulator +# ADB_SERIAL= ./scripts/build.sh # install target +# +# Output: /tmp/ttimg/-release.apk (signed with the debug keystore). +set -euo pipefail +cd "$(dirname "$0")/.." + +ABI="${1:-aarch64}" +case "$ABI" in + aarch64|x86_64|armv7|i686) ;; + *) echo "unknown ABI: $ABI" >&2; exit 2 ;; +esac + +export ANDROID_HOME="${ANDROID_HOME:-$HOME/android-sdk}" +export ANDROID_SDK_ROOT="$ANDROID_HOME" + +cargo tauri android build --target "$ABI" + +SRC=gen/android/app/build/outputs/apk/universal/release/app-universal-release-unsigned.apk +[ -f "$SRC" ] || { echo "APK not found at $SRC" >&2; exit 1; } + +OUT=/tmp/ttimg +mkdir -p "$OUT" +cp "$SRC" "$OUT/ttimg-$ABI-unsigned.apk" + +KEYSTORE="${KEYSTORE:-$HOME/.android/debug.keystore}" +APKSIGNER="$ANDROID_HOME/build-tools/35.0.0/apksigner" +"$APKSIGNER" sign --ks "$KEYSTORE" --ks-key-alias androiddebugkey \ + --ks-pass pass:android --key-pass pass:android \ + --out "$OUT/ttimg-$ABI-release.apk" "$OUT/ttimg-$ABI-unsigned.apk" +echo "APK: $OUT/ttimg-$ABI-release.apk ($(du -h "$OUT/ttimg-$ABI-release.apk" | cut -f1))" + +if [ -n "${ADB_SERIAL:-}" ]; then + adb -s "$ADB_SERIAL" install -r "$OUT/ttimg-$ABI-release.apk" + adb -s "$ADB_SERIAL" shell am force-stop wow.gmp.ttimg + adb -s "$ADB_SERIAL" shell am start -n wow.gmp.ttimg/.MainActivity +fi diff --git a/harnesses/ttimg/scripts/cargo-shim b/harnesses/ttimg/scripts/cargo-shim new file mode 100755 index 0000000..5c2006a --- /dev/null +++ b/harnesses/ttimg/scripts/cargo-shim @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +# cargo shim: intercept `cargo tauri android android-studio-script` (the +# hidden subcommand the tauri gradle plugin's rustBuild task runs) and +# reproduce its effect with a PLAIN cargo build. +# +# Why: the cargo-tauri CLI (every subcommand that builds a Rust interface) +# starts an inotify debouncer on Cargo.toml. This host's per-user inotify +# WATCH quota (65536) is exhausted by the user's standalone syncthing +# (65,482 watches), so inotify_add_watch → ENOSPC and the CLI dies before +# doing anything. Plain cargo build uses no inotify. +# +# android-studio-script's output (verified on the tttest build): the lib .so +# placed at gen/android/app/src/main/jniLibs//lib.so. +set -euo pipefail + +REAL_CARGO="$HOME/.cargo/bin/cargo" +PROJ=/mnt/Backup/prog/android/gallery/harnesses/ttimg +NDK="$HOME/android-sdk/ndk/27.0.12077973" + +if [ "${1:-}" = "tauri" ] && [ "${2:-}" = "android" ] && [ "${3:-}" = "android-studio-script" ]; then + shift 3 + release="" ; target="x86_64" + while [ $# -gt 0 ]; do + case "$1" in + --release) release=1 ;; + --target) shift; target="${1:-x86_64}" ;; + esac + shift + done + + case "$target" in + x86_64) TRIPLE=x86_64-linux-android; ABI_DIR=x86_64; CLANG=x86_64-linux-android24-clang ;; + aarch64) TRIPLE=aarch64-linux-android; ABI_DIR=arm64-v8a; CLANG=aarch64-linux-android24-clang ;; + armv7) TRIPLE=armv7-linux-androideabi; ABI_DIR=armeabi-v7a; CLANG=armv7a-linux-androideabi24-clang ;; + i686) TRIPLE=i686-linux-android; ABI_DIR=x86; CLANG=i686-linux-android24-clang ;; + *) echo "shim: unknown target $target" >&2; exit 1 ;; + esac + prof="debug"; [ -n "$release" ] && prof="release" + + echo "ttimg shim: cargo build $TRIPLE $prof (bypassing cargo-tauri)" + # env var names are CARGO_TARGET__... with HYPHENS → UNDERSCORES + UPPER=$(echo "$TRIPLE" | tr 'a-z-' 'A-Z_') + env \ + "CARGO_TARGET_${UPPER}_LINKER=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/$CLANG" \ + "CARGO_TARGET_${UPPER}_RUSTFLAGS=-Clink-arg=-landroid -Clink-arg=-llog -Clink-arg=-lOpenSLES" \ + "$REAL_CARGO" build --package ttimg --manifest-path "$PROJ/Cargo.toml" \ + --target "$TRIPLE" --features "tauri/custom-protocol" --lib --"$prof" + + SO="$PROJ/target/$TRIPLE/$prof/libttimg_lib.so" + [ -f "$SO" ] || { echo "shim: $SO not produced" >&2; exit 1; } + DEST="$PROJ/gen/android/app/src/main/jniLibs/$ABI_DIR/libttimg_lib.so" + mkdir -p "$(dirname "$DEST")" + # /mnt/Backup's stat identity is unreliable here (cp still reports + # "same file"), so just break any link and copy fresh: + rm -f "$DEST" + cp "$SO" "$DEST" + echo "ttimg shim: .so -> jniLibs/$ABI_DIR" + exit 0 +fi + +exec "$REAL_CARGO" "$@" diff --git a/harnesses/ttimg/src/lib.rs b/harnesses/ttimg/src/lib.rs new file mode 100644 index 0000000..31384c3 --- /dev/null +++ b/harnesses/ttimg/src/lib.rs @@ -0,0 +1,154 @@ +//! ttimg — Tauri v2 port of sltest (the scroll-jank testbed). +//! +//! Scene (mirrors sltest exactly): 8580 full-width colored rows +//! (150 px tall + 2 px white divider, alternating blue/maroon), custom +//! touch drag + exponential-decay fling in the RENDERER (JS), virtualized +//! to a ~24-element pool. No Tauri widgets at all — the Tauri/WebView +//! stack is the subject, not the UI framework. +//! +//! FR logging: the JS `requestAnimationFrame` loop measures per-frame gap +//! and work, and batches the lines to Rust via a command invoke once a +//! second. Rust writes them (non-blocking drain thread) to +//! /sdcard/Android/data/wow.gmp.ttimg/files/fr.log — the SAME file +//! tools/fr_capture.py pulls (its `--manual` mode then judges the +//! user's finger on this stack, same as sltest/egtest). +//! +//! Why this is an honest measurement: every frame of a Tauri mobile app +//! is produced by the system WebView (Chromium) compositor — our Rust +//! thread does NOT drive frames. The rAF timestamps are the Chromium +//! render thread's; the gap distribution IS the app's frame +//! distribution. If WebView caps below the panel rate on this device, +//! that shows up directly as a 16.7 ms median. + +#![cfg_attr(not(test), warn(unused_crate_dependencies))] + +use std::io::Write as _; +use std::sync::mpsc; +use std::sync::Mutex; +use std::time::Duration; + +use tauri::Listener as _; +use tauri::Manager as _; + +/// FR log path: Tauri's `document_dir()` on Android = +/// getExternalFilesDir(DIRECTORY_DOCUMENTS) = +/// /sdcard/Android/data/wow.gmp.ttimg/files/Documents — framework-created +/// (a raw std::fs mkdir of the app's external tree is SELinux-denied on +/// Android 11+), writable without permissions, and `adb pull`-able. +static FR_PATH: Mutex> = Mutex::new(None); + +static FR_TX: Mutex>> = Mutex::new(None); + +pub fn init_logcat() { + use std::sync::atomic::AtomicU64; + use log::{Level, LevelFilter, Log, Metadata, Record}; + extern "C" { + fn __android_log_write(prio: i32, tag: *const u8, msg: *const u8) -> i32; + } + static DROPPED: AtomicU64 = AtomicU64::new(0); + struct Cat; + impl Log for Cat { + fn enabled(&self, m: &Metadata) -> bool { m.level() <= Level::Info } + fn log(&self, record: &Record) { + if !self.enabled(record.metadata()) { + return; + } + // ANDROID_LOG_*: VERBOSE=2 DEBUG=3 INFO=4 WARN=5 ERROR=6 + let prio = match record.level() { + Level::Error => 6, + Level::Warn => 5, + Level::Info => 4, + _ => 3, + }; + let mut s = format!("{}\0", record.args()); + unsafe { + __android_log_write(prio, b"ttimg\0".as_ptr(), s.as_ptr()); + } + let _ = DROPPED; + } + fn flush(&self) {} + } + let _ = log::set_boxed_logger(Box::new(Cat)) + .map(|()| log::set_max_level(LevelFilter::Info)); +} + +pub fn init_fr_logger(path: &std::path::Path) { + let path = path.join("fr.log"); + let f = match std::fs::OpenOptions::new().create(true).append(true).open(&path) { + Ok(f) => f, + Err(e) => { + log::error!("cannot open {:?}: {e}", path); + return; + } + }; + *FR_PATH.lock().unwrap() = Some(path.display().to_string()); + log::info!("FR log → {:?}", path); + let (tx, rx) = mpsc::channel::(); + std::thread::Builder::new() + .name("ttimg-fr".into()) + .spawn(move || { + let mut buf = std::io::BufWriter::with_capacity(1 << 16, f); + let mut n = 0u32; + for chunk in rx { + let _ = buf.write_all(chunk.as_bytes()); + n += 1; + if n >= 64 { + let _ = buf.flush(); + n = 0; + } + } + let _ = buf.flush(); + }) + .ok(); + *FR_TX.lock().unwrap() = Some(tx); +} + +/// The webview emits `ttimg-fr` (one batch of pre-formatted FR lines) and +/// `ttimg-log` (lifecycle strings) at ~1 Hz — the event plugin is in +/// `core:default`, so no custom ACL permission is needed (app-command +/// permissions are generated in two passes and break first builds). +pub fn run() { + #[cfg(target_os = "android")] + init_logcat(); + + tauri::Builder::default() + .setup(|app| { + // Android: the framework-created external files dir (see + // FR_PATH docs) — calling the resolver is what CREATES it. + #[cfg(target_os = "android")] + { + match app.path().document_dir() { + Ok(dir) => init_fr_logger(&dir), + Err(e) => log::error!("document_dir: {e}"), + } + } + log::info!( + "setup (mobile={} webview ready)", + cfg!(target_os = "android") + ); + let _ = app.listen("ttimg-fr", |event| { + // payload is the JSON text of the emitted string. + if let Ok(s) = serde_json::from_str::(event.payload()) { + if let Some(tx) = FR_TX.lock().unwrap().as_ref() { + let _ = tx.send(s); + } + } + }); + let _ = app.listen("ttimg-log", |event| { + if let Ok(s) = serde_json::from_str::(event.payload()) { + log::info!("ttimg: {s}"); + } + }); + Ok(()) + }) + .run(tauri::generate_context!()) + .expect("ttimg: tauri run failed"); +} + +/// Tauri v2 mobile entry point (the CLI-generated Android activity calls +/// this via the cdylib). +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn mobile_main() { + let _ = Duration::from_secs(0); + run(); +} diff --git a/harnesses/ttimg/tauri.conf.json b/harnesses/ttimg/tauri.conf.json new file mode 100644 index 0000000..7a450f9 --- /dev/null +++ b/harnesses/ttimg/tauri.conf.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://schema.tauri.app/config/2", + "productName": "ttimg", + "version": "0.1.0", + "identifier": "wow.gmp.ttimg", + "build": { + "beforeDevCommand": "", + "devUrl": "http://localhost", + "beforeBuildCommand": "", + "frontendDist": "frontend/dist" + }, + "app": { + "withGlobalTauri": true, + "windows": [ + { + "label": "main", + "title": "ttimg", + "width": 800, + "height": 600, + "fullscreen": true, + "decorations": false + } + ], + "security": { + "csp": null + } + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ] + } +} \ No newline at end of file