/* ============================================================
   HNK Photoshop Ai Panel (Students) V1 — main.js
   HNK Studio · Myanmar · Gemini API (v1beta)
   UXP-SAFE: no localStorage, no element.dataset, no textarea,
   guarded window.*, flexbox-only CSS, native textarea prompt (runtime capacity self-test).
   ============================================================ */
"use strict";

const ps = require("photoshop");
const app = ps.app;
const psCore = ps.core;
const imaging = ps.imaging;
const batchPlay = ps.action.batchPlay;
const constants = ps.constants;
const uxp = require("uxp");
const fsp = uxp.storage.localFileSystem;
const formats = uxp.storage.formats;
const shell = (uxp && uxp.shell) ? uxp.shell : null; /* openPath (folder in Finder/Explorer); may be null on old hosts */

/* ---------------- Constants ---------------- */
const API_BASE = "https://generativelanguage.googleapis.com/v1beta";
const MODEL_FLASH_IMG = "gemini-2.5-flash-image";      // 1K fast
const MODEL_PRO_IMG = "gemini-3-pro-image-preview";    // 1K/2K/4K quality
const MODEL_TEXT = "gemini-2.5-flash";                 // prompt improve
const MAX_PROMPT = 20000;
const SETTINGS_FILE = "hnk_students_settings.json";
const RATIOS = [
  { id: "1:1", v: 1 }, { id: "4:5", v: 0.8 }, { id: "5:4", v: 1.25 },
  { id: "3:4", v: 0.75 }, { id: "4:3", v: 4 / 3 }, { id: "2:3", v: 2 / 3 },
  { id: "3:2", v: 1.5 }, { id: "9:16", v: 9 / 16 }, { id: "16:9", v: 16 / 9 },
  { id: "21:9", v: 21 / 9 }
];

/* ---------------- Logger (in-memory ring buffer + console mirror) ----------------
   Every caught error, warning and diagnostic funnels through hlog/hwarn/herr, so
   the panel can show a live log and the student can copy it for a bug report. The
   buffer is capped so a long session never grows without bound. */
const HNK_LOG = [];
const LOG_CAP = 200;
function pushLog(level, argv) {
  let msg = "";
  try {
    msg = Array.prototype.map.call(argv, function (a) {
      if (a instanceof Error) return (a.message || String(a));
      if (a && typeof a === "object") { try { return JSON.stringify(a); } catch (e) { return String(a); } }
      return String(a);
    }).join(" ");
  } catch (e) { msg = String(argv); }
  let ts = "";
  try { ts = new Date().toISOString().slice(11, 19); } catch (e) { ts = ""; }
  HNK_LOG.push({ ts: ts, level: level, msg: msg });
  if (HNK_LOG.length > LOG_CAP) HNK_LOG.splice(0, HNK_LOG.length - LOG_CAP);
  try {
    if (typeof console !== "undefined") {
      if (level === "ERR" && console.error) console.error("[HNK]", msg);
      else if (level === "WARN" && console.warn) console.warn("[HNK]", msg);
      else if (console.log) console.log("[HNK]", msg);
    }
  } catch (e) { }
  try { if (typeof renderLog === "function") renderLog(); } catch (e) { }
  return msg;
}
function hlog() { return pushLog("INFO", arguments); }
function hwarn() { return pushLog("WARN", arguments); }
function herr() { return pushLog("ERR", arguments); }
function logText() {
  if (!HNK_LOG.length) return "(log is empty)";
  return HNK_LOG.map(function (e) { return "[" + e.ts + "] " + e.level + "  " + e.msg; }).join("\n");
}

/* ---------------- State ---------------- */
const state = {
  /* v6.22.0 account gate. Only the refresh token is kept -- the access
     token is short-lived and re-minted every launch. accProfile/accSeenAt
     are what the offline grace window reads. */
  accRefresh: "", accUid: "", accEmail: "", accProfile: null,
  accSeenAt: 0, accDevId: "",
  apiKey: "", lang: "my", theme: "dark", model: "auto", size: "1K", ratio: "auto",
  autoRun: true, autoPlace: true, intensity: 60,
  refs: [null, null],
  beforeB64: null, beforeMime: "image/jpeg",
  resultB64: null, resultMime: "image/png",
  busy: false, keyShown: false, previewRatio: 0.75, urlSlot: -1,
  rt: null, sections: {}, promptCap: MAX_PROMPT, page: "prompt", lastPreset: null,
  clean: { people: false, hands: false, legs: false, full: false },
  keep: { frame: true, pose: true, face: true, expr: false, hair: false, dress: false, skin: false, light: false, color: false, bg: false, subject: false },
  rmix: { bg: false, fg: false, light: false, color: false, object: false },
  i2p: { objects: true, light: true, color: true, bg: true, fg: true, fit: true, adapt: true },
  lights: null, lightSel: 0, lightEquip: false,
  chains: { prewedding: false, pageant: false, model: false, glass: false, commercial: false, korea: false, vietnam: false, chinese: false },
  restMode: "color", myCache: null, pendingBtn: null, busyBtnEl: null, busyBtnTxt: null,
  history: [],
  recentPrompts: [], histSel: -1, lastAction: "Prompt",
  provider: "gemini", oaiKey: "", oaiModel: "gpt-image-2", oaiQuality: "auto",
  cRatio: "1:1", cVariations: 1, cGallery: [], cSel: 0, cUrlSlot: -1,
  cRefs: [null, null, null, null], cResultB64: null, cMime: "image/png", cBeforeB64: null,
  genCount: 0, batch: false, batchStop: false, lastUserText: "", lastFinalPrompt: "",
  webUrl: null, webNudged: false,
  liveTrans: true, enCache: null, transTimer: null, fillingEn: false, fillingMy: false,
  realOn: true, realDir: "auto", banText: true,
  camOn: false, camBody: null, camMm: null, camF: null, camFilm: null, camBokeh: null,
  camIso: 100, camIsoOn: false, camK: 5600, camKOn: false,
  refTarget: "solo", refMkOn: true, refHairOn: false,
  bgKeepFrame: true, bgKeepSubLight: false,
  bdayAge: 18, capOn: false, capText: "", capPos: "bottom", scarfDir: "right", scarfLen: "long",
  match: { color: true, light: true, makeup: true, skin: true },
  pipeline: [], pipeRunning: false, pipeMerge: false,
  wedTrail: "trailBlush", wedVeil: 2, wedGown: 3, wedPetal: "petGentle", wedExtra: "horse1",
  autoSave: false, saveDirH: null, sessionLog: "", _proFellBack: false,
  learnMode: true, armedKey: null, armedEl: null, armTimer: null, armStage: 0,
  /* Reference Image Library (user-selected folder + persistent token) */
  libToken: "", libFolderName: "", libNativePath: "", libImgCount: 0, libLastScan: 0,
  refTokens: {} /* stable-slot-id -> persistent file token */
};
const REFRESHERS = [];

/* ---------------- i18n (Myanmar + English, full parity) ---------------- */
/*I18N_START*/
const I18N = {
  /* ---- English (en) — 587 keys, complete ---- */
  en: {
    gate_sub_login: "Sign in with your HNK account to use this panel.",
    gate_email_ph: "Email",
    gate_pass_ph: "Password",
    gate_signin: "Log in",
    gate_checking: "Checking your plan…",
    gate_need: "Enter your email and password.",
    gate_bad: "Wrong email or password.",
    gate_offline: "No internet — your plan could not be checked. Connect, then press Check again.",
    gate_locked: "One payment covers both — the joining fee and the monthly fee open the web app AND this Photoshop panel. Buy or renew on the website, then press Check again.",
    gate_buy: "Open the website",
    gate_retry: "Check again",
    gate_signout: "Sign out",
    gate_days: "{D} days left",
    gate_grace: "Offline — {D} days of offline use left",
    gate_open_fail: "Could not open the browser. Address: {U}",
    app_title: "HNK Photoshop Ai Panel (Students)",
    sec_api: "Gemini API Key",
    btn_show: "Show",
    btn_hide: "Hide",
    btn_test: "Test Key",
    btn_save: "Save",
    st_testing: "Testing key",
    st_key_ok: "\u2713 API key is working",
    st_key_bad: "API key failed",
    st_key_saved: "API key saved \u2713",
    st_need_key: "Enter your Gemini API key first",
    sec_model: "Model & Output",
    scope_model_note: "Used by the Prompt tab's Generate button below \u2014 Create and AI Tools each have their own separate model settings.",
    model_auto: "Auto (recommended)",
    model_flash: "Flash \u2014 fast (2.5)",
    model_pro: "Pro \u2014 quality (3.0)",
    lbl_ratio: "Ratio",
    ratio_auto: "Auto ratio (from document)",
    lbl_size: "Size",
    lbl_quality: "Quality",
    qual_auto: "Auto",
    qual_low: "Low",
    qual_med: "Medium",
    qual_high: "High",
    sec_prompt: "Prompt",
    hint_prompt: "Type your prompt here\u2026 (max 20,000 characters)",
    btn_improve: "Improve Prompt",
    btn_clear: "Clear",
    st_improving: "Improving prompt",
    st_improved: "Prompt improved \u2713",
    sec_refs: "Reference Images (2 slots)",
    base_note: "Base image = your active Photoshop document (captured automatically).",
    btn_ref_layer: "+ Layer",
    btn_ref_file: "File",
    btn_ref_web: "Web",
    st_ref_layer_added: "Layer added as reference \u2713",
    st_ref_file_added: "File added as reference \u2713",
    st_importing: "Importing file",
    url_title: "Reference from URL \u2014 Chrome / Pinterest",
    url_ph: "https://\u2026 image address or Pinterest pin link",
    btn_paste: "Paste",
    btn_load: "Load",
    btn_cancel: "Cancel",
    st_url_loading: "Downloading web image",
    st_ref_web_added: "Web image added as reference \u2713",
    st_url_bad: "Could not load an image from this URL \u2014 copy the image address and try again",
    no_layer: "No layer selected",
    sec_presets: "AI Presets",
    auto_run: "Preset click \u2192 Auto Generate (OFF = insert into prompt only)",
    grp_cleanup: "Cleanup Tools",
    p_remove_people: "Remove People",
    p_fix_hands: "Fix Extra Hands",
    p_fix_legs: "Fix Extra Legs",
    p_full_clean: "Full Cleanup",
    grp_moved_note: "Reference tools now live in the Reference Ops Pro card below (one place, with Solo/Couple/Family + guides).",
    ro_h_detail: "Hair \u00b7 Accessories \u00b7 Pose (\u2190 Ref1)",
    ro_h_comp: "Composite \u00b7 Style \u00b7 Text (\u2190 Ref1)",
    p_fgbglc: "FG=Doc \u00b7 BG=Ref1 \u00b7 Light=Ref2",
    p_hair: "Hairstyle (\u2190 Ref1)",
    p_access: "Jewelry+Accessories (\u2190 Ref1)",
    p_pose: "Pose Match (Doc \u2192 Ref1)",
    p_fgprops: "FG Props (\u2190 Ref1)",
    p_textlogo: "Text / Logo (\u2190 Ref1)",
    p_style: "Photo Style (\u2190 Ref1)",
    grp_repsubj: "Replace Subject (Doc \u2192 Ref1 scene)",
    p_rep_solo: "Replace Solo",
    p_rep_couple: "Replace Couple",
    p_rep_family: "Replace Family",
    grp_rmix: "Replace Mix \u2014 tick & take from Ref1",
    rm_bg: "Background (BG)",
    rm_fg: "Foreground (FG)",
    rm_light: "Lighting",
    rm_color: "Colour",
    rm_object: "Objects / Props",
    btn_rmix: "REPLACE GENERATE",
    rm_none: "Tick at least one aspect first",
    grp_i2p: "Image \u2192 Prompt (Scene Builder)",
    i2p_note: "1) Extract: Ref1 scene \u2192 detailed text prompt (people excluded). 2) Edit it on the Prompt page. 3) SCENE GENERATE builds it around your document subject \u2014 auto-fitted to any angle. Face/Pose/Frame locks = Keep Original.",
    i2p_objects: "Objects & Props detail",
    i2p_light: "Lighting detail",
    i2p_color: "Color / Grade detail",
    i2p_bg: "Background detail",
    i2p_fg: "Foreground detail",
    btn_i2p: "Image \u2192 Prompt (Extract Scene)",
    i2p_fit: "Scene Auto-Fit \u2014 re-project scene to the document's angle / distance / lens",
    i2p_adapt: "Adapt subject light & color to the scene",
    btn_scenegen: "SCENE GENERATE",
    st_extract: "Extracting scene into a prompt",
    st_extract_done: "Scene prompt ready \u2014 review it on the Prompt page",
    scene_no_prompt: "Prompt box is empty \u2014 run Image \u2192 Prompt first",
    i2p_none: "Tick at least one detail aspect first",
    sec_light: "Studio Lighting \u2014 AI Relight",
    light_note: "Tick lights ON, tap a row to select it, shape it with the sliders \u2014 the 3D top-view diagram follows live (\u25b4 = high, \u25be = low). LIGHTING GENERATE relights your document exactly to this setup; face / pose / frame stay locked.",
    lbl_my_prompt: "MYANMAR PROMPT",
    lstage_model: "MODEL",
    lstage_cam: "CAM",
    l_key: "Key Light",
    l_fill: "Fill / Front",
    l_butterfly: "Butterfly (top-front)",
    l_side: "Side Light",
    l_rim: "Rim Light",
    l_back: "Back Light",
    l_hair: "Hair Light",
    l_bglight: "Background Light",
    lt_softbox: "Softbox",
    lt_octa: "Octa",
    lt_strip: "Strip",
    lt_umbrella: "Umbrella",
    lt_beauty: "Beauty",
    lt_hard: "Hard",
    li_int: "Intensity",
    li_angle: "Angle",
    li_height: "Height",
    li_dist: "Distance",
    li_size: "Size",
    btn_lightgen: "LIGHTING GENERATE",
    light_none: "Turn ON at least one light first",
    lg_equip: "Show light equipment in the photo (softbox / stands visible)",
    grp_chains: "Style Chains \u2014 combine \u2713 styles",
    chains_note: "Turn ON any styles \u2014 they blend into EVERY Generate / preset / Retouch together.",
    grp_restore: "Old Photo Restore",
    p_restore: "Old Photo Restore",
    rest_color: "Full Color",
    rest_bw: "Black & White",
    restore_note: "Repairs tears, water / burn damage, fading \u2014 keeps every original face 100% identical.",
    rt_browstyle: "Brow Style",
    rt_lashstyle: "Lash Style",
    rt_blush: "Blush Color",
    rt_contour: "Contour Style",
    rt_bust: "Bust",
    rt_butt: "Glutes",
    rt_thigh: "Thighs",
    rt_calf: "Calves",
    rt_neck: "Neck",
    rt_fingers: "Fingers",
    hint_prompt_my: "\u1019\u103c\u1014\u103a\u1019\u102c\u101c\u102d\u102f \u101b\u1031\u1038\u1015\u102b \u2014 Generate \u1019\u103e\u102c English \u1021\u101c\u102d\u102f\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u1015\u1031\u1038\u1019\u101a\u103a (\u1021\u1019\u103b\u102c\u1038\u1006\u102f\u1036\u1038 20,000)",
    st_translate: "Translating Myanmar prompt to English",
    live_trans: "Live \u21c4 auto-translate (EN \u2194 MY, after you pause typing)",
    st_retry: "Retrying",
    grp_recipes: "Recipes \u2014 save / share settings",
    recipe_note: "Save EVERYTHING (chains, retouch, lights, keeps, prompts) as one .json recipe \u2014 students just Load it.",
    btn_recipe_save: "Save Recipe",
    btn_recipe_load: "Load Recipe",
    st_recipe_saved: "Recipe saved \u2713",
    st_recipe_loaded: "Recipe loaded \u2713 \u2014 all controls updated",
    st_recipe_bad: "Not a HNK recipe file",
    sec_final: "Final Prompt (sent to AI)",
    btn_copy: "Copy",
    st_copied: "Copied \u2713",
    hist_note: "History \u2014 last 6 results, tap to view:",
    btn_hist_prompt: "\u2192 Prompt",
    sec_batch: "Batch Mode",
    batch_note: "Pick multiple photos + an output folder \u2014 the current prompt, chains, cleanup and Keep locks run on every photo; results save as *_HNK.png.",
    btn_batch: "RUN BATCH",
    btn_batch_stop: "Stop",
    st_batch: "Batch",
    st_batch_done: "Batch done",
    sec_web: "Web AI \u2014 Mini Browser",
    web_note: "Open any web AI editor inside Photoshop. Generate there, then bring the result in as a layer:",
    web_import_note: "Import: \u2460 in the web app use Copy image address, then IMPORT COPIED LINK \u00b7 \u2461 or download the file and use IMPORT FILE \u00b7 \u2462 partner web apps with the HNK bridge send images in automatically.",
    btn_web_go: "Go",
    btn_web_home: "Home",
    btn_web_reload: "Reload",
    btn_web_import_link: "IMPORT COPIED LINK \u2192 PS",
    btn_web_import_file: "IMPORT FILE \u2192 PS",
    st_web_import: "Imported to Photoshop as a layer \u2713",
    st_web_nourl: "Copy an image link first (right-click \u2192 Copy image address)",
    st_web_fetch: "Fetching image from link",
    st_web_notallowed: "This domain is not in the allow-list \u2014 it may stay blank. Ask HNK to add it.",
    st_need_doc: "Open a photo document in Photoshop first",
    sec_campro: "Camera Pro & Quality",
    autosave_lbl: "Auto-Export every result (PNG + prompt log \u2192 folder)",
    st_folder_ok: "Export folder set \u2713",
    st_exported: "Exported \u2713",
    st_export_fail: "Export failed \u2014 check the folder",
    st_pro_fallback: "Pro model unavailable \u2014 switched to Flash for this run",
    st_img_bad: "Image data failed the integrity check \u2014 re-add the photo",
    st_auto_comp: "Auto Composite: IMAGE 1 subject \u2192 reference scene",
    prov_lbl: "AI Provider",
    oai_key_ph: "sk-... (OpenAI API key)",
    tab_create: "Create",
    create_note: "CREATE MODE \u2014 brand-new image from your prompt (+ its own 4 refs). Fully standalone: never reads the document, presets, chains or locks.",
    create_ph: "Describe the image you want to create\u2026",
    btn_create_ps: "\u2b07 Send to Photoshop",
    btn_to_ref: "\u21ba Use as Ref 1",
    st_to_ref: "Result loaded into Ref 1 \u2713",
    scope_create_note: "Independent of Setup's Model & Output \u2014 these settings apply only to Create's Generate.",
    cr_ratio: "Ratio",
    cr_var: "Variations",
    cr_restyle: "\u267b Restyle result",
    cr_lib: "Prompt Library \u2014 tap to insert",
    cr_improve: "\u2728 Improve",
    cr_describe: "\ud83d\udd0d Describe Ref 1 \u2192 Prompt",
    st_describing: "Reading the reference\u2026",
    st_described: "Prompt written from Ref 1 \u2713",
    st_need_gem: "Add a Gemini API key (Setup) \u2014 this uses Gemini text",
    st_need_ref1: "Add an image to Ref 1 first",
    st_lib_added: "Prompt added \u2713",
    cr_refs: "Reference Images (up to 4)",
    cr_refs_note: "Optional \u2014 add with Layer / File / Web. Create pulls only what your prompt asks for.",
    cr_results: "Results",
    cr_gal_empty: "No results yet \u2014 tap Generate.",
    cr_gal_have: "result(s) \u00b7 tap a thumbnail to preview / act on it",
    cr_save: "\u2b07 Save PNG",
    cr_engine: "Engine",
    cr_need_result: "Generate an image first",
    btn_web_import_url: "\u2b07 Import URL",
    st_clip_help: "Clipboard empty/blocked \u2014 paste the link into the URL bar, then tap \u2b07 Import URL",
    st_web_blob: "That is a temporary blob: link \u2014 use right-click \u2192 Copy IMAGE Address, or save the file and use Import File",
    err_key: "API key invalid \u2014 re-check the key on the Setup tab \u00b7 API key \u1019\u103e\u102c\u1038\u1014\u1031 \u2014 Setup \u1019\u103e\u102c \u1015\u103c\u1014\u103a\u1005\u1005\u103a\u1015\u102b",
    err_quota: "Quota / rate limit \u2014 wait a moment, then retry \u00b7 Quota \u1015\u103c\u100a\u1037\u103a/\u1014\u103e\u102f\u1014\u103a\u1038\u1000\u1014\u1037\u103a \u2014 \u1001\u100f\u1014\u1031\u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    err_big: "Image too large for the API \u2014 downsize, then retry \u00b7 \u1015\u102f\u1036\u1000\u103c\u102e\u1038\u101c\u103d\u1014\u103a\u1038 \u2014 \u1001\u103b\u102f\u1036\u1037\u1015\u103c\u102e\u1038\u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    err_safety: "Blocked by safety filter \u2014 adjust the prompt or photo \u00b7 Safety \u1004\u103c\u1004\u103a\u1038 \u2014 prompt/\u1015\u102f\u1036 \u1015\u103c\u1004\u103a\u1015\u103c\u102e\u1038\u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    err_net: "Network / server problem \u2014 please try again \u00b7 \u1000\u103d\u1014\u103a\u101b\u1000\u103a/\u1006\u102c\u1017\u102c\u1015\u103c\u1005\u1014\u102c \u2014 \u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    err_timeout: "Request timed out \u2014 the server took too long; please try again \u00b7 \u1021\u1001\u103b\u102d\u1014\u103a\u1015\u103c\u100a\u1037\u103a \u2014 \u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    err_generic: "The request could not be completed \u2014 please try again",
    err_img: "No usable image was produced \u2014 please try again",
    err_mode: "This document is not in RGB mode \u2014 convert it first (Image \u25b8 Mode \u25b8 RGB Color), then try again",
    cam_master: "Camera block ON \u2014 append to the end of EVERY prompt",
    cam_body: "Camera Body",
    cam_lens: "Prime Lens (mm)",
    cam_f: "Aperture",
    cam_film: "Film Look",
    cam_bokeh: "Bokeh Style",
    cam_iso: "ISO",
    cam_k: "WB Kelvin",
    cam_note: "Turn the block ON, then pick only what you need \u2014 \u2013 chips stay silent. Everything lands at the end of the final prompt.",
    ro_h_main: "REFERENCE OPS PRO (Ref1 / Ref2)",
    ro_note: "Ref1 = IMAGE 2 (woman) \u00b7 Ref2 = IMAGE 3 (man). Pick a target, then run an op \u2014 unmatched people never change.",
    ro_target: "Target:",
    ro_solo: "Solo",
    ro_couple: "Couple",
    ro_family: "Family",
    ro_mk: "Copy ref makeup",
    ro_hair: "Take ref hairstyle",
    ro_h_face: "Face Ops",
    ro_h_bg: "BG / FG Ops",
    ro_h_sub: "Subject Ops",
    ro_h_lc: "Light & Color Ops",
    ro_h_dress: "Dress Ops",
    ro_h_mk: "Makeup Ops",
    ro_h_match: "\u2605 Master Match (one look)",
    ro_match_note: "Match IMAGE 1 to the reference so both look like one edit \u2014 tick what to match:",
    m_color: "Color",
    m_light: "Light",
    m_makeup: "Makeup",
    m_skin: "Skin Retouch",
    crd_pipe: "\u26d3 Pipeline Builder \u2014 chain anything",
    pipe_note: "Link ANY steps into one chain \u2014 every step's result feeds the next step. Max 6.",
    pipe_add: "+ Add",
    pipe_run: "\u25b6 RUN PIPELINE",
    pipe_clear: "Clear",
    pipe_retouch: "Retouch Apply (current sliders)",
    pipe_relight: "Relight (current light rig)",
    pipe_prompt: "Prompt (current EN box)",
    pipe_empty: "Add at least one step first",
    pipe_max: "Pipeline is full (6 steps max)",
    st_pipe: "Pipeline step",
    st_pipe_done: "Pipeline done",
    st_pipe_stop: "Pipeline stopped (a step failed)",
    pipe_merge: "\u26a1 One-Shot merge \u2014 ALL steps in ONE call (fast/cheap \u00b7 best \u2264 3 tasks)",
    crd_chainsrest: "Style Chains + Old Photo Restore",
    crd_refops: "Reference Ops Pro (Ref1 / Ref2)",
    crd_scenes: "\ud83c\udfac Scenes Pro \u2014 locked subject \u00b7 scene matches",
    scn_note: "Lock your subject (face \u00b7 pose \u00b7 dress \u00b7 frame) and rebuild the whole scene to match them \u2014 light, shadow, colour, background, foreground and objects all adapt automatically for a real-photo look.",
    scn_h_style: "Scene Style (indoor / cultural)",
    scn_h_bday: "\ud83c\udf82 Birthday \u2014 age number 1\u201345",
    scn_h_cap: "Caption / Text (kid \u00b7 Miss Universe \u00b7 birthday)",
    scn_h_scarf: "Outdoor / Flying Scarf",
    scn_grad: "Graduation Indoor",
    scn_prewed: "Prewedding Indoor",
    scn_vietnam: "Vietnam",
    scn_myanmar: "Myanmar",
    scn_chinese: "Chinese",
    scn_shan: "Shan",
    scn_newborn: "Newborn / Baby",
    scn_age: "Age",
    scn_bday_go: "\ud83c\udf82 BIRTHDAY SCENE",
    scn_cap_on: "Add caption text",
    scn_cap_ph: "Caption text (e.g. Happy 1st Birthday, name)\u2026",
    scn_cap_pos: "Position",
    scn_top: "Top",
    scn_bottom: "Bottom",
    scn_scarf: "\u2726 FLYING SCARF SCENE",
    scn_dir: "Direction",
    scn_left: "Left",
    scn_right: "Right",
    scn_up: "Up",
    scn_len: "Length",
    scn_short: "Short",
    scn_long: "Long",
    g_cat_scene: "SCENE OP \u2014 your subject is locked (face \u00b7 pose \u00b7 dress \u00b7 frame); the whole generated scene (light, shadow, colour, background, foreground, objects, atmosphere) is auto-matched to the subject for a real-photo composite.",
    crd_wed: "\u2665 Wedding Pro Suite",
    crd_recipes: "Recipes \u2014 save / share",
    learn_lbl: "\ud83c\udf93 Learn Mode \u2014 1st tap = guide (yellow), 2nd = prompt (blue), 3rd = RUN (green)",
    guide_hint: "Tap again: yellow \u2192 blue (prompt) \u2192 green (run) \u25b6",
    g_learn_next_prompt: "Tap again \u2192 shows the exact PROMPT (blue).",
    g_learn_prompt_head: "PROMPT this button will send (tap again = RUN):",
    g_learn_next_run: "Tap once more \u2192 RUN (green) generates.",
    st_prompt_ready: "Prompt ready \u2014 tap again (green) to run \u2713",
    g_step_doc: "Open your photo document in Photoshop first.",
    g_step_ref1: "Load the reference image into Ref1 (it becomes IMAGE 2). Add Ref2 for a second person.",
    g_step_target: "Pick the Target: Solo / Couple (Ref1 = woman, Ref2 = man) / Family.",
    g_step_mkhair: "Optional: tick \u2018Copy ref makeup\u2019 / \u2018Take ref hairstyle\u2019 above the Face Ops.",
    g_step_petal: "Pick a petal color first (auto = matches your scene).",
    g_step_rest: "Choose Full Color or B&W with the \u2713 above.",
    g_step_int: "Set the Intensity slider to taste.",
    g_step_confirm: "Tap again to advance: GUIDE (yellow) \u2192 PROMPT (blue) \u2192 RUN (GREEN generates).",
    g_cat_face: "FACE OP \u2014 transfers the reference face onto the matching person; everyone else stays unchanged.",
    g_cat_sub: "SUBJECT OP \u2014 brings/morphs the reference PERSON into your scene; scene and framing stay.",
    g_cat_bgfg: "BG/FG OP \u2014 changes only the background / foreground using the reference.",
    g_cat_lc: "LIGHT & COLOR OP \u2014 copies the reference\u2019s lighting and grade; people stay pixel-faithful.",
    g_cat_dress: "DRESS OP \u2014 changes only the outfit using the reference.",
    g_cat_mkop: "MAKEUP OP \u2014 changes only the makeup using the reference.",
    g_cat_match: "MASTER MATCH \u2014 makes your photo match the reference\u2019s whole look (tick the layers above).",
    g_cat_trail: "WEDDING TRAIL \u2014 luxury grass + a flowing flower path; faces/pose/frame are hard-locked.",
    g_cat_veil: "FLYING VEIL \u2014 adds/extends a wind-blown veil at this length; face never covered.",
    g_cat_gown: "GOWN \u2014 cleans the existing gown (design unchanged) and sets this train length.",
    g_cat_petal: "FLYING PETALS \u2014 adds petals in the air in this style; color from the swatch above.",
    g_cat_wedx: "WEDDING EXTRA \u2014 adds this element matched to your scene; subject stays locked.",
    g_cat_canvas: "REPLACE (CANVAS) \u2014 puts YOUR subject into the reference\u2019s scene; ref people removed.",
    g_cat_restore: "OLD PHOTO RESTORE \u2014 repairs damage; every original face stays 100% identical.",
    g_cat_generic: "PRESET \u2014 applies this professional edit to your photo.",
    g_gen: "GENERATE \u2014 runs the prompt box (+ chains, keeps, camera block) on your document.",
    g_retouchbtn: "RETOUCH APPLY \u2014 runs all your slider settings as one professional retouch pass.",
    g_relightbtn: "LIGHTING GENERATE \u2014 relights the photo exactly to your 3D light diagram.",
    g_scene: "SCENE GENERATE \u2014 rebuilds the scene from the extracted prompt; subject stays.",
    g_rmix: "REPLACE MIX \u2014 replaces only the \u2713 ticked parts from the reference.",
    g_pipe: "RUN PIPELINE \u2014 runs every chained step in order; each result feeds the next.",
    ro_faceRep: "Face Replace",
    ro_faceSwap: "Face Swap",
    ro_bgRep: "BG Replace",
    ro_bgSwap: "BG Swap",
    ro_fgRep: "FG Replace",
    ro_bg_note: "Doc = subject \u00b7 Ref1 = new scene. Target (Solo/Couple/Family) picks who to keep.",
    ro_bg_frame: "Keep frame & composition",
    ro_bg_light: "Preserve subject light/color",
    ro_subSwap: "Subject Swap",
    ro_lcRef: "L&C Reference",
    ro_lcCopy: "L&C Copy-Paste",
    ro_dressRef: "Dress Reference",
    ro_dressRep: "Dress Replace",
    ro_mkCopy: "Makeup Copy",
    ro_matchBtn: "\u2605 MASTER MATCH",
    grp_retouch: "Skin Retouch Presets",
    lbl_intensity: "Strength",
    p_evoto: "Evoto Style",
    p_meitu: "Meitu Style",
    auto_place: "Auto place result into Photoshop as a new layer",
    sec_retouchpro: "Retouch Pro \u2014 Sliders",
    rt_skin: "Skin",
    rt_faceai: "Face AI",
    rt_hair: "Hair",
    rt_dress: "Dress",
    rt_bg: "Background",
    rt_smooth: "Skin Smooth",
    rt_acne: "Acne Remove",
    rt_spots: "Dark Spots",
    rt_wrinkle: "Wrinkles",
    rt_tone: "Whiten / Tan",
    rt_glow: "Glow",
    rt_reshape: "AI Reshape",
    rt_lash: "Eyelashes",
    rt_brow: "Eyebrows",
    rt_lipsmooth: "Lip Smooth",
    rt_lipcolor: "Lip Color",
    rt_lenscolor: "Lens Color",
    rt_hairstray: "Stray Hair",
    rt_hairsmooth: "Hair Smooth",
    rt_hairshine: "Hair Shine (D&B)",
    rt_dresssmooth: "Fabric Smooth",
    rt_dressedge: "Edge Cleanup",
    rt_dresswrinkle: "Wrinkle Remove",
    rt_dresstexture: "Texture Recover",
    rt_bgsmooth: "BG Clean/Smooth",
    rt_bgcolor: "BG Color",
    rt_bgrecolor: "BG Color Smooth",
    rt_shape: "Reshape Pro (Face + Body)",
    rt_teeth: "Teeth Whiten",
    rt_eyewhite: "Eye Whites Clean",
    rt_faceslim: "Face Slim",
    rt_jaw: "Jawline",
    rt_chin: "Chin",
    rt_nosesize: "Nose Size",
    rt_eyesize: "Eye Size",
    rt_lipfull: "Lips Full",
    rt_waist: "Waist Slim",
    rt_bodyslim: "Body Slim",
    rt_shoulder: "Shoulders",
    rt_hip: "Hip Slim",
    rt_leglen: "Leg Length",
    rt_armslim: "Arm Slim",
    rt_dressfit: "Dress Fit",
    rt_dressclean: "Dress Clean",
    rt_dresscolorpure: "Dress Color Pure",
    rt_bodygrp: "Body Skin Pro",
    rt_bodysmooth: "Body Skin Smooth",
    rt_bodyblemish: "Body Blemish Clean",
    rt_bodytone: "Body Even Tone",
    rt_bodyglow: "Body Glow",
    rt_bodyhairrm: "Body Hair Reduce",
    rt_hairvolume: "Hair Volume",
    rt_hairgloss: "Hair Gloss",
    rt_hairfill: "Hair Fill (thin areas)",
    wp_h_trail: "\u2665 Wedding \u2014 Luxury Flower Trail",
    wp_h_veil: "\u2665 Wedding \u2014 Flying Veil",
    wp_h_gown: "\u2665 Wedding \u2014 Gown Clean + Train",
    wp_h_petal: "\u2665 Wedding \u2014 Flying Petals",
    wp_h_extra: "\u2665 Wedding \u2014 Horse \u00b7 Water \u00b7 Mood",
    wp_note: "Face ID / pose / frame / dress design are hard-locked \u2014 only the named element changes.",
    wp_petalcolor: "Petal Color (auto = scene match)",
    wp_trail_c: "Flower color",
    wp_trail_go: "\u25b6 Flower Trail",
    wp_veil_c: "Veil length",
    wp_veil_go: "\u25b6 Flying Veil",
    wp_gown_c: "Train length",
    wp_gown_go: "\u25b6 Gown Clean + Train",
    wp_pet_c: "Petal style",
    wp_pet_go: "\u25b6 Flying Petals",
    wp_extra_c: "Extra",
    wp_extra_go: "\u25b6 Add Extra",
    btn_apply_rt: "Apply Retouch",
    btn_reset: "Reset",
    rt_none: "Set at least one retouch slider or color first",
    tab_setup: "Setup",
    tab_prompt: "Studio",
    tab_presets: "Presets",
    recent_lbl: "Recent prompts\u2026",
    tab_retouch: "Retouch",
    tab_aitools: "AI Tools",
    cap_warn: "Photoshop limits this prompt box to:",
    cleanup_note: "Ticked items run together with EVERY Generate / preset.",
    btn_generate: "GENERATE",
    st_ready: "Ready",
    st_capture: "Capturing document",
    st_gen: "Generating\u2026",
    st_place: "Placing into Photoshop\u2026",
    st_placed_masked: "Placed as Layer + Mask group \u2014 original untouched \u2713",
    st_placed_plain: "Placed as a plain layer (mask/group unavailable on this host)",
    stage_queued: "Queued",
    stage_uploading: "Uploading",
    stage_generating: "Generating",
    stage_downloading: "Downloading",
    stage_placing: "Placing",
    st_done: "Done \u2713",
    st_err: "Error",
    st_no_doc: "No active document \u2014 open a photo first",
    st_no_prompt: "Prompt is empty",
    need_ref: "This preset needs a reference image in slot 1",
    st_new_doc: "Result opened as a new document \u2713",
    sec_preview: "Preview \u2014 Before / After",
    before: "BEFORE",
    after: "AFTER",
    btn_place: "Place to Photoshop",
    btn_saveas: "Save As\u2026",
    st_saved: "Saved \u2713",
    sec_diag: "System Check",
    sec_log: "Activity Log",
    btn_diag: "Run Check",
    btn_copylog: "Copy Log",
    btn_clearlog: "Clear",
    diag_host: "Photoshop host",
    diag_uxp: "UXP capabilities",
    diag_gem: "Gemini API key",
    diag_oai: "OpenAI API key",
    diag_doc: "Active document",
    diag_set: "set",
    diag_unset: "not set",
    diag_open: "open",
    diag_none: "none open",
    diag_missing: "missing",
    diag_done: "System check complete \u2713",
    diag_lib: "Reference Library",
    diag_lib_open: "Open-folder capability",
    sec_reflib: "Reference Image Library",
    reflib_note: "Pick a folder of your favourite reference images once \u2014 Browse remembers it and opens inside it everywhere.",
    btn_browse: "Browse",
    lib_choose: "Choose Folder",
    lib_open: "Open Folder",
    lib_change: "Change Folder",
    lib_reset: "Reset",
    lib_rescan: "Rescan",
    lib_current: "Current Folder",
    lib_found: "Images Found",
    lib_status: "Status",
    lib_lastscan: "Last Scan",
    lib_images: "images",
    lib_connected: "Connected",
    lib_not_config: "Not configured",
    lib_perm_lost: "Permission lost \u2014 reselect",
    lib_none: "(no folder selected)",
    lib_copy_only: "copy path only",
    lib_choose_msg: "Choose your HNK Reference Image Library folder.",
    lib_scanning: "Scanning library\u2026",
    lib_scan_done: "Rescan complete \u2713",
    lib_reset_done: "Library reset \u2713",
    lib_path_copied: "Path copied",
    lib_unsupported: "Unsupported image type",
    lib_restore_fail: "Reference could not be restored",
    on: "ON",
    off: "OFF",
    ai_home_title: "What do you want to create?",
    ai_free_generate: "Free Generate",
    ai_free_sub: "Write your own prompt",
    ai_more_tools: "More Tools",
    ai_more_sub: "Water Edit \u00b7 Text/Logo \u00b7 all workflows",
    ai_nav_home: "Home",
    ai_nav_tools: "Tools",
    ai_history: "History",
    ai_no_gen: "No generations yet.",
    ai_rerun: "Re-run",
    ai_reuse: "Reuse",
    ai_clear_hist: "Clear history",
    ai_images: "IMAGES",
    ai_add_ref: "+ Add Reference Image",
    ai_prompt: "PROMPT",
    ai_prompt_ph: "Describe what you want...",
    ai_model_output: "MODEL & OUTPUT",
    ai_model_note: "AI Tools has its own model/size settings, separate from the classic panel's Setup and Create tabs.",
    ai_auto_model: "Auto Model",
    ai_wf_tools: "Workflow Tools",
    ai_direct_gen: "Direct Generate",
    ai_identity_lock: "Identity Lock",
    ai_ref_transfer: "Reference Transfer",
    ai_req_images: "Required Images",
    ai_opt_images: "Optional Images",
    ai_model_lbl: "Model",
    ai_prepare: "Prepare (load & check)",
    ai_lib_bridge_off: "Library bridge unavailable on this host.",
    ai_lib_pick_first: "Pick a photo from the Presets tab \u2192 Visual Library first.",
    ai_lib_load_fail: "Library image could not be loaded.",
    ai_missing: "Missing",
    ai_add: "Add",
    ai_library: "Library",
    ai_rh_sec: "RunningHub \u2014 add a model endpoint (Advanced \u2014 optional)",
    ai_rh_note: "Built-in models already work with the key above \u2014 nothing to do. If a model shows \"not connected\" (its endpoint path isn't confirmed yet), copy the path from RunningHub's API docs and paste it here.",
    ai_rh_save: "Save this model's endpoint",
    ai_test_conn: "Test connection",
    ai_oai_sec: "OpenAI (Advanced \u2014 optional)",
    ai_oai_note: "Use your own OpenAI API key with GPT Image 2 instead of (or alongside) RunningHub Enterprise.",
    ai_save_verify: "Save & Verify",
    ai_settings: "Settings",
    ai_add_layers: "Add Results as New Layers",
    ai_done: "Done.",
    ai_result_ready: "Result ready.",
    ai_ready_nolayer: "Result ready (add-as-layer is off in Settings).",
    ai_place_failed: "Generated, but could not place into Photoshop.",
    ai_place_failed_fix: "Open a document, then re-run from History.",
    ai_placed_masked: "Placed into the \u201c{name}\u201d group as Layer + Mask \u2014 your original is untouched.",
    ai_placed_group: "Placed into the \u201c{name}\u201d group as a new layer (mask unavailable on this host).",
    ai_placed_plain: "Placed as a new layer (group/mask unavailable on this host).",
    ai_start_fail: "AI Tools failed to start",
    pgb_setup: "Start here \u2014 set up your API Key \u00b7 Model \u00b7 Library",
    pgb_studio: "Prompt \u2192 Reference \u2192 Generate \u2014 one continuous pro workflow",
    pgb_create: "From idea to artwork \u2014 4 reference slots \u00b7 Variations",
    pgb_presets: "Visual Library 366 \u00b7 Scenes \u00b7 Wedding \u00b7 Style Chains",
    pgb_aitools: "One-tap professional \u2014 Nano Banana \u00b7 GPT Image \u00b7 RunningHub",
    pgb_retouch: "Skin \u00b7 Face \u00b7 Body \u2014 professional sliders",
    wf_sum_bg_replace: "Replace the background",
    wf_sum_reference_transfer: "Put your subject into a reference scene",
    wf_sum_master_bgfg_replace: "Remove the scene's person, rebuild bg/fg, insert your subject",
    wf_sum_subject_face: "Transfer a subject or face onto a base",
    wf_sum_retouch: "Natural portrait enhancement",
    wf_sum_upscale: "Detail-preserving upscale",
    wf_sum_object_edit: "Remove, replace or add objects",
    wf_sum_water_edit: "Water and reflection edits",
    wf_sum_text_logo: "Add or edit text and logos",
    wfin_subject: "Your Photo (Subject)",
    wfin_new_bg: "New Background (optional)",
    wfin_ref_scene: "Reference Scene",
    wfin_style_ref: "Style Reference (optional)",
    wfin_target_scene: "Target Scene with Person",
    wfin_base: "Base Image",
    wfin_face_ref: "Face / Subject Reference",
    wfin_portrait: "Portrait",
    wfin_image: "Image",
    wfin_object_ref: "Object Reference (optional)",
    wfin_logo_ref: "Logo Reference (optional)",
    wf_exp_bg_replace: "Replaces the background behind your subject. Your person, pose, edges and lighting stay exactly the same \u2014 only what is behind them changes.",
    wf_exp_reference_transfer: "Takes a reference photo's whole scene (but NOT the people in it) and places YOUR subject into it \u2014 keeping your subject's identity, pose and framing, and matching the scene's light and perspective.",
    wf_exp_master_bgfg_replace: "The strictest subject-in-scene replacement: completely removes the person from your reference scene, naturally reconstructs the hidden background and foreground, then places your exact subject into that spot \u2014 identity, pose, proportions, hairstyle, outfit, skin and lighting locked from your photo, while the reference supplies only the scene, camera and depth.",
    wf_exp_subject_face: "Blends a referenced subject or face onto your base image seamlessly, keeping the base composition intact.",
    wf_exp_retouch: "Gives a natural retouch to skin, hair and tone. Your identity, features and expression are kept \u2014 no plastic skin, no face change.",
    wf_exp_upscale: "Upscales your image while restoring fine natural detail in skin, hair and fabric. Identity, pose, composition and colors stay exactly the same \u2014 no plastic smoothing.",
    wf_exp_object_edit: "Removes, replaces or adds objects using a controlled local edit. Everything you don't touch stays the same.",
    wf_exp_water_edit: "Adds or edits water, reflections and wet surfaces so they look physically natural, keeping your subject intact.",
    wf_exp_text_logo: "Adds or edits clean, legible text or a logo on the image while keeping the composition."
  },
  /* ---- Burmese (my) — 587 keys, complete ---- */
  my: {
    gate_sub_login: "ဒီ panel ကို သုံးရန် သင့် HNK အကောင့်နဲ့ ဝင်ပါ။",
    gate_email_ph: "အီးမေးလ်",
    gate_pass_ph: "စကားဝှက်",
    gate_signin: "အကောင့် ဝင်ရန်",
    gate_checking: "သင့် plan ကို စစ်ဆေးနေပါတယ်…",
    gate_need: "အီးမေးလ်နဲ့ စကားဝှက် ထည့်ပါ။",
    gate_bad: "အီးမေးလ် ဒါမှမဟုတ် စကားဝှက် မှားနေပါတယ်။",
    gate_offline: "အင်တာနက် မရှိပါ — plan ကို စစ်လို့ မရပါ။ ချိတ်ဆက်ပြီး ပြန်စစ်ပါ။",
    gate_locked: "တစ်ကြိမ်ပေးရင် နှစ်ခုလုံး ရပါတယ် — ဝင်ကြေးနဲ့ လစဉ်ကြေးဟာ web app နဲ့ ဒီ Photoshop panel နှစ်ခုလုံးအတွက် ဖြစ်ပါတယ်။ website မှာ ဝယ်ပါ ဒါမှမဟုတ် သက်တမ်းတိုးပြီး ပြန်စစ်ပါ။",
    gate_buy: "website ဖွင့်ရန်",
    gate_retry: "ပြန်စစ်ရန်",
    gate_signout: "ထွက်ရန်",
    gate_days: "{D} ရက် ကျန်",
    gate_grace: "အင်တာနက် မရှိ — အော့ဖ်လိုင်း {D} ရက် ကျန်ပါသေးတယ်",
    gate_open_fail: "browser ဖွင့်လို့ မရပါ။ လိပ်စာ — {U}",
    app_title: "HNK Photoshop Ai Panel (\u1000\u103b\u1031\u102c\u1004\u103a\u1038\u101e\u102c\u1038\u1019\u103b\u102c\u1038)",
    sec_api: "Gemini API Key",
    btn_show: "\u1015\u103c",
    btn_hide: "\u1016\u103d\u1000\u103a",
    btn_test: "Test \u1005\u1005\u103a\u1019\u101a\u103a",
    btn_save: "Save \u101e\u102d\u1019\u103a\u1038\u1019\u101a\u103a",
    st_testing: "Key \u1005\u1005\u103a\u1014\u1031\u101e\u100a\u103a",
    st_key_ok: "\u2713 API Key \u1021\u101c\u102f\u1015\u103a\u101c\u102f\u1015\u103a\u1015\u102b\u1010\u101a\u103a",
    st_key_bad: "API Key \u1019\u103e\u102c\u1038\u1014\u1031\u1015\u102b\u1010\u101a\u103a",
    st_key_saved: "API Key \u101e\u102d\u1019\u103a\u1038\u1015\u103c\u102e\u1038\u1015\u102b\u1015\u103c\u102e \u2713",
    st_need_key: "Gemini API Key \u1021\u101b\u1004\u103a\u1011\u100a\u103a\u1015\u102b",
    sec_model: "Model \u1014\u1032\u1037 Output",
    scope_model_note: "\u1021\u1031\u102c\u1000\u103a\u1000 Prompt tab \u101b\u1032\u1037 Generate \u1001\u101c\u102f\u1010\u103a\u1021\u1010\u103d\u1000\u103a\u1015\u102b \u2014 Create \u1014\u1032\u1037 AI Tools \u1010\u102d\u102f\u1037\u1019\u103e\u102c \u101e\u1030\u1010\u102d\u102f\u1037\u1000\u102d\u102f\u101a\u103a\u1015\u102d\u102f\u1004\u103a model setting \u101e\u102e\u1038\u1001\u103c\u102c\u1038\u1005\u102e \u101b\u103e\u102d\u1015\u102b\u1010\u101a\u103a\u104b",
    model_auto: "Auto (\u1021\u1000\u103c\u1036\u1015\u103c\u102f)",
    model_flash: "Flash \u2014 \u1019\u103c\u1014\u103a (2.5)",
    model_pro: "Pro \u2014 \u1021\u101b\u100a\u103a\u1021\u101e\u103d\u1031\u1038 (3.0)",
    lbl_ratio: "Ratio",
    ratio_auto: "Auto ratio (Document \u1021\u1010\u102d\u102f\u1004\u103a\u1038)",
    lbl_size: "Size",
    lbl_quality: "\u1021\u101b\u100a\u103a\u1021\u101e\u103d\u1031\u1038",
    qual_auto: "\u1021\u1031\u102c\u103a\u1010\u102d\u102f",
    qual_low: "\u1014\u102d\u1019\u1037\u103a",
    qual_med: "\u1021\u101c\u101a\u103a",
    qual_high: "\u1019\u103c\u1004\u1037\u103a",
    sec_prompt: "Prompt",
    hint_prompt: "Prompt \u1000\u102d\u102f \u1012\u102e\u1019\u103e\u102c\u101b\u1031\u1038\u1015\u102b\u2026 (\u1005\u102c\u101c\u102f\u1036\u1038 \u1042\u1040,\u1040\u1040\u1040 \u1021\u1011\u102d)",
    btn_improve: "Prompt \u1010\u102d\u102f\u1038\u1010\u1000\u103a\u1021\u1031\u102c\u1004\u103a\u101c\u102f\u1015\u103a",
    btn_clear: "\u1016\u103b\u1000\u103a",
    st_improving: "Prompt \u1010\u102d\u102f\u1038\u1010\u1000\u103a\u1021\u1031\u102c\u1004\u103a\u101c\u102f\u1015\u103a\u1014\u1031\u101e\u100a\u103a",
    st_improved: "Prompt \u1010\u102d\u102f\u1038\u1010\u1000\u103a\u1015\u103c\u102e\u1038\u1015\u102b\u1015\u103c\u102e \u2713",
    sec_refs: "Reference \u1015\u102f\u1036\u1019\u103b\u102c\u1038 (2 slots)",
    base_note: "Base \u1015\u102f\u1036 = \u1016\u103d\u1004\u103a\u1037\u1011\u102c\u1038\u1010\u1032\u1037 Photoshop document (\u1021\u101c\u102d\u102f\u1021\u101c\u103b\u1031\u102c\u1000\u103a \u1016\u1019\u103a\u1038\u101a\u1030\u1019\u101a\u103a)\u104b",
    btn_ref_layer: "+ Layer",
    btn_ref_file: "\u1016\u102d\u102f\u1004\u103a",
    btn_ref_web: "Web",
    st_ref_layer_added: "Layer \u1000\u102d\u102f reference \u1021\u1016\u103c\u1005\u103a\u1011\u100a\u103a\u1015\u103c\u102e\u1038 \u2713",
    st_ref_file_added: "File \u1000\u102d\u102f reference \u1021\u1016\u103c\u1005\u103a\u1011\u100a\u103a\u1015\u103c\u102e\u1038 \u2713",
    st_importing: "File \u1016\u103d\u1004\u103a\u1037\u1014\u1031\u101e\u100a\u103a",
    url_title: "URL \u1000\u1014\u1031 Reference \u2014 Chrome / Pinterest",
    url_ph: "https://\u2026 \u1015\u102f\u1036\u101c\u102d\u1015\u103a\u1005\u102c \u101e\u102d\u102f\u1037 Pinterest pin link",
    btn_paste: "Paste",
    btn_load: "\u101a\u1030\u1019\u101a\u103a",
    btn_cancel: "\u1019\u101c\u102f\u1015\u103a\u1010\u1031\u102c\u1037",
    st_url_loading: "Web \u1015\u102f\u1036 \u1006\u103d\u1032\u101a\u1030\u1014\u1031\u101e\u100a\u103a",
    st_ref_web_added: "Web \u1015\u102f\u1036\u1000\u102d\u102f reference \u1021\u1016\u103c\u1005\u103a\u1011\u100a\u103a\u1015\u103c\u102e\u1038 \u2713",
    st_url_bad: "\u1012\u102e URL \u1000\u1014\u1031 \u1015\u102f\u1036\u1019\u101b\u1015\u102b \u2014 \u1015\u102f\u1036\u1015\u1031\u102b\u103a Copy image address \u1014\u1032\u1037 \u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    no_layer: "Layer \u101b\u103d\u1031\u1038\u1011\u102c\u1038\u1001\u103c\u1004\u103a\u1038\u1019\u101b\u103e\u102d\u1015\u102b",
    sec_presets: "AI Presets",
    auto_run: "Preset \u1014\u103e\u102d\u1015\u103a\u101b\u1004\u103a \u1001\u103b\u1000\u103a\u1001\u103b\u1004\u103a\u1038 Generate (OFF = prompt \u1011\u1032\u1011\u100a\u103a\u101b\u102f\u1036)",
    grp_cleanup: "\u101b\u103e\u1004\u103a\u1038\u101c\u1004\u103a\u1038\u101b\u1031\u1038 Tools",
    p_remove_people: "\u101c\u1030\u1016\u103b\u1031\u102c\u1000\u103a",
    p_fix_hands: "\u101c\u1000\u103a\u1021\u1015\u102d\u102f \u1015\u103c\u1004\u103a",
    p_fix_legs: "\u1001\u103c\u1031\u1021\u1015\u102d\u102f \u1015\u103c\u1004\u103a",
    p_full_clean: "\u1021\u1000\u102f\u1014\u101b\u103e\u1004\u103a\u1038 (Full Cleanup)",
    grp_moved_note: "Reference tools \u1010\u103d\u1031 \u1021\u1001\u102f \u1021\u1031\u102c\u1000\u103a\u1000 Reference Ops Pro card \u1011\u1032 (\u1010\u1005\u103a\u1014\u1031\u101b\u102c\u1010\u100a\u103a\u1038 \u00b7 Solo/Couple/Family + guide)\u104b",
    ro_h_detail: "\u1006\u1036\u1015\u1004\u103a \u00b7 Accessories \u00b7 Pose (\u2190 Ref1)",
    ro_h_comp: "Composite \u00b7 Style \u00b7 Text (\u2190 Ref1)",
    p_fgbglc: "FG=Doc \u00b7 BG=Ref1 \u00b7 Light=Ref2",
    p_hair: "\u1006\u1036\u1015\u1004\u103a\u1015\u102f\u1036\u1005\u1036 (\u2190 Ref1)",
    p_access: "\u101c\u1000\u103a\u101d\u1010\u103a Accessories (\u2190 Ref1)",
    p_pose: "Pose Match (Doc \u2192 Ref1)",
    p_fgprops: "\u101b\u103e\u1031\u1037\u1001\u1036 Props (\u2190 Ref1)",
    p_textlogo: "\u1005\u102c\u101e\u102c\u1038 / Logo (\u2190 Ref1)",
    p_style: "\u1013\u102c\u1010\u103a\u1015\u102f\u1036 Style (\u2190 Ref1)",
    grp_repsubj: "Replace Subject (Doc \u2192 Ref1 scene)",
    p_rep_solo: "Replace Solo (\u1010\u1005\u103a\u101a\u1031\u102c\u1000\u103a)",
    p_rep_couple: "Replace Couple (\u1005\u102f\u1036\u1010\u103d\u1032)",
    p_rep_family: "Replace Family (\u1019\u102d\u101e\u102c\u1038\u1005\u102f)",
    grp_rmix: "Replace Mix \u2014 Ref1 \u1000\u1014\u1031 \u2713 \u101b\u103d\u1031\u1038\u101a\u1030",
    rm_bg: "\u1014\u1031\u102c\u1000\u103a\u1001\u1036 (BG)",
    rm_fg: "\u101b\u103e\u1031\u1037\u1001\u1036 (FG)",
    rm_light: "\u1021\u101c\u1004\u103a\u1038 (Lighting)",
    rm_color: "\u1021\u101b\u1031\u102c\u1004\u103a (Colour)",
    rm_object: "\u1015\u1005\u1039\u1005\u100a\u103a\u1038 (Objects)",
    btn_rmix: "REPLACE GENERATE",
    rm_none: "\u1021\u1019\u103e\u1014\u103a\u1001\u103c\u1005\u103a \u1010\u1005\u103a\u1001\u102f\u1021\u101b\u1004\u103a\u101b\u103d\u1031\u1038\u1015\u102b",
    grp_i2p: "Image \u2192 Prompt (Scene Builder)",
    i2p_note: "\u1041) Extract: Ref1 scene \u1000\u102d\u102f prompt \u1021\u101e\u1031\u1038\u1005\u102d\u1010\u103a\u1015\u103c\u1031\u102c\u1004\u103a\u1038 (\u101c\u1030\u1019\u1015\u102b)\u104b \u1042) Prompt page \u1019\u103e\u102c \u1015\u103c\u1004\u103a\u104b \u1043) SCENE GENERATE \u1000 document \u101b\u1032\u1037 \u101b\u103e\u102f\u1011\u1031\u102c\u1004\u1037\u103a/lens \u1021\u101c\u102d\u102f\u1000\u103a auto \u100a\u103e\u102d\u1015\u103c\u102e\u1038 \u1006\u1031\u102c\u1000\u103a\u1019\u101a\u103a\u104b Face/Pose/Frame lock = Keep Original\u104b",
    i2p_objects: "\u1015\u1005\u1039\u1005\u100a\u103a\u1038 Objects \u1021\u101e\u1031\u1038\u1005\u102d\u1010\u103a",
    i2p_light: "\u1021\u101c\u1004\u103a\u1038 \u1021\u101e\u1031\u1038\u1005\u102d\u1010\u103a",
    i2p_color: "\u1000\u102c\u101c\u102c / Grade",
    i2p_bg: "\u1014\u1031\u102c\u1000\u103a\u1001\u1036 \u1021\u101e\u1031\u1038\u1005\u102d\u1010\u103a",
    i2p_fg: "\u101b\u103e\u1031\u1037\u1001\u1036 \u1021\u101e\u1031\u1038\u1005\u102d\u1010\u103a",
    btn_i2p: "Image \u2192 Prompt (Scene \u1011\u102f\u1010\u103a\u101a\u1030)",
    i2p_fit: "Scene Auto-Fit \u2014 \u101b\u103e\u102f\u1011\u1031\u102c\u1004\u1037\u103a/\u1021\u1014\u102e\u1038\u1021\u101d\u1031\u1038/lens \u1021\u101c\u102d\u102f\u1000\u103a auto \u100a\u103e\u102d",
    i2p_adapt: "Subject \u1000\u102d\u102f scene \u101b\u1032\u1037 \u1021\u101c\u1004\u103a\u1038/\u1021\u101b\u1031\u102c\u1004\u103a \u101c\u102d\u102f\u1000\u103a\u1015\u103c\u1031\u102c\u1004\u103a\u1038",
    btn_scenegen: "SCENE GENERATE",
    st_extract: "Scene \u1000\u102d\u102f prompt \u1015\u103c\u1031\u102c\u1004\u103a\u1038\u1014\u1031\u101e\u100a\u103a",
    st_extract_done: "Scene prompt \u101b\u1015\u103c\u102e \u2014 Prompt page \u1019\u103e\u102c \u1015\u103c\u1004\u103a\u101c\u102d\u102f\u1037\u101b",
    scene_no_prompt: "Prompt box \u1017\u101c\u102c \u2014 Image \u2192 Prompt \u1021\u101b\u1004\u103a\u101c\u102f\u1015\u103a\u1015\u102b",
    i2p_none: "\u1021\u101e\u1031\u1038\u1005\u102d\u1010\u103a \u1021\u1019\u103e\u1014\u103a\u1001\u103c\u1005\u103a \u1010\u1005\u103a\u1001\u102f\u1021\u101b\u1004\u103a\u101b\u103d\u1031\u1038\u1015\u102b",
    sec_light: "Studio Lighting \u2014 AI Relight",
    light_note: "\u1019\u102e\u1038\u1010\u103d\u1031\u1000\u102d\u102f \u2713 \u1016\u103d\u1004\u1037\u103a\u1015\u103c\u102e\u1038 row \u1000\u102d\u102f\u1014\u103e\u102d\u1015\u103a\u101b\u103d\u1031\u1038\u1000\u102c slider \u1014\u1032\u1037\u1001\u103b\u102d\u1014\u103a \u2014 3D top-view diagram \u1000 \u1010\u102d\u102f\u1000\u103a\u101b\u102d\u102f\u1000\u103a\u101c\u102d\u102f\u1000\u103a\u1015\u103c\u1031\u102c\u1004\u103a\u1038 (\u25b4 = \u1021\u1019\u103c\u1004\u1037\u103a, \u25be = \u1021\u1014\u102d\u1019\u1037\u103a)\u104b LIGHTING GENERATE \u1014\u103e\u102d\u1015\u103a\u101b\u1004\u103a \u1001\u103b\u102d\u1014\u103a\u1011\u102c\u1038\u1010\u1032\u1037 setup \u1021\u1010\u102d\u102f\u1004\u103a\u1038 \u1000\u103d\u1000\u103a\u1010\u102d \u1019\u102e\u1038\u1011\u100a\u1037\u103a\u1019\u101a\u103a \u2014 \u1019\u103b\u1000\u103a\u1014\u103e\u102c/pose/frame \u1019\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u104b",
    lbl_my_prompt: "\u1019\u103c\u1014\u103a\u1019\u102c Prompt",
    lstage_model: "\u1019\u1031\u102c\u103a\u1012\u101a\u103a",
    lstage_cam: "\u1000\u1004\u103a\u1019\u101b\u102c",
    l_key: "Key Light (\u1021\u1013\u102d\u1000)",
    l_fill: "Fill / \u101b\u103e\u1031\u1037\u1010\u100a\u1037\u103a",
    l_butterfly: "Butterfly (\u1021\u1015\u1031\u102b\u103a\u1005\u102e\u1038)",
    l_side: "Side Light (\u1018\u1031\u1038)",
    l_rim: "Rim Light",
    l_back: "Back Light (\u1014\u1031\u102c\u1000\u103a)",
    l_hair: "Hair Light (\u1006\u1036\u1015\u1004\u103a)",
    l_bglight: "BG Light (\u1014\u1031\u102c\u1000\u103a\u1001\u1036\u1011\u102d\u102f\u1038)",
    lt_softbox: "Softbox",
    lt_octa: "Octa",
    lt_strip: "Strip",
    lt_umbrella: "Umbrella",
    lt_beauty: "Beauty",
    lt_hard: "Hard",
    li_int: "\u1021\u102c\u1038",
    li_angle: "\u101b\u103e\u102f\u1011\u1031\u102c\u1004\u1037\u103a",
    li_height: "\u1021\u1014\u102d\u1019\u1037\u103a\u1021\u1019\u103c\u1004\u1037\u103a",
    li_dist: "\u1021\u1014\u102e\u1038\u1021\u101d\u1031\u1038",
    li_size: "Size",
    btn_lightgen: "LIGHTING GENERATE",
    light_none: "\u1019\u102e\u1038 \u1010\u1005\u103a\u101c\u102f\u1036\u1038\u1021\u101b\u1004\u103a \u2713 \u1016\u103d\u1004\u1037\u103a\u1015\u102b",
    lg_equip: "\u1019\u102e\u1038/softbox \u1015\u1005\u1039\u1005\u100a\u103a\u1038\u1010\u103d\u1031 \u1015\u102f\u1036\u1011\u1032\u1019\u103e\u102c \u1015\u102b\u1015\u103c\u1019\u101a\u103a",
    grp_chains: "Style Chains \u2014 \u2713 \u1010\u103d\u1032\u101e\u102f\u1036\u1038",
    chains_note: "\u1000\u103c\u102d\u102f\u1000\u103a\u1010\u1032\u1037 style \u1010\u103d\u1031 \u2713 \u1016\u103d\u1004\u1037\u103a \u2014 Generate / Preset / Retouch \u1010\u102d\u102f\u1004\u103a\u1038\u1019\u103e\u102c \u1021\u101c\u102d\u102f\u1015\u1031\u102b\u1004\u103a\u1038\u1015\u102b\u101e\u103d\u102c\u1038\u1019\u101a\u103a\u104b",
    grp_restore: "\u1013\u102c\u1010\u103a\u1015\u102f\u1036\u1021\u101f\u1031\u102c\u1004\u103a\u1038 Restore",
    p_restore: "\u1015\u102f\u1036\u101f\u1031\u102c\u1004\u103a\u1038 \u1015\u103c\u1014\u103a\u1015\u103c\u1004\u103a",
    rest_color: "\u1000\u102c\u101c\u102c\u1005\u102f\u1036 (Full Color)",
    rest_bw: "\u1021\u1016\u103c\u1030\u1021\u1019\u1032 (B&W)",
    restore_note: "\u1005\u102f\u1010\u103a\u1015\u103c\u1032/\u101b\u1031\u1005\u102d\u102f/\u1019\u102e\u1038\u101c\u1031\u102c\u1004\u103a/\u1019\u103e\u102d\u1014\u103a\u1038\u1010\u102c\u1010\u103d\u1031 \u1015\u103c\u1014\u103a\u1015\u103c\u1004\u103a \u2014 \u1019\u1030\u101c\u1019\u103b\u1000\u103a\u1014\u103e\u102c \u1021\u1010\u102d\u1021\u1000\u103b \u1019\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u104b",
    rt_browstyle: "\u1019\u103b\u1000\u103a\u1001\u102f\u1036\u1038 Style",
    rt_lashstyle: "\u1019\u103b\u1000\u103a\u1010\u1031\u102c\u1004\u103a Style",
    rt_blush: "\u1015\u102b\u1038\u1014\u102e \u1021\u101b\u1031\u102c\u1004\u103a",
    rt_contour: "Contour Style",
    rt_bust: "\u101b\u1004\u103a",
    rt_butt: "\u1010\u1004\u103a",
    rt_thigh: "\u1015\u1031\u102b\u1004\u103a",
    rt_calf: "\u1001\u103c\u1031\u101e\u101c\u102f\u1036\u1038",
    rt_neck: "\u101c\u100a\u103a\u1015\u1004\u103a\u1038",
    rt_fingers: "\u101c\u1000\u103a\u1001\u103b\u1031\u102c\u1004\u103a\u1038",
    hint_prompt_my: "\u1019\u103c\u1014\u103a\u1019\u102c\u101c\u102d\u102f \u101b\u1031\u1038\u1015\u102b \u2014 Generate \u1019\u103e\u102c English \u1021\u101c\u102d\u102f\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u1015\u1031\u1038\u1019\u101a\u103a (\u1021\u1019\u103b\u102c\u1038\u1006\u102f\u1036\u1038 20,000)",
    st_translate: "\u1019\u103c\u1014\u103a\u1019\u102c prompt \u1000\u102d\u102f English \u1015\u103c\u1031\u102c\u1004\u103a\u1038\u1014\u1031\u101e\u100a\u103a",
    live_trans: "Live \u21c4 \u1021\u101c\u102d\u102f\u1018\u102c\u101e\u102c\u1015\u103c\u1014\u103a (EN \u2194 MY \u2014 \u101b\u1031\u1038\u101b\u1015\u103a\u1010\u102c\u1014\u1032\u1037)",
    st_retry: "\u1015\u103c\u1014\u103a\u1000\u103c\u102d\u102f\u1038\u1005\u102c\u1038\u1014\u1031\u101e\u100a\u103a",
    grp_recipes: "Recipes \u2014 setting \u101e\u102d\u1019\u103a\u1038/\u1019\u103b\u103e\u1038\u101d\u1031",
    recipe_note: "Chains + Retouch + Lights + Keep + Prompt \u1021\u102c\u1038\u101c\u102f\u1036\u1038\u1000\u102d\u102f .json \u1010\u1005\u103a\u1016\u102d\u102f\u1004\u103a\u1010\u100a\u103a\u1038\u101e\u102d\u1019\u103a\u1038 \u2014 \u101e\u1004\u103a\u1010\u1014\u103a\u1038\u101e\u102c\u1038\u1010\u103d\u1031 Load \u1015\u1032\u101c\u102f\u1015\u103a\u101b\u102f\u1036\u104b",
    btn_recipe_save: "Recipe \u101e\u102d\u1019\u103a\u1038\u1019\u101a\u103a",
    btn_recipe_load: "Recipe \u1016\u103d\u1004\u1037\u103a\u1019\u101a\u103a",
    st_recipe_saved: "Recipe \u101e\u102d\u1019\u103a\u1038\u1015\u103c\u102e\u1038 \u2713",
    st_recipe_loaded: "Recipe \u1016\u103d\u1004\u1037\u103a\u1015\u103c\u102e\u1038 \u2713 \u2014 control \u1021\u102c\u1038\u101c\u102f\u1036\u1038 update",
    st_recipe_bad: "HNK recipe \u1016\u102d\u102f\u1004\u103a \u1019\u101f\u102f\u1010\u103a\u1015\u102b",
    sec_final: "Final Prompt (AI \u1006\u102e \u1015\u102d\u102f\u1037\u1010\u1032\u1037\u1021\u1010\u102d\u102f\u1004\u103a\u1038)",
    btn_copy: "Copy",
    st_copied: "Copy \u1015\u103c\u102e\u1038 \u2713",
    hist_note: "History \u2014 \u1014\u1031\u102c\u1000\u103a\u1006\u102f\u1036\u1038 \u1046 \u1015\u102f\u1036\u104a \u1014\u103e\u102d\u1015\u103a\u1000\u103c\u100a\u1037\u103a:",
    btn_hist_prompt: "\u2192 Prompt",
    sec_batch: "Batch Mode",
    batch_note: "\u1015\u102f\u1036\u1021\u1019\u103b\u102c\u1038\u101b\u103d\u1031\u1038 + output folder \u101b\u103d\u1031\u1038 \u2014 \u101c\u1000\u103a\u101b\u103e\u102d prompt/chains/cleanup/Keep \u1010\u103d\u1031\u1014\u1032\u1037 \u1015\u102f\u1036\u1010\u102d\u102f\u1004\u103a\u1038 auto \u1015\u103c\u1031\u1038\u1015\u103c\u102e\u1038 *_HNK.png \u1014\u1032\u1037\u101e\u102d\u1019\u103a\u1038\u1019\u101a\u103a\u104b",
    btn_batch: "RUN BATCH",
    btn_batch_stop: "\u101b\u1015\u103a\u1019\u101a\u103a",
    st_batch: "Batch",
    st_batch_done: "Batch \u1015\u103c\u102e\u1038\u1015\u102b\u1015\u103c\u102e",
    sec_web: "Web AI \u2014 \u1019\u102e\u1014\u102e Browser",
    web_note: "Web AI editor \u1010\u103d\u1031\u1000\u102d\u102f Photoshop \u1011\u1032\u1000\u1014\u1031 \u1016\u103d\u1004\u1037\u103a\u101e\u102f\u1036\u1038 \u2014 \u101f\u102d\u102f\u1019\u103e\u102c Generate \u101c\u102f\u1015\u103a\u1015\u103c\u102e\u1038 \u101b\u101c\u1012\u103a\u1000\u102d\u102f layer \u1021\u1016\u103c\u1005\u103a \u1010\u1004\u103a\u1015\u102b:",
    web_import_note: "Import \u1014\u100a\u103a\u1038: \u2460 web app \u1011\u1032 \u1015\u102f\u1036\u1015\u1031\u102b\u103a right-click \u2192 Copy image address \u1015\u103c\u102e\u1038 IMPORT COPIED LINK \u00b7 \u2461 \u1012\u102b\u1019\u103e\u1019\u101f\u102f\u1010\u103a file download \u101c\u102f\u1015\u103a\u1015\u103c\u102e\u1038 IMPORT FILE \u00b7 \u2462 HNK bridge \u1015\u102b\u1010\u1032\u1037 web app \u1006\u102d\u102f auto \u101d\u1004\u103a\u101c\u102c\u1019\u101a\u103a\u104b",
    btn_web_go: "Go",
    btn_web_home: "Home",
    btn_web_reload: "Reload",
    btn_web_import_link: "\u1000\u1030\u1038\u1011\u102c\u1038\u1010\u1032\u1037 Link \u2192 PS",
    btn_web_import_file: "File \u2192 PS",
    st_web_import: "Photoshop \u1011\u1032 layer \u1021\u1016\u103c\u1005\u103a \u101d\u1004\u103a\u1015\u103c\u102e\u1038 \u2713",
    st_web_nourl: "Image link \u1021\u101b\u1004\u103a copy \u101c\u102f\u1015\u103a\u1015\u102b (right-click \u2192 Copy image address)",
    st_web_fetch: "Link \u1000\u1014\u1031 \u1015\u102f\u1036\u1006\u103d\u1032\u1014\u1031\u101e\u100a\u103a",
    st_web_notallowed: "\u1012\u102e domain \u1000 allow-list \u1011\u1032\u1019\u1015\u102b\u101e\u1031\u1038 \u2014 \u1021\u101c\u103d\u1010\u103a\u1016\u103c\u1005\u103a\u1014\u102d\u102f\u1004\u103a\u104a HNK \u1006\u102e \u1015\u103c\u1031\u102c\u1015\u102b\u104b",
    st_need_doc: "Photoshop \u1011\u1032 \u1013\u102c\u1010\u103a\u1015\u102f\u1036 document \u1021\u101b\u1004\u103a\u1016\u103d\u1004\u1037\u103a\u1015\u102b",
    sec_campro: "Camera Pro & Quality",
    autosave_lbl: "\u101b\u101c\u1012\u103a\u1010\u102d\u102f\u1004\u103a\u1038 Auto-Export (PNG + prompt log \u2192 folder)",
    st_folder_ok: "Export folder \u101b\u103d\u1031\u1038\u1015\u103c\u102e\u1038 \u2713",
    st_exported: "Export \u1015\u103c\u102e\u1038 \u2713",
    st_export_fail: "Export \u1019\u1021\u1031\u102c\u1004\u103a \u2014 folder \u1005\u1005\u103a\u1015\u102b",
    st_pro_fallback: "Pro model \u1019\u101b \u2014 \u1012\u102e\u1010\u1005\u103a\u1000\u103c\u102d\u1019\u103a Flash \u1014\u1032\u1037\u1015\u103c\u1031\u1038\u1019\u101a\u103a",
    st_img_bad: "\u1015\u102f\u1036 data \u1005\u1005\u103a\u1006\u1031\u1038\u1019\u1021\u1031\u102c\u1004\u103a \u2014 \u1015\u102f\u1036\u1000\u102d\u102f \u1015\u103c\u1014\u103a\u1011\u100a\u1037\u103a\u1015\u102b",
    st_auto_comp: "Auto Composite: \u1015\u1004\u103a\u1010\u102d\u102f\u1004\u103a (IMAGE 1) \u2192 reference scene \u1011\u1032\u101e\u103d\u1004\u103a\u1038\u1014\u1031\u101e\u100a\u103a",
    prov_lbl: "AI \u101d\u1014\u103a\u1006\u1031\u102c\u1004\u103a\u1019\u103e\u102f\u1015\u1031\u1038\u101e\u1030",
    oai_key_ph: "sk-... (OpenAI API key)",
    tab_create: "\u1016\u1014\u103a\u1010\u102e\u1038",
    create_note: "CREATE MODE \u2014 prompt (+ \u1000\u102d\u102f\u101a\u103a\u1015\u102d\u102f\u1004\u103a ref 4 \u1000\u103d\u1000\u103a) \u1014\u1032\u1037 \u1015\u102f\u1036\u1021\u101e\u1005\u103a\u1016\u1014\u103a\u1010\u102e\u1038\u1019\u101a\u103a\u104b Document \u1000\u102d\u102f \u101c\u102f\u1036\u1038\u101d\u1019\u1016\u1010\u103a \u2014 \u1018\u102c feature \u1014\u1032\u1037\u1019\u103e \u1019\u101b\u1031\u102c\u104b",
    create_ph: "\u1016\u1014\u103a\u1010\u102e\u1038\u1001\u103b\u1004\u103a\u1010\u1032\u1037\u1015\u102f\u1036\u1000\u102d\u102f \u1016\u1031\u102c\u103a\u1015\u103c\u1015\u102b\u2026",
    btn_create_ps: "\u2b07 Photoshop \u1011\u1032\u1015\u102d\u102f\u1037",
    btn_to_ref: "\u21ba Ref 1 \u1021\u1016\u103c\u1005\u103a\u101e\u102f\u1036\u1038",
    st_to_ref: "\u101b\u101c\u1012\u103a\u1000\u102d\u102f Ref 1 \u1011\u1032\u1011\u100a\u1037\u103a\u1015\u103c\u102e\u1038 \u2713",
    scope_create_note: "Setup \u101b\u1032\u1037 Model & Output \u1014\u1032\u1037 \u1019\u1006\u102d\u102f\u1004\u103a\u1015\u102b \u2014 \u1012\u102e setting \u1010\u103d\u1031\u1000 Create \u101b\u1032\u1037 Generate \u1021\u1010\u103d\u1000\u103a\u1015\u1032 \u1021\u1000\u103b\u102f\u1036\u1038\u101d\u1004\u103a\u1015\u102b\u1010\u101a\u103a\u104b",
    cr_ratio: "Ratio",
    cr_var: "\u1021\u101c\u102f\u1015\u103a\u1021\u1019\u103b\u102d\u102f\u1038\u1019\u103b\u102d\u102f\u1038",
    cr_restyle: "\u267b \u101b\u101c\u1012\u103a\u1000\u102d\u102f Restyle",
    cr_lib: "Prompt Library \u2014 \u1014\u103e\u102d\u1015\u103a\u1011\u100a\u1037\u103a",
    cr_improve: "\u2728 \u1010\u102d\u102f\u1038\u1010\u1000\u103a",
    cr_describe: "\ud83d\udd0d Ref 1 \u2192 Prompt \u1016\u1010\u103a",
    st_describing: "Reference \u1016\u1010\u103a\u1014\u1031\u101e\u100a\u103a\u2026",
    st_described: "Ref 1 \u1019\u103e prompt \u101b\u1015\u103c\u102e \u2713",
    st_need_gem: "Gemini API key \u1011\u100a\u1037\u103a\u1015\u102b (Setup) \u2014 Gemini text \u101e\u102f\u1036\u1038\u101e\u100a\u103a",
    st_need_ref1: "Ref 1 \u1011\u1032 \u1015\u102f\u1036\u1021\u101b\u1004\u103a\u1011\u100a\u1037\u103a\u1015\u102b",
    st_lib_added: "Prompt \u1011\u100a\u1037\u103a\u1015\u103c\u102e\u1038 \u2713",
    cr_refs: "Reference \u1015\u102f\u1036\u1019\u103b\u102c\u1038 (\u1021\u1019\u103b\u102c\u1038\u1006\u102f\u1036\u1038 4)",
    cr_refs_note: "\u1019\u1016\u103c\u1005\u103a\u1019\u1014\u1031 \u2014 Layer / File / Web \u1016\u103c\u1004\u1037\u103a \u1011\u100a\u1037\u103a\u104b Prompt \u1010\u1031\u102c\u1004\u103a\u1038\u1006\u102d\u102f\u1010\u102c\u1015\u1032 \u101a\u1030\u1015\u102b\u1010\u101a\u103a\u104b",
    cr_results: "\u101b\u101c\u1012\u103a\u1019\u103b\u102c\u1038",
    cr_gal_empty: "\u101b\u101c\u1012\u103a\u1019\u101b\u103e\u102d\u101e\u1031\u1038\u1015\u102b \u2014 Generate \u1014\u103e\u102d\u1015\u103a\u1015\u102b\u104b",
    cr_gal_have: "\u1001\u102f \u101b\u101c\u1012\u103a \u00b7 thumbnail \u1014\u103e\u102d\u1015\u103a\u1015\u103c\u102e\u1038 \u1000\u103c\u100a\u1037\u103a/\u1021\u101e\u102f\u1036\u1038\u1015\u103c\u102f\u1015\u102b",
    cr_save: "\u2b07 PNG \u101e\u102d\u1019\u103a\u1038",
    cr_engine: "Engine",
    cr_need_result: "\u1021\u101b\u1004\u103a \u1015\u102f\u1036\u1010\u1005\u103a\u1015\u102f\u1036 Generate \u101c\u102f\u1015\u103a\u1015\u102b",
    btn_web_import_url: "\u2b07 Import URL",
    st_clip_help: "Clipboard \u1017\u101c\u102c/\u1015\u102d\u1010\u103a\u1011\u102c\u1038 \u2014 link \u1000\u102d\u102f URL bar \u1011\u1032 paste \u1015\u103c\u102e\u1038 \u2b07 Import URL \u1014\u103e\u102d\u1015\u103a\u1015\u102b",
    st_web_blob: "blob: \u101a\u102c\u101a\u102e link \u1016\u103c\u1005\u103a\u1014\u1031 \u2014 \u1015\u102f\u1036\u1015\u1031\u102b\u103a right-click \u2192 Copy IMAGE Address \u101e\u102d\u102f\u1037 \u1015\u102f\u1036\u101e\u102d\u1019\u103a\u1038\u1015\u103c\u102e\u1038 Import File \u101e\u102f\u1036\u1038\u1015\u102b",
    err_key: "API key \u1019\u103e\u102c\u1038 \u2014 Setup tab \u1019\u103e\u102c key \u1015\u103c\u1014\u103a\u1005\u1005\u103a\u1015\u102b",
    err_quota: "Quota/\u1014\u103e\u102f\u1014\u103a\u1038\u1000\u1014\u1037\u103a\u1015\u103c\u100a\u1037\u103a \u2014 \u1001\u100f\u1014\u1031\u1015\u103c\u102e\u1038 \u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    err_big: "\u1015\u102f\u1036 API \u1021\u1010\u103d\u1000\u103a \u1000\u103c\u102e\u1038\u101c\u103d\u1014\u103a\u1038 \u2014 \u1001\u103b\u102f\u1036\u1037\u1015\u103c\u102e\u1038 \u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    err_safety: "Safety filter \u1004\u103c\u1004\u103a\u1038 \u2014 prompt (\u101e\u102d\u102f\u1037) \u1015\u102f\u1036 \u1015\u103c\u1004\u103a\u1015\u103c\u102e\u1038 \u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    err_net: "\u1000\u103d\u1014\u103a\u101b\u1000\u103a/\u1006\u102c\u1017\u102c \u1015\u103c\u1005\u1014\u102c \u2014 \u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    err_timeout: "\u1021\u1001\u103b\u102d\u1014\u103a\u1015\u103c\u100a\u1037\u103a\u101e\u103d\u102c\u1038\u1015\u103c\u102e \u2014 \u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    err_generic: "\u1010\u1031\u102c\u1004\u103a\u1038\u1006\u102d\u102f\u1019\u103e\u102f \u1019\u1015\u103c\u102e\u1038\u1006\u102f\u1036\u1038\u1015\u102b \u2014 \u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    err_img: "\u1021\u101e\u102f\u1036\u1038\u101d\u1004\u103a\u1010\u1032\u1037 \u1015\u102f\u1036 \u1019\u101b\u101b\u103e\u102d\u1015\u102b \u2014 \u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    err_mode: "\u1012\u102e document \u1000 RGB \u1019\u101f\u102f\u1010\u103a\u1015\u102b \u2014 Image \u25b8 Mode \u25b8 RGB Color \u1015\u103c\u1031\u102c\u1004\u103a\u1038\u1015\u103c\u102e\u1038\u1019\u103e \u1015\u103c\u1014\u103a\u1005\u1019\u103a\u1038\u1015\u102b",
    cam_master: "Camera block \u1016\u103d\u1004\u1037\u103a \u2014 prompt \u1010\u102d\u102f\u1004\u103a\u1038\u101b\u1032\u1037 \u1014\u1031\u102c\u1000\u103a\u1006\u102f\u1036\u1038\u1019\u103e\u102c \u1011\u100a\u1037\u103a\u1019\u101a\u103a",
    cam_body: "Camera Body",
    cam_lens: "Prime \u1019\u103e\u1014\u103a\u1018\u102e\u101c\u1030\u1038 (mm)",
    cam_f: "Aperture (F)",
    cam_film: "Film \u1021\u101e\u103d\u1004\u103a",
    cam_bokeh: "Bokeh Style",
    cam_iso: "ISO",
    cam_k: "WB Kelvin",
    cam_note: "Block \u1016\u103d\u1004\u1037\u103a\u1015\u103c\u102e\u1038 \u101c\u102d\u102f\u1010\u102c\u1015\u1032\u101b\u103d\u1031\u1038 \u2014 \u2013 chip \u1010\u103d\u1031 \u1018\u102c\u1019\u103e\u1019\u1011\u100a\u1037\u103a\u1018\u1030\u1038\u104b",
    ro_h_main: "REFERENCE OPS PRO (Ref1 / Ref2)",
    ro_note: "Ref1 = IMAGE 2 (\u1019\u102d\u1014\u103a\u1038\u1019) \u00b7 Ref2 = IMAGE 3 (\u101a\u1031\u102c\u1000\u103a\u103b\u102c\u1038)\u104b Target \u101b\u103d\u1031\u1038\u1015\u103c\u102e\u1038 op \u1014\u103e\u102d\u1015\u103a \u2014 \u1019\u1000\u102d\u102f\u1000\u103a\u1010\u1032\u1037\u101e\u1030 \u1018\u101a\u103a\u1010\u1031\u102c\u1037\u1019\u103e \u1019\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u104b",
    ro_target: "Target:",
    ro_solo: "Solo",
    ro_couple: "Couple",
    ro_family: "Family",
    ro_mk: "Ref \u1019\u102d\u1010\u103a\u1000\u1015\u103a \u1000\u1030\u1038",
    ro_hair: "Ref \u1006\u1036\u1015\u1004\u103a\u101a\u1030",
    ro_h_face: "Face Ops",
    ro_h_bg: "BG / FG Ops",
    ro_h_sub: "Subject Ops",
    ro_h_lc: "Light & Color Ops",
    ro_h_dress: "Dress Ops",
    ro_h_mk: "Makeup Ops",
    ro_h_match: "\u2605 Master Match (\u1010\u1005\u103a\u1015\u102f\u1036\u1005\u1036\u1010\u100a\u103a\u1038)",
    ro_match_note: "Reference \u1015\u102f\u1036\u1021\u1010\u102d\u102f\u1004\u103a\u1038 IMAGE 1 \u1000\u102d\u102f Match \u2014 \u1018\u102c\u1010\u103d\u1031 match \u1019\u101c\u1032 \u2713:",
    m_color: "Color",
    m_light: "Light",
    m_makeup: "Makeup",
    m_skin: "Skin Retouch",
    crd_pipe: "\u26d3 Pipeline Builder \u2014 \u1000\u103c\u102d\u102f\u1000\u103a\u101e\u101c\u102d\u102f\u1001\u103b\u102d\u1010\u103a",
    pipe_note: "\u1018\u101a\u103a step \u1019\u1006\u102d\u102f \u1001\u103b\u102d\u1010\u103a\u101c\u102d\u102f\u1037\u101b \u2014 \u1010\u1005\u103a\u1006\u1004\u1037\u103a\u101b\u101c\u1012\u103a\u1000 \u1014\u1031\u102c\u1000\u103a\u1010\u1005\u103a\u1006\u1004\u1037\u103a\u101b\u1032\u1037 input \u1016\u103c\u1005\u103a\u1015\u103c\u102e\u1038 \u1021\u1006\u1004\u1037\u103a\u1006\u1004\u1037\u103a auto \u1015\u103c\u1031\u1038\u1019\u101a\u103a\u104b \u1021\u1019\u103b\u102c\u1038\u1006\u102f\u1036\u1038 6\u104b",
    pipe_add: "+ \u1011\u100a\u1037\u103a",
    pipe_run: "\u25b6 RUN PIPELINE",
    pipe_clear: "\u101b\u103e\u1004\u103a\u1038",
    pipe_retouch: "Retouch Apply (\u101c\u1000\u103a\u101b\u103e\u102d slider)",
    pipe_relight: "Relight (\u101c\u1000\u103a\u101b\u103e\u102d \u1019\u102e\u1038 setup)",
    pipe_prompt: "Prompt (\u101c\u1000\u103a\u101b\u103e\u102d EN box)",
    pipe_empty: "Step \u1010\u1005\u103a\u1001\u102f\u1021\u101b\u1004\u103a\u1011\u100a\u1037\u103a\u1015\u102b",
    pipe_max: "Pipeline \u1015\u103c\u100a\u1037\u103a\u1015\u102b\u1015\u103c\u102e (6 \u1006\u1004\u1037\u103a\u1021\u1019\u103b\u102c\u1038\u1006\u102f\u1036\u1038)",
    st_pipe: "Pipeline \u1021\u1006\u1004\u1037\u103a",
    st_pipe_done: "Pipeline \u1015\u103c\u102e\u1038\u1015\u102b\u1015\u103c\u102e",
    st_pipe_stop: "Pipeline \u101b\u1015\u103a\u101e\u103d\u102c\u1038\u1015\u103c\u102e (\u1021\u1006\u1004\u1037\u103a\u1010\u1005\u103a\u1001\u102f fail)",
    pipe_merge: "\u26a1 One-Shot merge \u2014 \u1021\u1006\u1004\u1037\u103a\u1021\u102c\u1038\u101c\u102f\u1036\u1038 call \u1010\u1005\u103a\u1001\u102b\u1010\u100a\u103a\u1038 (\u1019\u103c\u1014\u103a/\u101e\u1000\u103a\u101e\u102c \u00b7 3 \u1006\u1004\u1037\u103a\u1021\u1011\u102d \u1021\u1000\u1031\u102c\u1004\u103a\u1038\u1006\u102f\u1036\u1038)",
    crd_chainsrest: "Style Chains + \u1013\u102c\u1010\u103a\u1015\u102f\u1036\u1021\u101f\u1031\u102c\u1004\u103a\u1038 Restore",
    crd_refops: "Reference Ops Pro (Ref1 / Ref2)",
    crd_scenes: "\ud83c\udfac Scenes Pro \u2014 subject lock \u00b7 scene \u1000\u102d\u102f\u1000\u103a",
    scn_note: "Subject (\u1019\u103b\u1000\u103a\u1014\u103e\u102c \u00b7 pose \u00b7 dress \u00b7 frame) \u1000\u102d\u102f lock \u1001\u1010\u103a\u1015\u103c\u102e\u1038 scene \u1010\u1005\u103a\u1001\u102f\u101c\u102f\u1036\u1038\u1000 subject \u1000\u102d\u102f \u101c\u102d\u102f\u1000\u103a\u100a\u103e\u102d \u2014 \u1021\u101c\u1004\u103a\u1038/\u1021\u101b\u102d\u1015\u103a/\u1021\u101b\u1031\u102c\u1004\u103a/background/foreground/objects \u1021\u102c\u1038\u101c\u102f\u1036\u1038 \u1021\u101c\u102d\u102f\u1021\u101c\u103b\u1031\u102c\u1000\u103a \u1000\u102d\u102f\u1000\u103a\u104a \u1013\u102c\u1010\u103a\u1015\u102f\u1036\u1021\u1005\u1005\u103a\u101c\u102d\u102f\u104b",
    scn_h_style: "Scene Style (indoor / \u101a\u1009\u103a\u1000\u103b\u1031\u1038\u1019\u103e\u102f)",
    scn_h_bday: "\ud83c\udf82 Birthday \u2014 \u1021\u101e\u1000\u103a 1\u201345",
    scn_h_cap: "Caption / \u1005\u102c\u101e\u102c\u1038 (\u1000\u101c\u1031\u1038 \u00b7 Miss Universe \u00b7 \u1019\u103d\u1031\u1038\u1014\u1031\u1037)",
    scn_h_scarf: "Outdoor / \u101c\u103d\u1004\u1037\u103a\u1014\u1031\u1010\u1032\u1037 \u1015\u101d\u102b",
    scn_grad: "Graduation Indoor",
    scn_prewed: "Prewedding Indoor",
    scn_vietnam: "Vietnam",
    scn_myanmar: "Myanmar",
    scn_chinese: "Chinese",
    scn_shan: "Shan",
    scn_newborn: "Newborn / \u1000\u101c\u1031\u1038",
    scn_age: "\u1021\u101e\u1000\u103a",
    scn_bday_go: "\ud83c\udf82 BIRTHDAY SCENE",
    scn_cap_on: "Caption \u1005\u102c\u101e\u102c\u1038 \u1011\u100a\u1037\u103a",
    scn_cap_ph: "Caption \u1005\u102c\u101e\u102c\u1038 (\u1025\u1015\u1019\u102c Happy 1st Birthday / \u1014\u102c\u1019\u100a\u103a)\u2026",
    scn_cap_pos: "\u1014\u1031\u101b\u102c",
    scn_top: "\u1021\u1015\u1031\u102b\u103a",
    scn_bottom: "\u1021\u1031\u102c\u1000\u103a",
    scn_scarf: "\u2726 \u1015\u102f\u101d\u102b\u101c\u103d\u1004\u1037\u103a SCENE",
    scn_dir: "\u1026\u1038\u1010\u100a\u103a\u101b\u102c",
    scn_left: "\u1018\u101a\u103a",
    scn_right: "\u100a\u102c",
    scn_up: "\u1021\u1015\u1031\u102b\u103a",
    scn_len: "\u1021\u101c\u103b\u102c\u1038",
    scn_short: "\u1010\u102d\u102f",
    scn_long: "\u101b\u103e\u100a\u103a",
    g_cat_scene: "SCENE OP \u2014 subject \u1000\u102d\u102f lock (\u1019\u103b\u1000\u103a\u1014\u103e\u102c \u00b7 pose \u00b7 dress \u00b7 frame); scene \u1010\u1005\u103a\u1001\u102f\u101c\u102f\u1036\u1038 (\u1021\u101c\u1004\u103a\u1038/\u1021\u101b\u102d\u1015\u103a/\u1021\u101b\u1031\u102c\u1004\u103a/background/foreground/objects/atmosphere) \u1000\u102d\u102f subject \u1014\u1032\u1037 auto \u1000\u102d\u102f\u1000\u103a\u104a \u1013\u102c\u1010\u103a\u1015\u102f\u1036\u1021\u1005\u1005\u103a\u101c\u102d\u102f\u104b",
    crd_wed: "\u2665 Wedding Pro Suite",
    crd_recipes: "Recipes \u2014 \u101e\u102d\u1019\u103a\u1038/\u1019\u103b\u103e\u101d\u1031",
    learn_lbl: "\ud83c\udf93 Learn Mode \u2014 \u1041\u1001\u103b\u1000\u103a = guide (\u1021\u101d\u102b)\u104a \u1042\u1001\u103b\u1000\u103a = prompt (\u1021\u1015\u103c\u102c)\u104a \u1043\u1001\u103b\u1000\u103a = RUN (\u1021\u1005\u102d\u1019\u103a\u1038)",
    guide_hint: "\u1011\u1015\u103a\u1014\u103e\u102d\u1015\u103a: \u1021\u101d\u102b \u2192 \u1021\u1015\u103c\u102c (prompt) \u2192 \u1021\u1005\u102d\u1019\u103a\u1038 (run) \u25b6",
    g_learn_next_prompt: "\u1011\u1015\u103a\u1014\u103e\u102d\u1015\u103a \u2192 PROMPT \u1021\u1010\u102d\u1021\u1000\u103b \u1015\u103c\u1019\u101a\u103a (\u1021\u1015\u103c\u102c)\u104b",
    g_learn_prompt_head: "\u1012\u102e\u1001\u101c\u102f\u1010\u103a \u1015\u102d\u102f\u1037\u1019\u101a\u1037\u103a PROMPT (\u1011\u1015\u103a\u1014\u103e\u102d\u1015\u103a = RUN):",
    g_learn_next_run: "\u1014\u1031\u102c\u1000\u103a\u1010\u1005\u103a\u1001\u103b\u1000\u103a \u1011\u1015\u103a\u1014\u103e\u102d\u1015\u103a \u2192 RUN (\u1021\u1005\u102d\u1019\u103a\u1038) generate \u101c\u102f\u1015\u103a\u1019\u101a\u103a\u104b",
    st_prompt_ready: "Prompt \u1021\u1006\u1004\u103a\u101e\u1004\u1037\u103a \u2014 \u1011\u1015\u103a\u1014\u103e\u102d\u1015\u103a (\u1021\u1005\u102d\u1019\u103a\u1038) run \u2713",
    g_step_doc: "\u1013\u102c\u1010\u103a\u1015\u102f\u1036\u1000\u102d\u102f Photoshop \u1019\u103e\u102c \u1021\u101b\u1004\u103a\u1016\u103d\u1004\u1037\u103a\u1015\u102b\u104b",
    g_step_ref1: "Reference \u1015\u102f\u1036\u1000\u102d\u102f Ref1 \u1011\u1032\u1010\u1004\u103a\u1015\u102b (IMAGE 2 \u1016\u103c\u1005\u103a\u1019\u101a\u103a)\u104b \u1012\u102f\u1010\u102d\u101a\u101c\u1030\u1021\u1010\u103d\u1000\u103a Ref2\u104b",
    g_step_target: "Target \u101b\u103d\u1031\u1038\u1015\u102b: Solo / Couple (Ref1 = \u1019\u102d\u1014\u103a\u1038\u1019\u104a Ref2 = \u101a\u1031\u102c\u1000\u103a\u103b\u102c\u1038) / Family\u104b",
    g_step_mkhair: "\u101c\u102d\u102f\u101b\u1004\u103a: Face Ops \u1021\u1015\u1031\u102b\u103a\u1000 \u2018Ref \u1019\u102d\u1010\u103a\u1000\u1015\u103a\u1000\u1030\u1038\u2019 / \u2018Ref \u1006\u1036\u1015\u1004\u103a\u101a\u1030\u2019 \u2713 \u1016\u103d\u1004\u1037\u103a\u1015\u102b\u104b",
    g_step_petal: "\u1015\u103d\u1004\u1037\u103a\u1001\u103b\u1015\u103a\u1021\u101b\u1031\u102c\u1004\u103a \u1021\u101b\u1004\u103a\u101b\u103d\u1031\u1038\u1015\u102b (auto = scene \u1014\u1032\u1037\u1000\u102d\u102f\u1000\u103a)\u104b",
    g_step_rest: "Full Color / B&W \u2713 \u101b\u103d\u1031\u1038\u1015\u102b\u104b",
    g_step_int: "Intensity slider \u1000\u103c\u102d\u102f\u1000\u103a\u101e\u101c\u102d\u102f\u1001\u103b\u102d\u1014\u103a\u1015\u102b\u104b",
    g_step_confirm: "\u1011\u1015\u103a\u1014\u103e\u102d\u1015\u103a\u1015\u102b: GUIDE (\u1021\u101d\u102b) \u2192 PROMPT (\u1021\u1015\u103c\u102c) \u2192 RUN (\u1021\u1005\u102d\u1019\u103a\u1038\u1000 generate \u101c\u102f\u1015\u103a\u101e\u100a\u103a)\u104b",
    g_cat_face: "FACE OP \u2014 reference \u1019\u103b\u1000\u103a\u1014\u103e\u102c\u1000\u102d\u102f \u1000\u102d\u102f\u1000\u103a\u100a\u102e\u101e\u1030\u1006\u102e \u1015\u103c\u1031\u102c\u1004\u103a\u1038\u1011\u100a\u1037\u103a\u1015\u1031\u1038\u1010\u101a\u103a \u2014 \u1000\u103b\u1014\u103a\u101e\u1030\u1010\u103d\u1031 \u1019\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u104b",
    g_cat_sub: "SUBJECT OP \u2014 reference \u101c\u1030\u1000\u102d\u102f \u1019\u1004\u103a\u1038 scene \u1011\u1032 \u1011\u100a\u1037\u103a/\u1015\u103c\u1031\u102c\u1004\u103a\u1038 \u2014 scene/frame \u1019\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u104b",
    g_cat_bgfg: "BG/FG OP \u2014 \u1014\u1031\u102c\u1000\u103a\u1001\u1036/\u1021\u101b\u103e\u1031\u1037\u1001\u1036\u1015\u1032 reference \u1014\u1032\u1037\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u1010\u101a\u103a\u104b",
    g_cat_lc: "LIGHT & COLOR OP \u2014 reference \u101b\u1032\u1037 \u1021\u101c\u1004\u103a\u1038\u1014\u1032\u1037 grade \u1000\u1030\u1038\u1010\u101a\u103a \u2014 \u101c\u1030 pixel-faithful\u104b",
    g_cat_dress: "DRESS OP \u2014 \u1021\u101d\u1010\u103a\u1015\u1032 reference \u1014\u1032\u1037\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u1010\u101a\u103a\u104b",
    g_cat_mkop: "MAKEUP OP \u2014 \u1019\u102d\u1010\u103a\u1000\u1015\u103a\u1015\u1032 reference \u1014\u1032\u1037\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u1010\u101a\u103a\u104b",
    g_cat_match: "MASTER MATCH \u2014 reference \u1015\u102f\u1036\u1021\u1010\u102d\u102f\u1004\u103a\u1038 \u1010\u1005\u103a\u1015\u102f\u1036\u1005\u1036\u1010\u100a\u103a\u1038 Match (\u1021\u1015\u1031\u102b\u103a\u1000 \u2713 \u101b\u103d\u1031\u1038)\u104b",
    g_cat_trail: "WEDDING TRAIL \u2014 luxury \u1019\u103c\u1000\u103a\u1001\u1004\u103a\u1038 + \u1015\u1014\u103a\u1038\u101c\u1019\u103a\u1038 \u2014 \u1019\u103b\u1000\u103a\u1014\u103e\u102c/pose/frame hard-lock\u104b",
    g_cat_veil: "FLYING VEIL \u2014 \u1012\u102e\u1021\u101b\u103e\u100a\u103a\u1014\u1032\u1037 \u1007\u102c\u1015\u101d\u102b\u101c\u103d\u1004\u1037\u103a\u1011\u100a\u1037\u103a \u2014 \u1019\u103b\u1000\u103a\u1014\u103e\u102c\u1019\u1016\u102f\u1036\u1038\u104b",
    g_cat_gown: "GOWN \u2014 \u101b\u103e\u102d\u1015\u103c\u102e\u1038\u101e\u102c\u1038\u1002\u102b\u101d\u1014\u103a\u101e\u1014\u1037\u103a + \u1012\u102e train \u1021\u101b\u103e\u100a\u103a\u104b",
    g_cat_petal: "FLYING PETALS \u2014 \u1012\u102e style \u1014\u1032\u1037 \u1015\u103d\u1004\u1037\u103a\u1001\u103b\u1015\u103a\u101c\u103d\u1004\u1037\u103a \u2014 \u1021\u101b\u1031\u102c\u1004\u103a\u1000 \u1021\u1015\u1031\u102b\u103a\u1000 swatch\u104b",
    g_cat_wedx: "WEDDING EXTRA \u2014 scene \u1014\u1032\u1037\u1000\u102d\u102f\u1000\u103a\u1010\u1032\u1037 element \u1011\u100a\u1037\u103a \u2014 \u1015\u1004\u103a\u1010\u102d\u102f\u1004\u103a lock\u104b",
    g_cat_canvas: "REPLACE (CANVAS) \u2014 \u1019\u1004\u103a\u1038\u101c\u1030\u1000\u102d\u102f reference scene \u1011\u1032\u1011\u100a\u1037\u103a \u2014 ref \u101c\u1030\u1010\u103d\u1031\u1016\u101a\u103a\u104b",
    g_cat_restore: "OLD PHOTO RESTORE \u2014 \u1015\u103b\u1000\u103a\u1005\u102e\u1038\u1010\u102c\u1015\u103c\u1004\u103a \u2014 \u1019\u1030\u101c\u1019\u103b\u1000\u103a\u1014\u103e\u102c 100% \u1019\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u104b",
    g_cat_generic: "PRESET \u2014 \u1012\u102e professional edit \u1000\u102d\u102f \u1019\u1004\u103a\u1038\u1015\u102f\u1036\u1015\u1031\u102b\u103a \u1021\u101c\u102f\u1015\u103a\u101c\u102f\u1015\u103a\u1019\u101a\u103a\u104b",
    g_gen: "GENERATE \u2014 prompt box (+ chains/keeps/camera) \u1000\u102d\u102f \u1019\u1004\u103a\u1038 document \u1015\u1031\u102b\u103a run\u104b",
    g_retouchbtn: "RETOUCH APPLY \u2014 slider \u1021\u102c\u1038\u101c\u102f\u1036\u1038\u1000\u102d\u102f \u1010\u1005\u103a\u1000\u103c\u102d\u1019\u103a\u1010\u100a\u103a\u1038 retouch\u104b",
    g_relightbtn: "LIGHTING GENERATE \u2014 3D diagram \u1021\u1010\u102d\u102f\u1004\u103a\u1038 \u1000\u103d\u1000\u103a\u1010\u102d\u1019\u102e\u1038\u1011\u100a\u1037\u103a\u104b",
    g_scene: "SCENE GENERATE \u2014 \u1011\u102f\u1010\u103a\u1011\u102c\u1038\u1010\u1032\u1037 prompt \u1021\u1010\u102d\u102f\u1004\u103a\u1038 scene \u1015\u103c\u1014\u103a\u1006\u1031\u102c\u1000\u103a \u2014 \u101c\u1030\u1019\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u104b",
    g_rmix: "REPLACE MIX \u2014 \u2713 \u1016\u103d\u1004\u1037\u103a\u1011\u102c\u1038\u1010\u1032\u1037\u1021\u1015\u102d\u102f\u1004\u103a\u1038\u1010\u103d\u1031\u1015\u1032 reference \u1000\u1014\u1031\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u104b",
    g_pipe: "RUN PIPELINE \u2014 \u1001\u103b\u102d\u1010\u103a\u1011\u102c\u1038\u1010\u1032\u1037 \u1021\u1006\u1004\u1037\u103a\u1010\u102d\u102f\u1004\u103a\u1038 \u1021\u1005\u1009\u103a\u101c\u102d\u102f\u1000\u103a run \u2014 \u101b\u101c\u1012\u103a\u1000 \u1014\u1031\u102c\u1000\u103a\u1010\u1005\u103a\u1006\u1004\u1037\u103a input\u104b",
    ro_faceRep: "Face Replace",
    ro_faceSwap: "Face Swap",
    ro_bgRep: "BG Replace",
    ro_bgSwap: "BG Swap",
    ro_fgRep: "FG Replace",
    ro_bg_note: "Doc = subject \u00b7 Ref1 = scene \u1021\u101e\u1005\u103a\u104b Target (Solo/Couple/Family) \u1000 \u1018\u101a\u103a\u101e\u1030 \u1011\u102c\u1038\u1019\u101c\u1032 \u101b\u103d\u1031\u1038\u104b",
    ro_bg_frame: "Frame & composition \u1011\u102c\u1038\u1019\u100a\u103a",
    ro_bg_light: "Subject light/color \u1019\u1011\u102d",
    ro_subSwap: "Subject Swap",
    ro_lcRef: "L&C Reference",
    ro_lcCopy: "L&C Copy-Paste",
    ro_dressRef: "Dress Reference",
    ro_dressRep: "Dress Replace",
    ro_mkCopy: "Makeup Copy",
    ro_matchBtn: "\u2605 MASTER MATCH",
    grp_retouch: "Skin Retouch Presets",
    lbl_intensity: "\u1015\u103c\u1004\u103a\u1038\u1021\u102c\u1038",
    p_evoto: "Evoto Style",
    p_meitu: "Meitu Style",
    auto_place: "\u101b\u101c\u1012\u103a\u1000\u102d\u102f Photoshop \u1011\u1032 layer \u1021\u101e\u1005\u103a\u1021\u1016\u103c\u1005\u103a \u1021\u101c\u102d\u102f\u1021\u101c\u103b\u1031\u102c\u1000\u103a\u1011\u100a\u103a",
    sec_retouchpro: "Retouch Pro \u2014 Sliders",
    rt_skin: "Skin (\u1021\u101e\u102c\u1038\u1021\u101b\u1031)",
    rt_faceai: "Face AI",
    rt_hair: "\u1006\u1036\u1015\u1004\u103a (Hair)",
    rt_dress: "\u1021\u101d\u1010\u103a\u1021\u1005\u102c\u1038 (Dress)",
    rt_bg: "\u1014\u1031\u102c\u1000\u103a\u1001\u1036 (Background)",
    rt_smooth: "\u1021\u101e\u102c\u1038\u1001\u103b\u1031\u102c (Smooth)",
    rt_acne: "Acne / \u1010\u1004\u103a\u1038\u1010\u102d\u1015\u103a",
    rt_spots: "\u1021\u1019\u1032\u1005\u1000\u103a\u1016\u103b\u1031\u102c\u1000\u103a",
    rt_wrinkle: "\u1021\u101b\u1031\u1038\u1021\u1000\u103c\u1031\u102c\u1004\u103a\u1038",
    rt_tone: "\u1016\u103c\u1030 / \u100a\u102d\u102f",
    rt_glow: "Glow",
    rt_reshape: "AI Reshape",
    rt_lash: "\u1019\u103b\u1000\u103a\u1010\u1031\u102c\u1004\u103a",
    rt_brow: "\u1019\u103b\u1000\u103a\u1001\u102f\u1036\u1038",
    rt_lipsmooth: "\u1014\u103e\u102f\u1010\u103a\u1001\u1019\u103a\u1038\u1001\u103b\u1031\u102c",
    rt_lipcolor: "\u1014\u103e\u102f\u1010\u103a\u1001\u1019\u103a\u1038\u1014\u102e \u1021\u101b\u1031\u102c\u1004\u103a",
    rt_lenscolor: "\u1019\u103b\u1000\u103a\u1000\u1015\u103a\u1019\u103e\u1014\u103a \u1021\u101b\u1031\u102c\u1004\u103a",
    rt_hairstray: "\u1006\u1036\u1015\u1004\u103a\u1021\u1005 \u101b\u103e\u1004\u103a\u1038",
    rt_hairsmooth: "\u1006\u1036\u1015\u1004\u103a Smooth",
    rt_hairshine: "\u1006\u1036\u1015\u1004\u103a D&B \u1010\u1031\u102c\u1000\u103a\u1015",
    rt_dresssmooth: "\u1021\u101d\u1010\u103a Smooth",
    rt_dressedge: "\u1021\u1014\u102c\u1038\u101e\u1010\u103a \u101b\u103e\u1004\u103a\u1038",
    rt_dresswrinkle: "\u1021\u1010\u103d\u1014\u103a\u1037\u1016\u103b\u1031\u102c\u1000\u103a",
    rt_dresstexture: "Texture \u1015\u103c\u1014\u103a\u1016\u1031\u102c\u103a",
    rt_bgsmooth: "\u1014\u1031\u102c\u1000\u103a\u1001\u1036 \u1001\u103b\u1031\u102c/\u101b\u103e\u1004\u103a\u1038",
    rt_bgcolor: "\u1014\u1031\u102c\u1000\u103a\u1001\u1036 \u1021\u101b\u1031\u102c\u1004\u103a",
    rt_bgrecolor: "\u1014\u1031\u102c\u1000\u103a\u1001\u1036\u1021\u101b\u1031\u102c\u1004\u103a \u1001\u103b\u1031\u102c",
    rt_shape: "Reshape Pro (\u1019\u103b\u1000\u103a\u1014\u103e\u102c + \u1000\u102d\u102f\u101a\u103a)",
    rt_teeth: "\u101e\u103d\u102c\u1038\u1016\u103c\u1030",
    rt_eyewhite: "\u1019\u103b\u1000\u103a\u101c\u102f\u1036\u1038\u1021\u1010\u103d\u1004\u103a\u1038\u101e\u102c\u1038\u1016\u103c\u1030",
    rt_faceslim: "\u1019\u103b\u1000\u103a\u1014\u103e\u102c\u101e\u103d\u101a\u103a",
    rt_jaw: "\u1019\u1031\u1038\u101b\u102d\u102f\u1038",
    rt_chin: "\u1019\u1031\u1038\u1005\u1031\u1037",
    rt_nosesize: "\u1014\u103e\u102c\u1001\u1031\u102b\u1004\u103a\u1038 Size",
    rt_eyesize: "\u1019\u103b\u1000\u103a\u101c\u102f\u1036\u1038 Size",
    rt_lipfull: "\u1014\u103e\u102f\u1010\u103a\u1001\u1019\u103a\u1038\u1016\u1031\u102c\u1004\u103a\u1038",
    rt_waist: "\u1001\u102b\u1038\u101e\u103d\u101a\u103a",
    rt_bodyslim: "\u1000\u102d\u102f\u101a\u103a\u101e\u103d\u101a\u103a",
    rt_shoulder: "\u1015\u1001\u102f\u1036\u1038",
    rt_hip: "\u1010\u1004\u103a\u1015\u102b\u101e\u103d\u101a\u103a",
    rt_leglen: "\u1001\u103c\u1031\u1011\u1031\u102c\u1000\u103a\u101b\u103e\u100a\u103a",
    rt_armslim: "\u101c\u1000\u103a\u1019\u1031\u102c\u1004\u103a\u1038\u101e\u103d\u101a\u103a",
    rt_dressfit: "\u1021\u101d\u1010\u103a\u1021\u1010\u1004\u103a\u1038\u1021\u101c\u103b\u1031\u102c\u1037",
    rt_dressclean: "\u1021\u101d\u1010\u103a\u101e\u1014\u1037\u103a\u101b\u103e\u1004\u103a\u1038",
    rt_dresscolorpure: "\u1021\u101d\u1010\u103a\u1021\u101b\u1031\u102c\u1004\u103a\u101e\u1014\u1037\u103a",
    rt_bodygrp: "Body Skin Pro (\u1000\u102d\u102f\u101a\u103a\u1021\u101e\u102c\u1038)",
    rt_bodysmooth: "\u1000\u102d\u102f\u101a\u103a\u1021\u101e\u102c\u1038 \u1001\u103b\u1031\u102c",
    rt_bodyblemish: "\u1000\u102d\u102f\u101a\u103a\u1021\u1005\u1000\u103a\u1016\u101a\u103a",
    rt_bodytone: "\u1000\u102d\u102f\u101a\u103a\u1021\u101b\u1031\u102c\u1004\u103a\u100a\u102e",
    rt_bodyglow: "\u1000\u102d\u102f\u101a\u103a Glow",
    rt_bodyhairrm: "\u1000\u102d\u102f\u101a\u103a\u1021\u1019\u103d\u103e\u1031\u1038\u101c\u103b\u103e\u1031\u102c\u1037",
    rt_hairvolume: "\u1006\u1036\u1015\u1004\u103a Volume",
    rt_hairgloss: "\u1006\u1036\u1015\u1004\u103a Gloss",
    rt_hairfill: "\u1006\u1036\u1015\u1004\u103a\u1016\u103c\u100a\u1037\u103a",
    wp_h_trail: "\u2665 Wedding \u2014 \u1015\u1014\u103a\u1038\u101c\u1019\u103a\u1038 (Luxury Grass)",
    wp_h_veil: "\u2665 Wedding \u2014 \u1007\u102c\u1015\u101d\u102b \u1021\u101c\u103d\u1004\u1037\u103a",
    wp_h_gown: "\u2665 Wedding \u2014 \u1002\u102b\u101d\u1014\u103a\u101e\u1014\u1037\u103a + Train",
    wp_h_petal: "\u2665 Wedding \u2014 \u1015\u103d\u1004\u1037\u103a\u1001\u103b\u1015\u103a\u101c\u103d\u1004\u1037\u103a",
    wp_h_extra: "\u2665 Wedding \u2014 \u1019\u103c\u1004\u103a\u1038\u1016\u103c\u1030 \u00b7 \u101b\u1031 \u00b7 Mood",
    wp_note: "Face ID / pose / frame / dress design \u1010\u103d\u1031 hard-lock \u2014 \u1015\u103c\u1031\u102c\u1011\u102c\u1038\u1010\u1032\u1037\u1021\u1015\u102d\u102f\u1004\u103a\u1038\u1015\u1032\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u1019\u101a\u103a\u104b",
    wp_petalcolor: "\u1015\u103d\u1004\u1037\u103a\u1001\u103b\u1015\u103a\u1021\u101b\u1031\u102c\u1004\u103a (auto = scene \u1014\u1032\u1037\u1000\u102d\u102f\u1000\u103a)",
    wp_trail_c: "\u1015\u1014\u103a\u1038\u1021\u101b\u1031\u102c\u1004\u103a",
    wp_trail_go: "\u25b6 \u1015\u1014\u103a\u1038\u101c\u1019\u103a\u1038",
    wp_veil_c: "\u1007\u102c\u1015\u101d\u102b \u1021\u101b\u103e\u100a\u103a",
    wp_veil_go: "\u25b6 Veil \u101c\u103d\u1004\u1037\u103a",
    wp_gown_c: "Train \u1021\u101b\u103e\u100a\u103a",
    wp_gown_go: "\u25b6 Gown Clean + Train",
    wp_pet_c: "\u1015\u103d\u1004\u1037\u103a\u1001\u103b\u1015\u103a style",
    wp_pet_go: "\u25b6 \u1015\u1014\u103a\u1038\u1015\u103d\u1004\u1037\u103a\u101c\u103d\u1004\u1037\u103a",
    wp_extra_c: "Extra",
    wp_extra_go: "\u25b6 Add Extra",
    btn_apply_rt: "Retouch Apply \u101c\u102f\u1015\u103a\u1019\u101a\u103a",
    btn_reset: "Reset",
    rt_none: "Retouch slider / \u1021\u101b\u1031\u102c\u1004\u103a \u1010\u1005\u103a\u1001\u102f\u1021\u101b\u1004\u103a\u101b\u103d\u1031\u1038\u1015\u102b",
    tab_setup: "Setup",
    tab_prompt: "Studio",
    tab_presets: "Presets",
    recent_lbl: "\u1019\u1000\u103c\u102c\u101e\u1031\u1038\u1019\u102e prompt \u1019\u103b\u102c\u1038\u2026",
    tab_retouch: "Retouch",
    tab_aitools: "AI Tools",
    cap_warn: "Prompt box \u1000\u102d\u102f Photoshop \u1000 \u1000\u1014\u1037\u103a\u101e\u1010\u103a\u1011\u102c\u1038:",
    cleanup_note: "\u1021\u1019\u103e\u1014\u103a\u1001\u103c\u1005\u103a\u1011\u102c\u1038\u1010\u102c\u1010\u103d\u1031 Generate / Preset \u1010\u102d\u102f\u1004\u103a\u1038\u1019\u103e\u102c \u1021\u101c\u102d\u102f \u1010\u103d\u1032\u1015\u102b\u101e\u103d\u102c\u1038\u1019\u101a\u103a\u104b",
    btn_generate: "GENERATE",
    st_ready: "\u1021\u101e\u1004\u103a\u1037\u1016\u103c\u1005\u103a\u1015\u102b\u1015\u103c\u102e",
    st_capture: "Document \u1000\u102d\u102f \u1016\u1019\u103a\u1038\u101a\u1030\u1014\u1031\u101e\u100a\u103a",
    st_gen: "Generate \u101c\u102f\u1015\u103a\u1014\u1031\u101e\u100a\u103a\u2026",
    st_place: "Photoshop \u1011\u1032 \u1011\u100a\u103a\u1014\u1031\u101e\u100a\u103a\u2026",
    st_placed_masked: "Layer + Mask group \u1014\u1032\u1037 \u1011\u100a\u103a\u1015\u103c\u102e\u1038\u1015\u102b\u1015\u103c\u102e \u2014 \u1019\u1030\u101b\u1004\u103a\u1038\u1015\u102f\u1036 \u1019\u1015\u103b\u1000\u103a\u1015\u102b \u2713",
    st_placed_plain: "\u101b\u102d\u102f\u1038\u101b\u102d\u102f\u1038 layer \u1021\u1016\u103c\u1005\u103a \u1011\u100a\u103a\u1015\u103c\u102e\u1038\u1015\u102b\u1015\u103c\u102e (\u1012\u102e host \u1019\u103e\u102c mask/group \u1019\u101b\u1014\u102d\u102f\u1004\u103a\u1015\u102b)",
    stage_queued: "\u1010\u1014\u103a\u1038\u1005\u102e\u1014\u1031\u101e\u100a\u103a",
    stage_uploading: "\u1015\u102f\u1036\u1010\u1004\u103a\u1014\u1031\u101e\u100a\u103a",
    stage_generating: "\u1016\u1014\u103a\u1010\u102e\u1038\u1014\u1031\u101e\u100a\u103a",
    stage_downloading: "\u101b\u101c\u1012\u103a\u1006\u103d\u1032\u101a\u1030\u1014\u1031\u101e\u100a\u103a",
    stage_placing: "Photoshop \u1011\u1032 \u1011\u100a\u103a\u1014\u1031\u101e\u100a\u103a",
    st_done: "\u1015\u103c\u102e\u1038\u1015\u102b\u1015\u103c\u102e \u2713",
    st_err: "Error",
    st_no_doc: "Document \u1016\u103d\u1004\u103a\u1037\u1011\u102c\u1038\u1001\u103c\u1004\u103a\u1038\u1019\u101b\u103e\u102d\u1015\u102b \u2014 \u1015\u102f\u1036\u1021\u101b\u1004\u103a\u1016\u103d\u1004\u103a\u1037\u1015\u102b",
    st_no_prompt: "Prompt \u1019\u101b\u1031\u1038\u101b\u101e\u1031\u1038\u1015\u102b",
    need_ref: "\u1012\u102e preset \u1021\u1010\u103d\u1000\u103a Reference \u1015\u102f\u1036 (slot 1) \u101c\u102d\u102f\u1015\u102b\u1010\u101a\u103a",
    st_new_doc: "\u101b\u101c\u1012\u103a\u1000\u102d\u102f document \u1021\u101e\u1005\u103a\u1021\u1016\u103c\u1005\u103a \u1016\u103d\u1004\u103a\u1037\u1015\u103c\u102e\u1038 \u2713",
    sec_preview: "\u1021\u1000\u103c\u102d\u102f\u1000\u103c\u100a\u1037\u103a \u2014 Before / After",
    before: "BEFORE",
    after: "AFTER",
    btn_place: "Photoshop \u1011\u1032\u1011\u100a\u103a",
    btn_saveas: "\u1021\u1016\u103c\u1005\u103a \u101e\u102d\u1019\u103a\u1038\u2026",
    st_saved: "Save \u1015\u103c\u102e\u1038 \u2713",
    sec_diag: "\u1005\u1014\u1005\u103a\u1005\u1005\u103a\u1006\u1031\u1038 \u1005\u1005\u103a\u1006\u1031\u1038\u1001\u103c\u1004\u103a\u1038",
    sec_log: "\u101c\u102f\u1015\u103a\u1006\u1031\u102c\u1004\u103a\u1019\u103e\u1010\u103a\u1010\u1019\u103a\u1038",
    btn_diag: "\u1005\u1005\u103a\u1006\u1031\u1038\u1015\u102b",
    btn_copylog: "Log \u1000\u1030\u1038",
    btn_clearlog: "\u101b\u103e\u1004\u103a\u1038",
    diag_host: "Photoshop \u1021\u1000\u103a\u1015\u103a",
    diag_uxp: "UXP \u1005\u103d\u1019\u103a\u1038\u101b\u100a\u103a",
    diag_gem: "Gemini API key",
    diag_oai: "OpenAI API key",
    diag_doc: "\u1016\u103d\u1004\u103a\u1011\u102c\u1038\u101e\u1031\u102c document",
    diag_set: "\u1011\u100a\u103a\u1015\u103c\u102e\u1038",
    diag_unset: "\u1019\u1011\u100a\u103a\u101b\u101e\u1031\u1038",
    diag_open: "\u1016\u103d\u1004\u103a\u1011\u102c\u1038",
    diag_none: "\u1019\u1016\u103d\u1004\u103a\u1037\u101b\u101e\u1031\u1038",
    diag_missing: "\u1015\u103b\u1031\u102c\u1000\u103a\u1014\u1031",
    diag_done: "\u1005\u1005\u103a\u1006\u1031\u1038\u1001\u103c\u1004\u103a\u1038 \u1015\u103c\u102e\u1038 \u2713",
    diag_lib: "Reference Library",
    diag_lib_open: "Folder \u1016\u103d\u1004\u103a\u1037\u1014\u102d\u102f\u1004\u103a\u1019\u103e\u102f",
    sec_reflib: "Reference \u1015\u102f\u1036 Library",
    reflib_note: "\u1000\u103c\u102d\u102f\u1000\u103a\u1014\u103e\u1005\u103a\u101e\u1000\u103a\u1010\u1032\u1037 reference \u1015\u102f\u1036\u1010\u103d\u1031\u101b\u103e\u102d\u1010\u1032\u1037 folder \u1000\u102d\u102f \u1010\u1005\u103a\u1001\u102b\u101b\u103d\u1031\u1038\u1015\u102b \u2014 Browse \u1000 \u1019\u103e\u1010\u103a\u1011\u102c\u1038\u1015\u102b\u1010\u101a\u103a\u104b",
    btn_browse: "Browse",
    lib_choose: "Folder \u101b\u103d\u1031\u1038",
    lib_open: "Folder \u1016\u103d\u1004\u103a\u1037",
    lib_change: "Folder \u1015\u103c\u1031\u102c\u1004\u103a\u1038",
    lib_reset: "Reset",
    lib_rescan: "\u1015\u103c\u1014\u103a\u1005\u1005\u103a",
    lib_current: "\u101c\u1000\u103a\u101b\u103e\u102d Folder",
    lib_found: "\u1010\u103d\u1031\u1037\u101b\u103e\u102d\u1015\u102f\u1036",
    lib_status: "\u1021\u1001\u103c\u1031\u1021\u1014\u1031",
    lib_lastscan: "\u1014\u1031\u102c\u1000\u103a\u1006\u102f\u1036\u1038\u1005\u1005\u103a",
    lib_images: "\u1015\u102f\u1036",
    lib_connected: "\u1001\u103b\u102d\u1010\u103a\u1006\u1000\u103a\u1015\u103c\u102e\u1038",
    lib_not_config: "\u1019\u101e\u1010\u103a\u1019\u103e\u1010\u103a\u101b\u101e\u1031\u1038",
    lib_perm_lost: "\u1001\u103d\u1004\u103a\u1037\u1015\u103c\u102f\u1001\u103b\u1000\u103a\u1015\u103b\u1031\u102c\u1000\u103a \u2014 \u1015\u103c\u1014\u103a\u101b\u103d\u1031\u1038\u1015\u102b",
    lib_none: "(folder \u1019\u101b\u103d\u1031\u1038\u101b\u101e\u1031\u1038)",
    lib_copy_only: "path \u1000\u1030\u1038\u101b\u102f\u1036\u101e\u102c",
    lib_choose_msg: "\u101e\u1004\u103a\u1037 HNK Reference \u1015\u102f\u1036 Library folder \u1000\u102d\u102f \u101b\u103d\u1031\u1038\u1015\u102b\u104b",
    lib_scanning: "Library \u1005\u1005\u103a\u1014\u1031\u101e\u100a\u103a\u2026",
    lib_scan_done: "\u1015\u103c\u1014\u103a\u1005\u1005\u103a\u1001\u103c\u1004\u103a\u1038 \u1015\u103c\u102e\u1038 \u2713",
    lib_reset_done: "Library reset \u2713",
    lib_path_copied: "Path \u1000\u1030\u1038\u1015\u103c\u102e\u1038",
    lib_unsupported: "\u1019\u1015\u1036\u1037\u1015\u102d\u102f\u1038\u101e\u1031\u102c \u1015\u102f\u1036\u1021\u1019\u103b\u102d\u102f\u1038\u1021\u1005\u102c\u1038",
    lib_restore_fail: "Reference \u1000\u102d\u102f \u1015\u103c\u1014\u103a\u1019\u101b\u1014\u102d\u102f\u1004\u103a\u1015\u102b",
    on: "\u1016\u103d\u1004\u1037\u103a",
    off: "\u1015\u102d\u1010\u103a",
    ai_home_title: "\u1018\u102c\u1016\u1014\u103a\u1010\u102e\u1038\u1001\u103b\u1004\u103a\u101c\u1032\u104b",
    ai_free_generate: "\u101c\u103d\u1010\u103a\u101c\u1015\u103a\u1016\u1014\u103a\u1010\u102e\u1038",
    ai_free_sub: "\u1000\u102d\u102f\u101a\u103a\u1015\u102d\u102f\u1004\u103a prompt \u101b\u1031\u1038\u1015\u102b",
    ai_more_tools: "\u1014\u1031\u102c\u1000\u103a\u1011\u1015\u103a \u1000\u102d\u101b\u102d\u101a\u102c\u1019\u103b\u102c\u1038",
    ai_more_sub: "Water Edit \u00b7 Text/Logo \u00b7 workflow \u1021\u102c\u1038\u101c\u102f\u1036\u1038",
    ai_nav_home: "\u1015\u1004\u103a\u1019",
    ai_nav_tools: "\u1000\u102d\u101b\u102d\u101a\u102c",
    ai_history: "\u1019\u103e\u1010\u103a\u1010\u1019\u103a\u1038",
    ai_no_gen: "\u1016\u1014\u103a\u1010\u102e\u1038\u1011\u102c\u1038\u1010\u102c \u1019\u101b\u103e\u102d\u101e\u1031\u1038\u1015\u102b\u104b",
    ai_rerun: "\u1015\u103c\u1014\u103a\u101c\u102f\u1015\u103a",
    ai_reuse: "\u1015\u103c\u1014\u103a\u101e\u102f\u1036\u1038",
    ai_clear_hist: "\u1019\u103e\u1010\u103a\u1010\u1019\u103a\u1038 \u101b\u103e\u1004\u103a\u1038\u101c\u1004\u103a\u1038",
    ai_images: "\u1015\u102f\u1036\u1019\u103b\u102c\u1038",
    ai_add_ref: "+ Reference \u1015\u102f\u1036 \u1011\u100a\u1037\u103a",
    ai_prompt: "PROMPT",
    ai_prompt_ph: "\u1018\u102c\u101c\u102d\u102f\u1001\u103b\u1004\u103a\u101c\u1032 \u101b\u1031\u1038\u1015\u102b\u2026",
    ai_model_output: "MODEL \u1014\u103e\u1004\u1037\u103a OUTPUT",
    ai_model_note: "AI Tools \u1019\u103e\u102c \u1000\u102d\u102f\u101a\u103a\u1015\u102d\u102f\u1004\u103a model/size setting \u101b\u103e\u102d\u1015\u102b\u1010\u101a\u103a \u2014 Setup \u1014\u1032\u1037 Create tab \u1010\u103d\u1031\u1014\u1032\u1037 \u101e\u102e\u1038\u1001\u103c\u102c\u1038\u1015\u102b\u104b",
    ai_auto_model: "Model \u1021\u101c\u102d\u102f\u1021\u101c\u103b\u1031\u102c\u1000\u103a",
    ai_wf_tools: "Workflow \u1000\u102d\u101b\u102d\u101a\u102c\u1019\u103b\u102c\u1038",
    ai_direct_gen: "\u1010\u102d\u102f\u1000\u103a\u101b\u102d\u102f\u1000\u103a \u1016\u1014\u103a\u1010\u102e\u1038",
    ai_identity_lock: "\u1019\u103b\u1000\u103a\u1014\u103e\u102c \u101c\u1031\u102c\u1037\u1001\u103a",
    ai_ref_transfer: "Reference \u1000\u1030\u1038\u101a\u1030",
    ai_req_images: "\u101c\u102d\u102f\u1021\u1015\u103a\u101e\u1031\u102c \u1015\u102f\u1036\u1019\u103b\u102c\u1038",
    ai_opt_images: "\u1011\u100a\u1037\u103a\u101c\u100a\u103a\u1038\u101b\u101e\u1031\u102c \u1015\u102f\u1036\u1019\u103b\u102c\u1038",
    ai_model_lbl: "Model",
    ai_prepare: "\u1015\u103c\u1004\u103a\u1006\u1004\u103a (\u1016\u103d\u1004\u1037\u103a\u1015\u103c\u102e\u1038 \u1005\u1005\u103a)",
    ai_lib_bridge_off: "\u1012\u102e host \u1019\u103e\u102c Library \u1001\u103b\u102d\u1010\u103a\u1006\u1000\u103a\u1019\u103e\u102f \u1019\u101b\u1014\u102d\u102f\u1004\u103a\u1015\u102b\u104b",
    ai_lib_pick_first: "Presets tab \u2192 Visual Library \u1000\u1014\u1031 \u1015\u102f\u1036\u1010\u1005\u103a\u1015\u102f\u1036 \u1021\u101b\u1004\u103a\u101b\u103d\u1031\u1038\u1015\u102b\u104b",
    ai_lib_load_fail: "Library \u1015\u102f\u1036\u1000\u102d\u102f \u1019\u1016\u103d\u1004\u1037\u103a\u1014\u102d\u102f\u1004\u103a\u1015\u102b\u104b",
    ai_missing: "\u1019\u101b\u103e\u102d\u101e\u1031\u1038",
    ai_add: "\u1011\u100a\u1037\u103a",
    ai_library: "Library",
    ai_rh_sec: "RunningHub \u2014 model endpoint \u1011\u100a\u1037\u103a\u101b\u1014\u103a (Advanced \u2014 \u1019\u1011\u100a\u1037\u103a\u101c\u100a\u103a\u1038\u101b)",
    ai_rh_note: "\u1015\u102b\u1015\u103c\u102e\u1038\u101e\u102c\u1038 model \u1010\u103d\u1031\u1000 \u1021\u1015\u1031\u102b\u103a\u1000 key \u1014\u1032\u1037 \u1021\u101c\u102f\u1015\u103a\u101c\u102f\u1015\u103a\u1015\u102b\u1015\u103c\u102e \u2014 \u1018\u102c\u1019\u103e\u101c\u102f\u1015\u103a\u1005\u101b\u102c \u1019\u101c\u102d\u102f\u1015\u102b\u104b model \u1010\u1005\u103a\u1001\u102f\u1000 \"not connected\" \u1015\u103c\u1014\u1031\u101b\u1004\u103a (endpoint path \u1019\u101e\u1031\u1001\u103b\u102c\u101e\u1031\u1038\u101c\u102d\u102f\u1037) RunningHub API docs \u1000\u1014\u1031 path \u1000\u102d\u102f \u1000\u1030\u1038\u1015\u103c\u102e\u1038 \u1012\u102e\u1019\u103e\u102c \u1011\u100a\u1037\u103a\u1015\u102b\u104b",
    ai_rh_save: "\u1012\u102e model \u101b\u1032\u1037 endpoint \u101e\u102d\u1019\u103a\u1038",
    ai_test_conn: "\u1001\u103b\u102d\u1010\u103a\u1006\u1000\u103a\u1019\u103e\u102f \u1005\u1005\u103a",
    ai_oai_sec: "OpenAI (Advanced \u2014 \u1019\u1011\u100a\u1037\u103a\u101c\u100a\u103a\u1038\u101b)",
    ai_oai_note: "RunningHub Enterprise \u1021\u1005\u102c\u1038 (\u101e\u102d\u102f\u1037) \u1021\u1010\u1030\u1010\u1030 \u1000\u102d\u102f\u101a\u103a\u1015\u102d\u102f\u1004\u103a OpenAI API key \u1014\u1032\u1037 GPT Image 2 \u101e\u102f\u1036\u1038\u1014\u102d\u102f\u1004\u103a\u1015\u102b\u1010\u101a\u103a\u104b",
    ai_save_verify: "\u101e\u102d\u1019\u103a\u1038\u1015\u103c\u102e\u1038 \u1005\u1005\u103a",
    ai_settings: "\u1006\u1000\u103a\u1010\u1004\u103a",
    ai_add_layers: "\u101b\u101c\u1012\u103a\u1000\u102d\u102f Layer \u1021\u101e\u1005\u103a\u1021\u1016\u103c\u1005\u103a \u1011\u100a\u1037\u103a",
    ai_done: "\u1015\u103c\u102e\u1038\u1015\u102b\u1015\u103c\u102e\u104b",
    ai_result_ready: "\u101b\u101c\u1012\u103a \u1021\u101e\u1004\u1037\u103a\u1016\u103c\u1005\u103a\u1015\u102b\u1015\u103c\u102e\u104b",
    ai_ready_nolayer: "\u101b\u101c\u1012\u103a \u1021\u101e\u1004\u1037\u103a\u1016\u103c\u1005\u103a\u1015\u102b\u1015\u103c\u102e (Layer \u1021\u1016\u103c\u1005\u103a\u1011\u100a\u1037\u103a\u1001\u103c\u1004\u103a\u1038\u1000\u102d\u102f Settings \u1019\u103e\u102c \u1015\u102d\u1010\u103a\u1011\u102c\u1038\u1015\u102b\u1010\u101a\u103a)\u104b",
    ai_place_failed: "\u1016\u1014\u103a\u1010\u102e\u1038\u1015\u103c\u102e\u1038\u1015\u102b\u1015\u103c\u102e\u104a \u1012\u102b\u1015\u1031\u1019\u101a\u1037\u103a Photoshop \u1011\u1032 \u1011\u100a\u1037\u103a\u104d \u1019\u101b\u1015\u102b\u104b",
    ai_place_failed_fix: "Document \u1010\u1005\u103a\u1001\u102f \u1016\u103d\u1004\u1037\u103a\u1015\u103c\u102e\u1038 History \u1000\u1014\u1031 \u1015\u103c\u1014\u103a\u101c\u102f\u1015\u103a\u1015\u102b\u104b",
    ai_placed_masked: "\u201c{name}\u201d group \u1011\u1032 Layer + Mask \u1021\u1016\u103c\u1005\u103a \u1011\u100a\u1037\u103a\u1015\u103c\u102e\u1038\u1015\u102b\u1015\u103c\u102e \u2014 \u1019\u1030\u101b\u1004\u103a\u1038\u1015\u102f\u1036 \u1019\u1015\u103b\u1000\u103a\u1015\u102b\u104b",
    ai_placed_group: "\u201c{name}\u201d group \u1011\u1032 Layer \u1021\u101e\u1005\u103a\u1021\u1016\u103c\u1005\u103a \u1011\u100a\u1037\u103a\u1015\u103c\u102e\u1038\u1015\u102b\u1015\u103c\u102e (\u1012\u102e host \u1019\u103e\u102c mask \u1019\u101b\u1014\u102d\u102f\u1004\u103a\u1015\u102b)\u104b",
    ai_placed_plain: "Layer \u1021\u101e\u1005\u103a\u1021\u1016\u103c\u1005\u103a \u1011\u100a\u1037\u103a\u1015\u103c\u102e\u1038\u1015\u102b\u1015\u103c\u102e (\u1012\u102e host \u1019\u103e\u102c group/mask \u1019\u101b\u1014\u102d\u102f\u1004\u103a\u1015\u102b)\u104b",
    ai_start_fail: "AI Tools \u1005\u1010\u1004\u103a\u104d \u1019\u101b\u1015\u102b",
    pgb_setup: "\u1001\u101b\u102e\u1038\u1021\u1005 \u2014 API Key \u00b7 Model \u00b7 Library \u1015\u103c\u1004\u103a\u1006\u1004\u103a\u1015\u102b",
    pgb_studio: "Prompt \u2192 Reference \u2192 Generate \u2014 \u1015\u101b\u102d\u102f\u1021\u101c\u102f\u1015\u103a\u1005\u1009\u103a \u1010\u1005\u103a\u1006\u1000\u103a\u1010\u100a\u103a\u1038",
    pgb_create: "\u1005\u102d\u1010\u103a\u1000\u1030\u1038\u1019\u103e \u1021\u1014\u102f\u1015\u100a\u102c\u1006\u102e \u2014 Reference 4 \u1000\u103d\u1000\u103a \u00b7 Variations",
    pgb_presets: "Visual Library 366 \u00b7 Scenes \u00b7 Wedding \u00b7 Style Chains",
    pgb_aitools: "\u1010\u1005\u103a\u1001\u103b\u1000\u103a\u1014\u103e\u102d\u1015\u103a Professional \u2014 Nano Banana \u00b7 GPT Image \u00b7 RunningHub",
    pgb_retouch: "\u1021\u101e\u102c\u1038\u1021\u101b\u1031 \u00b7 \u1019\u103b\u1000\u103a\u1014\u103e\u102c \u00b7 \u1000\u102d\u102f\u101a\u103a\u101f\u1014\u103a \u2014 Professional Sliders",
    wf_sum_bg_replace: "\u1014\u1031\u102c\u1000\u103a\u1001\u1036\u1000\u102d\u102f \u1021\u1005\u102c\u1038\u1011\u102d\u102f\u1038",
    wf_sum_reference_transfer: "\u101e\u1004\u1037\u103a\u1015\u102f\u1036\u1011\u1032\u1000 \u101c\u1030\u1000\u102d\u102f reference scene \u1011\u1032 \u1011\u100a\u1037\u103a",
    wf_sum_master_bgfg_replace: "Scene \u1011\u1032\u1000 \u101c\u1030\u1000\u102d\u102f \u1016\u101a\u103a\u104a bg/fg \u1015\u103c\u1014\u103a\u1010\u100a\u103a\u104a \u101e\u1004\u1037\u103a\u101c\u1030\u1000\u102d\u102f \u1011\u100a\u1037\u103a",
    wf_sum_subject_face: "\u101c\u1030 (\u101e\u102d\u102f\u1037) \u1019\u103b\u1000\u103a\u1014\u103e\u102c\u1000\u102d\u102f base \u1015\u102f\u1036\u1015\u1031\u102b\u103a \u1000\u1030\u1038\u1011\u100a\u1037\u103a",
    wf_sum_retouch: "\u101e\u1018\u102c\u101d\u1000\u103b\u1000\u103b \u1015\u102f\u1036\u101b\u102d\u1015\u103a \u1019\u103d\u1019\u103a\u1038\u1019\u1036",
    wf_sum_upscale: "\u1021\u101e\u1031\u1038\u1005\u102d\u1010\u103a \u1019\u1015\u103b\u1000\u103a\u1005\u1031\u1018\u1032 \u1001\u103b\u1032\u1037",
    wf_sum_object_edit: "\u1021\u101b\u102c\u101d\u1010\u1039\u1011\u102f\u1019\u103b\u102c\u1038 \u1016\u101a\u103a\u104a \u101c\u1032\u104a \u1011\u100a\u1037\u103a",
    wf_sum_water_edit: "\u101b\u1031\u1014\u103e\u1004\u1037\u103a \u101b\u1031\u102c\u1004\u103a\u1015\u103c\u1014\u103a\u101f\u1015\u103a\u1019\u103e\u102f \u1015\u103c\u1004\u103a\u1006\u1004\u103a",
    wf_sum_text_logo: "\u1005\u102c\u101e\u102c\u1038\u1014\u103e\u1004\u1037\u103a logo \u1011\u100a\u1037\u103a/\u1015\u103c\u1004\u103a",
    wfin_subject: "\u101e\u1004\u1037\u103a\u1015\u102f\u1036 (\u101c\u1030)",
    wfin_new_bg: "\u1014\u1031\u102c\u1000\u103a\u1001\u1036\u1021\u101e\u1005\u103a (\u1019\u1011\u100a\u1037\u103a\u101c\u100a\u103a\u1038\u101b)",
    wfin_ref_scene: "Reference scene",
    wfin_style_ref: "Style reference (\u1019\u1011\u100a\u1037\u103a\u101c\u100a\u103a\u1038\u101b)",
    wfin_target_scene: "\u101c\u1030\u1015\u102b\u101e\u1031\u102c target scene",
    wfin_base: "Base \u1015\u102f\u1036",
    wfin_face_ref: "\u1019\u103b\u1000\u103a\u1014\u103e\u102c / \u101c\u1030 reference",
    wfin_portrait: "\u101c\u1030\u1015\u102f\u1036",
    wfin_image: "\u1015\u102f\u1036",
    wfin_object_ref: "\u1021\u101b\u102c\u101d\u1010\u1039\u1011\u102f reference (\u1019\u1011\u100a\u1037\u103a\u101c\u100a\u103a\u1038\u101b)",
    wfin_logo_ref: "Logo reference (\u1019\u1011\u100a\u1037\u103a\u101c\u100a\u103a\u1038\u101b)",
    wf_exp_bg_replace: "\u101c\u1030\u1014\u1031\u102c\u1000\u103a\u1000 \u1014\u1031\u102c\u1000\u103a\u1001\u1036\u1000\u102d\u102f \u1021\u1005\u102c\u1038\u1011\u102d\u102f\u1038\u1015\u1031\u1038\u1010\u101a\u103a\u104b \u101c\u1030\u104a \u1000\u102d\u102f\u101a\u103a\u101f\u1014\u103a\u104a \u1021\u1014\u102c\u1038\u101e\u1010\u103a\u1014\u1032\u1037 \u1021\u101c\u1004\u103a\u1038\u1000 \u1021\u1010\u102d\u1021\u1000\u103b \u1019\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u1018\u1032 \u1014\u1031\u102c\u1000\u103a\u1000\u103d\u101a\u103a\u1000\u1015\u1032 \u1015\u103c\u1031\u102c\u1004\u103a\u1038\u101e\u103d\u102c\u1038\u1019\u101a\u103a\u104b",
    wf_exp_reference_transfer: "Reference \u1015\u102f\u1036\u101b\u1032\u1037 scene \u1010\u1005\u103a\u1001\u102f\u101c\u102f\u1036\u1038\u1000\u102d\u102f \u101a\u1030\u1010\u101a\u103a (\u1012\u102b\u1015\u1031\u1019\u101a\u1037\u103a \u1021\u1011\u1032\u1000 \u101c\u1030\u1010\u103d\u1031\u1000\u102d\u102f \u1019\u101a\u1030\u1018\u1030\u1038)\u104a \u1015\u103c\u102e\u1038\u101b\u1004\u103a \u101e\u1004\u1037\u103a\u101c\u1030\u1000\u102d\u102f \u1011\u100a\u1037\u103a\u1015\u1031\u1038\u1010\u101a\u103a \u2014 \u1019\u103b\u1000\u103a\u1014\u103e\u102c\u104a \u1000\u102d\u102f\u101a\u103a\u101f\u1014\u103a\u1014\u1032\u1037 frame \u1000\u102d\u102f \u1011\u102d\u1014\u103a\u1038\u1015\u103c\u102e\u1038 scene \u101b\u1032\u1037 \u1021\u101c\u1004\u103a\u1038\u1014\u1032\u1037 \u101b\u103e\u102f\u1011\u1031\u102c\u1004\u1037\u103a\u1000\u102d\u102f \u1000\u102d\u102f\u1000\u103a\u100a\u102e\u1021\u1031\u102c\u1004\u103a \u101c\u102f\u1015\u103a\u1015\u1031\u1038\u1010\u101a\u103a\u104b",
    wf_exp_master_bgfg_replace: "\u1021\u1010\u102d\u1000\u103b\u1006\u102f\u1036\u1038 subject-in-scene \u1021\u1005\u102c\u1038\u1011\u102d\u102f\u1038\u1019\u103e\u102f \u2014 reference scene \u1011\u1032\u1000 \u101c\u1030\u1000\u102d\u102f \u101c\u102f\u1036\u1038\u101d\u1016\u101a\u103a\u101b\u103e\u102c\u1038\u104a \u1000\u103d\u101a\u103a\u1014\u1031\u1010\u1032\u1037 \u1014\u1031\u102c\u1000\u103a\u1001\u1036\u1014\u1032\u1037 \u101b\u103e\u1031\u1037\u1001\u1036\u1000\u102d\u102f \u101e\u1018\u102c\u101d\u1000\u103b\u1000\u103b \u1015\u103c\u1014\u103a\u1010\u100a\u103a\u1006\u1031\u102c\u1000\u103a\u104a \u1015\u103c\u102e\u1038\u101b\u1004\u103a \u101e\u1004\u1037\u103a\u101c\u1030\u1000\u102d\u102f \u1021\u1032\u1012\u102e\u1014\u1031\u101b\u102c\u1019\u103e\u102c \u1021\u1010\u102d\u1021\u1000\u103b \u1011\u100a\u1037\u103a\u1015\u1031\u1038\u1010\u101a\u103a \u2014 \u1019\u103b\u1000\u103a\u1014\u103e\u102c\u104a \u1000\u102d\u102f\u101a\u103a\u101f\u1014\u103a\u104a \u1021\u1001\u103b\u102d\u102f\u1038\u1021\u1005\u102c\u1038\u104a \u1006\u1036\u1015\u1004\u103a\u104a \u101d\u1010\u103a\u1005\u102f\u1036\u104a \u1021\u101e\u102c\u1038\u1021\u101b\u1031\u1014\u1032\u1037 \u1021\u101c\u1004\u103a\u1038\u1000 \u101e\u1004\u1037\u103a\u1015\u102f\u1036\u1000\u1014\u1031 \u101c\u1031\u102c\u1037\u1001\u103a\u1001\u103b\u1011\u102c\u1038\u1015\u103c\u102e\u1038 reference \u1000\u1010\u1031\u102c\u1037 scene\u104a \u1000\u1004\u103a\u1019\u101b\u102c\u1014\u1032\u1037 \u1021\u1014\u1000\u103a\u1000\u102d\u102f\u1015\u1032 \u1015\u1031\u1038\u1010\u101a\u103a\u104b",
    wf_exp_subject_face: "Reference \u1011\u1032\u1000 \u101c\u1030 (\u101e\u102d\u102f\u1037) \u1019\u103b\u1000\u103a\u1014\u103e\u102c\u1000\u102d\u102f \u101e\u1004\u1037\u103a base \u1015\u102f\u1036\u1015\u1031\u102b\u103a \u1001\u103b\u1031\u102c\u1019\u103d\u1031\u1037\u1005\u103d\u102c \u1015\u1031\u102b\u1004\u103a\u1038\u1005\u1015\u103a\u1015\u1031\u1038\u1015\u103c\u102e\u1038 base \u101b\u1032\u1037 \u1016\u103d\u1032\u1037\u1005\u100a\u103a\u1038\u1015\u102f\u1036\u1000\u102d\u102f \u1019\u1011\u102d\u1001\u102d\u102f\u1000\u103a\u1005\u1031\u1015\u102b\u104b",
    wf_exp_retouch: "\u1021\u101e\u102c\u1038\u1021\u101b\u1031\u104a \u1006\u1036\u1015\u1004\u103a\u1014\u1032\u1037 \u1021\u101b\u1031\u102c\u1004\u103a\u1000\u102d\u102f \u101e\u1018\u102c\u101d\u1000\u103b\u1000\u103b \u1019\u103d\u1019\u103a\u1038\u1019\u1036\u1015\u1031\u1038\u1010\u101a\u103a\u104b \u1019\u103b\u1000\u103a\u1014\u103e\u102c\u104a \u1021\u1004\u103a\u1039\u1002\u102b\u101b\u1015\u103a\u1014\u1032\u1037 \u1021\u1019\u1030\u1021\u101b\u102c\u1000 \u1021\u1010\u102d\u102f\u1004\u103a\u1038\u101b\u103e\u102d\u1014\u1031\u1019\u101a\u103a \u2014 \u1021\u101e\u102c\u1038\u1015\u101c\u1015\u103a\u1005\u1010\u1005\u103a \u1019\u1016\u103c\u1005\u103a\u104a \u1019\u103b\u1000\u103a\u1014\u103e\u102c \u1019\u1015\u103c\u1031\u102c\u1004\u103a\u1038\u104b",
    wf_exp_upscale: "\u1015\u102f\u1036\u1000\u102d\u102f \u1001\u103b\u1032\u1037\u1015\u1031\u1038\u101b\u1004\u103a\u1038 \u1021\u101e\u102c\u1038\u1021\u101b\u1031\u104a \u1006\u1036\u1015\u1004\u103a\u1014\u1032\u1037 \u1021\u1011\u100a\u103a\u101b\u1032\u1037 \u101e\u1018\u102c\u101d \u1021\u101e\u1031\u1038\u1005\u102d\u1010\u103a\u1000\u102d\u102f \u1015\u103c\u1014\u103a\u1016\u1031\u102c\u103a\u1015\u1031\u1038\u1010\u101a\u103a\u104b \u1019\u103b\u1000\u103a\u1014\u103e\u102c\u104a \u1000\u102d\u102f\u101a\u103a\u101f\u1014\u103a\u104a \u1016\u103d\u1032\u1037\u1005\u100a\u103a\u1038\u1015\u102f\u1036\u1014\u1032\u1037 \u1021\u101b\u1031\u102c\u1004\u103a\u1010\u103d\u1031 \u1021\u1010\u102d\u1021\u1000\u103b \u1019\u1015\u103c\u1031\u102c\u1004\u103a\u1038 \u2014 \u1015\u101c\u1015\u103a\u1005\u1010\u1005\u103a\u1006\u1014\u103a\u1010\u1032\u1037 \u1001\u103b\u1031\u102c\u1019\u103d\u1031\u1037\u1019\u103e\u102f \u1019\u101b\u103e\u102d\u104b",
    wf_exp_object_edit: "\u1011\u102d\u1014\u103a\u1038\u1001\u103b\u102f\u1015\u103a\u1011\u102c\u1038\u1010\u1032\u1037 \u1014\u1031\u101b\u102c\u101c\u102d\u102f\u1000\u103a \u1015\u103c\u1004\u103a\u1006\u1004\u103a\u1019\u103e\u102f\u1014\u1032\u1037 \u1021\u101b\u102c\u101d\u1010\u1039\u1011\u102f\u1010\u103d\u1031\u1000\u102d\u102f \u1016\u101a\u103a\u104a \u101c\u1032 (\u101e\u102d\u102f\u1037) \u1011\u100a\u1037\u103a\u1015\u1031\u1038\u1010\u101a\u103a\u104b \u1019\u1011\u102d\u1010\u1032\u1037 \u1021\u101b\u102c\u1021\u102c\u1038\u101c\u102f\u1036\u1038 \u1021\u1010\u102d\u102f\u1004\u103a\u1038\u101b\u103e\u102d\u1014\u1031\u1019\u101a\u103a\u104b",
    wf_exp_water_edit: "\u101b\u1031\u104a \u101b\u1031\u102c\u1004\u103a\u1015\u103c\u1014\u103a\u101f\u1015\u103a\u1019\u103e\u102f\u1014\u1032\u1037 \u1005\u102d\u102f\u1005\u103d\u1010\u103a\u1010\u1032\u1037 \u1019\u103b\u1000\u103a\u1014\u103e\u102c\u1015\u103c\u1004\u103a\u1010\u103d\u1031\u1000\u102d\u102f \u101b\u1030\u1015\u1017\u1031\u1012\u1021\u101b \u101e\u1018\u102c\u101d\u1000\u103b\u1021\u1031\u102c\u1004\u103a \u1011\u100a\u1037\u103a/\u1015\u103c\u1004\u103a\u1015\u1031\u1038\u1015\u103c\u102e\u1038 \u101e\u1004\u1037\u103a\u101c\u1030\u1000\u102d\u102f \u1019\u1011\u102d\u1001\u102d\u102f\u1000\u103a\u1005\u1031\u1015\u102b\u104b",
    wf_exp_text_logo: "\u1015\u102f\u1036\u1015\u1031\u102b\u103a\u1019\u103e\u102c \u101e\u1014\u1037\u103a\u101b\u103e\u1004\u103a\u1038\u1015\u103c\u102e\u1038 \u1016\u1010\u103a\u101b\u101c\u103d\u101a\u103a\u1010\u1032\u1037 \u1005\u102c\u101e\u102c\u1038 (\u101e\u102d\u102f\u1037) logo \u1000\u102d\u102f \u1011\u100a\u1037\u103a/\u1015\u103c\u1004\u103a\u1015\u1031\u1038\u1015\u103c\u102e\u1038 \u1016\u103d\u1032\u1037\u1005\u100a\u103a\u1038\u1015\u102f\u1036\u1000\u102d\u102f \u1011\u102d\u1014\u103a\u1038\u1011\u102c\u1038\u1015\u102b\u1010\u101a\u103a\u104b"
  },
  /* ---- Shan (Tai Long) (shn) — 587 keys, complete ---- */
  shn: {
    gate_sub_login: "ၶဝ်ႈဢၶွင်ႉ HNK သူ ဢွၼ်တၢင်း သေ ၸႂ်ႉ panel ဢၼ်ၼႆႉ။",
    gate_email_ph: "ဢီးမေးလ်",
    gate_pass_ph: "ၶေႃႈလပ်ႉ",
    gate_signin: "ၶဝ်ႈဢၶွင်ႉ",
    gate_checking: "တိုၵ်ႉၵူတ်ႇထတ်းငဝ်းလၢႆးသူ…",
    gate_need: "သႂ်ႇ ဢီးမေးလ် လႄႈ ၶေႃႈလပ်ႉ",
    gate_bad: "ဢီးမေးလ် ဢမ်ႇၼၼ် ၶေႃႈလပ်ႉ ဢမ်ႇထုၵ်ႇ",
    gate_offline: "ဢမ်ႇမီးဢိၼ်ႇထႃႇၼႅတ်ႉ — ၵူတ်ႇထတ်းငဝ်းလၢႆးဢမ်ႇလႆႈ။ ၵပ်းသိုပ်ႇသေ ၵူတ်ႇထတ်းၶိုၼ်း။",
    gate_locked: "သိုဝ်ႉပွၵ်ႈလဵဝ် လႆႈသွင်ဢၼ် — ၵႃႈၶဝ်ႈ လႄႈ ၵႃႈလိူၼ် ပိုတ်ႇပၼ် web app လႄႈ Photoshop panel ဢၼ်ၼႆႉ သွင်ဢၼ်။ သိုဝ်ႉ ဢမ်ႇၼၼ် တေႃႇသိုပ်ႇ တီႈ website သေ ၵူတ်ႇထတ်းၶိုၼ်း။",
    gate_buy: "ပိုတ်ႇ website",
    gate_retry: "ၵူတ်ႇထတ်းၶိုၼ်း",
    gate_signout: "ဢွၵ်ႇ",
    gate_days: "ၵိုတ်း {D} ဝၼ်း",
    gate_grace: "ဢမ်ႇမီးဢိၼ်ႇထႃႇၼႅတ်ႉ — ၸႂ်ႉလႆႈထႅင်ႈ {D} ဝၼ်း",
    gate_open_fail: "ပိုတ်ႇ browser ဢမ်ႇလႆႈ။ လိင်ႉ — {U}",
    app_title: "HNK Photoshop Ai Panel (\u101c\u102f\u1075\u103a\u1088\u1081\u1035\u107c\u103a\u1038)",
    sec_api: "Gemini API Key",
    btn_show: "\u107c\u1084",
    btn_hide: "\u1019\u1030\u1075\u103a\u1038",
    btn_test: "\u1010\u1085\u1010\u103a\u1088 Key",
    btn_save: "\u101e\u102d\u1019\u103a\u1038",
    st_testing: "\u1010\u102d\u102f\u1075\u103a\u1089\u1010\u1085\u1010\u103a\u1088 key",
    st_key_ok: "\u2713 API key \u1081\u1035\u1010\u103a\u1038\u1075\u1062\u107c\u103a\u101c\u102e",
    st_key_bad: "API key \u1022\u1019\u103a\u1087\u1015\u1035\u107c\u103a",
    st_key_saved: "\u101e\u102d\u1019\u103a\u1038 API key \u101a\u101d\u103a\u1089 \u2713",
    st_need_key: "\u101e\u1082\u103a\u1087 Gemini API key \u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038",
    sec_model: "Model \u101c\u1084\u1088 Output",
    scope_model_note: "\u1078\u1082\u103a\u1089\u1010\u103d\u107c\u103a\u1088\u1010\u1083\u1087\u1015\u102f\u1019\u103a\u1087 Generate \u107c\u1082\u103a\u1038 tab Prompt \u1010\u1082\u103a\u1088\u107c\u1086\u1089 \u2014 Create \u101c\u1084\u1088 AI Tools \u1019\u102e\u1038 setting model \u1081\u1004\u103a\u1038\u107d\u1082\u103a\u1019\u107c\u103a\u1038\u104b",
    model_auto: "\u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038 (\u1076\u102d\u102f\u1075\u103a\u1089)",
    model_flash: "Flash \u2014 \u101d\u1086\u1038 (2.5)",
    model_pro: "Pro \u2014 \u107c\u1019\u103a\u1089\u1078\u107c\u103a\u1089 (3.0)",
    lbl_ratio: "Ratio",
    ratio_auto: "Ratio \u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038 (\u1010\u102e\u1088 document)",
    lbl_size: "\u1076\u107c\u1062\u1010\u103a\u1088",
    lbl_quality: "\u107c\u1019\u103a\u1089\u1078\u107c\u103a\u1089",
    qual_auto: "\u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038",
    qual_low: "\u1010\u1085\u1019\u103a\u1087",
    qual_med: "\u1075\u1062\u1004\u103a",
    qual_high: "\u101e\u102f\u1004\u103a",
    sec_prompt: "Prompt",
    hint_prompt: "\u1010\u1085\u1019\u103a\u1088 prompt \u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u1010\u102e\u1088\u107c\u1086\u1088\u2026 (\u107c\u1019\u103a\u101e\u102f\u1010\u103a\u1038 20,000 \u1010\u1030\u101d\u103a\u101c\u102d\u1075\u103a\u1088)",
    btn_improve: "\u1019\u1084\u1038 Prompt \u1081\u1082\u103a\u1088\u101c\u102e",
    btn_clear: "\u1019\u103d\u1010\u103a\u1087",
    st_improving: "\u1010\u102d\u102f\u1075\u103a\u1089\u1019\u1084\u1038 prompt",
    st_improved: "\u1019\u1084\u1038 prompt \u101a\u101d\u103a\u1089 \u2713",
    sec_refs: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088 Reference (2 \u101e\u103d\u1004\u103a\u1089)",
    base_note: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1015\u102d\u102f\u107c\u103a\u1089 = document Photoshop \u1022\u107c\u103a\u1015\u102d\u102f\u1010\u103a\u1087\u101d\u1086\u1089 (\u1022\u101d\u103a\u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038)\u104b",
    btn_ref_layer: "+ Layer",
    btn_ref_file: "\u107e\u1062\u1086\u1087",
    btn_ref_web: "Web",
    st_ref_layer_added: "\u101e\u1082\u103a\u1087 layer \u1015\u1035\u107c\u103a reference \u101a\u101d\u103a\u1089 \u2713",
    st_ref_file_added: "\u101e\u1082\u103a\u1087\u107e\u1062\u1086\u1087 \u1015\u1035\u107c\u103a reference \u101a\u101d\u103a\u1089 \u2713",
    st_importing: "\u1010\u102d\u102f\u1075\u103a\u1089\u1076\u101d\u103a\u1088\u107e\u1062\u1086\u1087",
    url_title: "Reference \u1010\u102e\u1088 URL \u2014 Chrome / Pinterest",
    url_ph: "https://\u2026 \u1022\u103d\u1004\u103a\u1088\u1010\u102e\u1088\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088 \u1022\u1019\u103a\u1087\u107c\u107c\u103a link Pinterest",
    btn_paste: "\u1015\u1062\u1075\u103a\u1088",
    btn_load: "\u101c\u1030\u1010\u103a\u1087",
    btn_cancel: "\u1075\u102d\u102f\u1010\u103a\u1038",
    st_url_loading: "\u1010\u102d\u102f\u1075\u103a\u1089\u1022\u101d\u103a\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1010\u102e\u1088 web",
    st_ref_web_added: "\u101e\u1082\u103a\u1087\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088 web \u1015\u1035\u107c\u103a reference \u101a\u101d\u103a\u1089 \u2713",
    st_url_bad: "\u1022\u101d\u103a\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1010\u102e\u1088 URL \u107c\u1086\u1089\u1022\u1019\u103a\u1087\u101c\u1086\u1088 \u2014 \u1075\u1031\u1083\u1087\u1022\u103d\u1004\u103a\u1088\u1010\u102e\u1088\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u101e\u1031 \u1078\u1062\u1019\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038",
    no_layer: "\u1015\u1086\u1087\u101c\u102d\u1030\u1075\u103a\u1088 layer",
    sec_presets: "AI Presets",
    auto_run: "\u107c\u1035\u1075\u103a\u1038 preset \u2192 Generate \u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038 (\u1015\u102d\u1075\u103a\u1089 = \u101e\u1082\u103a\u1087\u1076\u101d\u103a\u1088 prompt \u1075\u1030\u107a\u103a\u1038)",
    grp_cleanup: "\u1076\u102d\u1030\u1004\u103a\u1088\u1019\u102d\u102f\u101d\u103a\u1038\u1081\u1035\u1010\u103a\u1038\u1019\u1030\u1010\u103a\u1038\u101e\u1082\u103a",
    p_remove_people: "\u1022\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u1022\u103d\u1075\u103a\u1087",
    p_fix_hands: "\u1019\u1084\u1038\u1019\u102d\u102f\u101d\u103a\u1038\u101c\u102d\u1030\u101d\u103a",
    p_fix_legs: "\u1019\u1084\u1038\u1076\u1083\u101c\u102d\u1030\u101d\u103a",
    p_full_clean: "\u1081\u1035\u1010\u103a\u1038\u1019\u1030\u1010\u103a\u1038\u101e\u1082\u103a\u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088",
    grp_moved_note: "\u1076\u102d\u1030\u1004\u103a\u1088\u1019\u102d\u102f\u101d\u103a\u1038 Reference \u101a\u1030\u1087\u107c\u1082\u103a\u1038 card Reference Ops Pro \u1010\u1082\u103a\u1088\u107c\u1086\u1089\u101a\u101d\u103a\u1089 (\u1010\u102e\u1088\u101c\u1035\u101d\u103a, \u1015\u1083\u1038 Solo/Couple/Family + \u101c\u103d\u1004\u103a\u1088\u107c\u1084)\u104b",
    ro_h_detail: "\u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a \u00b7 \u1076\u102d\u1030\u1004\u103a\u1088\u1015\u102d\u1030\u1004\u103a \u00b7 \u1078\u1083\u1087\u1010\u1083\u1087 (\u2190 Ref1)",
    ro_h_comp: "\u107d\u103d\u1019\u103a\u1089\u1076\u1085\u1015\u103a\u1038 \u00b7 Style \u00b7 \u101c\u102d\u1075\u103a\u1088 (\u2190 Ref1)",
    p_fgbglc: "FG=Doc \u00b7 BG=Ref1 \u00b7 Light=Ref2",
    p_hair: "\u1081\u1062\u1004\u103a\u1088\u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a (\u2190 Ref1)",
    p_access: "\u1076\u1019\u103a\u1038\u1004\u102d\u102f\u107c\u103a\u1038 + \u1076\u102d\u1030\u1004\u103a\u1088\u1015\u102d\u1030\u1004\u103a (\u2190 Ref1)",
    p_pose: "\u1081\u1082\u103a\u1088\u1078\u1083\u1087\u1010\u1083\u1087\u1019\u102d\u1030\u107c\u103a (Doc \u2192 Ref1)",
    p_fgprops: "\u1076\u1030\u101d\u103a\u1038\u107d\u1062\u1086\u1087\u107c\u1083\u1088 (\u2190 Ref1)",
    p_textlogo: "\u101c\u102d\u1075\u103a\u1088 / Logo (\u2190 Ref1)",
    p_style: "Style \u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088 (\u2190 Ref1)",
    grp_repsubj: "\u101c\u1085\u1075\u103a\u1088\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038 (Doc \u2192 scene Ref1)",
    p_rep_solo: "\u101c\u1085\u1075\u103a\u1088\u1075\u1031\u1083\u1089\u101c\u1035\u101d\u103a",
    p_rep_couple: "\u101c\u1085\u1075\u103a\u1088\u1075\u1030\u1088\u1076\u1030\u1088",
    p_rep_family: "\u101c\u1085\u1075\u103a\u1088\u1015\u102e\u1088\u107c\u103d\u1004\u103a\u1089",
    grp_rmix: "Replace Mix \u2014 \u1019\u1062\u1086\u101e\u1031 \u1022\u101d\u103a\u1010\u102e\u1088 Ref1",
    rm_bg: "\u107d\u1062\u1086\u1087\u101c\u1004\u103a (BG)",
    rm_fg: "\u107d\u1062\u1086\u1087\u107c\u1083\u1088 (FG)",
    rm_light: "\u107e\u1086\u1038",
    rm_color: "\u101e\u102e",
    rm_object: "\u1076\u1030\u101d\u103a\u1038\u1076\u103d\u1004\u103a / Props",
    btn_rmix: "REPLACE GENERATE",
    rm_none: "\u1019\u1062\u1086\u1022\u107c\u103a\u107c\u102d\u102f\u1004\u103a\u1088\u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038",
    grp_i2p: "Image \u2192 Prompt (Scene Builder)",
    i2p_note: "1) \u1011\u102f\u1010\u103a\u1087: scene Ref1 \u2192 prompt \u101c\u102d\u1075\u103a\u1088\u1081\u1030\u101d\u103a\u101a\u103d\u1086\u1088 (\u1022\u1019\u103a\u1087\u1015\u1083\u1038\u1075\u1030\u107c\u103a\u1038)\u104b 2) \u1019\u1084\u1038\u1010\u102e\u1088\u107c\u1083\u1088 Prompt\u104b 3) SCENE GENERATE \u101e\u1062\u1004\u103a\u1088\u1081\u103d\u1015\u103a\u1088\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u107c\u1082\u103a\u1038 document \u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087 \u2014 \u1076\u101d\u103a\u1088\u1075\u107c\u103a\u1010\u1004\u103a\u1038\u1019\u102f\u1019\u103a\u1075\u1030\u1088\u1022\u107c\u103a\u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038\u104b \u101c\u103d\u1075\u103a\u1089 Face/Pose/Frame = \u101d\u1086\u1089\u1078\u102d\u1030\u1004\u103a\u1089\u1075\u101d\u103a\u1087\u104b",
    i2p_objects: "\u1081\u1030\u101d\u103a\u101a\u103d\u1086\u1088 \u1076\u1030\u101d\u103a\u1038\u1076\u103d\u1004\u103a \u101c\u1084\u1088 props",
    i2p_light: "\u1081\u1030\u101d\u103a\u101a\u103d\u1086\u1088 \u107e\u1086\u1038",
    i2p_color: "\u1081\u1030\u101d\u103a\u101a\u103d\u1086\u1088 \u101e\u102e / grade",
    i2p_bg: "\u1081\u1030\u101d\u103a\u101a\u103d\u1086\u1088 \u107d\u1062\u1086\u1087\u101c\u1004\u103a",
    i2p_fg: "\u1081\u1030\u101d\u103a\u101a\u103d\u1086\u1088 \u107d\u1062\u1086\u1087\u107c\u1083\u1088",
    btn_i2p: "Image \u2192 Prompt (\u1011\u102f\u1010\u103a\u1087 Scene)",
    i2p_fit: "Scene Auto-Fit \u2014 \u101e\u1062\u1004\u103a\u1088 scene \u1076\u102d\u102f\u107c\u103a\u1038\u1078\u103d\u1019\u103a\u1038\u1019\u102f\u1019\u103a / \u101c\u103d\u1004\u103a\u1088\u1075\u1086 / lens \u1076\u103d\u1004\u103a document",
    i2p_adapt: "\u1081\u1082\u103a\u1088\u107e\u1086\u1038\u101c\u1084\u1088\u101e\u102e\u1076\u103d\u1004\u103a\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038 \u1076\u101d\u103a\u1088\u1075\u107c\u103a\u1010\u1004\u103a\u1038 scene",
    btn_scenegen: "SCENE GENERATE",
    st_extract: "\u1010\u102d\u102f\u1075\u103a\u1089\u1011\u102f\u1010\u103a\u1087 scene \u1015\u1035\u107c\u103a prompt",
    st_extract_done: "Prompt scene \u1081\u1062\u1004\u103a\u1088\u1081\u1085\u107c\u103a\u1038\u101a\u101d\u103a\u1089 \u2014 \u1010\u1030\u107a\u103a\u1038\u1010\u102e\u1088\u107c\u1083\u1088 Prompt",
    scene_no_prompt: "\u1081\u103d\u1004\u103a\u1088 prompt \u1015\u101d\u103a\u1087\u101d\u1086\u1089 \u2014 \u1081\u1035\u1010\u103a\u1038 Image \u2192 Prompt \u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038",
    i2p_none: "\u1019\u1062\u1086\u1081\u1030\u101d\u103a\u101a\u103d\u1086\u1088\u1022\u107c\u103a\u107c\u102d\u102f\u1004\u103a\u1088\u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038",
    sec_light: "Studio Lighting \u2014 AI Relight",
    light_note: "\u1019\u1062\u1086\u1015\u102d\u102f\u1010\u103a\u1087\u107e\u1086\u1038, \u107c\u1035\u1075\u103a\u1038\u1011\u1085\u101d\u103a\u101e\u1031\u101c\u102d\u1030\u1075\u103a\u1088, \u1078\u1082\u103a\u1089 slider \u1019\u1084\u1038 \u2014 \u1081\u1062\u1004\u103a\u1088 3D \u1010\u1030\u107a\u103a\u1038\u1010\u102e\u1088\u107c\u102d\u1030\u101d\u103a \u1015\u1086\u1078\u103d\u1019\u103a\u1038\u1075\u1019\u103a\u1038\u101c\u1035\u101d\u103a (\u25b4 = \u101e\u102f\u1004\u103a, \u25be = \u1010\u1085\u1019\u103a\u1087)\u104b LIGHTING GENERATE \u1010\u1031\u101e\u1082\u103a\u1087\u107e\u1086\u1038\u1076\u102d\u102f\u107c\u103a\u1038\u1078\u103d\u1019\u103a\u1038\u107c\u1086\u1089\u1010\u1085\u1010\u103a\u1088\u1010\u1085\u1010\u103a\u1088; \u107c\u1083\u1088\u1010\u1083 / \u1078\u1083\u1087\u1010\u1083\u1087 / \u1076\u103d\u1015\u103a\u1087 \u101c\u103d\u1075\u103a\u1089\u101d\u1086\u1089\u101a\u1030\u1087\u104b",
    lbl_my_prompt: "PROMPT \u107d\u1083\u1087\u101e\u1083\u1087\u1010\u1086\u1038",
    lstage_model: "MODEL",
    lstage_cam: "CAM",
    l_key: "\u107e\u1086\u1038\u101c\u1030\u1004\u103a",
    l_fill: "\u107e\u1086\u1038\u101e\u102d\u102f\u1015\u103a\u1087 / \u107d\u1062\u1086\u1087\u107c\u1083\u1088",
    l_butterfly: "Butterfly (\u107c\u102d\u1030\u101d\u103a-\u107c\u1083\u1088)",
    l_side: "\u107e\u1086\u1038\u107d\u1062\u1086\u1087\u1076\u1062\u1004\u103a\u1088",
    l_rim: "\u107e\u1086\u1038\u1081\u103d\u1015\u103a\u1088",
    l_back: "\u107e\u1086\u1038\u107d\u1062\u1086\u1087\u101c\u1004\u103a",
    l_hair: "\u107e\u1086\u1038\u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a",
    l_bglight: "\u107e\u1086\u1038\u107d\u1062\u1086\u1087\u101c\u1004\u103a\u1081\u1062\u1004\u103a\u1088",
    lt_softbox: "Softbox",
    lt_octa: "Octa",
    lt_strip: "Strip",
    lt_umbrella: "Umbrella",
    lt_beauty: "Beauty",
    lt_hard: "Hard",
    li_int: "\u1081\u1085\u1004\u103a\u1038",
    li_angle: "\u1019\u102f\u1019\u103a",
    li_height: "\u101c\u103d\u1004\u103a\u1088\u101e\u102f\u1004\u103a",
    li_dist: "\u101c\u103d\u1004\u103a\u1088\u1075\u1086",
    li_size: "\u1076\u107c\u1062\u1010\u103a\u1088",
    btn_lightgen: "LIGHTING GENERATE",
    light_none: "\u1015\u102d\u102f\u1010\u103a\u1087\u107e\u1086\u1038\u1022\u107c\u103a\u107c\u102d\u102f\u1004\u103a\u1088\u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038",
    lg_equip: "\u107c\u1084\u1076\u102d\u1030\u1004\u103a\u1088\u107e\u1086\u1038\u107c\u1082\u103a\u1038\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088 (\u1081\u107c\u103a softbox / \u1076\u1083\u1010\u1004\u103a\u1088)",
    grp_chains: "Style Chains \u2014 \u1081\u1030\u1019\u103a\u1088 style \u2713",
    chains_note: "\u1015\u102d\u102f\u1010\u103a\u1087 style \u1022\u107c\u103a\u101c\u1082\u103a\u1075\u1031\u1083\u1088\u101c\u1086\u1088 \u2014 \u1010\u1031\u101c\u1031\u1083\u1038\u1076\u101d\u103a\u1088\u107c\u1082\u103a\u1038 Generate / preset / Retouch \u1075\u1030\u1088\u1022\u107c\u103a\u1078\u103d\u1019\u103a\u1038\u1075\u107c\u103a\u104b",
    grp_restore: "\u1019\u1084\u1038\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1075\u101d\u103a\u1087",
    p_restore: "\u1019\u1084\u1038\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1075\u101d\u103a\u1087",
    rest_color: "\u101e\u102e\u1010\u1035\u1019\u103a",
    rest_bw: "\u1076\u1062\u101d\u103a-\u101c\u1019\u103a",
    restore_note: "\u1019\u1084\u1038\u1022\u107c\u103a\u1076\u1062\u1010\u103a\u1087, \u101c\u103d\u1004\u103a\u1088\u101c\u102f\u1010\u103a\u1088\u101a\u103d\u107c\u103a\u1089\u107c\u1019\u103a\u1089 / \u107e\u1086\u1038, \u101e\u102e\u1078\u1062\u1004\u103a\u1087 \u2014 \u101d\u1086\u1089\u107c\u1083\u1088\u1010\u1083\u1075\u1030\u1088\u1075\u1031\u1083\u1089\u1019\u102d\u1030\u107c\u103a\u1075\u101d\u103a\u1087 100%\u104b",
    rt_browstyle: "\u1081\u1062\u1004\u103a\u1088\u1076\u1030\u107c\u103a\u1010\u1083",
    rt_lashstyle: "\u1081\u1062\u1004\u103a\u1088\u1076\u1030\u107c\u103a\u1010\u1083\u107c\u103d\u1075\u103a\u1088",
    rt_blush: "\u101e\u102e\u101c\u1085\u1004\u103a\u1075\u1085\u1019\u103a\u1088",
    rt_contour: "\u1081\u1062\u1004\u103a\u1088 Contour",
    rt_bust: "\u1022\u1030\u1075\u103a\u1038",
    rt_butt: "\u1075\u1030\u107c\u103a\u1087",
    rt_thigh: "\u1076\u1083\u1022\u103d\u107c\u103a",
    rt_calf: "\u107c\u103d\u1004\u103a\u1089\u1076\u1083",
    rt_neck: "\u1076\u1031\u1083\u1038",
    rt_fingers: "\u107c\u102d\u101d\u103a\u1089\u1019\u102d\u102f\u101d\u103a\u1038",
    hint_prompt_my: "\u1010\u1085\u1019\u103a\u1088\u107d\u1083\u1087\u101e\u1083\u1087\u1010\u1086\u1038\u101c\u1086\u1088\u101a\u1030\u1087 \u2014 \u1019\u102d\u1030\u101d\u103a\u1088 Generate \u1010\u1031\u1015\u102d\u107c\u103a\u1087\u1015\u1035\u107c\u103a English \u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038 (\u107c\u1019\u103a\u101e\u102f\u1010\u103a\u1038 20,000)",
    st_translate: "\u1010\u102d\u102f\u1075\u103a\u1089\u1015\u102d\u107c\u103a\u1087 prompt \u1015\u1035\u107c\u103a English",
    live_trans: "\u1015\u102d\u107c\u103a\u1087\u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038 \u21c4 (EN \u2194 SHN, \u101d\u1062\u1086\u1038\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u1075\u102d\u102f\u1010\u103a\u1038\u1010\u1085\u1019\u103a\u1088)",
    st_retry: "\u1010\u102d\u102f\u1075\u103a\u1089\u1078\u1062\u1019\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038",
    grp_recipes: "Recipes \u2014 \u101e\u102d\u1019\u103a\u1038 / \u1019\u103d\u1015\u103a\u1088 setting",
    recipe_note: "\u101e\u102d\u1019\u103a\u1038\u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088 (chains, retouch, \u107e\u1086\u1038, \u101c\u103d\u1075\u103a\u1089, prompt) \u1015\u1035\u107c\u103a\u107e\u1062\u1086\u1087 .json \u1022\u107c\u103a\u101c\u1035\u101d\u103a \u2014 \u101c\u102f\u1075\u103a\u1088\u1081\u1035\u107c\u103a\u1038\u107c\u1035\u1075\u103a\u1038 Load \u1075\u1030\u107a\u103a\u1038\u104b",
    btn_recipe_save: "\u101e\u102d\u1019\u103a\u1038 Recipe",
    btn_recipe_load: "\u101c\u1030\u1010\u103a\u1087 Recipe",
    st_recipe_saved: "\u101e\u102d\u1019\u103a\u1038 Recipe \u101a\u101d\u103a\u1089 \u2713",
    st_recipe_loaded: "\u101c\u1030\u1010\u103a\u1087 Recipe \u101a\u101d\u103a\u1089 \u2713 \u2014 \u1019\u1084\u1038\u1076\u102d\u1030\u1004\u103a\u1088\u1075\u102f\u1019\u103a\u1038\u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088",
    st_recipe_bad: "\u1022\u1019\u103a\u1087\u1078\u1082\u103a\u1088\u107e\u1062\u1086\u1087 Recipe \u1076\u103d\u1004\u103a HNK",
    sec_final: "Prompt \u101c\u102d\u102f\u107c\u103a\u1038\u101e\u102f\u1010\u103a\u1038 (\u101e\u1030\u1004\u103a\u1087\u1011\u102d\u102f\u1004\u103a AI)",
    btn_copy: "\u1075\u1031\u1083\u1087",
    st_copied: "\u1075\u1031\u1083\u1087\u101a\u101d\u103a\u1089 \u2713",
    hist_note: "\u1019\u1062\u1086\u1010\u103d\u1004\u103a\u1038 \u2014 \u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088 6 \u1022\u107c\u103a\u101c\u102d\u102f\u107c\u103a\u1038\u101e\u102f\u1010\u103a\u1038, \u107c\u1035\u1075\u103a\u1038\u1010\u1030\u107a\u103a\u1038:",
    btn_hist_prompt: "\u2192 Prompt",
    sec_batch: "Batch Mode",
    batch_note: "\u101c\u102d\u1030\u1075\u103a\u1088\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u101c\u1062\u1086\u1022\u107c\u103a + folder \u1022\u103d\u1075\u103a\u1087 \u2014 prompt, chains, cleanup \u101c\u1084\u1088 \u101c\u103d\u1075\u103a\u1089 Keep \u101a\u1062\u1019\u103a\u1038\u101c\u1035\u101d\u103a \u1010\u1031\u1081\u1035\u1010\u103a\u1038\u107c\u102d\u1030\u101d\u103a\u1075\u1030\u1088\u1076\u1085\u1015\u103a\u1038; \u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088\u101e\u102d\u1019\u103a\u1038\u1015\u1035\u107c\u103a *_HNK.png\u104b",
    btn_batch: "\u1081\u1035\u1010\u103a\u1038 BATCH",
    btn_batch_stop: "\u1075\u102d\u102f\u1010\u103a\u1038",
    st_batch: "Batch",
    st_batch_done: "Batch \u101a\u101d\u103a\u1089",
    sec_web: "Web AI \u2014 Browser \u1022\u103d\u107c\u103a\u1087",
    web_note: "\u1015\u102d\u102f\u1010\u103a\u1087 web AI editor \u1022\u107c\u103a\u101c\u1082\u103a\u1075\u1031\u1083\u1088\u101c\u1086\u1088 \u107c\u1082\u103a\u1038 Photoshop\u104b \u101e\u1062\u1004\u103a\u1088\u1010\u102e\u1088\u107c\u107c\u103a\u1088\u101e\u1031 \u1022\u101d\u103a\u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088\u1076\u101d\u103a\u1088\u1019\u1083\u1038\u1015\u1035\u107c\u103a layer:",
    web_import_note: "\u1076\u101d\u103a\u1088: \u2460 \u107c\u1082\u103a\u1038 web app \u1078\u1082\u103a\u1089 Copy image address \u101e\u1031 \u107c\u1035\u1075\u103a\u1038 IMPORT COPIED LINK \u00b7 \u2461 \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u1022\u101d\u103a\u107e\u1062\u1086\u1087\u101c\u1030\u1004\u103a\u1038\u101e\u1031 \u1078\u1082\u103a\u1089 IMPORT FILE \u00b7 \u2462 web app \u1022\u1030\u107a\u103a\u1038\u1075\u1031\u1083\u1089\u1022\u107c\u103a\u1019\u102e\u1038 HNK bridge \u1010\u1031\u101e\u1030\u1004\u103a\u1087\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1076\u101d\u103a\u1088\u1019\u1083\u1038\u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038\u104b",
    btn_web_go: "\u1075\u1082\u1083\u1087",
    btn_web_home: "\u1081\u102d\u1030\u107c\u103a\u1038",
    btn_web_reload: "\u101c\u1030\u1010\u103a\u1087\u1076\u102d\u102f\u107c\u103a\u1038",
    btn_web_import_link: "\u1076\u101d\u103a\u1088 LINK \u1022\u107c\u103a\u1075\u1031\u1083\u1087\u101d\u1086\u1089 \u2192 PS",
    btn_web_import_file: "\u1076\u101d\u103a\u1088\u107e\u1062\u1086\u1087 \u2192 PS",
    st_web_import: "\u1076\u101d\u103a\u1088 Photoshop \u1015\u1035\u107c\u103a layer \u101a\u101d\u103a\u1089 \u2713",
    st_web_nourl: "\u1075\u1031\u1083\u1087 link \u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038 (\u107c\u1035\u1075\u103a\u1038\u1076\u1082\u1083 \u2192 Copy image address)",
    st_web_fetch: "\u1010\u102d\u102f\u1075\u103a\u1089\u1022\u101d\u103a\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1010\u102e\u1088 link",
    st_web_notallowed: "Domain \u107c\u1086\u1089\u1022\u1019\u103a\u1087\u1015\u1083\u1038\u107c\u1082\u103a\u1038\u101e\u1035\u107c\u103a\u1088\u1022\u107c\u103a\u1022\u107c\u102f\u107a\u1062\u1010\u103a\u1088 \u2014 \u1010\u1031\u1015\u101d\u103a\u1087\u101d\u1086\u1089\u1075\u1031\u1083\u1088\u1015\u1035\u107c\u103a\u101c\u1086\u1088\u104b \u101a\u103d\u107c\u103a\u1038\u1081\u1082\u103a\u1088 HNK \u101e\u1082\u103a\u1087\u1015\u107c\u103a\u104b",
    st_need_doc: "\u1015\u102d\u102f\u1010\u103a\u1087 document \u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u107c\u1082\u103a\u1038 Photoshop \u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038",
    sec_campro: "Camera Pro \u101c\u1084\u1088 \u107c\u1019\u103a\u1089\u1078\u107c\u103a\u1089",
    autosave_lbl: "Export \u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088\u1075\u1030\u1088\u1022\u107c\u103a\u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038 (PNG + log prompt \u2192 folder)",
    st_folder_ok: "\u1019\u1075\u103a\u1038 folder export \u101a\u101d\u103a\u1089 \u2713",
    st_exported: "Export \u101a\u101d\u103a\u1089 \u2713",
    st_export_fail: "Export \u1022\u1019\u103a\u1087\u1015\u1035\u107c\u103a \u2014 \u1010\u1030\u107a\u103a\u1038 folder",
    st_pro_fallback: "Model Pro \u1022\u1019\u103a\u1087\u101c\u1086\u1088 \u2014 \u101c\u1085\u1075\u103a\u1088\u1015\u1035\u107c\u103a Flash \u1010\u103d\u107c\u103a\u1088\u1010\u1083\u1087\u1015\u103d\u1075\u103a\u1088\u107c\u1086\u1089",
    st_img_bad: "\u1076\u1031\u1083\u1088\u1019\u102f\u107c\u103a\u1038\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088 \u1022\u1019\u103a\u1087\u107d\u1062\u107c\u103a\u1087\u101c\u103d\u1004\u103a\u1088\u1010\u1085\u1010\u103a\u1088 \u2014 \u101e\u1082\u103a\u1087\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1076\u102d\u102f\u107c\u103a\u1038",
    st_auto_comp: "\u107d\u103d\u1019\u103a\u1089\u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038: \u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038 IMAGE 1 \u2192 scene reference",
    prov_lbl: "\u107d\u1030\u1088\u1015\u107c\u103a\u101d\u1086\u1089 AI",
    oai_key_ph: "sk-... (OpenAI API key)",
    tab_create: "Create",
    create_note: "CREATE MODE \u2014 \u1081\u1035\u1010\u103a\u1038\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1019\u1082\u103a\u1087\u1010\u102e\u1088 prompt \u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087 (+ ref 4 \u1022\u107c\u103a\u1081\u1004\u103a\u1038\u1076\u1031\u1083)\u104b \u1081\u1004\u103a\u1038\u1076\u1031\u1083\u1010\u1084\u1089\u1010\u1084\u1089: \u1022\u1019\u103a\u1087\u101c\u1030 document, preset, chains \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u101c\u103d\u1075\u103a\u1089\u101e\u1004\u103a\u104b",
    create_ph: "\u1010\u1085\u1019\u103a\u1088\u101d\u1083\u1088 \u1076\u1082\u103a\u1088\u101e\u1062\u1004\u103a\u1088\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1022\u102e\u1088\u101e\u1004\u103a\u2026",
    btn_create_ps: "\u2b07 \u101e\u1030\u1004\u103a\u1087\u1011\u102d\u102f\u1004\u103a Photoshop",
    btn_to_ref: "\u21ba \u1078\u1082\u103a\u1089\u1015\u1035\u107c\u103a Ref 1",
    st_to_ref: "\u101e\u1082\u103a\u1087\u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088\u1076\u101d\u103a\u1088 Ref 1 \u101a\u101d\u103a\u1089 \u2713",
    scope_create_note: "\u1081\u1004\u103a\u1038\u1076\u1031\u1083\u1010\u102e\u1088 Model & Output \u1076\u103d\u1004\u103a Setup \u2014 setting \u107c\u1086\u1089\u1078\u1082\u103a\u1089\u1010\u103d\u107c\u103a\u1088\u1010\u1083\u1087 Generate \u1076\u103d\u1004\u103a Create \u1075\u1030\u107a\u103a\u1038\u104b",
    cr_ratio: "Ratio",
    cr_var: "\u1022\u107c\u103a\u1015\u1085\u1075\u103a\u1087",
    cr_restyle: "\u267b \u101c\u1085\u1075\u103a\u1088 style \u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088",
    cr_lib: "Prompt Library \u2014 \u107c\u1035\u1075\u103a\u1038\u101e\u1031\u101e\u1082\u103a\u1087",
    cr_improve: "\u2728 \u1019\u1084\u1038\u101c\u102e",
    cr_describe: "\ud83d\udd0d \u101c\u1030 Ref 1 \u2192 Prompt",
    st_describing: "\u1010\u102d\u102f\u1075\u103a\u1089\u101c\u1030\u1076\u1085\u1015\u103a\u1038 reference\u2026",
    st_described: "\u1010\u1085\u1019\u103a\u1088 prompt \u1010\u102e\u1088 Ref 1 \u101a\u101d\u103a\u1089 \u2713",
    st_need_gem: "\u101e\u1082\u103a\u1087 Gemini API key (Setup) \u2014 \u1022\u107c\u103a\u107c\u1086\u1089\u1078\u1082\u103a\u1089 Gemini text",
    st_need_ref1: "\u101e\u1082\u103a\u1087\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1076\u101d\u103a\u1088 Ref 1 \u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038",
    st_lib_added: "\u101e\u1082\u103a\u1087 prompt \u101a\u101d\u103a\u1089 \u2713",
    cr_refs: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088 Reference (\u1011\u102d\u102f\u1004\u103a 4)",
    cr_refs_note: "\u101e\u1082\u103a\u1087\u1075\u1031\u1083\u1088\u101c\u1086\u1088 \u1022\u1019\u103a\u1087\u101e\u1082\u103a\u1087\u1075\u1031\u1083\u1088\u101c\u1086\u1088 \u2014 \u101e\u1082\u103a\u1087\u101c\u1030\u107a\u103a\u1088 Layer / File / Web\u104b Create \u1010\u1031\u1022\u101d\u103a\u1022\u107c\u103a prompt \u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u101a\u103d\u107c\u103a\u1038\u1075\u1030\u107a\u103a\u1038\u104b",
    cr_results: "\u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088",
    cr_gal_empty: "\u1015\u1086\u1087\u1019\u102e\u1038\u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088 \u2014 \u107c\u1035\u1075\u103a\u1038 Generate\u104b",
    cr_gal_have: "\u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088 \u00b7 \u107c\u1035\u1075\u103a\u1038\u1076\u1085\u1015\u103a\u1038\u1022\u103d\u107c\u103a\u1087\u101e\u1031 \u1010\u1030\u107a\u103a\u1038 / \u1081\u1035\u1010\u103a\u1038\u101e\u1004\u103a",
    cr_save: "\u2b07 \u101e\u102d\u1019\u103a\u1038 PNG",
    cr_engine: "Engine",
    cr_need_result: "\u101e\u1062\u1004\u103a\u1088\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038",
    btn_web_import_url: "\u2b07 \u1076\u101d\u103a\u1088 URL",
    st_clip_help: "Clipboard \u1015\u101d\u103a\u1087/\u1011\u102f\u1075\u103a\u1087\u1081\u1062\u1019\u103a\u1088 \u2014 \u1015\u1062\u1075\u103a\u1088 link \u101e\u1082\u103a\u1087\u107c\u1082\u103a\u1038\u1081\u103d\u1004\u103a\u1088 URL \u101e\u1031 \u107c\u1035\u1075\u103a\u1038 \u2b07 Import URL",
    st_web_blob: "\u1022\u107c\u103a\u107c\u107c\u103a\u1089\u1015\u1035\u107c\u103a link blob: \u1075\u1019\u103a\u1038\u107c\u102d\u102f\u1004\u103a\u1088\u1075\u1030\u107a\u103a\u1038 \u2014 \u107c\u1035\u1075\u103a\u1038\u1076\u1082\u1083 \u2192 Copy IMAGE Address, \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u101e\u102d\u1019\u103a\u1038\u107e\u1062\u1086\u1087\u101e\u1031 \u1078\u1082\u103a\u1089 Import File",
    err_key: "API key \u1022\u1019\u103a\u1087\u1011\u102f\u1075\u103a\u1087 \u2014 \u1010\u1030\u107a\u103a\u1038 key \u1076\u102d\u102f\u107c\u103a\u1038\u1010\u102e\u1088 tab Setup",
    err_quota: "Quota / \u1081\u1085\u1004\u103a\u1038\u1076\u1082\u1062\u1004\u103a\u1088\u1010\u1035\u1019\u103a \u2014 \u1015\u1082\u103a\u1089\u1075\u1019\u103a\u1038\u107c\u102d\u102f\u1004\u103a\u1088\u101e\u1031 \u1078\u1062\u1019\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038",
    err_big: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u101a\u1082\u103a\u1087\u1015\u1030\u107c\u103a\u1089\u1010\u103d\u107c\u103a\u1088\u1010\u1083\u1087 API \u2014 \u1081\u1035\u1010\u103a\u1038\u1081\u1082\u103a\u1088\u101c\u1035\u1075\u103a\u1089\u101e\u1031 \u1078\u1062\u1019\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038",
    err_safety: "\u1011\u102f\u1075\u103a\u1087 safety filter \u1081\u1062\u1019\u103a\u1088 \u2014 \u1019\u1084\u1038 prompt \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u101e\u1031 \u1078\u1062\u1019\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038",
    err_net: "\u1076\u103d\u1004\u103a\u1087\u101e\u1035\u1004\u103a\u1088 / server \u1019\u102e\u1038\u101c\u103d\u1004\u103a\u1088\u101a\u102f\u1075\u103a\u1038 \u2014 \u1078\u1062\u1019\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038",
    err_timeout: "\u1076\u1062\u101d\u103a\u1038\u101a\u1062\u1019\u103a\u1038\u1010\u1035\u1019\u103a \u2014 server \u1078\u1082\u103a\u1089\u1076\u1062\u101d\u103a\u1038\u101a\u1062\u1019\u103a\u1038\u1081\u102d\u102f\u1004\u103a\u1015\u1030\u107c\u103a\u1089; \u1078\u1062\u1019\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038",
    err_generic: "\u1081\u1035\u1010\u103a\u1038\u1022\u1019\u103a\u1087\u101a\u101d\u103a\u1089 \u2014 \u1078\u1062\u1019\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038",
    err_img: "\u1022\u1019\u103a\u1087\u101c\u1086\u1088\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1022\u107c\u103a\u1078\u1082\u103a\u1089\u101c\u1086\u1088 \u2014 \u1078\u1062\u1019\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038",
    err_mode: "Document \u107c\u1086\u1089 \u1022\u1019\u103a\u1087\u1078\u1082\u103a\u1088 RGB mode \u2014 \u101c\u1085\u1075\u103a\u1088\u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038 (Image \u25b8 Mode \u25b8 RGB Color) \u101e\u1031 \u1078\u1062\u1019\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038",
    cam_master: "\u1015\u102d\u102f\u1010\u103a\u1087 Camera block \u2014 \u101e\u1082\u103a\u1087\u1010\u102e\u1088\u1015\u1062\u1086 prompt \u1075\u1030\u1088\u1022\u107c\u103a",
    cam_body: "\u1010\u1030\u101d\u103a\u1075\u103d\u1004\u103a\u1088\u1011\u1062\u1086\u1087",
    cam_lens: "\u101c\u1085\u107c\u103a\u1089 Prime (mm)",
    cam_f: "Aperture",
    cam_film: "\u1081\u1062\u1004\u103a\u1088 Film",
    cam_bokeh: "Style Bokeh",
    cam_iso: "ISO",
    cam_k: "WB Kelvin",
    cam_note: "\u1015\u102d\u102f\u1010\u103a\u1087 block \u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038 \u101e\u1031 \u101c\u102d\u1030\u1075\u103a\u1088\u1022\u107c\u103a\u101c\u1030\u101d\u103a\u1087\u1075\u1030\u107a\u103a\u1038 \u2014 chip \u2013 \u1010\u1031\u1022\u1019\u103a\u1087\u1015\u1083\u1038\u104b \u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088\u1010\u1031\u101a\u1030\u1087\u1010\u102e\u1088\u1015\u1062\u1086 prompt \u101c\u102d\u102f\u107c\u103a\u1038\u101e\u102f\u1010\u103a\u1038\u104b",
    ro_h_main: "REFERENCE OPS PRO (Ref1 / Ref2)",
    ro_note: "Ref1 = IMAGE 2 (\u101a\u102d\u1004\u103a\u1038) \u00b7 Ref2 = IMAGE 3 (\u1078\u1062\u1086\u1038)\u104b \u101c\u102d\u1030\u1075\u103a\u1088\u1022\u107c\u103a\u1019\u1062\u1086\u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038\u101e\u1031 \u1081\u1035\u1010\u103a\u1038 \u2014 \u1075\u1030\u107c\u103a\u1038\u1022\u107c\u103a\u1022\u1019\u103a\u1087\u1019\u1085\u107c\u103a\u1088 \u1010\u1031\u1022\u1019\u103a\u1087\u101c\u1085\u1075\u103a\u1088\u104b",
    ro_target: "\u1022\u107c\u103a\u1019\u1062\u1086:",
    ro_solo: "\u1075\u1031\u1083\u1089\u101c\u1035\u101d\u103a",
    ro_couple: "\u1075\u1030\u1088\u1076\u1030\u1088",
    ro_family: "\u1015\u102e\u1088\u107c\u103d\u1004\u103a\u1089",
    ro_mk: "\u1075\u1031\u1083\u1087 makeup \u1010\u102e\u1088 ref",
    ro_hair: "\u1022\u101d\u103a\u1081\u1062\u1004\u103a\u1088\u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a\u1010\u102e\u1088 ref",
    ro_h_face: "Face Ops",
    ro_h_bg: "BG / FG Ops",
    ro_h_sub: "Subject Ops",
    ro_h_lc: "Light & Color Ops",
    ro_h_dress: "Dress Ops",
    ro_h_mk: "Makeup Ops",
    ro_h_match: "\u2605 Master Match (\u1081\u1062\u1004\u103a\u1088\u101c\u1035\u101d\u103a)",
    ro_match_note: "\u1081\u1082\u103a\u1088 IMAGE 1 \u1076\u101d\u103a\u1088\u1075\u107c\u103a\u1010\u1004\u103a\u1038 reference \u1081\u1082\u103a\u1088\u1019\u102d\u1030\u107c\u103a\u1019\u1084\u1038\u1015\u103d\u1075\u103a\u1088\u101c\u1035\u101d\u103a\u1075\u107c\u103a \u2014 \u1019\u1062\u1086\u1022\u107c\u103a\u1076\u1082\u103a\u1088\u1081\u1082\u103a\u1088\u1019\u102d\u1030\u107c\u103a:",
    m_color: "\u101e\u102e",
    m_light: "\u107e\u1086\u1038",
    m_makeup: "Makeup",
    m_skin: "Retouch \u107d\u102d\u101d\u103a\u107c\u1004\u103a",
    crd_pipe: "\u26d3 Pipeline Builder \u2014 \u101e\u102d\u102f\u1015\u103a\u1087\u101c\u1086\u1088\u1075\u1030\u1088\u1022\u107c\u103a",
    pipe_note: "\u101e\u102d\u102f\u1015\u103a\u1087\u1076\u1075\u103a\u1089\u1022\u107c\u103a\u101c\u1082\u103a\u1075\u1031\u1083\u1088\u101c\u1086\u1088\u1015\u1035\u107c\u103a\u101e\u1062\u1086\u101c\u1035\u101d\u103a \u2014 \u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088\u1075\u1030\u1088\u1076\u1075\u103a\u1089 \u1076\u101d\u103a\u1088\u1015\u1035\u107c\u103a\u1022\u107c\u103a\u1078\u1082\u103a\u1089\u1010\u103d\u107c\u103a\u1088\u1010\u1083\u1087\u1076\u1075\u103a\u1089\u1010\u1031\u1019\u1083\u1038\u104b \u107c\u1019\u103a\u101e\u102f\u1010\u103a\u1038 6\u104b",
    pipe_add: "+ \u101e\u1082\u103a\u1087",
    pipe_run: "\u25b6 \u1081\u1035\u1010\u103a\u1038 PIPELINE",
    pipe_clear: "\u1019\u103d\u1010\u103a\u1087",
    pipe_retouch: "\u1078\u1082\u103a\u1089 Retouch (slider \u101a\u1062\u1019\u103a\u1038\u101c\u1035\u101d\u103a)",
    pipe_relight: "Relight (\u1076\u102d\u1030\u1004\u103a\u1088\u107e\u1086\u1038\u101a\u1062\u1019\u103a\u1038\u101c\u1035\u101d\u103a)",
    pipe_prompt: "Prompt (\u1081\u103d\u1004\u103a\u1088 EN \u101a\u1062\u1019\u103a\u1038\u101c\u1035\u101d\u103a)",
    pipe_empty: "\u101e\u1082\u103a\u1087\u1076\u1075\u103a\u1089\u107c\u102d\u102f\u1004\u103a\u1088\u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038",
    pipe_max: "Pipeline \u1010\u1035\u1019\u103a\u101a\u101d\u103a\u1089 (\u107c\u1019\u103a\u101e\u102f\u1010\u103a\u1038 6 \u1076\u1075\u103a\u1089)",
    st_pipe: "\u1076\u1075\u103a\u1089 pipeline",
    st_pipe_done: "Pipeline \u101a\u101d\u103a\u1089",
    st_pipe_stop: "Pipeline \u1075\u102d\u102f\u1010\u103a\u1038 (\u1076\u1075\u103a\u1089\u107c\u102d\u102f\u1004\u103a\u1088\u1022\u1019\u103a\u1087\u1015\u1035\u107c\u103a)",
    pipe_merge: "\u26a1 \u1081\u1030\u1019\u103a\u1088\u1015\u103d\u1075\u103a\u1088\u101c\u1035\u101d\u103a \u2014 \u1076\u1075\u103a\u1089\u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088\u107c\u1082\u103a\u1038\u1015\u103d\u1075\u103a\u1088\u101c\u1035\u101d\u103a (\u101d\u1086\u1038/\u1011\u102f\u1075\u103a\u1087 \u00b7 \u101c\u102e\u101e\u102f\u1010\u103a\u1038 \u2264 3 \u1075\u1062\u107c\u103a)",
    crd_chainsrest: "Style Chains + \u1019\u1084\u1038\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1075\u101d\u103a\u1087",
    crd_refops: "Reference Ops Pro (Ref1 / Ref2)",
    crd_scenes: "\ud83c\udfac Scenes Pro \u2014 \u101c\u103d\u1075\u103a\u1089\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038 \u00b7 scene \u1076\u101d\u103a\u1088\u1075\u107c\u103a",
    scn_note: "\u101c\u103d\u1075\u103a\u1089\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087 (\u107c\u1083\u1088\u1010\u1083 \u00b7 \u1078\u1083\u1087\u1010\u1083\u1087 \u00b7 \u1076\u1030\u101d\u103a\u1038\u107c\u102f\u1004\u103a\u1088 \u00b7 \u1076\u103d\u1015\u103a\u1087) \u101e\u1031 \u101e\u1062\u1004\u103a\u1088 scene \u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088\u1081\u1082\u103a\u1088\u1076\u101d\u103a\u1088\u1075\u107c\u103a \u2014 \u107e\u1086\u1038, \u1004\u101d\u103a\u1038, \u101e\u102e, \u107d\u1062\u1086\u1087\u101c\u1004\u103a, \u107d\u1062\u1086\u1087\u107c\u1083\u1088 \u101c\u1084\u1088 \u1076\u1030\u101d\u103a\u1038\u1076\u103d\u1004\u103a \u1076\u101d\u103a\u1088\u1075\u107c\u103a\u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038 \u1081\u1082\u103a\u1088\u1019\u102d\u1030\u107c\u103a\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1010\u1084\u1089\u104b",
    scn_h_style: "Style Scene (\u107c\u1082\u103a\u1038\u1081\u102d\u1030\u107c\u103a\u1038 / \u107e\u102d\u1004\u103a\u1088\u1011\u102f\u1004\u103a\u1038)",
    scn_h_bday: "\ud83c\udf82 \u101d\u107c\u103a\u1038\u1075\u102d\u1030\u1010\u103a\u1087 \u2014 \u1022\u1083\u1087\u101a\u102f 1\u201345",
    scn_h_cap: "\u101c\u102d\u1075\u103a\u1088 Caption (\u101c\u102f\u1075\u103a\u1088\u1022\u103d\u107c\u103a\u1087 \u00b7 Miss Universe \u00b7 \u101d\u107c\u103a\u1038\u1075\u102d\u1030\u1010\u103a\u1087)",
    scn_h_scarf: "\u107c\u103d\u1075\u103a\u1088\u1081\u102d\u1030\u107c\u103a\u1038 / \u107d\u1083\u1088\u1015\u102d\u101d\u103a",
    scn_grad: "\u1081\u1015\u103a\u1089\u1078\u102f\u1019\u103a\u1088\u1076\u1030\u1038 \u107c\u1082\u103a\u1038\u1081\u102d\u1030\u107c\u103a\u1038",
    scn_prewed: "Prewedding \u107c\u1082\u103a\u1038\u1081\u102d\u1030\u107c\u103a\u1038",
    scn_vietnam: "\u101d\u1085\u1010\u103a\u1089\u107c\u1019\u103a\u1038",
    scn_myanmar: "\u1019\u1062\u107c\u103a\u1088",
    scn_chinese: "\u1076\u1084\u1087",
    scn_shan: "\u1010\u1086\u1038",
    scn_newborn: "\u101c\u102f\u1075\u103a\u1088\u1022\u103d\u107c\u103a\u1087\u1075\u102d\u1030\u1010\u103a\u1087\u1019\u1082\u103a\u1087",
    scn_age: "\u1022\u1083\u1087\u101a\u102f",
    scn_bday_go: "\ud83c\udf82 SCENE \u101d\u107c\u103a\u1038\u1075\u102d\u1030\u1010\u103a\u1087",
    scn_cap_on: "\u101e\u1082\u103a\u1087\u101c\u102d\u1075\u103a\u1088 caption",
    scn_cap_ph: "\u101c\u102d\u1075\u103a\u1088 caption (\u107c\u1004\u103a\u1087 Happy 1st Birthday, \u1078\u102d\u102f\u101d\u103a\u1088)\u2026",
    scn_cap_pos: "\u1010\u102e\u1088\u101a\u1030\u1087",
    scn_top: "\u107c\u102d\u1030\u101d\u103a",
    scn_bottom: "\u1010\u1082\u103a\u1088",
    scn_scarf: "\u2726 SCENE \u107d\u1083\u1088\u1015\u102d\u101d\u103a",
    scn_dir: "\u1081\u1030\u1038\u1010\u1062\u1004\u103a\u1038",
    scn_left: "\u101e\u1062\u1086\u1089",
    scn_right: "\u1076\u1082\u1083",
    scn_up: "\u107c\u102d\u1030\u101d\u103a",
    scn_len: "\u101c\u103d\u1004\u103a\u1088\u101a\u1062\u101d\u103a\u1038",
    scn_short: "\u1015\u103d\u1010\u103a\u1038",
    scn_long: "\u101a\u1062\u101d\u103a\u1038",
    g_cat_scene: "SCENE OP \u2014 \u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087 \u101c\u103d\u1075\u103a\u1089\u101d\u1086\u1089 (\u107c\u1083\u1088\u1010\u1083 \u00b7 \u1078\u1083\u1087\u1010\u1083\u1087 \u00b7 \u1076\u1030\u101d\u103a\u1038\u107c\u102f\u1004\u103a\u1088 \u00b7 \u1076\u103d\u1015\u103a\u1087); scene \u1022\u107c\u103a\u101e\u1062\u1004\u103a\u1088\u1022\u103d\u1075\u103a\u1087\u1019\u1083\u1038\u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088 (\u107e\u1086\u1038, \u1004\u101d\u103a\u1038, \u101e\u102e, \u107d\u1062\u1086\u1087\u101c\u1004\u103a, \u107d\u1062\u1086\u1087\u107c\u1083\u1088, \u1076\u1030\u101d\u103a\u1038\u1076\u103d\u1004\u103a, \u101d\u1086\u1088\u101c\u1030\u1019\u103a\u1038) \u1076\u101d\u103a\u1088\u1075\u107c\u103a\u1010\u1004\u103a\u1038\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038 \u1081\u1082\u103a\u1088\u1019\u102d\u1030\u107c\u103a\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1010\u1084\u1089\u104b",
    crd_wed: "\u2665 Wedding Pro Suite",
    crd_recipes: "Recipes \u2014 \u101e\u102d\u1019\u103a\u1038 / \u1019\u103d\u1015\u103a\u1088",
    learn_lbl: "\ud83c\udf93 Learn Mode \u2014 \u107c\u1035\u1075\u103a\u1038 1 = \u101c\u103d\u1004\u103a\u1088\u107c\u1084 (\u101c\u102d\u1030\u1004\u103a), 2 = prompt (\u1076\u1035\u101d\u103a\u107e\u1083\u1089), 3 = \u1081\u1035\u1010\u103a\u1038 (\u1076\u1035\u101d\u103a)",
    guide_hint: "\u107c\u1035\u1075\u103a\u1038\u1011\u1085\u1004\u103a\u1088: \u101c\u102d\u1030\u1004\u103a \u2192 \u1076\u1035\u101d\u103a\u107e\u1083\u1089 (prompt) \u2192 \u1076\u1035\u101d\u103a (\u1081\u1035\u1010\u103a\u1038) \u25b6",
    g_learn_next_prompt: "\u107c\u1035\u1075\u103a\u1038\u1011\u1085\u1004\u103a\u1088 \u2192 \u107c\u1084 PROMPT \u1010\u1084\u1089 (\u1076\u1035\u101d\u103a\u107e\u1083\u1089)\u104b",
    g_learn_prompt_head: "PROMPT \u1022\u107c\u103a\u1015\u102f\u1019\u103a\u1087\u107c\u1086\u1089\u1010\u1031\u101e\u1030\u1004\u103a\u1087 (\u107c\u1035\u1075\u103a\u1038\u1011\u1085\u1004\u103a\u1088 = \u1081\u1035\u1010\u103a\u1038):",
    g_learn_next_run: "\u107c\u1035\u1075\u103a\u1038\u1011\u1085\u1004\u103a\u1088\u1015\u103d\u1075\u103a\u1088\u107c\u102d\u102f\u1004\u103a\u1088 \u2192 RUN (\u1076\u1035\u101d\u103a) \u1010\u1031\u101e\u1062\u1004\u103a\u1088\u104b",
    st_prompt_ready: "Prompt \u1081\u1062\u1004\u103a\u1088\u1081\u1085\u107c\u103a\u1038\u101a\u101d\u103a\u1089 \u2014 \u107c\u1035\u1075\u103a\u1038\u1011\u1085\u1004\u103a\u1088 (\u1076\u1035\u101d\u103a) \u101e\u1031\u1081\u1035\u1010\u103a\u1038 \u2713",
    g_step_doc: "\u1015\u102d\u102f\u1010\u103a\u1087 document \u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u107c\u1082\u103a\u1038 Photoshop \u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038\u104b",
    g_step_ref1: "\u101e\u1082\u103a\u1087\u1076\u1085\u1015\u103a\u1038 reference \u1076\u101d\u103a\u1088 Ref1 (\u1010\u1031\u1015\u1035\u107c\u103a IMAGE 2)\u104b \u1015\u1031\u1083\u1038\u1019\u102e\u1038\u1075\u1030\u107c\u103a\u1038\u1011\u1030\u107c\u103a\u1088\u101e\u103d\u1004\u103a \u101e\u1082\u103a\u1087 Ref2\u104b",
    g_step_target: "\u101c\u102d\u1030\u1075\u103a\u1088 Target: Solo / Couple (Ref1 = \u101a\u102d\u1004\u103a\u1038, Ref2 = \u1078\u1062\u1086\u1038) / Family\u104b",
    g_step_mkhair: "\u101e\u1082\u103a\u1087\u1075\u1031\u1083\u1088\u101c\u1086\u1088: \u1019\u1062\u1086 \u2018Copy ref makeup\u2019 / \u2018Take ref hairstyle\u2019 \u1022\u107c\u103a\u101a\u1030\u1087\u107c\u102d\u1030\u101d\u103a Face Ops\u104b",
    g_step_petal: "\u101c\u102d\u1030\u1075\u103a\u1088\u101e\u102e\u1019\u1062\u1075\u103a\u1087\u1019\u103d\u1075\u103a\u1087\u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038 (auto = \u1076\u101d\u103a\u1088\u1075\u107c\u103a\u1010\u1004\u103a\u1038 scene \u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087)\u104b",
    g_step_rest: "\u101c\u102d\u1030\u1075\u103a\u1088 Full Color \u1022\u1019\u103a\u1087\u107c\u107c\u103a B&W \u101c\u1030\u107a\u103a\u1088 \u2713 \u107c\u102d\u1030\u101d\u103a\u107c\u1086\u1089\u104b",
    g_step_int: "\u1019\u1084\u1038 slider Intensity \u1078\u103d\u1019\u103a\u1038\u1078\u1082\u103a\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u104b",
    g_step_confirm: "\u107c\u1035\u1075\u103a\u1038\u1011\u1085\u1004\u103a\u1088\u101e\u1031\u1075\u1082\u1083\u1087\u107c\u1083\u1088: GUIDE (\u101c\u102d\u1030\u1004\u103a) \u2192 PROMPT (\u1076\u1035\u101d\u103a\u107e\u1083\u1089) \u2192 RUN (\u1076\u1035\u101d\u103a \u1010\u1031\u101e\u1062\u1004\u103a\u1088\u1010\u1084\u1089)\u104b",
    g_cat_face: "FACE OP \u2014 \u1022\u101d\u103a\u107c\u1083\u1088\u1010\u1083 reference \u101e\u1082\u103a\u1087\u1015\u107c\u103a\u1075\u1030\u107c\u103a\u1038\u1022\u107c\u103a\u1019\u1085\u107c\u103a\u1088; \u1075\u1030\u107c\u103a\u1038\u1010\u1062\u1004\u103a\u1087\u1075\u1031\u1083\u1089\u1022\u1019\u103a\u1087\u101c\u1085\u1075\u103a\u1088\u104b",
    g_cat_sub: "SUBJECT OP \u2014 \u1022\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u107c\u1082\u103a\u1038 reference \u1076\u101d\u103a\u1088\u1019\u1083\u1038\u107c\u1082\u103a\u1038 scene \u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087; scene \u101c\u1084\u1088 \u1076\u103d\u1015\u103a\u1087 \u101d\u1086\u1089\u1075\u101d\u103a\u1087\u104b",
    g_cat_bgfg: "BG/FG OP \u2014 \u101c\u1085\u1075\u103a\u1088\u107d\u1062\u1086\u1087\u101c\u1004\u103a / \u107d\u1062\u1086\u1087\u107c\u1083\u1088 \u1075\u1030\u107a\u103a\u1038 \u101c\u1030\u107a\u103a\u1088 reference\u104b",
    g_cat_lc: "LIGHT & COLOR OP \u2014 \u1075\u1031\u1083\u1087\u107e\u1086\u1038\u101c\u1084\u1088\u101e\u102e\u1076\u103d\u1004\u103a reference; \u1075\u1030\u107c\u103a\u1038\u101d\u1086\u1089\u1010\u1085\u1010\u103a\u1088\u1075\u1030\u1088 pixel\u104b",
    g_cat_dress: "DRESS OP \u2014 \u101c\u1085\u1075\u103a\u1088\u1076\u1030\u101d\u103a\u1038\u107c\u102f\u1004\u103a\u1088\u1075\u1030\u107a\u103a\u1038 \u101c\u1030\u107a\u103a\u1088 reference\u104b",
    g_cat_mkop: "MAKEUP OP \u2014 \u101c\u1085\u1075\u103a\u1088 makeup \u1075\u1030\u107a\u103a\u1038 \u101c\u1030\u107a\u103a\u1088 reference\u104b",
    g_cat_match: "MASTER MATCH \u2014 \u1081\u1035\u1010\u103a\u1038\u1081\u1082\u103a\u1088\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087 \u1076\u101d\u103a\u1088\u1075\u107c\u103a\u1010\u1004\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088\u1076\u103d\u1004\u103a reference (\u1019\u1062\u1086\u1078\u107c\u103a\u1089\u107c\u102d\u1030\u101d\u103a)\u104b",
    g_cat_trail: "WEDDING TRAIL \u2014 \u101a\u102d\u1030\u101d\u103a\u1088\u1019\u1030\u1010\u103a\u1038\u101c\u102e + \u1010\u1062\u1004\u103a\u1038\u1019\u103d\u1075\u103a\u1087\u101a\u1062\u101d\u103a\u1038; \u107c\u1083\u1088\u1010\u1083/\u1078\u1083\u1087\u1010\u1083\u1087/\u1076\u103d\u1015\u103a\u1087 \u101c\u103d\u1075\u103a\u1089\u1076\u1035\u1004\u103a\u1088\u104b",
    g_cat_veil: "FLYING VEIL \u2014 \u101e\u1082\u103a\u1087/\u1081\u1035\u1010\u103a\u1038\u1081\u1082\u103a\u1088\u107d\u1083\u1088\u1076\u101c\u102f\u1019\u103a\u1087\u1015\u102d\u101d\u103a\u101a\u1062\u101d\u103a\u1038\u1078\u102d\u1030\u1004\u103a\u1089\u107c\u1086\u1089; \u1022\u1019\u103a\u1087\u1010\u102d\u102f\u1075\u103a\u1038\u107c\u1083\u1088\u1010\u1083\u101e\u1031\u1015\u103d\u1075\u103a\u1088\u104b",
    g_cat_gown: "GOWN \u2014 \u1081\u1035\u1010\u103a\u1038\u1081\u1082\u103a\u1088\u1076\u1030\u101d\u103a\u1038\u107c\u102f\u1004\u103a\u1088\u1019\u102e\u1038\u101d\u1086\u1089\u1019\u1030\u1010\u103a\u1038\u101e\u1082\u103a (\u1081\u1062\u1004\u103a\u1088\u1022\u1019\u103a\u1087\u101c\u1085\u1075\u103a\u1088) \u101e\u1031 \u1019\u1075\u103a\u1038\u101c\u103d\u1004\u103a\u1088\u101a\u1062\u101d\u103a\u1038\u1081\u1062\u1004\u103a\u107c\u1086\u1089\u104b",
    g_cat_petal: "FLYING PETALS \u2014 \u101e\u1082\u103a\u1087\u1019\u1062\u1075\u103a\u1087\u1019\u103d\u1075\u103a\u1087\u1015\u102d\u101d\u103a\u107c\u1082\u103a\u1038\u101c\u1030\u1019\u103a\u1038 \u1078\u102d\u1030\u1004\u103a\u1089 style \u107c\u1086\u1089; \u101e\u102e\u1022\u101d\u103a\u1010\u102e\u1088\u1078\u107c\u103a\u1089\u107c\u102d\u1030\u101d\u103a\u104b",
    g_cat_wedx: "WEDDING EXTRA \u2014 \u101e\u1082\u103a\u1087\u1022\u107c\u103a\u107c\u1086\u1089\u1081\u1082\u103a\u1088\u1076\u101d\u103a\u1088\u1075\u107c\u103a\u1010\u1004\u103a\u1038 scene \u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087; \u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u101c\u103d\u1075\u103a\u1089\u101d\u1086\u1089\u104b",
    g_cat_canvas: "REPLACE (CANVAS) \u2014 \u1022\u101d\u103a\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087 \u101e\u1082\u103a\u1087\u1076\u101d\u103a\u1088 scene \u1076\u103d\u1004\u103a reference; \u1075\u1030\u107c\u103a\u1038\u107c\u1082\u103a\u1038 ref \u1022\u101d\u103a\u1022\u103d\u1075\u103a\u1087\u104b",
    g_cat_restore: "OLD PHOTO RESTORE \u2014 \u1019\u1084\u1038\u1022\u107c\u103a\u101c\u102f\u1010\u103a\u1088; \u107c\u1083\u1088\u1010\u1083\u1075\u1030\u1088\u1075\u1031\u1083\u1089\u1019\u102d\u1030\u107c\u103a\u1075\u101d\u103a\u1087 100%\u104b",
    g_cat_generic: "PRESET \u2014 \u1078\u1082\u103a\u1089\u101c\u103d\u1004\u103a\u1088\u1019\u1084\u1038\u1078\u107c\u103a\u1089\u1076\u102d\u102f\u1075\u103a\u1089\u107c\u1086\u1089 \u107c\u102d\u1030\u101d\u103a\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u104b",
    g_gen: "GENERATE \u2014 \u1081\u1035\u1010\u103a\u1038\u1081\u103d\u1004\u103a\u1088 prompt (+ chains, \u101c\u103d\u1075\u103a\u1089 Keep, camera block) \u107c\u102d\u1030\u101d\u103a document \u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u104b",
    g_retouchbtn: "RETOUCH APPLY \u2014 \u1081\u1035\u1010\u103a\u1038 setting slider \u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088 \u1015\u1035\u107c\u103a retouch \u1078\u107c\u103a\u1089\u1076\u102d\u102f\u1075\u103a\u1089\u1015\u103d\u1075\u103a\u1088\u101c\u1035\u101d\u103a\u104b",
    g_relightbtn: "LIGHTING GENERATE \u2014 \u101e\u1082\u103a\u1087\u107e\u1086\u1038\u1076\u102d\u102f\u107c\u103a\u1038\u1078\u103d\u1019\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u107e\u1086\u1038 3D \u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u1010\u1085\u1010\u103a\u1088\u1010\u1085\u1010\u103a\u1088\u104b",
    g_scene: "SCENE GENERATE \u2014 \u101e\u1062\u1004\u103a\u1088 scene \u1076\u102d\u102f\u107c\u103a\u1038\u1010\u102e\u1088 prompt \u1022\u107c\u103a\u1011\u102f\u1010\u103a\u1087\u101d\u1086\u1089; \u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u101d\u1086\u1089\u1075\u101d\u103a\u1087\u104b",
    g_rmix: "REPLACE MIX \u2014 \u101c\u1085\u1075\u103a\u1088\u1022\u107c\u103a\u1019\u1062\u1086 \u2713 \u101d\u1086\u1089\u1075\u1030\u107a\u103a\u1038 \u1010\u102e\u1088 reference\u104b",
    g_pipe: "RUN PIPELINE \u2014 \u1081\u1035\u1010\u103a\u1038\u1076\u1075\u103a\u1089\u1022\u107c\u103a\u101e\u102d\u102f\u1015\u103a\u1087\u101d\u1086\u1089\u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088\u1078\u103d\u1019\u103a\u1038\u101c\u1087\u1010\u102d\u102f\u101d\u103a\u1038; \u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088\u1075\u1030\u1088\u1022\u107c\u103a \u1076\u101d\u103a\u1088\u1076\u1075\u103a\u1089\u1010\u1031\u1019\u1083\u1038\u104b",
    ro_faceRep: "Face Replace",
    ro_faceSwap: "Face Swap",
    ro_bgRep: "BG Replace",
    ro_bgSwap: "BG Swap",
    ro_fgRep: "FG Replace",
    ro_bg_note: "Doc = \u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038 \u00b7 Ref1 = scene \u1019\u1082\u103a\u1087\u104b Target (Solo/Couple/Family) \u101c\u102d\u1030\u1075\u103a\u1088\u101d\u1083\u1088\u1010\u1031\u101d\u1086\u1089\u107d\u1082\u103a\u104b",
    ro_bg_frame: "\u101d\u1086\u1089\u1076\u103d\u1015\u103a\u1087\u101c\u1084\u1088\u101c\u103d\u1004\u103a\u1088\u1078\u1010\u103a\u1038",
    ro_bg_light: "\u101d\u1086\u1089\u107e\u1086\u1038/\u101e\u102e\u1076\u103d\u1004\u103a\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038",
    ro_subSwap: "Subject Swap",
    ro_lcRef: "L&C Reference",
    ro_lcCopy: "L&C Copy-Paste",
    ro_dressRef: "Dress Reference",
    ro_dressRep: "Dress Replace",
    ro_mkCopy: "Makeup Copy",
    ro_matchBtn: "\u2605 MASTER MATCH",
    grp_retouch: "Preset Retouch \u107d\u102d\u101d\u103a\u107c\u1004\u103a",
    lbl_intensity: "\u1081\u1085\u1004\u103a\u1038",
    p_evoto: "Evoto Style",
    p_meitu: "Meitu Style",
    auto_place: "\u101e\u1082\u103a\u1087\u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088\u1076\u101d\u103a\u1088 Photoshop \u1015\u1035\u107c\u103a layer \u1019\u1082\u103a\u1087\u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038",
    sec_retouchpro: "Retouch Pro \u2014 Sliders",
    rt_skin: "\u107d\u102d\u101d\u103a\u107c\u1004\u103a",
    rt_faceai: "Face AI",
    rt_hair: "\u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a",
    rt_dress: "\u1076\u1030\u101d\u103a\u1038\u107c\u102f\u1004\u103a\u1088",
    rt_bg: "\u107d\u1062\u1086\u1087\u101c\u1004\u103a",
    rt_smooth: "\u1081\u1035\u1010\u103a\u1038\u107d\u102d\u101d\u103a\u107c\u1004\u103a\u1019\u1030\u107c\u103a\u1038",
    rt_acne: "\u1022\u101d\u103a\u1019\u1062\u1075\u103a\u1087\u1022\u103d\u1075\u103a\u1087",
    rt_spots: "\u1010\u102e\u1088\u101c\u1019\u103a",
    rt_wrinkle: "\u1081\u103d\u1086\u1038\u101c\u102d\u1030\u1010\u103a\u1087",
    rt_tone: "\u1076\u1062\u101d\u103a / \u1022\u103d\u107c\u103a\u1087\u101c\u1019\u103a",
    rt_glow: "\u1081\u102d\u1030\u101d\u103a\u1088",
    rt_reshape: "AI Reshape",
    rt_lash: "\u1076\u1030\u107c\u103a\u1010\u1083\u107c\u103d\u1075\u103a\u1088",
    rt_brow: "\u1076\u1030\u107c\u103a\u1010\u1083",
    rt_lipsmooth: "\u1019\u1030\u107c\u103a\u1038\u101e\u1030\u1015\u103a\u1038",
    rt_lipcolor: "\u101e\u102e\u101e\u1030\u1015\u103a\u1038",
    rt_lenscolor: "\u101e\u102e Lens \u1010\u1083",
    rt_hairstray: "\u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a\u1081\u1075\u103a\u1038",
    rt_hairsmooth: "\u1019\u1030\u107c\u103a\u1038\u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a",
    rt_hairshine: "\u1081\u102d\u1030\u101d\u103a\u1088\u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a (D&B)",
    rt_dresssmooth: "\u1019\u1030\u107c\u103a\u1038\u107d\u1083\u1088",
    rt_dressedge: "\u1081\u1035\u1010\u103a\u1038\u1081\u102d\u1019\u103a\u1038\u1076\u103d\u1015\u103a\u1087\u1019\u1030\u1010\u103a\u1038",
    rt_dresswrinkle: "\u1022\u101d\u103a\u1081\u103d\u1086\u1038\u101a\u103d\u1004\u103a\u1087\u1022\u103d\u1075\u103a\u1087",
    rt_dresstexture: "\u1019\u1084\u1038\u1081\u1062\u1004\u103a\u1088\u107d\u1083\u1088\u1076\u102d\u102f\u107c\u103a\u1038",
    rt_bgsmooth: "\u1081\u1035\u1010\u103a\u1038\u107d\u1062\u1086\u1087\u101c\u1004\u103a\u1019\u1030\u1010\u103a\u1038/\u1019\u1030\u107c\u103a\u1038",
    rt_bgcolor: "\u101e\u102e\u107d\u1062\u1086\u1087\u101c\u1004\u103a",
    rt_bgrecolor: "\u1019\u1030\u107c\u103a\u1038\u101e\u102e\u107d\u1062\u1086\u1087\u101c\u1004\u103a",
    rt_shape: "Reshape Pro (\u107c\u1083\u1088\u1010\u1083 + \u1010\u1030\u101d\u103a)",
    rt_teeth: "\u1081\u1035\u1010\u103a\u1038\u1076\u1035\u101d\u103a\u1088\u1076\u1062\u101d\u103a",
    rt_eyewhite: "\u1081\u1035\u1010\u103a\u1038\u1010\u1083\u1076\u1062\u101d\u103a\u1019\u1030\u1010\u103a\u1038",
    rt_faceslim: "\u1081\u1035\u1010\u103a\u1038\u107c\u1083\u1088\u101c\u1035\u1075\u103a\u1089",
    rt_jaw: "\u101e\u1035\u107c\u103a\u1088\u1076\u1062\u1004\u103a\u1088\u1076\u1035\u101d\u103a\u1088",
    rt_chin: "\u1076\u1062\u1004\u103a\u1038",
    rt_nosesize: "\u1076\u107c\u1062\u1010\u103a\u1088\u1076\u1030\u1087",
    rt_eyesize: "\u1076\u107c\u1062\u1010\u103a\u1088\u1010\u1083",
    rt_lipfull: "\u101e\u1030\u1015\u103a\u1038\u1010\u1035\u1019\u103a",
    rt_waist: "\u1022\u1085\u101d\u103a\u101c\u1035\u1075\u103a\u1089",
    rt_bodyslim: "\u1010\u1030\u101d\u103a\u101c\u1035\u1075\u103a\u1089",
    rt_shoulder: "\u1015\u1062\u1086\u1088",
    rt_hip: "\u1075\u1030\u107c\u103a\u1087\u101c\u1035\u1075\u103a\u1089",
    rt_leglen: "\u101c\u103d\u1004\u103a\u1088\u101a\u1062\u101d\u103a\u1038\u1076\u1083",
    rt_armslim: "\u1076\u1085\u107c\u103a\u101c\u1035\u1075\u103a\u1089",
    rt_dressfit: "\u1076\u1030\u101d\u103a\u1038\u107c\u102f\u1004\u103a\u1088\u1019\u1085\u107c\u103a\u1088\u1010\u1030\u101d\u103a",
    rt_dressclean: "\u1076\u1030\u101d\u103a\u1038\u107c\u102f\u1004\u103a\u1088\u1019\u1030\u1010\u103a\u1038\u101e\u1082\u103a",
    rt_dresscolorpure: "\u101e\u102e\u1076\u1030\u101d\u103a\u1038\u107c\u102f\u1004\u103a\u1088\u101e\u1082\u103a",
    rt_bodygrp: "Body Skin Pro",
    rt_bodysmooth: "\u1019\u1030\u107c\u103a\u1038\u107d\u102d\u101d\u103a\u107c\u1004\u103a\u1010\u1030\u101d\u103a",
    rt_bodyblemish: "\u1081\u1035\u1010\u103a\u1038\u107d\u102d\u101d\u103a\u107c\u1004\u103a\u1010\u1030\u101d\u103a\u1019\u1030\u1010\u103a\u1038",
    rt_bodytone: "\u101e\u102e\u107d\u102d\u101d\u103a\u107c\u1004\u103a\u1019\u102d\u1030\u107c\u103a\u1075\u107c\u103a",
    rt_bodyglow: "\u1010\u1030\u101d\u103a\u1081\u102d\u1030\u101d\u103a\u1088",
    rt_bodyhairrm: "\u1081\u1035\u1010\u103a\u1038\u1081\u1082\u103a\u1088\u1076\u1030\u107c\u103a\u1010\u1030\u101d\u103a\u1022\u1031\u1087",
    rt_hairvolume: "\u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a\u107c\u1019\u103a",
    rt_hairgloss: "\u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a\u1081\u102d\u1030\u101d\u103a\u1088",
    rt_hairfill: "\u101e\u1082\u103a\u1087\u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a (\u1010\u102e\u1088\u1022\u1031\u1087)",
    wp_h_trail: "\u2665 Wedding \u2014 \u1010\u1062\u1004\u103a\u1038\u1019\u103d\u1075\u103a\u1087\u1019\u1030\u1010\u103a\u1038\u101c\u102e",
    wp_h_veil: "\u2665 Wedding \u2014 \u107d\u1083\u1088\u1076\u101c\u102f\u1019\u103a\u1087\u1015\u102d\u101d\u103a",
    wp_h_gown: "\u2665 Wedding \u2014 \u1076\u1030\u101d\u103a\u1038\u107c\u102f\u1004\u103a\u1088\u1019\u1030\u1010\u103a\u1038 + \u1081\u1062\u1004\u103a",
    wp_h_petal: "\u2665 Wedding \u2014 \u1019\u1062\u1075\u103a\u1087\u1019\u103d\u1075\u103a\u1087\u1015\u102d\u101d\u103a",
    wp_h_extra: "\u2665 Wedding \u2014 \u1019\u1083\u1089 \u00b7 \u107c\u1019\u103a\u1089 \u00b7 \u101d\u1086\u1088\u101c\u1030\u1019\u103a\u1038",
    wp_note: "Face ID / \u1078\u1083\u1087\u1010\u1083\u1087 / \u1076\u103d\u1015\u103a\u1087 / \u1081\u1062\u1004\u103a\u1088\u1076\u1030\u101d\u103a\u1038\u107c\u102f\u1004\u103a\u1088 \u101c\u103d\u1075\u103a\u1089\u1076\u1035\u1004\u103a\u1088 \u2014 \u101c\u1085\u1075\u103a\u1088\u1022\u107c\u103a\u1022\u107c\u103a\u1081\u103d\u1004\u103a\u1089\u1078\u102d\u102f\u101d\u103a\u1088\u101d\u1086\u1089\u1075\u1030\u107a\u103a\u1038\u104b",
    wp_petalcolor: "\u101e\u102e\u1019\u1062\u1075\u103a\u1087\u1019\u103d\u1075\u103a\u1087 (auto = \u1076\u101d\u103a\u1088\u1075\u107c\u103a\u1010\u1004\u103a\u1038 scene)",
    wp_trail_c: "\u101e\u102e\u1019\u103d\u1075\u103a\u1087",
    wp_trail_go: "\u25b6 \u1010\u1062\u1004\u103a\u1038\u1019\u103d\u1075\u103a\u1087",
    wp_veil_c: "\u101c\u103d\u1004\u103a\u1088\u101a\u1062\u101d\u103a\u1038\u107d\u1083\u1088\u1076\u101c\u102f\u1019\u103a\u1087",
    wp_veil_go: "\u25b6 \u107d\u1083\u1088\u1076\u101c\u102f\u1019\u103a\u1087\u1015\u102d\u101d\u103a",
    wp_gown_c: "\u101c\u103d\u1004\u103a\u1088\u101a\u1062\u101d\u103a\u1038\u1081\u1062\u1004\u103a",
    wp_gown_go: "\u25b6 \u1076\u1030\u101d\u103a\u1038\u107c\u102f\u1004\u103a\u1088\u1019\u1030\u1010\u103a\u1038 + \u1081\u1062\u1004\u103a",
    wp_pet_c: "Style \u1019\u1062\u1075\u103a\u1087\u1019\u103d\u1075\u103a\u1087",
    wp_pet_go: "\u25b6 \u1019\u1062\u1075\u103a\u1087\u1019\u103d\u1075\u103a\u1087\u1015\u102d\u101d\u103a",
    wp_extra_c: "\u1011\u1085\u1004\u103a\u1088",
    wp_extra_go: "\u25b6 \u101e\u1082\u103a\u1087\u1011\u1085\u1004\u103a\u1088",
    btn_apply_rt: "\u1078\u1082\u103a\u1089 Retouch",
    btn_reset: "\u1081\u1035\u1010\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038\u1078\u102d\u1030\u1004\u103a\u1089\u1075\u101d\u103a\u1087",
    rt_none: "\u1019\u1084\u1038 slider \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u101e\u102e retouch \u1022\u107c\u103a\u107c\u102d\u102f\u1004\u103a\u1088\u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038",
    tab_setup: "Setup",
    tab_prompt: "Studio",
    tab_presets: "Presets",
    recent_lbl: "Prompt \u101c\u102d\u102f\u107c\u103a\u1038\u101e\u102f\u1010\u103a\u1038\u2026",
    tab_retouch: "Retouch",
    tab_aitools: "AI Tools",
    cap_warn: "Photoshop \u1081\u1062\u1019\u103a\u1088\u1081\u103d\u1004\u103a\u1088 prompt \u107c\u1086\u1089\u1010\u102e\u1088:",
    cleanup_note: "\u1022\u107c\u103a\u1019\u1062\u1086\u101d\u1086\u1089 \u1010\u1031\u1081\u1035\u1010\u103a\u1038\u1078\u103d\u1019\u103a\u1038 Generate / preset \u1075\u1030\u1088\u1015\u103d\u1075\u103a\u1088\u104b",
    btn_generate: "GENERATE",
    st_ready: "\u1081\u1062\u1004\u103a\u1088\u1081\u1085\u107c\u103a\u1038\u101a\u101d\u103a\u1089",
    st_capture: "\u1010\u102d\u102f\u1075\u103a\u1089\u1022\u101d\u103a document",
    st_gen: "\u1010\u102d\u102f\u1075\u103a\u1089\u101e\u1062\u1004\u103a\u1088\u2026",
    st_place: "\u1010\u102d\u102f\u1075\u103a\u1089\u101e\u1082\u103a\u1087\u1076\u101d\u103a\u1088 Photoshop\u2026",
    st_placed_masked: "\u101e\u1082\u103a\u1087\u1015\u1035\u107c\u103a group Layer + Mask \u101a\u101d\u103a\u1089 \u2014 \u1076\u1085\u1015\u103a\u1038\u1015\u102d\u1030\u1004\u103a\u1087\u1022\u1019\u103a\u1087\u101c\u102f\u1010\u103a\u1088 \u2713",
    st_placed_plain: "\u101e\u1082\u103a\u1087\u1015\u1035\u107c\u103a layer \u1019\u102d\u1030\u101d\u103a\u1088 (\u107c\u102d\u1030\u101d\u103a host \u107c\u1086\u1089 mask/group \u1022\u1019\u103a\u1087\u101c\u1086\u1088)",
    stage_queued: "\u1015\u1082\u103a\u1089\u1011\u1085\u101d\u103a",
    stage_uploading: "\u1010\u1062\u1004\u103a\u1087\u1076\u102d\u102f\u107c\u103a\u1088",
    stage_generating: "\u1010\u102d\u102f\u1075\u103a\u1089\u101e\u1062\u1004\u103a\u1088",
    stage_downloading: "\u1022\u101d\u103a\u101c\u1030\u1004\u103a\u1038",
    stage_placing: "\u1010\u102d\u102f\u1075\u103a\u1089\u101e\u1082\u103a\u1087",
    st_done: "\u101a\u101d\u103a\u1089\u1010\u1030\u101d\u103a\u1088 \u2713",
    st_err: "\u107d\u102d\u1010\u103a\u1038",
    st_no_doc: "\u1022\u1019\u103a\u1087\u1019\u102e\u1038 document \u1015\u102d\u102f\u1010\u103a\u1087\u101d\u1086\u1089 \u2014 \u1015\u102d\u102f\u1010\u103a\u1087\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038",
    st_no_prompt: "Prompt \u1015\u101d\u103a\u1087\u101d\u1086\u1089",
    need_ref: "Preset \u107c\u1086\u1089\u101c\u1030\u101d\u103a\u1087\u1076\u1085\u1015\u103a\u1038 reference \u107c\u1082\u103a\u1038\u101e\u103d\u1004\u103a\u1089 1",
    st_new_doc: "\u1015\u102d\u102f\u1010\u103a\u1087\u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088\u1015\u1035\u107c\u103a document \u1019\u1082\u103a\u1087\u101a\u101d\u103a\u1089 \u2713",
    sec_preview: "\u1081\u1062\u1004\u103a\u1088\u1010\u1030\u107a\u103a\u1038\u101c\u1030\u1004\u103a\u1088\u107c\u1083\u1088 \u2014 Before / After",
    before: "\u1075\u1030\u1088\u1015\u103d\u1075\u103a\u1088",
    after: "\u101d\u1062\u1086\u1038\u101c\u1004\u103a",
    btn_place: "\u101e\u1082\u103a\u1087\u1076\u101d\u103a\u1088 Photoshop",
    btn_saveas: "\u101e\u102d\u1019\u103a\u1038\u1015\u1035\u107c\u103a\u2026",
    st_saved: "\u101e\u102d\u1019\u103a\u1038\u101a\u101d\u103a\u1089 \u2713",
    sec_diag: "\u1075\u1030\u1010\u103a\u1087\u1011\u1010\u103a\u1038 System",
    sec_log: "Log \u1075\u1062\u107c\u103a\u1004\u1062\u107c\u103a\u1038",
    btn_diag: "\u1075\u1030\u1010\u103a\u1087\u1011\u1010\u103a\u1038",
    btn_copylog: "\u1075\u1031\u1083\u1087 Log",
    btn_clearlog: "\u1019\u103d\u1010\u103a\u1087",
    diag_host: "\u1022\u1085\u1015\u103a\u1089 Photoshop",
    diag_uxp: "\u107c\u1019\u103a\u1089\u1075\u1010\u103a\u1089 UXP",
    diag_gem: "Gemini API key",
    diag_oai: "OpenAI API key",
    diag_doc: "Document \u1022\u107c\u103a\u1015\u102d\u102f\u1010\u103a\u1087\u101d\u1086\u1089",
    diag_set: "\u1019\u1075\u103a\u1038\u101d\u1086\u1089",
    diag_unset: "\u1015\u1086\u1087\u1019\u1075\u103a\u1038",
    diag_open: "\u1015\u102d\u102f\u1010\u103a\u1087\u101d\u1086\u1089",
    diag_none: "\u1022\u1019\u103a\u1087\u1019\u102e\u1038",
    diag_missing: "\u1022\u1019\u103a\u1087\u1081\u107c\u103a",
    diag_done: "\u1075\u1030\u1010\u103a\u1087\u1011\u1010\u103a\u1038 System \u101a\u101d\u103a\u1089 \u2713",
    diag_lib: "Library Reference",
    diag_lib_open: "\u107c\u1019\u103a\u1089\u1075\u1010\u103a\u1089\u1015\u102d\u102f\u1010\u103a\u1087 folder",
    sec_reflib: "Library \u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088 Reference",
    reflib_note: "\u101c\u102d\u1030\u1075\u103a\u1088 folder \u1076\u1085\u1015\u103a\u1038 reference \u1022\u107c\u103a\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u101c\u1086\u1088\u1078\u1082\u103a \u1015\u103d\u1075\u103a\u1088\u101c\u1035\u101d\u103a\u1075\u1030\u107a\u103a\u1038 \u2014 Browse \u1010\u1031\u1019\u1062\u1086\u1010\u103d\u1004\u103a\u1038\u101e\u1031 \u1015\u102d\u102f\u1010\u103a\u1087\u107c\u1082\u103a\u1038\u107c\u107c\u103a\u1089\u1075\u1030\u1088\u1010\u102e\u1088\u104b",
    btn_browse: "\u101e\u103d\u1075\u103a\u1088\u1010\u1030\u107a\u103a\u1038",
    lib_choose: "\u101c\u102d\u1030\u1075\u103a\u1088 Folder",
    lib_open: "\u1015\u102d\u102f\u1010\u103a\u1087 Folder",
    lib_change: "\u101c\u1085\u1075\u103a\u1088 Folder",
    lib_reset: "\u1081\u1035\u1010\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038",
    lib_rescan: "Scan \u1076\u102d\u102f\u107c\u103a\u1038",
    lib_current: "Folder \u101a\u1062\u1019\u103a\u1038\u101c\u1035\u101d\u103a",
    lib_found: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1022\u107c\u103a\u1081\u107c\u103a",
    lib_status: "\u1004\u101d\u103a\u1038\u101c\u1062\u1086\u1038",
    lib_lastscan: "Scan \u101c\u102d\u102f\u107c\u103a\u1038\u101e\u102f\u1010\u103a\u1038",
    lib_images: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088",
    lib_connected: "\u1075\u1015\u103a\u1038\u101e\u102d\u102f\u1015\u103a\u1087\u101a\u101d\u103a\u1089",
    lib_not_config: "\u1015\u1086\u1087\u1019\u1075\u103a\u1038\u1019\u107c\u103a\u1088",
    lib_perm_lost: "\u1022\u107c\u102f\u107a\u1062\u1010\u103a\u1088\u1081\u1062\u1086 \u2014 \u101c\u102d\u1030\u1075\u103a\u1088\u1076\u102d\u102f\u107c\u103a\u1038",
    lib_none: "(\u1015\u1086\u1087\u101c\u102d\u1030\u1075\u103a\u1088 folder)",
    lib_copy_only: "\u1075\u1031\u1083\u1087\u101e\u1035\u107c\u103a\u1088\u1010\u1062\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038",
    lib_choose_msg: "\u101c\u102d\u1030\u1075\u103a\u1088 folder Library \u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088 Reference \u1076\u103d\u1004\u103a HNK \u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u104b",
    lib_scanning: "\u1010\u102d\u102f\u1075\u103a\u1089 scan library\u2026",
    lib_scan_done: "Scan \u1076\u102d\u102f\u107c\u103a\u1038\u101a\u101d\u103a\u1089 \u2713",
    lib_reset_done: "\u1081\u1035\u1010\u103a\u1038 Library \u1076\u102d\u102f\u107c\u103a\u1038\u101a\u101d\u103a\u1089 \u2713",
    lib_path_copied: "\u1075\u1031\u1083\u1087\u101e\u1035\u107c\u103a\u1088\u1010\u1062\u1004\u103a\u1038\u101a\u101d\u103a\u1089",
    lib_unsupported: "\u1081\u1062\u1004\u103a\u1088\u1019\u1035\u101d\u103a\u1038\u107c\u1086\u1089\u1078\u1082\u103a\u1089\u1022\u1019\u103a\u1087\u101c\u1086\u1088",
    lib_restore_fail: "\u1019\u1084\u1038 reference \u1076\u102d\u102f\u107c\u103a\u1038\u1022\u1019\u103a\u1087\u101c\u1086\u1088",
    on: "\u1015\u102d\u102f\u1010\u103a\u1087",
    off: "\u1015\u102d\u1075\u103a\u1089",
    ai_home_title: "\u1076\u1082\u103a\u1088\u101e\u1062\u1004\u103a\u1088\u101e\u1004\u103a?",
    ai_free_generate: "\u101e\u1062\u1004\u103a\u1088\u101c\u103d\u1010\u103a\u1088\u101c\u1085\u101d\u103a\u1038",
    ai_free_sub: "\u1010\u1085\u1019\u103a\u1088 prompt \u1081\u1004\u103a\u1038\u1076\u1031\u1083",
    ai_more_tools: "\u1076\u102d\u1030\u1004\u103a\u1088\u1019\u102d\u102f\u101d\u103a\u1038\u1011\u1085\u1004\u103a\u1088",
    ai_more_sub: "Water Edit \u00b7 Text/Logo \u00b7 workflow \u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088",
    ai_nav_home: "\u1081\u102d\u1030\u107c\u103a\u1038",
    ai_nav_tools: "\u1076\u102d\u1030\u1004\u103a\u1088\u1019\u102d\u102f\u101d\u103a\u1038",
    ai_history: "\u1019\u1062\u1086\u1010\u103d\u1004\u103a\u1038",
    ai_no_gen: "\u1015\u1086\u1087\u1019\u102e\u1038\u1022\u107c\u103a\u101e\u1062\u1004\u103a\u1088\u101d\u1086\u1089\u104b",
    ai_rerun: "\u1081\u1035\u1010\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038",
    ai_reuse: "\u1078\u1082\u103a\u1089\u1076\u102d\u102f\u107c\u103a\u1038",
    ai_clear_hist: "\u1019\u103d\u1010\u103a\u1087\u1019\u1062\u1086\u1010\u103d\u1004\u103a\u1038",
    ai_images: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088",
    ai_add_ref: "+ \u101e\u1082\u103a\u1087\u1076\u1085\u1015\u103a\u1038 Reference",
    ai_prompt: "PROMPT",
    ai_prompt_ph: "\u1010\u1085\u1019\u103a\u1088\u101d\u1083\u1088 \u1076\u1082\u103a\u1088\u101c\u1086\u1088\u101e\u1004\u103a\u2026",
    ai_model_output: "MODEL \u101c\u1084\u1088 OUTPUT",
    ai_model_note: "AI Tools \u1019\u102e\u1038 model/size setting \u1081\u1004\u103a\u1038\u1076\u1031\u1083 \u2014 \u1022\u1019\u103a\u1087\u1078\u1082\u103a\u1088\u1022\u107c\u103a\u101c\u1035\u101d\u103a\u1075\u107c\u103a\u1010\u1004\u103a\u1038 Setup \u101c\u1084\u1088 Create tab\u104b",
    ai_auto_model: "Model \u1081\u1004\u103a\u1038\u1075\u1030\u107a\u103a\u1038",
    ai_wf_tools: "\u1076\u102d\u1030\u1004\u103a\u1088\u1019\u102d\u102f\u101d\u103a\u1038 Workflow",
    ai_direct_gen: "\u101e\u1062\u1004\u103a\u1088\u101e\u102d\u102f\u101d\u103a\u1088\u101e\u102d\u102f\u101d\u103a\u1088",
    ai_identity_lock: "\u101c\u103d\u1075\u103a\u1089\u107c\u1083\u1088\u1010\u1083",
    ai_ref_transfer: "\u1015\u102d\u107c\u103a\u1087 Reference",
    ai_req_images: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1022\u107c\u103a\u101c\u1030\u101d\u103a\u1087",
    ai_opt_images: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u101e\u1082\u103a\u1087\u1075\u1031\u1083\u1088\u101c\u1086\u1088",
    ai_model_lbl: "Model",
    ai_prepare: "\u1081\u1062\u1004\u103a\u1088\u1081\u1085\u107c\u103a\u1038 (\u1015\u102d\u102f\u1010\u103a\u1087\u101e\u1031 \u1010\u1085\u1010\u103a\u1088)",
    ai_lib_bridge_off: "\u107c\u102d\u1030\u101d\u103a host \u107c\u1086\u1089 Library \u1022\u1019\u103a\u1087\u1075\u1015\u103a\u1038\u101e\u102d\u102f\u1015\u103a\u1087\u101c\u1086\u1088\u104b",
    ai_lib_pick_first: "\u101c\u102d\u1030\u1075\u103a\u1088\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1010\u102e\u1088 Presets tab \u2192 Visual Library \u1022\u103d\u107c\u103a\u1010\u1062\u1004\u103a\u1038\u104b",
    ai_lib_load_fail: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088 Library \u1015\u102d\u102f\u1010\u103a\u1087\u1022\u1019\u103a\u1087\u101c\u1086\u1088\u104b",
    ai_missing: "\u1015\u1086\u1087\u1019\u102e\u1038",
    ai_add: "\u101e\u1082\u103a\u1087",
    ai_library: "Library",
    ai_rh_sec: "RunningHub \u2014 \u101e\u1082\u103a\u1087 model endpoint (Advanced \u2014 \u1022\u1019\u103a\u1087\u101e\u1082\u103a\u1087\u1075\u1031\u1083\u1088\u101c\u1086\u1088)",
    ai_rh_note: "Model \u1022\u107c\u103a\u1015\u1083\u1038\u1019\u1083\u1038\u1078\u102d\u102f\u1004\u103a \u1078\u1082\u103a\u1089\u1010\u1004\u103a\u1038 key \u107c\u102d\u1030\u101d\u103a\u107c\u1086\u1089\u101c\u1086\u1088\u101a\u101d\u103a\u1089 \u2014 \u1022\u1019\u103a\u1087\u101c\u1030\u101d\u103a\u1087\u1081\u1035\u1010\u103a\u1038\u101e\u1004\u103a\u104b Model \u101c\u1082\u103a\u107c\u1084\u101d\u1083\u1088 \"not connected\" (endpoint path \u1015\u1086\u1087\u1010\u1085\u1010\u103a\u1088) \u1078\u102d\u102f\u1004\u103a \u1022\u101d\u103a path \u1010\u102e\u1088 RunningHub API docs \u101e\u1031 \u101e\u1082\u103a\u1087\u1010\u102e\u1088\u107c\u1086\u1088\u104b",
    ai_rh_save: "\u101e\u102d\u1019\u103a\u1038 endpoint \u1076\u103d\u1004\u103a model \u107c\u1086\u1089",
    ai_test_conn: "\u1010\u1085\u1010\u103a\u1088\u101c\u103d\u1004\u103a\u1088\u1075\u1015\u103a\u1038\u101e\u102d\u102f\u1015\u103a\u1087",
    ai_oai_sec: "OpenAI (Advanced \u2014 \u1022\u1019\u103a\u1087\u101e\u1082\u103a\u1087\u1075\u1031\u1083\u1088\u101c\u1086\u1088)",
    ai_oai_note: "\u1078\u1082\u103a\u1089 OpenAI API key \u1081\u1004\u103a\u1038\u1076\u1031\u1083\u1010\u1004\u103a\u1038 GPT Image 2 \u1010\u1085\u107c\u103a\u1038 RunningHub Enterprise \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u1078\u1082\u103a\u1089\u1078\u103d\u1019\u103a\u1038\u1075\u107c\u103a\u104b",
    ai_save_verify: "\u101e\u102d\u1019\u103a\u1038\u101e\u1031 \u1010\u1085\u1010\u103a\u1088",
    ai_settings: "\u1078\u1010\u103a\u1038\u101e\u1083\u1087",
    ai_add_layers: "\u101e\u1082\u103a\u1087\u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088\u1015\u1035\u107c\u103a Layer \u1019\u1082\u103a\u1087",
    ai_done: "\u101a\u101d\u103a\u1089\u1010\u1030\u101d\u103a\u1088\u104b",
    ai_result_ready: "\u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088 \u1081\u1062\u1004\u103a\u1088\u1081\u1085\u107c\u103a\u1038\u101a\u101d\u103a\u1089\u104b",
    ai_ready_nolayer: "\u107d\u103d\u107c\u103a\u1038\u101c\u1086\u1088 \u1081\u1062\u1004\u103a\u1088\u1081\u1085\u107c\u103a\u1038\u101a\u101d\u103a\u1089 (\u101e\u1082\u103a\u1087\u1015\u1035\u107c\u103a Layer \u107c\u107c\u103a\u1089 \u1015\u102d\u1075\u103a\u1089\u101d\u1086\u1089\u1010\u102e\u1088 Settings)\u104b",
    ai_place_failed: "\u101e\u1062\u1004\u103a\u1088\u101a\u101d\u103a\u1089 \u1075\u1030\u107a\u103a\u1038\u1075\u1083\u1088 \u101e\u1082\u103a\u1087\u1076\u101d\u103a\u1088 Photoshop \u1022\u1019\u103a\u1087\u101c\u1086\u1088\u104b",
    ai_place_failed_fix: "\u1015\u102d\u102f\u1010\u103a\u1087 Document \u1022\u107c\u103a\u107c\u102d\u102f\u1004\u103a\u1088\u101e\u1031 \u1081\u1035\u1010\u103a\u1038\u1076\u102d\u102f\u107c\u103a\u1038\u1010\u102e\u1088 History\u104b",
    ai_placed_masked: "\u101e\u1082\u103a\u1087\u1076\u101d\u103a\u1088\u107c\u1082\u103a\u1038 group \u201c{name}\u201d \u1015\u1035\u107c\u103a Layer + Mask \u101a\u101d\u103a\u1089 \u2014 \u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1015\u102d\u1030\u1004\u103a\u1087 \u1022\u1019\u103a\u1087\u101c\u102f\u1010\u103a\u1088\u104b",
    ai_placed_group: "\u101e\u1082\u103a\u1087\u1076\u101d\u103a\u1088\u107c\u1082\u103a\u1038 group \u201c{name}\u201d \u1015\u1035\u107c\u103a Layer \u1019\u1082\u103a\u1087\u101a\u101d\u103a\u1089 (\u107c\u102d\u1030\u101d\u103a host \u107c\u1086\u1089 mask \u1022\u1019\u103a\u1087\u101c\u1086\u1088)\u104b",
    ai_placed_plain: "\u101e\u1082\u103a\u1087\u1015\u1035\u107c\u103a Layer \u1019\u1082\u103a\u1087\u101a\u101d\u103a\u1089 (\u107c\u102d\u1030\u101d\u103a host \u107c\u1086\u1089 group/mask \u1022\u1019\u103a\u1087\u101c\u1086\u1088)\u104b",
    ai_start_fail: "AI Tools \u1010\u1084\u1087\u1022\u1019\u103a\u1087\u101c\u1086\u1088",
    pgb_setup: "\u1010\u1084\u1087\u1010\u102e\u1088\u107c\u1086\u1088 \u2014 \u1081\u1062\u1004\u103a\u1088\u1081\u1085\u107c\u103a\u1038 API Key \u00b7 Model \u00b7 Library",
    pgb_studio: "Prompt \u2192 Reference \u2192 Generate \u2014 \u1076\u1075\u103a\u1089\u1075\u1062\u107c\u103a\u1078\u107c\u103a\u1089\u1076\u102d\u102f\u1075\u103a\u1089 \u101e\u102d\u102f\u1015\u103a\u1087\u1075\u107c\u103a",
    pgb_create: "\u1010\u102e\u1088\u107c\u1082\u103a\u1038\u1078\u1082\u103a \u1011\u102d\u102f\u1004\u103a\u1081\u1062\u1004\u103a\u1088\u101c\u102e \u2014 Reference 4 \u101e\u103d\u1004\u103a\u1089 \u00b7 Variations",
    pgb_presets: "Visual Library 366 \u00b7 Scenes \u00b7 Wedding \u00b7 Style Chains",
    pgb_aitools: "\u107c\u1035\u1075\u103a\u1038\u1015\u103d\u1075\u103a\u1088\u101c\u1035\u101d\u103a \u1078\u107c\u103a\u1089\u1076\u102d\u102f\u1075\u103a\u1089 \u2014 Nano Banana \u00b7 GPT Image \u00b7 RunningHub",
    pgb_retouch: "\u107d\u102d\u101d\u103a\u107c\u1004\u103a \u00b7 \u107c\u1083\u1088\u1010\u1083 \u00b7 \u1010\u1030\u101d\u103a\u1076\u102d\u1004\u103a\u1038 \u2014 Professional Sliders",
    wf_sum_bg_replace: "\u101c\u1085\u1075\u103a\u1088\u107d\u1062\u1086\u1087\u101c\u1004\u103a",
    wf_sum_reference_transfer: "\u101e\u1082\u103a\u1087\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087 \u1076\u101d\u103a\u1088\u107c\u1082\u103a\u1038 scene reference",
    wf_sum_master_bgfg_replace: "\u1022\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u107c\u1082\u103a\u1038 scene \u1022\u103d\u1075\u103a\u1087, \u101e\u1062\u1004\u103a\u1088 bg/fg \u1076\u102d\u102f\u107c\u103a\u1038, \u101e\u1082\u103a\u1087\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087",
    wf_sum_subject_face: "\u1022\u101d\u103a\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038 \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u107c\u1083\u1088\u1010\u1083 \u101e\u1082\u103a\u1087\u107c\u102d\u1030\u101d\u103a\u1076\u1085\u1015\u103a\u1038 base",
    wf_sum_retouch: "\u1019\u1084\u1038\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1075\u1030\u107c\u103a\u1038 \u1081\u1082\u103a\u1088\u101c\u102e\u1078\u103d\u1019\u103a\u1038\u101e\u107d\u1083\u1087\u101d",
    wf_sum_upscale: "\u1081\u1035\u1010\u103a\u1038\u1081\u1082\u103a\u1088\u101a\u1082\u103a\u1087 \u1081\u1030\u101d\u103a\u101a\u103d\u1086\u1088\u1022\u1019\u103a\u1087\u101c\u102f\u1010\u103a\u1088",
    wf_sum_object_edit: "\u1022\u101d\u103a\u1022\u103d\u1075\u103a\u1087, \u101c\u1085\u1075\u103a\u1088 \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u101e\u1082\u103a\u1087\u1076\u1030\u101d\u103a\u1038\u1076\u103d\u1004\u103a",
    wf_sum_water_edit: "\u1019\u1084\u1038\u107c\u1019\u103a\u1089\u101c\u1084\u1088 \u1004\u101d\u1083\u1087\u107c\u1019\u103a\u1089",
    wf_sum_text_logo: "\u101e\u1082\u103a\u1087 \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u1019\u1084\u1038\u101c\u102d\u1075\u103a\u1088\u101c\u1084\u1088 logo",
    wfin_subject: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087 (\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038)",
    wfin_new_bg: "\u107d\u1062\u1086\u1087\u101c\u1004\u103a\u1019\u1082\u103a\u1087 (\u1022\u1019\u103a\u1087\u101e\u1082\u103a\u1087\u1075\u1031\u1083\u1088\u101c\u1086\u1088)",
    wfin_ref_scene: "Scene Reference",
    wfin_style_ref: "Style Reference (\u1022\u1019\u103a\u1087\u101e\u1082\u103a\u1087\u1075\u1031\u1083\u1088\u101c\u1086\u1088)",
    wfin_target_scene: "Scene \u1022\u107c\u103a\u1019\u102e\u1038\u1075\u1030\u107c\u103a\u1038",
    wfin_base: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088 Base",
    wfin_face_ref: "Reference \u107c\u1083\u1088\u1010\u1083 / \u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038",
    wfin_portrait: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u1075\u1030\u107c\u103a\u1038",
    wfin_image: "\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088",
    wfin_object_ref: "Reference \u1076\u1030\u101d\u103a\u1038\u1076\u103d\u1004\u103a (\u1022\u1019\u103a\u1087\u101e\u1082\u103a\u1087\u1075\u1031\u1083\u1088\u101c\u1086\u1088)",
    wfin_logo_ref: "Reference Logo (\u1022\u1019\u103a\u1087\u101e\u1082\u103a\u1087\u1075\u1031\u1083\u1088\u101c\u1086\u1088)",
    wf_exp_bg_replace: "\u101c\u1085\u1075\u103a\u1088\u1015\u107c\u103a\u107d\u1062\u1086\u1087\u101c\u1004\u103a \u1022\u107c\u103a\u101a\u1030\u1087\u1010\u1062\u1004\u103a\u1038\u101c\u1004\u103a\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u104b \u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038, \u1078\u1083\u1087\u1010\u1083\u1087, \u1081\u102d\u1019\u103a\u1038\u1076\u103d\u1015\u103a\u1087 \u101c\u1084\u1088 \u107e\u1086\u1038 \u1022\u1019\u103a\u1087\u101c\u1085\u1075\u103a\u1088\u101e\u1004\u103a \u2014 \u101c\u1085\u1075\u103a\u1088\u1022\u107c\u103a\u101a\u1030\u1087\u1010\u1062\u1004\u103a\u1038\u101c\u1004\u103a\u1075\u1030\u107a\u103a\u1038\u104b",
    wf_exp_reference_transfer: "\u1022\u101d\u103a scene \u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088\u1076\u103d\u1004\u103a\u1076\u1085\u1015\u103a\u1038 reference (\u1075\u1030\u107a\u103a\u1038\u1075\u1083\u1088 \u1022\u1019\u103a\u1087\u1022\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u107c\u1082\u103a\u1038\u107c\u107c\u103a\u1089) \u101e\u1031 \u101e\u1082\u103a\u1087\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u1076\u101d\u103a\u1088 \u2014 \u101d\u1086\u1089\u107c\u1083\u1088\u1010\u1083, \u1078\u1083\u1087\u1010\u1083\u1087 \u101c\u1084\u1088 \u1076\u103d\u1015\u103a\u1087, \u1081\u1035\u1010\u103a\u1038\u1081\u1082\u103a\u1088\u1076\u101d\u103a\u1088\u1075\u107c\u103a\u1010\u1004\u103a\u1038\u107e\u1086\u1038\u101c\u1084\u1088\u1019\u102f\u1019\u103a\u1076\u103d\u1004\u103a scene\u104b",
    wf_exp_master_bgfg_replace: "\u101c\u103d\u1004\u103a\u1088\u101c\u1085\u1075\u103a\u1088\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u107c\u1082\u103a\u1038 scene \u1022\u107c\u103a\u1076\u1035\u1004\u103a\u1088\u101e\u102f\u1010\u103a\u1038 \u2014 \u1022\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u107c\u1082\u103a\u1038 scene reference \u1022\u103d\u1075\u103a\u1087\u1019\u1030\u1010\u103a\u1038, \u101e\u1062\u1004\u103a\u1088\u107d\u1062\u1086\u1087\u101c\u1004\u103a\u101c\u1084\u1088\u107d\u1062\u1086\u1087\u107c\u1083\u1088\u1022\u107c\u103a\u1019\u1030\u1075\u103a\u1038\u101d\u1086\u1089\u1076\u102d\u102f\u107c\u103a\u1038\u1081\u1082\u103a\u1088\u1019\u102d\u1030\u107c\u103a\u101e\u107d\u1083\u1087\u101d, \u101a\u101d\u103a\u1089\u101e\u1031 \u101e\u1082\u103a\u1087\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u1010\u102e\u1088\u107c\u107c\u103a\u1088\u1010\u1085\u1010\u103a\u1088\u1010\u1085\u1010\u103a\u1088 \u2014 \u107c\u1083\u1088\u1010\u1083, \u1078\u1083\u1087\u1010\u1083\u1087, \u1076\u107c\u1062\u1010\u103a\u1088, \u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a, \u1076\u1030\u101d\u103a\u1038\u107c\u102f\u1004\u103a\u1088, \u107d\u102d\u101d\u103a\u107c\u1004\u103a \u101c\u1084\u1088 \u107e\u1086\u1038 \u101c\u103d\u1075\u103a\u1089\u1022\u101d\u103a\u1010\u102e\u1088\u1076\u1085\u1015\u103a\u1038\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087, reference \u1015\u107c\u103a\u1076\u102d\u102f\u107c\u103a\u1038 scene, \u1075\u103d\u1004\u103a\u1088\u1011\u1062\u1086\u1087 \u101c\u1084\u1088 \u101c\u103d\u1004\u103a\u1088\u101c\u102d\u102f\u1075\u103a\u1089\u1075\u1030\u107a\u103a\u1038\u104b",
    wf_exp_subject_face: "\u1022\u101d\u103a\u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038 \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u107c\u1083\u1088\u1010\u1083\u107c\u1082\u103a\u1038 reference \u1081\u1030\u1019\u103a\u1088\u1076\u101d\u103a\u1088\u107c\u102d\u1030\u101d\u103a\u1076\u1085\u1015\u103a\u1038 base \u1081\u1082\u103a\u1088\u1019\u1030\u107c\u103a\u1038, \u101c\u103d\u1004\u103a\u1088\u1078\u1010\u103a\u1038 base \u1022\u1019\u103a\u1087\u101c\u102f\u1010\u103a\u1088\u104b",
    wf_exp_retouch: "\u1019\u1084\u1038\u107d\u102d\u101d\u103a\u107c\u1004\u103a, \u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a \u101c\u1084\u1088 \u101e\u102e \u1081\u1082\u103a\u1088\u101c\u102e\u1078\u103d\u1019\u103a\u1038\u101e\u107d\u1083\u1087\u101d\u104b \u107c\u1083\u1088\u1010\u1083, \u1081\u1062\u1004\u103a\u1088 \u101c\u1084\u1088 \u101c\u103d\u1004\u103a\u1088\u107c\u1084\u1078\u1082\u103a \u101d\u1086\u1089\u1078\u102d\u1030\u1004\u103a\u1089\u1075\u101d\u103a\u1087 \u2014 \u107d\u102d\u101d\u103a\u107c\u1004\u103a\u1022\u1019\u103a\u1087\u1015\u1035\u107c\u103a\u1015\u101c\u1083\u1087\u101e\u1010\u102d\u1075\u103a\u1089, \u107c\u1083\u1088\u1010\u1083\u1022\u1019\u103a\u1087\u101c\u1085\u1075\u103a\u1088\u104b",
    wf_exp_upscale: "\u1081\u1035\u1010\u103a\u1038\u1081\u1082\u103a\u1088\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088\u101a\u1082\u103a\u1087 \u1015\u1083\u1038\u1010\u1004\u103a\u1038\u1019\u1084\u1038\u1081\u1030\u101d\u103a\u101a\u103d\u1086\u1088\u1076\u103d\u1004\u103a\u107d\u102d\u101d\u103a\u107c\u1004\u103a, \u1076\u1030\u107c\u103a\u1081\u1030\u101d\u103a \u101c\u1084\u1088 \u107d\u1083\u1088 \u1076\u102d\u102f\u107c\u103a\u1038\u1081\u1082\u103a\u1088\u1019\u102d\u1030\u107c\u103a\u101e\u107d\u1083\u1087\u101d\u104b \u107c\u1083\u1088\u1010\u1083, \u1078\u1083\u1087\u1010\u1083\u1087, \u101c\u103d\u1004\u103a\u1088\u1078\u1010\u103a\u1038 \u101c\u1084\u1088 \u101e\u102e \u1022\u1019\u103a\u1087\u101c\u1085\u1075\u103a\u1088\u101e\u1004\u103a \u2014 \u1022\u1019\u103a\u1087\u1019\u1030\u107c\u103a\u1038\u1015\u1035\u107c\u103a\u1015\u101c\u1083\u1087\u101e\u1010\u102d\u1075\u103a\u1089\u104b",
    wf_exp_object_edit: "\u1022\u101d\u103a\u1022\u103d\u1075\u103a\u1087, \u101c\u1085\u1075\u103a\u1088 \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u101e\u1082\u103a\u1087\u1076\u1030\u101d\u103a\u1038\u1076\u103d\u1004\u103a \u101c\u1030\u107a\u103a\u1088\u101c\u103d\u1004\u103a\u1088\u1019\u1084\u1038\u1010\u102e\u1088\u101c\u1035\u101d\u103a\u1022\u107c\u103a\u1075\u102f\u1019\u103a\u1038\u101d\u1086\u1089\u104b \u1022\u107c\u103a\u1022\u1019\u103a\u1087\u1010\u102d\u102f\u1075\u103a\u1038 \u1010\u1004\u103a\u1038\u101e\u1035\u1004\u103a\u1088\u101d\u1086\u1089\u1078\u102d\u1030\u1004\u103a\u1089\u1075\u101d\u103a\u1087\u104b",
    wf_exp_water_edit: "\u101e\u1082\u103a\u1087 \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u1019\u1084\u1038\u107c\u1019\u103a\u1089, \u1004\u101d\u1083\u1087\u107c\u1019\u103a\u1089 \u101c\u1084\u1088 \u107c\u1083\u1088\u101c\u102d\u107c\u103a\u1022\u107c\u103a\u1015\u1035\u107c\u103a\u107c\u1019\u103a\u1089 \u1081\u1082\u103a\u1088\u1019\u102d\u1030\u107c\u103a\u1010\u1084\u1089, \u1010\u1030\u101d\u103a\u1075\u1030\u107c\u103a\u1038\u1078\u101d\u103a\u1088\u1075\u101d\u103a\u1087\u1022\u1019\u103a\u1087\u101c\u102f\u1010\u103a\u1088\u104b",
    wf_exp_text_logo: "\u101e\u1082\u103a\u1087 \u1022\u1019\u103a\u1087\u107c\u107c\u103a \u1019\u1084\u1038\u101c\u102d\u1075\u103a\u1088 \u1022\u1019\u103a\u1087\u107c\u107c\u103a logo \u1022\u107c\u103a\u1019\u1030\u1010\u103a\u1038\u101e\u1082\u103a\u101c\u1030\u101c\u1086\u1088\u1004\u1062\u1086\u1088 \u107c\u102d\u1030\u101d\u103a\u1076\u1085\u1015\u103a\u1038\u1081\u1062\u1004\u103a\u1088, \u101c\u103d\u1004\u103a\u1088\u1078\u1010\u103a\u1038\u101d\u1086\u1089\u1075\u101d\u103a\u1087\u104b"
  },
  /* ---- Jinghpaw (Kachin) (kac) — 587 keys, complete ---- */
  kac: {
    gate_sub_login: "Ndai panel hpe lang na matu na a HNK account hte shang u.",
    gate_email_ph: "Email",
    gate_pass_ph: "Password",
    gate_signin: "Account shang u",
    gate_checking: "Na a plan hpe sawn yu nga ai…",
    gate_need: "Na a email hte password bang u.",
    gate_bad: "Email sh'ning password n hkrak ai",
    gate_offline: "Internet n nga ai — plan hpe sawn yu n lu ai. Internet hkrum nna bai sawn yu u.",
    gate_locked: "Langai mari yang lahkawng lu ai — shawng mari hte shata shagu jarik gaw web app hte ndai Photoshop panel lahkawng hpe hpaw ya ai. Website kaw mari u n rai yang matut la nna, bai sawn yu u.",
    gate_buy: "Website hpaw u",
    gate_retry: "Bai sawn yu u",
    gate_signout: "Pru u",
    gate_days: "{D} ya ngam ai",
    gate_grace: "Internet n nga ai — {D} ya lang lu ai",
    gate_open_fail: "Browser hpaw n lu ai. Address: {U}",
    app_title: "HNK Photoshop Ai Panel (Sharin ma ni)",
    sec_api: "Gemini API Key",
    btn_show: "Madun",
    btn_hide: "Makoi",
    btn_test: "Key sawn yu",
    btn_save: "Makoi da",
    st_testing: "Key hpe sawn yu nga ai",
    st_key_ok: "\u2713 API key akyu rawng nga ai",
    st_key_bad: "API key n byin ai",
    st_key_saved: "API key makoi da sai \u2713",
    st_need_key: "Na a Gemini API key hpe shawng bang u",
    sec_model: "Model hte Output",
    scope_model_note: "Npu na Prompt tab a Generate button hpe lang ai \u2014 Create hte AI Tools gaw shada n bung ai model setting nga ai.",
    model_auto: "Shi hkrai (tsun shadawn ai)",
    model_flash: "Flash \u2014 lawan (2.5)",
    model_pro: "Pro \u2014 atsam kaja (3.0)",
    lbl_ratio: "Ratio",
    ratio_auto: "Ratio shi hkrai (document kaw na)",
    lbl_size: "Kaba ai lam",
    lbl_quality: "Atsam",
    qual_auto: "Shi hkrai",
    qual_low: "Kaji",
    qual_med: "Ka-ang",
    qual_high: "Tsaw",
    sec_prompt: "Prompt",
    hint_prompt: "Na a prompt hpe ndai kaw ka u\u2026 (grau law 20,000 laika)",
    btn_improve: "Prompt grau kaja shatai",
    btn_clear: "Kasat kau",
    st_improving: "Prompt hpe grau kaja shatai nga ai",
    st_improved: "Prompt grau kaja sai \u2713",
    sec_refs: "Reference sumla (slot 2)",
    base_note: "Ningpawt sumla = na hpaw da ai Photoshop document (shi hkrai la ai).",
    btn_ref_layer: "+ Layer",
    btn_ref_file: "Laika daw",
    btn_ref_web: "Web",
    st_ref_layer_added: "Layer hpe reference hku bang sai \u2713",
    st_ref_file_added: "Laika daw hpe reference hku bang sai \u2713",
    st_importing: "Laika daw shang la nga ai",
    url_title: "URL kaw na reference \u2014 Chrome / Pinterest",
    url_ph: "https://\u2026 sumla shara shing nrai Pinterest pin link",
    btn_paste: "Kap da",
    btn_load: "La",
    btn_cancel: "Hkring",
    st_url_loading: "Web sumla hpe la nga ai",
    st_ref_web_added: "Web sumla hpe reference hku bang sai \u2713",
    st_url_bad: "Ndai URL kaw na sumla n lu la ai \u2014 sumla shara hpe copy nna bai chyam u",
    no_layer: "Layer n lata shi ai",
    sec_presets: "AI Presets",
    auto_run: "Preset dip yang \u2192 shi hkrai Generate (PAT = prompt kaw sha bang na)",
    grp_cleanup: "Kasan ai arung arai",
    p_remove_people: "Masha shamat kau",
    p_fix_hands: "Lata jat ai hpe jaw",
    p_fix_legs: "Lagaw jat ai hpe jaw",
    p_full_clean: "Yawng kasan",
    grp_moved_note: "Reference arung arai ni gaw npu na Reference Ops Pro card kaw du sai (shara langai kaw, Solo/Couple/Family + madun lam hte).",
    ro_h_detail: "Kara \u00b7 Arung arai \u00b7 Pose (\u2190 Ref1)",
    ro_h_comp: "Composite \u00b7 Style \u00b7 Laika (\u2190 Ref1)",
    p_fgbglc: "FG=Doc \u00b7 BG=Ref1 \u00b7 Light=Ref2",
    p_hair: "Kara hkum (\u2190 Ref1)",
    p_access: "Ja gumhpraw + arung arai (\u2190 Ref1)",
    p_pose: "Pose bung shangun (Doc \u2192 Ref1)",
    p_fgprops: "Shawng maga na rai (\u2190 Ref1)",
    p_textlogo: "Laika / Logo (\u2190 Ref1)",
    p_style: "Sumla a style (\u2190 Ref1)",
    grp_repsubj: "Masha galai (Doc \u2192 Ref1 scene)",
    p_rep_solo: "Langai galai",
    p_rep_couple: "Num la galai",
    p_rep_family: "Dinghku galai",
    grp_rmix: "Replace Mix \u2014 matsing nna Ref1 kaw na la",
    rm_bg: "Hpang maga (BG)",
    rm_fg: "Shawng maga (FG)",
    rm_light: "Nhtoi",
    rm_color: "Nsam",
    rm_object: "Rai / Props",
    btn_rmix: "REPLACE GENERATE",
    rm_none: "Shawng langai mi matsing u",
    grp_i2p: "Image \u2192 Prompt (Scene Builder)",
    i2p_note: "1) Shaw la: Ref1 scene \u2192 atsawm ka da ai prompt (masha n lawm). 2) Prompt shara kaw jaw u. 3) SCENE GENERATE gaw na document masha hpe hkum shingdu nna galaw ya na \u2014 ang shagu hte shi hkrai maren ai. Face/Pose/Frame lock = shawng na hku rawng na.",
    i2p_objects: "Rai hte props a lam",
    i2p_light: "Nhtoi a lam",
    i2p_color: "Nsam / grade a lam",
    i2p_bg: "Hpang maga a lam",
    i2p_fg: "Shawng maga a lam",
    btn_i2p: "Image \u2192 Prompt (Scene shaw la)",
    i2p_fit: "Scene Auto-Fit \u2014 document a ang / tsan ai lam / lens hte maren scene bai galaw",
    i2p_adapt: "Masha a nhtoi hte nsam hpe scene hte maren shatai",
    btn_scenegen: "SCENE GENERATE",
    st_extract: "Scene hpe prompt hku shaw la nga ai",
    st_extract_done: "Scene prompt hkyen sai \u2014 Prompt shara kaw yu u",
    scene_no_prompt: "Prompt kaw hpa n nga ai \u2014 Image \u2192 Prompt shawng galaw u",
    i2p_none: "Shawng langai mi matsing u",
    sec_light: "Studio Lighting \u2014 AI Relight",
    light_note: "Nhtoi hpe matsing nna hpaw u, lahkawng dip nna lata u, slider hte hkum shatai u \u2014 3D lahta yu ai sumla gaw kalang ta hkan nang ai (\u25b4 = tsaw, \u25be = layang). LIGHTING GENERATE gaw ndai hku sha nhtoi bai jaw na; myi man / pose / frame gaw lock rawng na.",
    lbl_my_prompt: "JINGHPAW PROMPT",
    lstage_model: "MODEL",
    lstage_cam: "CAM",
    l_key: "Key Light",
    l_fill: "Fill / Shawng",
    l_butterfly: "Butterfly (lahta-shawng)",
    l_side: "Makau nhtoi",
    l_rim: "Rim Light",
    l_back: "Back Light",
    l_hair: "Hair Light",
    l_bglight: "Hpang maga nhtoi",
    lt_softbox: "Softbox",
    lt_octa: "Octa",
    lt_strip: "Strip",
    lt_umbrella: "Umbrella",
    lt_beauty: "Beauty",
    lt_hard: "Hard",
    li_int: "N-gun",
    li_angle: "Ang",
    li_height: "Tsaw ai lam",
    li_dist: "Tsan ai lam",
    li_size: "Kaba ai lam",
    btn_lightgen: "LIGHTING GENERATE",
    light_none: "Nhtoi langai mi shawng hpaw u",
    lg_equip: "Sumla kaw nhtoi arung arai madun (softbox / stand mu na)",
    grp_chains: "Style Chains \u2014 style \u2713 ni jawm",
    chains_note: "Style langai mi hpaw yang \u2014 Generate / preset / Retouch SHAGU kaw rau lawm wa na.",
    grp_restore: "Sumla dingsa bai jaw",
    p_restore: "Sumla dingsa bai jaw",
    rest_color: "Nsam hkum",
    rest_bw: "Ahpraw-achyang",
    restore_note: "Je ai, hka / wan hte hkra ai, nsam mat ai ni hpe bai jaw ai \u2014 shawng na myi man shagu hpe 100% maren jang da ai.",
    rt_browstyle: "Myi hkyi hkum",
    rt_lashstyle: "Myi mun hkum",
    rt_blush: "Blush nsam",
    rt_contour: "Contour hkum",
    rt_bust: "Sinda",
    rt_butt: "Maidang",
    rt_thigh: "Magyi",
    rt_calf: "Lagaw shan",
    rt_neck: "Du",
    rt_fingers: "Lata di",
    hint_prompt_my: "Jinghpaw hku ka u \u2014 Generate ten hta English de shi hkrai galai ya na (grau law 20,000)",
    st_translate: "Prompt hpe English hku galai nga ai",
    live_trans: "Shi hkrai galai \u21c4 (EN \u2194 KAC, ka hkring ai hpang)",
    st_retry: "Bai chyam nga ai",
    grp_recipes: "Recipes \u2014 setting makoi / garan",
    recipe_note: "Yawng (chains, retouch, nhtoi, lock, prompt) hpe .json laika daw langai hku makoi u \u2014 sharin ma ni gaw Load sha dip na.",
    btn_recipe_save: "Recipe makoi",
    btn_recipe_load: "Recipe la",
    st_recipe_saved: "Recipe makoi da sai \u2713",
    st_recipe_loaded: "Recipe la sai \u2713 \u2014 yawng bai hkrat sai",
    st_recipe_bad: "HNK a recipe laika daw n re",
    sec_final: "Hpang jahtum Prompt (AI de shagun na)",
    btn_copy: "Copy",
    st_copied: "Copy la sai \u2713",
    hist_note: "Labau \u2014 hpang jahtum pru ai 6, yu na matu dip u:",
    btn_hist_prompt: "\u2192 Prompt",
    sec_batch: "Batch Mode",
    batch_note: "Sumla law law + pru na folder langai lata u \u2014 ya na prompt, chains, cleanup hte Keep lock ni gaw sumla shagu hta galaw na; pru ai gaw *_HNK.png hku makoi na.",
    btn_batch: "BATCH GALAW",
    btn_batch_stop: "Hkring",
    st_batch: "Batch",
    st_batch_done: "Batch ngut sai",
    sec_web: "Web AI \u2014 Browser kachyi",
    web_note: "Photoshop kata kaw web AI editor langai mi hpaw u. Dai kaw galaw nna, pru ai hpe layer hku la wa u:",
    web_import_note: "Shang la: \u2460 web app kaw Copy image address lang nna IMPORT COPIED LINK dip u \u00b7 \u2461 shing nrai laika daw hpe download la nna IMPORT FILE lang u \u00b7 \u2462 HNK bridge lawm ai manang web app ni gaw sumla hpe shi hkrai shagun ya ai.",
    btn_web_go: "Sa",
    btn_web_home: "Nta",
    btn_web_reload: "Bai la",
    btn_web_import_link: "COPY DA AI LINK SHANG \u2192 PS",
    btn_web_import_file: "LAIKA DAW SHANG \u2192 PS",
    st_web_import: "Photoshop kaw layer hku shang sai \u2713",
    st_web_nourl: "Sumla link hpe shawng copy u (hkra maga dip \u2192 Copy image address)",
    st_web_fetch: "Link kaw na sumla la nga ai",
    st_web_notallowed: "Ndai domain gaw hkap la ai list kaw n lawm ai \u2014 hpa n pru mung mai byin ai. HNK hpe bang ya na matu tsun u.",
    st_need_doc: "Photoshop kaw sumla document langai shawng hpaw u",
    sec_campro: "Camera Pro hte Atsam",
    autosave_lbl: "Pru ai shagu shi hkrai export (PNG + prompt log \u2192 folder)",
    st_folder_ok: "Export folder masat sai \u2713",
    st_exported: "Export ngut sai \u2713",
    st_export_fail: "Export n byin ai \u2014 folder hpe yu u",
    st_pro_fallback: "Pro model n lu ai \u2014 ndai lang gaw Flash de galai sai",
    st_img_bad: "Sumla data gaw sawn yu ai lam n lai ai \u2014 sumla bai bang u",
    st_auto_comp: "Shi hkrai composite: IMAGE 1 masha \u2192 reference scene",
    prov_lbl: "AI jaw ai",
    oai_key_ph: "sk-... (OpenAI API key)",
    tab_create: "Create",
    create_note: "CREATE MODE \u2014 na a prompt kaw na sumla nnan (+ shi a ref 4). Shi hkrai tsap ai: document, preset, chains, lock ni hpe galoi mung n hti ai.",
    create_ph: "Galaw mayu ai sumla hpe tsun dan u\u2026",
    btn_create_ps: "\u2b07 Photoshop de shagun",
    btn_to_ref: "\u21ba Ref 1 hku lang",
    st_to_ref: "Pru ai hpe Ref 1 kaw bang sai \u2713",
    scope_create_note: "Setup a Model & Output hte n seng ai \u2014 ndai setting ni gaw Create a Generate hta sha akyu rawng ai.",
    cr_ratio: "Ratio",
    cr_var: "Amyu shai",
    cr_restyle: "\u267b Pru ai a style galai",
    cr_lib: "Prompt Library \u2014 bang na matu dip u",
    cr_improve: "\u2728 Grau kaja",
    cr_describe: "\ud83d\udd0d Ref 1 hti \u2192 Prompt",
    st_describing: "Reference sumla hpe hti nga ai\u2026",
    st_described: "Ref 1 kaw na prompt ka sai \u2713",
    st_need_gem: "Gemini API key bang u (Setup) \u2014 ndai gaw Gemini text lang ai",
    st_need_ref1: "Ref 1 kaw sumla shawng bang u",
    st_lib_added: "Prompt bang sai \u2713",
    cr_refs: "Reference sumla (4 du hkra)",
    cr_refs_note: "Bang mung mai, n bang mung mai \u2014 Layer / File / Web hte bang u. Create gaw na a prompt hpyi ai lam sha la na.",
    cr_results: "Pru ai lam",
    cr_gal_empty: "Pru ai n nga shi ai \u2014 Generate dip u.",
    cr_gal_have: "pru ai \u00b7 sumla kachyi dip nna yu / galaw u",
    cr_save: "\u2b07 PNG makoi",
    cr_engine: "Engine",
    cr_need_result: "Sumla langai shawng galaw u",
    btn_web_import_url: "\u2b07 URL shang",
    st_clip_help: "Clipboard hkum shing nrai pat da ai \u2014 link hpe URL kahtawng kaw kap nna \u2b07 Import URL dip u",
    st_web_blob: "Dai gaw ten kadun blob: link re \u2014 hkra maga dip \u2192 Copy IMAGE Address lang u, shing nrai laika daw makoi nna Import File lang u",
    err_key: "API key n hkrak ai \u2014 Setup tab kaw key hpe bai yu u",
    err_quota: "Quota / hkan shatai ai lam hpring sai \u2014 kachyi mi la nna bai chyam u",
    err_big: "API a matu sumla grau kaba ai \u2014 kaji shatai nna bai chyam u",
    err_safety: "Safety filter gaw pat kau ai \u2014 prompt shing nrai sumla hpe jaw nna bai chyam u",
    err_net: "Network / server jam jau ai \u2014 bai chyam yu u",
    err_timeout: "Ten hpring mat sai \u2014 server grau na ai; bai chyam yu u",
    err_generic: "Ndai lam n ngut lu ai \u2014 bai chyam yu u",
    err_img: "Lang mai ai sumla n pru ai \u2014 bai chyam yu u",
    err_mode: "Ndai document gaw RGB mode n re \u2014 shawng galai u (Image \u25b8 Mode \u25b8 RGB Color), ngut jang bai chyam u",
    cam_master: "Camera block HPAW \u2014 prompt SHAGU a jahtum kaw jailang",
    cam_body: "Camera hkum",
    cam_lens: "Prime Lens (mm)",
    cam_f: "Aperture",
    cam_film: "Film hkum",
    cam_bokeh: "Bokeh style",
    cam_iso: "ISO",
    cam_k: "WB Kelvin",
    cam_note: "Block hpe shawng hpaw nna, ra ai lam sha lata u \u2014 chip \u2013 ni gaw n lawm na. Yawng gaw hpang jahtum prompt a jahtum kaw du na.",
    ro_h_main: "REFERENCE OPS PRO (Ref1 / Ref2)",
    ro_note: "Ref1 = IMAGE 2 (num) \u00b7 Ref2 = IMAGE 3 (la). Target hpe shawng lata nna galaw u \u2014 n maren ai masha ni gaw galoi mung n galai ai.",
    ro_target: "Target:",
    ro_solo: "Langai",
    ro_couple: "Num la",
    ro_family: "Dinghku",
    ro_mk: "Ref makeup copy",
    ro_hair: "Ref kara hkum la",
    ro_h_face: "Face Ops",
    ro_h_bg: "BG / FG Ops",
    ro_h_sub: "Subject Ops",
    ro_h_lc: "Light & Color Ops",
    ro_h_dress: "Dress Ops",
    ro_h_mk: "Makeup Ops",
    ro_h_match: "\u2605 Master Match (hkum langai)",
    ro_match_note: "IMAGE 1 hpe reference hte maren shatai nna lahkawng yen kalang sha jaw da ai zawn byin shangun u \u2014 maren shangun na lam ni hpe matsing u:",
    m_color: "Nsam",
    m_light: "Nhtoi",
    m_makeup: "Makeup",
    m_skin: "Hpyi retouch",
    crd_pipe: "\u26d3 Pipeline Builder \u2014 hpa raitim matut",
    pipe_note: "Lam HPA raitim langai hku matut u \u2014 lam shagu a pru ai gaw hpang lam a matu shang wa ai. Grau law 6.",
    pipe_add: "+ Bang",
    pipe_run: "\u25b6 PIPELINE GALAW",
    pipe_clear: "Kasat kau",
    pipe_retouch: "Retouch jailang (ya na slider)",
    pipe_relight: "Relight (ya na nhtoi rig)",
    pipe_prompt: "Prompt (ya na EN kahtawng)",
    pipe_empty: "Lam langai mi shawng bang u",
    pipe_max: "Pipeline hpring sai (grau law 6 lam)",
    st_pipe: "Pipeline lam",
    st_pipe_done: "Pipeline ngut sai",
    st_pipe_stop: "Pipeline hkring sai (lam langai n byin)",
    pipe_merge: "\u26a1 Kalang sha jawm \u2014 lam YAWNG hpe KALANG sha shaga (lawan/manu kaji \u00b7 3 lam npu grau kaja)",
    crd_chainsrest: "Style Chains + Sumla dingsa bai jaw",
    crd_refops: "Reference Ops Pro (Ref1 / Ref2)",
    crd_scenes: "\ud83c\udfac Scenes Pro \u2014 masha lock \u00b7 scene maren",
    scn_note: "Na a masha hpe lock u (myi man \u00b7 pose \u00b7 palawng \u00b7 frame) nna scene yawng hpe shi hte maren bai galaw u \u2014 nhtoi, nsin, nsam, hpang maga, shawng maga hte rai ni yawng shi hkrai hkan nang nna, sumla teng zawn byin wa ai.",
    scn_h_style: "Scene Style (nta kata / htunghking)",
    scn_h_bday: "\ud83c\udf82 Shangai poi \u2014 asak 1\u201345",
    scn_h_cap: "Caption / Laika (ma \u00b7 Miss Universe \u00b7 shangai poi)",
    scn_h_scarf: "Shinggan / Pali pyen",
    scn_grad: "Nta kata Graduation",
    scn_prewed: "Nta kata Prewedding",
    scn_vietnam: "Vietnam",
    scn_myanmar: "Myen mung",
    scn_chinese: "Miwa",
    scn_shan: "Sam",
    scn_newborn: "Ma shangai nnan",
    scn_age: "Asak",
    scn_bday_go: "\ud83c\udf82 SHANGAI POI SCENE",
    scn_cap_on: "Caption laika bang",
    scn_cap_ph: "Caption laika (zawn Happy 1st Birthday, amying)\u2026",
    scn_cap_pos: "Shara",
    scn_top: "Lahta",
    scn_bottom: "Npu",
    scn_scarf: "\u2726 PALI PYEN SCENE",
    scn_dir: "Maga",
    scn_left: "Pai",
    scn_right: "Hkra",
    scn_up: "Lahta",
    scn_len: "Galu ai lam",
    scn_short: "Kadun",
    scn_long: "Galu",
    g_cat_scene: "SCENE OP \u2014 na a masha gaw lock rawng ai (myi man \u00b7 pose \u00b7 palawng \u00b7 frame); galaw pru ai scene yawng (nhtoi, nsin, nsam, hpang maga, shawng maga, rai, nbung) gaw masha hte shi hkrai maren nna, sumla teng zawn composite byin ai.",
    crd_wed: "\u2665 Wedding Pro Suite",
    crd_recipes: "Recipes \u2014 makoi / garan",
    learn_lbl: "\ud83c\udf93 Learn Mode \u2014 1 dip = madun lam (ahkyeng tsit), 2 = prompt (mut), 3 = GALAW (tsit)",
    guide_hint: "Bai dip u: ahkyeng tsit \u2192 mut (prompt) \u2192 tsit (galaw) \u25b6",
    g_learn_next_prompt: "Bai dip u \u2192 shagun na PROMPT teng hpe madun na (mut).",
    g_learn_prompt_head: "Ndai button shagun na PROMPT (bai dip yang = GALAW):",
    g_learn_next_run: "Kalang bai dip u \u2192 RUN (tsit) galaw hpang na.",
    st_prompt_ready: "Prompt hkyen sai \u2014 galaw na matu bai dip u (tsit) \u2713",
    g_step_doc: "Photoshop kaw na a sumla document hpe shawng hpaw u.",
    g_step_ref1: "Reference sumla hpe Ref1 kaw bang u (IMAGE 2 byin na). Masha lahkawng ngu yang Ref2 bang u.",
    g_step_target: "Target lata u: Solo / Couple (Ref1 = num, Ref2 = la) / Family.",
    g_step_mkhair: "Ra yang: Face Ops a lahta na \u2018Copy ref makeup\u2019 / \u2018Take ref hairstyle\u2019 hpe matsing u.",
    g_step_petal: "Nampan lap nsam hpe shawng lata u (auto = na a scene hte maren na).",
    g_step_rest: "Lahta na \u2713 hte Full Color shing nrai B&W lata u.",
    g_step_int: "Intensity slider hpe na ra ai daram jaw u.",
    g_step_confirm: "Matut na matu bai dip u: GUIDE (ahkyeng tsit) \u2192 PROMPT (mut) \u2192 RUN (TSIT gaw galaw hpang sai).",
    g_cat_face: "FACE OP \u2014 reference myi man hpe maren ai masha kaw htawt ya ai; kaga ni gaw n galai ai.",
    g_cat_sub: "SUBJECT OP \u2014 reference kaw na MASHA hpe na a scene kaw shang shangun ai; scene hte frame gaw rawng na.",
    g_cat_bgfg: "BG/FG OP \u2014 reference lang nna hpang maga / shawng maga sha galai ai.",
    g_cat_lc: "LIGHT & COLOR OP \u2014 reference a nhtoi hte grade hpe copy ai; masha ni gaw pixel shagu teng sha rawng ai.",
    g_cat_dress: "DRESS OP \u2014 reference lang nna palawng sha galai ai.",
    g_cat_mkop: "MAKEUP OP \u2014 reference lang nna makeup sha galai ai.",
    g_cat_match: "MASTER MATCH \u2014 na a sumla hpe reference a hkum tsup hte maren shatai ai (lahta na layer ni matsing u).",
    g_cat_trail: "WEDDING TRAIL \u2014 tsawm ai tsing pa + nampan lam galu; myi man/pose/frame gaw ngang ngang lock ai.",
    g_cat_veil: "FLYING VEIL \u2014 nbung hte pyen ai veil hpe ndai galu ai daram bang/galu shatai ai; myi man gaw galoi mung n magap ai.",
    g_cat_gown: "GOWN \u2014 nga sai palawng hpe kasan ai (hkum n galai) nna ndai train galu ai lam masat ai.",
    g_cat_petal: "FLYING PETALS \u2014 ndai style hku nampan hpun lap ni hpe nbung kaw bang ai; nsam gaw lahta na swatch kaw na.",
    g_cat_wedx: "WEDDING EXTRA \u2014 ndai lam hpe na a scene hte maren nna bang ai; masha gaw lock rawng ai.",
    g_cat_canvas: "REPLACE (CANVAS) \u2014 NA a masha hpe reference a scene kaw bang ai; ref kaw na masha ni gaw shamat kau ai.",
    g_cat_restore: "OLD PHOTO RESTORE \u2014 hkrat ai lam ni hpe bai jaw ai; shawng na myi man shagu 100% maren rawng ai.",
    g_cat_generic: "PRESET \u2014 ndai atsawm jaw da ai lam hpe na a sumla kaw jailang ai.",
    g_gen: "GENERATE \u2014 prompt kahtawng (+ chains, Keep lock, camera block) hpe na a document kaw galaw ai.",
    g_retouchbtn: "RETOUCH APPLY \u2014 na a slider setting yawng hpe atsawm retouch kalang hku galaw ai.",
    g_relightbtn: "LIGHTING GENERATE \u2014 na a 3D nhtoi sumla hte maren sha sumla hpe nhtoi bai jaw ai.",
    g_scene: "SCENE GENERATE \u2014 shaw la da ai prompt kaw na scene bai galaw ai; masha gaw rawng na.",
    g_rmix: "REPLACE MIX \u2014 reference kaw na \u2713 matsing da ai daw ni sha galai ai.",
    g_pipe: "RUN PIPELINE \u2014 matut da ai lam shagu hpe ahkying hku galaw ai; pru ai shagu gaw hpang lam de shang ai.",
    ro_faceRep: "Face Replace",
    ro_faceSwap: "Face Swap",
    ro_bgRep: "BG Replace",
    ro_bgSwap: "BG Swap",
    ro_fgRep: "FG Replace",
    ro_bg_note: "Doc = masha \u00b7 Ref1 = scene nnan. Target (Solo/Couple/Family) gaw kadai hpe jang da na lata ai.",
    ro_bg_frame: "Frame hte composition jang da",
    ro_bg_light: "Masha a nhtoi/nsam jang da",
    ro_subSwap: "Subject Swap",
    ro_lcRef: "L&C Reference",
    ro_lcCopy: "L&C Copy-Paste",
    ro_dressRef: "Dress Reference",
    ro_dressRep: "Dress Replace",
    ro_mkCopy: "Makeup Copy",
    ro_matchBtn: "\u2605 MASTER MATCH",
    grp_retouch: "Hpyi retouch preset",
    lbl_intensity: "N-gun",
    p_evoto: "Evoto Style",
    p_meitu: "Meitu Style",
    auto_place: "Pru ai hpe Photoshop kaw layer nnan hku shi hkrai bang",
    sec_retouchpro: "Retouch Pro \u2014 Sliders",
    rt_skin: "Hpyi",
    rt_faceai: "Face AI",
    rt_hair: "Kara",
    rt_dress: "Palawng",
    rt_bg: "Hpang maga",
    rt_smooth: "Hpyi hpraw shatai",
    rt_acne: "Ju shamat",
    rt_spots: "Achyang tsawm",
    rt_wrinkle: "Nyaw ai lam",
    rt_tone: "Hpraw / chyang",
    rt_glow: "Kabrim",
    rt_reshape: "AI Reshape",
    rt_lash: "Myi mun",
    rt_brow: "Myi hkyi",
    rt_lipsmooth: "Ningma hpraw",
    rt_lipcolor: "Ningma nsam",
    rt_lenscolor: "Myi lens nsam",
    rt_hairstray: "Kara pru ai",
    rt_hairsmooth: "Kara hpraw",
    rt_hairshine: "Kara kabrim (D&B)",
    rt_dresssmooth: "Palawng hpraw",
    rt_dressedge: "Makau kasan",
    rt_dresswrinkle: "Nyaw shamat",
    rt_dresstexture: "Texture bai jaw",
    rt_bgsmooth: "Hpang maga kasan/hpraw",
    rt_bgcolor: "Hpang maga nsam",
    rt_bgrecolor: "Hpang maga nsam hpraw",
    rt_shape: "Reshape Pro (Myi man + Hkum)",
    rt_teeth: "Wa hpraw shatai",
    rt_eyewhite: "Myi hpraw kasan",
    rt_faceslim: "Myi man kaji",
    rt_jaw: "Ngup nra",
    rt_chin: "Ngup dung",
    rt_nosesize: "Ladi kaba ai lam",
    rt_eyesize: "Myi kaba ai lam",
    rt_lipfull: "Ningma hpring",
    rt_waist: "Sinnyen kaji",
    rt_bodyslim: "Hkum kaji",
    rt_shoulder: "Lahpaw",
    rt_hip: "Maidang kaji",
    rt_leglen: "Lagaw galu",
    rt_armslim: "Lata kaji",
    rt_dressfit: "Palawng hkrak",
    rt_dressclean: "Palawng kasan",
    rt_dresscolorpure: "Palawng nsam san",
    rt_bodygrp: "Body Skin Pro",
    rt_bodysmooth: "Hkum hpyi hpraw",
    rt_bodyblemish: "Hkum hpyi kasan",
    rt_bodytone: "Hpyi nsam maren",
    rt_bodyglow: "Hkum kabrim",
    rt_bodyhairrm: "Hkum mun kaji shatai",
    rt_hairvolume: "Kara law ai lam",
    rt_hairgloss: "Kara gloss",
    rt_hairfill: "Kara bang (kaji ai shara)",
    wp_h_trail: "\u2665 Wedding \u2014 Nampan lam tsawm",
    wp_h_veil: "\u2665 Wedding \u2014 Veil pyen",
    wp_h_gown: "\u2665 Wedding \u2014 Gown kasan + Train",
    wp_h_petal: "\u2665 Wedding \u2014 Nampan lap pyen",
    wp_h_extra: "\u2665 Wedding \u2014 Gumra \u00b7 Hka \u00b7 Nbung",
    wp_note: "Face ID / pose / frame / palawng hkum gaw ngang ngang lock ai \u2014 tsun da ai lam sha galai ai.",
    wp_petalcolor: "Nampan lap nsam (auto = scene hte maren)",
    wp_trail_c: "Nampan nsam",
    wp_trail_go: "\u25b6 Nampan lam",
    wp_veil_c: "Veil galu ai lam",
    wp_veil_go: "\u25b6 Veil pyen",
    wp_gown_c: "Train galu ai lam",
    wp_gown_go: "\u25b6 Gown kasan + Train",
    wp_pet_c: "Nampan lap style",
    wp_pet_go: "\u25b6 Nampan lap pyen",
    wp_extra_c: "Kaga",
    wp_extra_go: "\u25b6 Kaga bang",
    btn_apply_rt: "Retouch jailang",
    btn_reset: "Bai masat",
    rt_none: "Retouch slider shing nrai nsam langai mi shawng masat u",
    tab_setup: "Setup",
    tab_prompt: "Studio",
    tab_presets: "Presets",
    recent_lbl: "Nnan na prompt ni\u2026",
    tab_retouch: "Retouch",
    tab_aitools: "AI Tools",
    cap_warn: "Photoshop gaw ndai prompt kahtawng hpe ndai daram sha jaw ai:",
    cleanup_note: "Matsing da ai lam ni gaw Generate / preset SHAGU hte rau galaw na.",
    btn_generate: "GENERATE",
    st_ready: "Hkyen sai",
    st_capture: "Document la nga ai",
    st_gen: "Galaw nga ai\u2026",
    st_place: "Photoshop kaw bang nga ai\u2026",
    st_placed_masked: "Layer + Mask group hku bang sai \u2014 shawng na sumla n hkra ai \u2713",
    st_placed_plain: "Layer hkum sha hku bang sai (ndai host kaw mask/group n lu ai)",
    stage_queued: "La nga ai",
    stage_uploading: "Tsun dat nga ai",
    stage_generating: "Galaw nga ai",
    stage_downloading: "La nga ai",
    stage_placing: "Bang nga ai",
    st_done: "Ngut sai \u2713",
    st_err: "Shut ai",
    st_no_doc: "Hpaw da ai document n nga ai \u2014 sumla shawng hpaw u",
    st_no_prompt: "Prompt kaw hpa n nga ai",
    need_ref: "Ndai preset gaw slot 1 kaw reference sumla ra ai",
    st_new_doc: "Pru ai hpe document nnan hku hpaw sai \u2713",
    sec_preview: "Shawng yu \u2014 Before / After",
    before: "SHAWNG",
    after: "HPANG",
    btn_place: "Photoshop kaw bang",
    btn_saveas: "Ndai hku makoi\u2026",
    st_saved: "Makoi da sai \u2713",
    sec_diag: "System sawn yu",
    sec_log: "Bungli Log",
    btn_diag: "Sawn yu",
    btn_copylog: "Log copy",
    btn_clearlog: "Kasat kau",
    diag_host: "Photoshop nta madu",
    diag_uxp: "UXP atsam",
    diag_gem: "Gemini API key",
    diag_oai: "OpenAI API key",
    diag_doc: "Hpaw da ai document",
    diag_set: "masat da sai",
    diag_unset: "n masat shi ai",
    diag_open: "hpaw da ai",
    diag_none: "n nga ai",
    diag_missing: "n mu ai",
    diag_done: "System sawn yu ngut sai \u2713",
    diag_lib: "Reference Library",
    diag_lib_open: "Folder hpaw lu ai atsam",
    sec_reflib: "Reference sumla Library",
    reflib_note: "Na ra sharawng ai reference sumla folder hpe kalang sha lata u \u2014 Browse gaw dai hpe matsing nna shara shagu dai kata kaw hpaw ya na.",
    btn_browse: "Tam yu",
    lib_choose: "Folder lata",
    lib_open: "Folder hpaw",
    lib_change: "Folder galai",
    lib_reset: "Bai masat",
    lib_rescan: "Bai scan",
    lib_current: "Ya na folder",
    lib_found: "Mu ai sumla",
    lib_status: "Status",
    lib_lastscan: "Hpang jahtum scan",
    lib_images: "sumla",
    lib_connected: "Matut da sai",
    lib_not_config: "N hkyen shi ai",
    lib_perm_lost: "Ahkang mat sai \u2014 bai lata u",
    lib_none: "(folder n lata shi ai)",
    lib_copy_only: "lam sha copy",
    lib_choose_msg: "Na a HNK Reference sumla Library folder hpe lata u.",
    lib_scanning: "Library scan nga ai\u2026",
    lib_scan_done: "Bai scan ngut sai \u2713",
    lib_reset_done: "Library bai masat sai \u2713",
    lib_path_copied: "Lam copy la sai",
    lib_unsupported: "Ndai sumla amyu n lu lang ai",
    lib_restore_fail: "Reference bai la n lu ai",
    on: "HPAW",
    off: "PAT",
    ai_home_title: "Hpa baw galaw mayu ai rai?",
    ai_free_generate: "Lawt lat Generate",
    ai_free_sub: "Nang a prompt ka u",
    ai_more_tools: "Arung arai kaga",
    ai_more_sub: "Water Edit \u00b7 Text/Logo \u00b7 workflow yawng",
    ai_nav_home: "Nta",
    ai_nav_tools: "Arung arai",
    ai_history: "Labau",
    ai_no_gen: "Galaw da ai n nga shi ai.",
    ai_rerun: "Bai galaw",
    ai_reuse: "Bai lang",
    ai_clear_hist: "Labau kasat kau",
    ai_images: "SUMLA NI",
    ai_add_ref: "+ Reference sumla bang",
    ai_prompt: "PROMPT",
    ai_prompt_ph: "Hpa ra ai hpe tsun dan u\u2026",
    ai_model_output: "MODEL HTE OUTPUT",
    ai_model_note: "AI Tools gaw shi a model/size setting nga ai \u2014 Setup hte Create tab ni hte n bung ai.",
    ai_auto_model: "Model shi hkrai",
    ai_wf_tools: "Workflow arung arai",
    ai_direct_gen: "Ding di generate",
    ai_identity_lock: "Myi man lock",
    ai_ref_transfer: "Reference htawt ya",
    ai_req_images: "Ra ai sumla ni",
    ai_opt_images: "Bang mung mai ai sumla",
    ai_model_lbl: "Model",
    ai_prepare: "Hkyen (hpaw nna sawn)",
    ai_lib_bridge_off: "Ndai host kaw Library bridge n lu ai.",
    ai_lib_pick_first: "Presets tab \u2192 Visual Library kaw na sumla langai shawng lata u.",
    ai_lib_load_fail: "Library sumla hpe n hpaw lu ai.",
    ai_missing: "N nga shi ai",
    ai_add: "Bang",
    ai_library: "Library",
    ai_rh_sec: "RunningHub \u2014 model endpoint bang (Advanced \u2014 n bang mung mai)",
    ai_rh_note: "Nlung ai model ni gaw ntsa na key hte galaw sai \u2014 hpa galaw ra ai n nga. Model langai \"not connected\" madun yang (endpoint path teng sha n chye shi ai), RunningHub API docs kaw na path hpe la nna ndai kaw bang u.",
    ai_rh_save: "Ndai model a endpoint makoi",
    ai_test_conn: "Matut lam sawn yu",
    ai_oai_sec: "OpenAI (Advanced \u2014 n bang mung mai)",
    ai_oai_note: "RunningHub Enterprise malai shing nrai shi hte rau, nang a OpenAI API key hte GPT Image 2 lang mai ai.",
    ai_save_verify: "Makoi nna sawn",
    ai_settings: "Setting",
    ai_add_layers: "Pru ai lam hpe Layer nnan hku bang",
    ai_done: "Ngut sai.",
    ai_result_ready: "Pru ai lam hkyen sai.",
    ai_ready_nolayer: "Pru ai lam hkyen sai (Layer hku bang ai lam gaw Settings kaw pat da ai).",
    ai_place_failed: "Galaw ngut sai, raitim Photoshop kaw n lu bang ai.",
    ai_place_failed_fix: "Document langai hpaw nna History kaw na bai galaw u.",
    ai_placed_masked: "\u201c{name}\u201d group kaw Layer + Mask hku bang ngut sai \u2014 nang a shawng na sumla n hkra ai.",
    ai_placed_group: "\u201c{name}\u201d group kaw Layer nnan hku bang ngut sai (ndai host kaw mask n lu ai).",
    ai_placed_plain: "Layer nnan hku bang ngut sai (ndai host kaw group/mask n lu ai).",
    ai_start_fail: "AI Tools n hpang lu ai",
    pgb_setup: "Ndai kaw hpang u \u2014 API Key \u00b7 Model \u00b7 Library hkyen u",
    pgb_studio: "Prompt \u2192 Reference \u2192 Generate \u2014 atsawm bungli lam langai matut",
    pgb_create: "Myit kaw na sumla tsawm de \u2014 Reference 4 slot \u00b7 Variations",
    pgb_presets: "Visual Library 366 \u00b7 Scenes \u00b7 Wedding \u00b7 Style Chains",
    pgb_aitools: "Kalang dip sha atsawm \u2014 Nano Banana \u00b7 GPT Image \u00b7 RunningHub",
    pgb_retouch: "Hpyi \u00b7 Myi man \u00b7 Hkum \u2014 Professional Sliders",
    wf_sum_bg_replace: "Hpang maga galai",
    wf_sum_reference_transfer: "Na a masha hpe reference scene kaw bang",
    wf_sum_master_bgfg_replace: "Scene kaw na masha shamat, bg/fg bai galaw, na a masha bang",
    wf_sum_subject_face: "Masha shing nrai myi man hpe base sumla kaw htawt",
    wf_sum_retouch: "Masha sumla hpe sha-sha re shatsawm",
    wf_sum_upscale: "Atsawm lam n mat ai sha kaba shatai",
    wf_sum_object_edit: "Rai ni hpe shamat, galai shing nrai bang",
    wf_sum_water_edit: "Hka hte hka kaw dan ai lam jaw",
    wf_sum_text_logo: "Laika hte logo bang shing nrai jaw",
    wfin_subject: "Na a sumla (masha)",
    wfin_new_bg: "Hpang maga nnan (n bang mung mai)",
    wfin_ref_scene: "Reference scene",
    wfin_style_ref: "Style reference (n bang mung mai)",
    wfin_target_scene: "Masha lawm ai target scene",
    wfin_base: "Base sumla",
    wfin_face_ref: "Myi man / masha reference",
    wfin_portrait: "Masha sumla",
    wfin_image: "Sumla",
    wfin_object_ref: "Rai reference (n bang mung mai)",
    wfin_logo_ref: "Logo reference (n bang mung mai)",
    wf_exp_bg_replace: "Na a masha a hpang maga hpe galai ya ai. Masha, pose, makau hte nhtoi gaw n galai ai \u2014 hpang maga sha galai ai.",
    wf_exp_reference_transfer: "Reference sumla a scene yawng hpe la ai (raitim shi kaw na masha ni gaw n la ai), nna NA a masha hpe dai kaw bang ya ai \u2014 myi man, pose hte frame jang da nna, scene a nhtoi hte ang hpe maren shatai ai.",
    wf_exp_master_bgfg_replace: "Scene kata masha galai ai lam kaw grau ngang dik ai: reference scene kaw na masha hpe hpring tsup shamat kau nna, makoi taw ai hpang maga hte shawng maga hpe sha-sha re bai galaw, dai hpang na a masha hpe dai shara kaw teng sha bang ya ai \u2014 myi man, pose, kaba kaji, kara, palawng, hpyi hte nhtoi gaw na a sumla kaw na lock da ai, reference gaw scene, camera hte sung ai lam sha jaw ai.",
    wf_exp_subject_face: "Reference kaw na masha shing nrai myi man hpe na a base sumla kaw sha-sha re jawm bang ya nna, base a hkum gaw n hkra ai.",
    wf_exp_retouch: "Hpyi, kara hte nsam hpe sha-sha re shatsawm ya ai. Na a myi man, hkum hte myit madun gaw jang da ai \u2014 hpyi plastic n byin, myi man n galai ai.",
    wf_exp_upscale: "Na a sumla hpe kaba shatai nna hpyi, kara hte palawng a sha-sha re atsawm lam ni hpe bai shapraw ya ai. Myi man, pose, hkum hte nsam gaw n galai ai \u2014 plastic zawn hpraw shatai ai n nga.",
    wf_exp_object_edit: "Shara mi kaw sha jaw ai lam hte rai ni hpe shamat, galai shing nrai bang ya ai. N hkra ai lam ni gaw yawng dai hku sha nga ai.",
    wf_exp_water_edit: "Hka, hka kaw dan ai lam hte madi ai shara ni hpe teng sha zawn byin hkra bang shing nrai jaw ya ai, na a masha gaw n hkra ai.",
    wf_exp_text_logo: "Sumla ntsa kaw san seng nna hti mai ai laika shing nrai logo hpe bang shing nrai jaw ya nna, hkum gaw jang da ai."
  },
  /* ---- Thai (th) — 587 keys, complete ---- */
  th: {
    gate_sub_login: "เข้าสู่ระบบด้วยบัญชี HNK ของคุณเพื่อใช้แผงนี้",
    gate_email_ph: "อีเมล",
    gate_pass_ph: "รหัสผ่าน",
    gate_signin: "เข้าสู่ระบบ",
    gate_checking: "กำลังตรวจสอบแพ็กเกจของคุณ…",
    gate_need: "กรอกอีเมลและรหัสผ่าน",
    gate_bad: "อีเมลหรือรหัสผ่านไม่ถูกต้อง",
    gate_offline: "ไม่มีอินเทอร์เน็ต — ตรวจสอบแพ็กเกจไม่ได้ เชื่อมต่อแล้วกดตรวจสอบอีกครั้ง",
    gate_locked: "จ่ายครั้งเดียวได้ทั้งสอง — ค่าแรกเข้าและค่ารายเดือนเปิดใช้ทั้งเว็บแอปและแผง Photoshop นี้ ซื้อหรือต่ออายุบนเว็บไซต์ แล้วกดตรวจสอบอีกครั้ง",
    gate_buy: "เปิดเว็บไซต์",
    gate_retry: "ตรวจสอบอีกครั้ง",
    gate_signout: "ออกจากระบบ",
    gate_days: "เหลือ {D} วัน",
    gate_grace: "ออฟไลน์ — ใช้งานแบบออฟไลน์ได้อีก {D} วัน",
    gate_open_fail: "เปิดเบราว์เซอร์ไม่ได้ ที่อยู่: {U}",
    app_title: "HNK Ai Panel (\u0e19\u0e31\u0e01\u0e40\u0e23\u0e35\u0e22\u0e19)",
    sec_api: "Gemini API Key",
    btn_show: "\u0e41\u0e2a\u0e14\u0e07",
    btn_hide: "\u0e0b\u0e48\u0e2d\u0e19",
    btn_test: "\u0e17\u0e14\u0e2a\u0e2d\u0e1a",
    btn_save: "\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01",
    st_testing: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e17\u0e14\u0e2a\u0e2d\u0e1a\u0e04\u0e35\u0e22\u0e4c",
    st_key_ok: "\u2713 API key \u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49",
    st_key_bad: "API key \u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27",
    st_key_saved: "\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01 API key \u0e41\u0e25\u0e49\u0e27 \u2713",
    st_need_key: "\u0e43\u0e2a\u0e48 Gemini API key \u0e01\u0e48\u0e2d\u0e19",
    sec_model: "\u0e42\u0e21\u0e40\u0e14\u0e25 & \u0e40\u0e2d\u0e32\u0e15\u0e4c\u0e1e\u0e38\u0e15",
    scope_model_note: "\u0e43\u0e0a\u0e49\u0e01\u0e31\u0e1a\u0e1b\u0e38\u0e48\u0e21 Generate \u0e02\u0e2d\u0e07\u0e41\u0e17\u0e47\u0e1a Prompt \u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07 \u2014 Create \u0e41\u0e25\u0e30 AI Tools \u0e21\u0e35\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32\u0e42\u0e21\u0e40\u0e14\u0e25\u0e41\u0e22\u0e01\u0e02\u0e2d\u0e07\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07",
    model_auto: "\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34 (\u0e41\u0e19\u0e30\u0e19\u0e33)",
    model_flash: "Flash \u2014 \u0e40\u0e23\u0e47\u0e27 (2.5)",
    model_pro: "Pro \u2014 \u0e04\u0e38\u0e13\u0e20\u0e32\u0e1e (3.0)",
    lbl_ratio: "\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e2a\u0e48\u0e27\u0e19",
    ratio_auto: "\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e2a\u0e48\u0e27\u0e19\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34 (\u0e08\u0e32\u0e01\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23)",
    lbl_size: "\u0e02\u0e19\u0e32\u0e14",
    lbl_quality: "\u0e04\u0e38\u0e13\u0e20\u0e32\u0e1e",
    qual_auto: "\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34",
    qual_low: "\u0e15\u0e48\u0e33",
    qual_med: "\u0e01\u0e25\u0e32\u0e07",
    qual_high: "\u0e2a\u0e39\u0e07",
    sec_prompt: "\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c",
    hint_prompt: "\u0e1e\u0e34\u0e21\u0e1e\u0e4c\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e17\u0e35\u0e48\u0e19\u0e35\u0e48\u2026 (\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14 20,000 \u0e15\u0e31\u0e27\u0e2d\u0e31\u0e01\u0e29\u0e23)",
    btn_improve: "\u0e1b\u0e23\u0e31\u0e1a\u0e1b\u0e23\u0e38\u0e07",
    btn_clear: "\u0e25\u0e49\u0e32\u0e07",
    st_improving: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e1b\u0e23\u0e31\u0e1a\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c",
    st_improved: "\u0e1b\u0e23\u0e31\u0e1a\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e41\u0e25\u0e49\u0e27 \u2713",
    sec_refs: "\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07",
    base_note: "\u0e20\u0e32\u0e1e\u0e15\u0e49\u0e19\u0e17\u0e32\u0e07 = \u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23 Photoshop \u0e17\u0e35\u0e48\u0e40\u0e1b\u0e34\u0e14\u0e2d\u0e22\u0e39\u0e48 (\u0e14\u0e36\u0e07\u0e21\u0e32\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34)",
    btn_ref_layer: "+ \u0e40\u0e25\u0e40\u0e22\u0e2d\u0e23\u0e4c",
    btn_ref_file: "\u0e44\u0e1f\u0e25\u0e4c",
    btn_ref_web: "\u0e40\u0e27\u0e47\u0e1a",
    st_ref_layer_added: "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e25\u0e40\u0e22\u0e2d\u0e23\u0e4c\u0e40\u0e1b\u0e47\u0e19\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07\u0e41\u0e25\u0e49\u0e27 \u2713",
    st_ref_file_added: "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e44\u0e1f\u0e25\u0e4c\u0e40\u0e1b\u0e47\u0e19\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07\u0e41\u0e25\u0e49\u0e27 \u2713",
    st_importing: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e19\u0e33\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1f\u0e25\u0e4c",
    url_title: "\u0e42\u0e2b\u0e25\u0e14\u0e20\u0e32\u0e1e\u0e08\u0e32\u0e01 URL",
    url_ph: "https://\u2026 \u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e20\u0e32\u0e1e \u0e2b\u0e23\u0e37\u0e2d\u0e25\u0e34\u0e07\u0e01\u0e4c\u0e1e\u0e34\u0e19 Pinterest",
    btn_paste: "\u0e27\u0e32\u0e07",
    btn_load: "\u0e42\u0e2b\u0e25\u0e14",
    btn_cancel: "\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01",
    st_url_loading: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e42\u0e2b\u0e25\u0e14\u0e20\u0e32\u0e1e\u0e08\u0e32\u0e01\u0e40\u0e27\u0e47\u0e1a",
    st_ref_web_added: "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e20\u0e32\u0e1e\u0e40\u0e27\u0e47\u0e1a\u0e40\u0e1b\u0e47\u0e19\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07\u0e41\u0e25\u0e49\u0e27 \u2713",
    st_url_bad: "\u0e42\u0e2b\u0e25\u0e14\u0e20\u0e32\u0e1e\u0e08\u0e32\u0e01 URL \u0e19\u0e35\u0e49\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49 \u2014 \u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e02\u0e2d\u0e07\u0e20\u0e32\u0e1e\u0e41\u0e25\u0e49\u0e27\u0e25\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48",
    no_layer: "\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e40\u0e25\u0e40\u0e22\u0e2d\u0e23\u0e4c",
    sec_presets: "\u0e1e\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15 AI",
    auto_run: "\u0e04\u0e25\u0e34\u0e01\u0e1e\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15 \u2192 \u0e2a\u0e23\u0e49\u0e32\u0e07\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34 (\u0e1b\u0e34\u0e14 = \u0e41\u0e17\u0e23\u0e01\u0e25\u0e07\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19)",
    grp_cleanup: "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e17\u0e33\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e30\u0e2d\u0e32\u0e14",
    p_remove_people: "\u0e25\u0e1a\u0e1c\u0e39\u0e49\u0e04\u0e19",
    p_fix_hands: "\u0e41\u0e01\u0e49\u0e21\u0e37\u0e2d\u0e40\u0e01\u0e34\u0e19",
    p_fix_legs: "\u0e41\u0e01\u0e49\u0e02\u0e32\u0e40\u0e01\u0e34\u0e19",
    p_full_clean: "\u0e17\u0e33\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e30\u0e2d\u0e32\u0e14\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14",
    grp_moved_note: "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d Reference \u0e22\u0e49\u0e32\u0e22\u0e44\u0e1b\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e01\u0e32\u0e23\u0e4c\u0e14 Reference Ops Pro \u0e14\u0e49\u0e32\u0e19\u0e25\u0e48\u0e32\u0e07\u0e41\u0e25\u0e49\u0e27 (\u0e23\u0e27\u0e21\u0e17\u0e35\u0e48\u0e40\u0e14\u0e35\u0e22\u0e27 \u0e1e\u0e23\u0e49\u0e2d\u0e21 Solo/Couple/Family \u0e41\u0e25\u0e30\u0e04\u0e33\u0e41\u0e19\u0e30\u0e19\u0e33)",
    ro_h_detail: "\u0e1c\u0e21 \u00b7 \u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e1b\u0e23\u0e30\u0e14\u0e31\u0e1a \u00b7 \u0e17\u0e48\u0e32\u0e42\u0e1e\u0e2a (\u2190 Ref1)",
    ro_h_comp: "\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a \u00b7 \u0e2a\u0e44\u0e15\u0e25\u0e4c \u00b7 \u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21 (\u2190 Ref1)",
    p_fgbglc: "FG=\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23 \u00b7 BG=Ref1 \u00b7 \u0e41\u0e2a\u0e07=Ref2",
    p_hair: "\u0e17\u0e23\u0e07\u0e1c\u0e21 (\u2190 Ref1)",
    p_access: "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e1b\u0e23\u0e30\u0e14\u0e31\u0e1a+\u0e2d\u0e31\u0e0d\u0e21\u0e13\u0e35 (\u2190 Ref1)",
    p_pose: "\u0e08\u0e31\u0e1a\u0e04\u0e39\u0e48\u0e17\u0e48\u0e32\u0e42\u0e1e\u0e2a (\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23 \u2192 Ref1)",
    p_fgprops: "\u0e27\u0e31\u0e15\u0e16\u0e38\u0e14\u0e49\u0e32\u0e19\u0e2b\u0e19\u0e49\u0e32 (\u2190 Ref1)",
    p_textlogo: "\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21 / \u0e42\u0e25\u0e42\u0e01\u0e49 (\u2190 Ref1)",
    p_style: "\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e20\u0e32\u0e1e (\u2190 Ref1)",
    grp_repsubj: "\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a (\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23 \u2192 \u0e09\u0e32\u0e01 Ref1)",
    p_rep_solo: "\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e40\u0e14\u0e35\u0e48\u0e22\u0e27",
    p_rep_couple: "\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e04\u0e39\u0e48",
    p_rep_family: "\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e04\u0e23\u0e2d\u0e1a\u0e04\u0e23\u0e31\u0e27",
    grp_rmix: "\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e41\u0e1a\u0e1a\u0e1c\u0e2a\u0e21 \u2014 \u0e15\u0e34\u0e4a\u0e01\u0e41\u0e25\u0e49\u0e27\u0e14\u0e36\u0e07\u0e08\u0e32\u0e01 Ref1",
    rm_bg: "\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07 (BG)",
    rm_fg: "\u0e09\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32 (FG)",
    rm_light: "\u0e41\u0e2a\u0e07",
    rm_color: "\u0e2a\u0e35",
    rm_object: "\u0e27\u0e31\u0e15\u0e16\u0e38 / \u0e1e\u0e23\u0e47\u0e2d\u0e1e",
    btn_rmix: "\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e41\u0e1a\u0e1a\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48",
    rm_none: "\u0e15\u0e34\u0e4a\u0e01\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e01\u0e48\u0e2d\u0e19",
    grp_i2p: "\u0e20\u0e32\u0e1e \u2192 \u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c (\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e09\u0e32\u0e01)",
    i2p_note: "1) \u0e2a\u0e01\u0e31\u0e14: \u0e09\u0e32\u0e01\u0e43\u0e19 Ref1 \u2192 prompt \u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14 (\u0e44\u0e21\u0e48\u0e23\u0e27\u0e21\u0e04\u0e19) 2) \u0e41\u0e01\u0e49\u0e44\u0e02\u0e44\u0e14\u0e49\u0e17\u0e35\u0e48\u0e2b\u0e19\u0e49\u0e32 Prompt 3) SCENE GENERATE \u0e08\u0e30\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e09\u0e32\u0e01\u0e19\u0e31\u0e49\u0e19\u0e23\u0e2d\u0e1a\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e43\u0e19\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 \u2014 \u0e1b\u0e23\u0e31\u0e1a\u0e40\u0e02\u0e49\u0e32\u0e21\u0e38\u0e21\u0e01\u0e25\u0e49\u0e2d\u0e07\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34 \u0e25\u0e47\u0e2d\u0e01 Face/Pose/Frame = \u0e04\u0e07\u0e02\u0e2d\u0e07\u0e40\u0e14\u0e34\u0e21",
    i2p_objects: "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e27\u0e31\u0e15\u0e16\u0e38 & \u0e1e\u0e23\u0e47\u0e2d\u0e1e",
    i2p_light: "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e41\u0e2a\u0e07",
    i2p_color: "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e2a\u0e35 / \u0e40\u0e01\u0e23\u0e14",
    i2p_bg: "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07",
    i2p_fg: "\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e09\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32",
    btn_i2p: "\u0e20\u0e32\u0e1e \u2192 \u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c (\u0e14\u0e36\u0e07\u0e09\u0e32\u0e01)",
    i2p_fit: "Scene Auto-Fit \u2014 \u0e1b\u0e23\u0e31\u0e1a\u0e09\u0e32\u0e01\u0e43\u0e2b\u0e21\u0e48\u0e43\u0e2b\u0e49\u0e15\u0e23\u0e07\u0e21\u0e38\u0e21 / \u0e23\u0e30\u0e22\u0e30 / \u0e40\u0e25\u0e19\u0e2a\u0e4c \u0e02\u0e2d\u0e07\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23",
    i2p_adapt: "\u0e1b\u0e23\u0e31\u0e1a\u0e41\u0e2a\u0e07 & \u0e2a\u0e35\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e43\u0e2b\u0e49\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a\u0e09\u0e32\u0e01",
    btn_scenegen: "\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e09\u0e32\u0e01",
    st_extract: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e14\u0e36\u0e07\u0e09\u0e32\u0e01\u0e40\u0e1b\u0e47\u0e19\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c",
    st_extract_done: "\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e09\u0e32\u0e01\u0e1e\u0e23\u0e49\u0e2d\u0e21 \u2014 \u0e15\u0e23\u0e27\u0e08\u0e14\u0e39\u0e17\u0e35\u0e48\u0e2b\u0e19\u0e49\u0e32\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c",
    scene_no_prompt: "\u0e0a\u0e48\u0e2d\u0e07\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e27\u0e48\u0e32\u0e07 \u2014 \u0e23\u0e31\u0e19 \u0e20\u0e32\u0e1e \u2192 \u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c \u0e01\u0e48\u0e2d\u0e19",
    i2p_none: "\u0e15\u0e34\u0e4a\u0e01\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e01\u0e48\u0e2d\u0e19",
    sec_light: "\u0e41\u0e2a\u0e07\u0e2a\u0e15\u0e39\u0e14\u0e34\u0e42\u0e2d \u2014 \u0e08\u0e31\u0e14\u0e41\u0e2a\u0e07\u0e43\u0e2b\u0e21\u0e48\u0e14\u0e49\u0e27\u0e22 AI",
    light_note: "\u0e15\u0e34\u0e4a\u0e01\u0e40\u0e1b\u0e34\u0e14\u0e44\u0e1f \u0e41\u0e15\u0e30\u0e41\u0e16\u0e27\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e40\u0e25\u0e37\u0e2d\u0e01 \u0e41\u0e25\u0e49\u0e27\u0e1b\u0e23\u0e31\u0e1a\u0e14\u0e49\u0e27\u0e22\u0e2a\u0e44\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c \u2014 \u0e41\u0e1c\u0e19\u0e20\u0e32\u0e1e\u0e21\u0e38\u0e21\u0e1a\u0e19 3D \u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e2a\u0e14 (\u25b4 = \u0e2a\u0e39\u0e07, \u25be = \u0e15\u0e48\u0e33) LIGHTING GENERATE \u0e08\u0e30\u0e08\u0e31\u0e14\u0e41\u0e2a\u0e07\u0e20\u0e32\u0e1e\u0e43\u0e2b\u0e21\u0e48\u0e15\u0e32\u0e21\u0e0a\u0e38\u0e14\u0e19\u0e35\u0e49\u0e40\u0e1b\u0e4a\u0e30 \u0e2a\u0e48\u0e27\u0e19\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32 / \u0e17\u0e48\u0e32\u0e17\u0e32\u0e07 / \u0e40\u0e1f\u0e23\u0e21 \u0e22\u0e31\u0e07\u0e25\u0e47\u0e2d\u0e01\u0e44\u0e27\u0e49",
    lbl_my_prompt: "Prompt \u0e20\u0e32\u0e29\u0e32\u0e1e\u0e21\u0e48\u0e32",
    lstage_model: "\u0e41\u0e1a\u0e1a",
    lstage_cam: "\u0e01\u0e25\u0e49\u0e2d\u0e07",
    l_key: "\u0e44\u0e1f\u0e2b\u0e25\u0e31\u0e01",
    l_fill: "\u0e44\u0e1f\u0e40\u0e2a\u0e23\u0e34\u0e21 / \u0e14\u0e49\u0e32\u0e19\u0e2b\u0e19\u0e49\u0e32",
    l_butterfly: "\u0e1a\u0e31\u0e15\u0e40\u0e15\u0e2d\u0e23\u0e4c\u0e1f\u0e25\u0e32\u0e22 (\u0e1a\u0e19-\u0e2b\u0e19\u0e49\u0e32)",
    l_side: "\u0e44\u0e1f\u0e14\u0e49\u0e32\u0e19\u0e02\u0e49\u0e32\u0e07",
    l_rim: "\u0e44\u0e1f\u0e02\u0e2d\u0e1a",
    l_back: "\u0e44\u0e1f\u0e14\u0e49\u0e32\u0e19\u0e2b\u0e25\u0e31\u0e07",
    l_hair: "\u0e44\u0e1f\u0e2a\u0e48\u0e2d\u0e07\u0e1c\u0e21",
    l_bglight: "\u0e44\u0e1f\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07",
    lt_softbox: "\u0e0b\u0e2d\u0e1f\u0e15\u0e4c\u0e1a\u0e47\u0e2d\u0e01\u0e0b\u0e4c",
    lt_octa: "\u0e2d\u0e2d\u0e04\u0e15\u0e32",
    lt_strip: "\u0e2a\u0e15\u0e23\u0e34\u0e1b",
    lt_umbrella: "\u0e23\u0e48\u0e21",
    lt_beauty: "\u0e1a\u0e34\u0e27\u0e15\u0e35\u0e49",
    lt_hard: "\u0e44\u0e1f\u0e41\u0e02\u0e47\u0e07",
    li_int: "\u0e04\u0e27\u0e32\u0e21\u0e40\u0e02\u0e49\u0e21",
    li_angle: "\u0e21\u0e38\u0e21",
    li_height: "\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e39\u0e07",
    li_dist: "\u0e23\u0e30\u0e22\u0e30\u0e2b\u0e48\u0e32\u0e07",
    li_size: "\u0e02\u0e19\u0e32\u0e14",
    btn_lightgen: "\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e41\u0e2a\u0e07",
    light_none: "\u0e40\u0e1b\u0e34\u0e14\u0e44\u0e1f\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e14\u0e27\u0e07\u0e01\u0e48\u0e2d\u0e19",
    lg_equip: "\u0e41\u0e2a\u0e14\u0e07\u0e2d\u0e38\u0e1b\u0e01\u0e23\u0e13\u0e4c\u0e44\u0e1f\u0e43\u0e19\u0e20\u0e32\u0e1e (\u0e40\u0e2b\u0e47\u0e19\u0e0b\u0e2d\u0e1f\u0e15\u0e4c\u0e1a\u0e47\u0e2d\u0e01\u0e0b\u0e4c / \u0e02\u0e32\u0e15\u0e31\u0e49\u0e07)",
    grp_chains: "\u0e40\u0e0a\u0e19\u0e2a\u0e44\u0e15\u0e25\u0e4c \u2014 \u0e1c\u0e2a\u0e21 \u2713 \u0e2a\u0e44\u0e15\u0e25\u0e4c",
    chains_note: "\u0e40\u0e1b\u0e34\u0e14\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e43\u0e14\u0e01\u0e47\u0e44\u0e14\u0e49 \u2014 \u0e08\u0e30\u0e1c\u0e2a\u0e21\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a\u0e17\u0e38\u0e01 Generate / preset / Retouch \u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e01\u0e31\u0e19",
    grp_restore: "\u0e01\u0e39\u0e49\u0e20\u0e32\u0e1e\u0e40\u0e01\u0e48\u0e32",
    p_restore: "\u0e01\u0e39\u0e49\u0e20\u0e32\u0e1e\u0e40\u0e01\u0e48\u0e32",
    rest_color: "\u0e2a\u0e35\u0e40\u0e15\u0e47\u0e21",
    rest_bw: "\u0e02\u0e32\u0e27-\u0e14\u0e33",
    restore_note: "\u0e0b\u0e48\u0e2d\u0e21\u0e23\u0e2d\u0e22\u0e09\u0e35\u0e01 \u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22\u0e08\u0e32\u0e01\u0e19\u0e49\u0e33 / \u0e44\u0e1f \u0e41\u0e25\u0e30\u0e2a\u0e35\u0e0b\u0e35\u0e14 \u2014 \u0e23\u0e31\u0e01\u0e29\u0e32\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e14\u0e34\u0e21\u0e17\u0e38\u0e01\u0e04\u0e19\u0e43\u0e2b\u0e49\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e40\u0e14\u0e34\u0e21 100%",
    rt_browstyle: "\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e04\u0e34\u0e49\u0e27",
    rt_lashstyle: "\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e02\u0e19\u0e15\u0e32",
    rt_blush: "\u0e2a\u0e35\u0e1a\u0e25\u0e31\u0e0a",
    rt_contour: "\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e04\u0e2d\u0e19\u0e17\u0e31\u0e27\u0e23\u0e4c",
    rt_bust: "\u0e2b\u0e19\u0e49\u0e32\u0e2d\u0e01",
    rt_butt: "\u0e2a\u0e30\u0e42\u0e1e\u0e01",
    rt_thigh: "\u0e15\u0e49\u0e19\u0e02\u0e32",
    rt_calf: "\u0e19\u0e48\u0e2d\u0e07",
    rt_neck: "\u0e04\u0e2d",
    rt_fingers: "\u0e19\u0e34\u0e49\u0e27\u0e21\u0e37\u0e2d",
    hint_prompt_my: "\u0e40\u0e02\u0e35\u0e22\u0e19\u0e20\u0e32\u0e29\u0e32\u0e44\u0e17\u0e22\u0e44\u0e14\u0e49\u0e40\u0e25\u0e22 \u2014 \u0e15\u0e2d\u0e19 Generate \u0e23\u0e30\u0e1a\u0e1a\u0e08\u0e30\u0e41\u0e1b\u0e25\u0e40\u0e1b\u0e47\u0e19\u0e2d\u0e31\u0e07\u0e01\u0e24\u0e29\u0e43\u0e2b\u0e49\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34 (\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14 20,000)",
    st_translate: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e41\u0e1b\u0e25\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e1e\u0e21\u0e48\u0e32\u0e40\u0e1b\u0e47\u0e19\u0e2d\u0e31\u0e07\u0e01\u0e24\u0e29",
    live_trans: "\u0e41\u0e1b\u0e25\u0e2a\u0e14 (EN \u21c4 MY)",
    st_retry: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e25\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48",
    grp_recipes: "\u0e2a\u0e39\u0e15\u0e23 \u2014 \u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01 / \u0e41\u0e0a\u0e23\u0e4c\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32",
    recipe_note: "\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e17\u0e38\u0e01\u0e2d\u0e22\u0e48\u0e32\u0e07 (chains, retouch, \u0e44\u0e1f, \u0e25\u0e47\u0e2d\u0e01, prompt) \u0e40\u0e1b\u0e47\u0e19\u0e44\u0e1f\u0e25\u0e4c .json \u0e40\u0e14\u0e35\u0e22\u0e27 \u2014 \u0e19\u0e31\u0e01\u0e40\u0e23\u0e35\u0e22\u0e19\u0e41\u0e04\u0e48\u0e01\u0e14 Load",
    btn_recipe_save: "\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e2a\u0e39\u0e15\u0e23",
    btn_recipe_load: "\u0e42\u0e2b\u0e25\u0e14\u0e2a\u0e39\u0e15\u0e23",
    st_recipe_saved: "\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e2a\u0e39\u0e15\u0e23\u0e41\u0e25\u0e49\u0e27 \u2713",
    st_recipe_loaded: "\u0e42\u0e2b\u0e25\u0e14\u0e2a\u0e39\u0e15\u0e23\u0e41\u0e25\u0e49\u0e27 \u2713 \u2014 \u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15\u0e17\u0e38\u0e01\u0e15\u0e31\u0e27\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21",
    st_recipe_bad: "\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e44\u0e1f\u0e25\u0e4c\u0e2a\u0e39\u0e15\u0e23 HNK",
    sec_final: "\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e2a\u0e38\u0e14\u0e17\u0e49\u0e32\u0e22",
    btn_copy: "\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01",
    st_copied: "\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e41\u0e25\u0e49\u0e27 \u2713",
    hist_note: "\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34 \u2014 6 \u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14 \u0e41\u0e15\u0e30\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e14\u0e39:",
    btn_hist_prompt: "\u2192 \u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c",
    sec_batch: "\u0e42\u0e2b\u0e21\u0e14\u0e41\u0e1a\u0e15\u0e0a\u0e4c",
    batch_note: "\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e2b\u0e25\u0e32\u0e22\u0e20\u0e32\u0e1e + \u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e1b\u0e25\u0e32\u0e22\u0e17\u0e32\u0e07 \u2014 prompt, chains, cleanup \u0e41\u0e25\u0e30\u0e25\u0e47\u0e2d\u0e01 Keep \u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19\u0e08\u0e30\u0e23\u0e31\u0e19\u0e01\u0e31\u0e1a\u0e17\u0e38\u0e01\u0e20\u0e32\u0e1e \u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e40\u0e1b\u0e47\u0e19 *_HNK.png",
    btn_batch: "\u0e23\u0e31\u0e19\u0e41\u0e1a\u0e15\u0e0a\u0e4c",
    btn_batch_stop: "\u0e2b\u0e22\u0e38\u0e14",
    st_batch: "\u0e41\u0e1a\u0e15\u0e0a\u0e4c",
    st_batch_done: "\u0e41\u0e1a\u0e15\u0e0a\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08",
    sec_web: "Web AI \u2014 \u0e40\u0e1a\u0e23\u0e32\u0e27\u0e4c\u0e40\u0e0b\u0e2d\u0e23\u0e4c\u0e22\u0e48\u0e2d",
    web_note: "\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e27\u0e47\u0e1a AI editor \u0e43\u0e14\u0e01\u0e47\u0e44\u0e14\u0e49\u0e20\u0e32\u0e22\u0e43\u0e19 Photoshop \u0e2a\u0e23\u0e49\u0e32\u0e07\u0e07\u0e32\u0e19\u0e17\u0e35\u0e48\u0e19\u0e31\u0e48\u0e19 \u0e41\u0e25\u0e49\u0e27\u0e14\u0e36\u0e07\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e40\u0e02\u0e49\u0e32\u0e21\u0e32\u0e40\u0e1b\u0e47\u0e19 layer:",
    web_import_note: "\u0e19\u0e33\u0e40\u0e02\u0e49\u0e32: \u2460 \u0e43\u0e19\u0e40\u0e27\u0e47\u0e1a\u0e41\u0e2d\u0e1b\u0e43\u0e2b\u0e49\u0e43\u0e0a\u0e49 Copy image address \u0e41\u0e25\u0e49\u0e27\u0e01\u0e14 IMPORT COPIED LINK \u00b7 \u2461 \u0e2b\u0e23\u0e37\u0e2d\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e42\u0e2b\u0e25\u0e14\u0e44\u0e1f\u0e25\u0e4c\u0e41\u0e25\u0e49\u0e27\u0e43\u0e0a\u0e49 IMPORT FILE \u00b7 \u2462 \u0e40\u0e27\u0e47\u0e1a\u0e41\u0e2d\u0e1b\u0e1e\u0e32\u0e23\u0e4c\u0e15\u0e40\u0e19\u0e2d\u0e23\u0e4c\u0e17\u0e35\u0e48\u0e21\u0e35 HNK bridge \u0e08\u0e30\u0e2a\u0e48\u0e07\u0e20\u0e32\u0e1e\u0e40\u0e02\u0e49\u0e32\u0e21\u0e32\u0e43\u0e2b\u0e49\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34",
    btn_web_go: "\u0e44\u0e1b",
    btn_web_home: "\u0e2b\u0e19\u0e49\u0e32\u0e41\u0e23\u0e01",
    btn_web_reload: "\u0e42\u0e2b\u0e25\u0e14\u0e43\u0e2b\u0e21\u0e48",
    btn_web_import_link: "\u0e19\u0e33\u0e40\u0e02\u0e49\u0e32\u0e25\u0e34\u0e07\u0e01\u0e4c\u0e17\u0e35\u0e48\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01 \u2192 PS",
    btn_web_import_file: "\u0e19\u0e33\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1f\u0e25\u0e4c \u2192 PS",
    st_web_import: "\u0e19\u0e33\u0e40\u0e02\u0e49\u0e32\u0e2a\u0e39\u0e48 Photoshop \u0e40\u0e1b\u0e47\u0e19\u0e40\u0e25\u0e40\u0e22\u0e2d\u0e23\u0e4c\u0e41\u0e25\u0e49\u0e27 \u2713",
    st_web_nourl: "\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e25\u0e34\u0e07\u0e01\u0e4c\u0e20\u0e32\u0e1e\u0e01\u0e48\u0e2d\u0e19 (\u0e04\u0e25\u0e34\u0e01\u0e02\u0e27\u0e32 \u2192 \u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e20\u0e32\u0e1e)",
    st_web_fetch: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e14\u0e36\u0e07\u0e20\u0e32\u0e1e\u0e08\u0e32\u0e01\u0e25\u0e34\u0e07\u0e01\u0e4c",
    st_web_notallowed: "\u0e42\u0e14\u0e40\u0e21\u0e19\u0e19\u0e35\u0e49\u0e44\u0e21\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15 \u2014 \u0e2d\u0e32\u0e08\u0e41\u0e2a\u0e14\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e2b\u0e19\u0e49\u0e32\u0e27\u0e48\u0e32\u0e07 \u0e41\u0e08\u0e49\u0e07 HNK \u0e43\u0e2b\u0e49\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e44\u0e14\u0e49",
    st_need_doc: "\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e20\u0e32\u0e1e\u0e43\u0e19 Photoshop \u0e01\u0e48\u0e2d\u0e19",
    sec_campro: "\u0e01\u0e25\u0e49\u0e2d\u0e07\u0e42\u0e1b\u0e23 & \u0e04\u0e38\u0e13\u0e20\u0e32\u0e1e",
    autosave_lbl: "\u0e2a\u0e48\u0e07\u0e2d\u0e2d\u0e01\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34\u0e17\u0e38\u0e01\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c (PNG + \u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c \u2192 \u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c)",
    st_folder_ok: "\u0e15\u0e31\u0e49\u0e07\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e2a\u0e48\u0e07\u0e2d\u0e2d\u0e01\u0e41\u0e25\u0e49\u0e27 \u2713",
    st_exported: "\u0e2a\u0e48\u0e07\u0e2d\u0e2d\u0e01\u0e41\u0e25\u0e49\u0e27 \u2713",
    st_export_fail: "\u0e2a\u0e48\u0e07\u0e2d\u0e2d\u0e01\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 \u2014 \u0e15\u0e23\u0e27\u0e08\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c",
    st_pro_fallback: "\u0e42\u0e21\u0e40\u0e14\u0e25 Pro \u0e44\u0e21\u0e48\u0e1e\u0e23\u0e49\u0e2d\u0e21 \u2014 \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19 Flash \u0e23\u0e2d\u0e1a\u0e19\u0e35\u0e49",
    st_img_bad: "\u0e02\u0e49\u0e2d\u0e21\u0e39\u0e25\u0e20\u0e32\u0e1e\u0e44\u0e21\u0e48\u0e1c\u0e48\u0e32\u0e19\u0e01\u0e32\u0e23\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a \u2014 \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e20\u0e32\u0e1e\u0e43\u0e2b\u0e21\u0e48",
    st_auto_comp: "\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34: \u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a IMAGE 1 \u2192 \u0e09\u0e32\u0e01\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07",
    prov_lbl: "\u0e1c\u0e39\u0e49\u0e43\u0e2b\u0e49\u0e1a\u0e23\u0e34\u0e01\u0e32\u0e23 AI",
    oai_key_ph: "sk-... (OpenAI API key)",
    tab_create: "\u0e2a\u0e23\u0e49\u0e32\u0e07",
    create_note: "\u0e42\u0e2b\u0e21\u0e14 CREATE \u2014 \u0e20\u0e32\u0e1e\u0e43\u0e2b\u0e21\u0e48\u0e08\u0e32\u0e01\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c (\u0e21\u0e35 ref \u0e02\u0e2d\u0e07\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07 4 \u0e23\u0e39\u0e1b)",
    create_ph: "\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e20\u0e32\u0e1e\u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e2a\u0e23\u0e49\u0e32\u0e07\u2026",
    btn_create_ps: "\u2b07 \u0e2a\u0e48\u0e07\u0e44\u0e1b Photoshop",
    btn_to_ref: "\u21ba \u0e43\u0e0a\u0e49\u0e40\u0e1b\u0e47\u0e19 Ref 1",
    st_to_ref: "\u0e42\u0e2b\u0e25\u0e14\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e25\u0e07 Ref 1 \u0e41\u0e25\u0e49\u0e27 \u2713",
    scope_create_note: "\u0e41\u0e22\u0e01\u0e08\u0e32\u0e01 Model & Output \u0e02\u0e2d\u0e07 Setup \u2014 \u0e04\u0e48\u0e32\u0e40\u0e2b\u0e25\u0e48\u0e32\u0e19\u0e35\u0e49\u0e43\u0e0a\u0e49\u0e01\u0e31\u0e1a Generate \u0e02\u0e2d\u0e07 Create \u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19",
    cr_ratio: "\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e2a\u0e48\u0e27\u0e19",
    cr_var: "\u0e08\u0e33\u0e19\u0e27\u0e19\u0e41\u0e1a\u0e1a",
    cr_restyle: "\u267b \u0e23\u0e35\u0e2a\u0e44\u0e15\u0e25\u0e4c",
    cr_lib: "\u0e04\u0e25\u0e31\u0e07\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c \u2014 \u0e41\u0e15\u0e30\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e41\u0e17\u0e23\u0e01",
    cr_improve: "\u2728 \u0e1b\u0e23\u0e31\u0e1a\u0e1b\u0e23\u0e38\u0e07",
    cr_describe: "\ud83d\udd0d \u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22 Ref 1 \u2192 \u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c",
    st_describing: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e2d\u0e48\u0e32\u0e19\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07\u2026",
    st_described: "\u0e40\u0e02\u0e35\u0e22\u0e19\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e08\u0e32\u0e01 Ref 1 \u0e41\u0e25\u0e49\u0e27 \u2713",
    st_need_gem: "\u0e40\u0e1e\u0e34\u0e48\u0e21 Gemini API key (\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32) \u2014 \u0e43\u0e0a\u0e49 Gemini \u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21",
    st_need_ref1: "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e20\u0e32\u0e1e\u0e25\u0e07 Ref 1 \u0e01\u0e48\u0e2d\u0e19",
    st_lib_added: "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e41\u0e25\u0e49\u0e27 \u2713",
    cr_refs: "\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07 (\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14 4)",
    cr_refs_note: "\u0e44\u0e21\u0e48\u0e1a\u0e31\u0e07\u0e04\u0e31\u0e1a \u2014 \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e14\u0e49\u0e27\u0e22 Layer / File / Web \u0e2a\u0e48\u0e27\u0e19 Create \u0e08\u0e30\u0e14\u0e36\u0e07\u0e21\u0e32\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e2a\u0e34\u0e48\u0e07\u0e17\u0e35\u0e48 prompt \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e23\u0e30\u0e1a\u0e38",
    cr_results: "\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c",
    cr_gal_empty: "\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c \u2014 \u0e41\u0e15\u0e30\u0e2a\u0e23\u0e49\u0e32\u0e07",
    cr_gal_have: "\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c \u00b7 \u0e41\u0e15\u0e30\u0e23\u0e39\u0e1b\u0e22\u0e48\u0e2d\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e14\u0e39 / \u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23",
    cr_save: "\u2b07 \u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01 PNG",
    cr_engine: "\u0e40\u0e2d\u0e19\u0e08\u0e34\u0e19",
    cr_need_result: "\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e20\u0e32\u0e1e\u0e01\u0e48\u0e2d\u0e19",
    btn_web_import_url: "\u2b07 \u0e19\u0e33\u0e40\u0e02\u0e49\u0e32 URL",
    st_clip_help: "\u0e04\u0e25\u0e34\u0e1b\u0e1a\u0e2d\u0e23\u0e4c\u0e14\u0e27\u0e48\u0e32\u0e07\u0e2b\u0e23\u0e37\u0e2d\u0e16\u0e39\u0e01\u0e1a\u0e25\u0e47\u0e2d\u0e01 \u2014 \u0e27\u0e32\u0e07\u0e25\u0e34\u0e07\u0e01\u0e4c\u0e25\u0e07\u0e43\u0e19\u0e0a\u0e48\u0e2d\u0e07 URL \u0e41\u0e25\u0e49\u0e27\u0e01\u0e14 \u2b07 Import URL",
    st_web_blob: "\u0e19\u0e31\u0e48\u0e19\u0e40\u0e1b\u0e47\u0e19\u0e25\u0e34\u0e07\u0e01\u0e4c blob: \u0e0a\u0e31\u0e48\u0e27\u0e04\u0e23\u0e32\u0e27 \u2014 \u0e43\u0e0a\u0e49\u0e04\u0e25\u0e34\u0e01\u0e02\u0e27\u0e32 \u2192 Copy IMAGE Address \u0e2b\u0e23\u0e37\u0e2d\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e44\u0e1f\u0e25\u0e4c\u0e41\u0e25\u0e49\u0e27\u0e43\u0e0a\u0e49 Import File",
    err_key: "API key \u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e15\u0e49\u0e2d\u0e07 \u2014 \u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e04\u0e35\u0e22\u0e4c\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07\u0e43\u0e19\u0e41\u0e17\u0e47\u0e1a Setup",
    err_quota: "\u0e42\u0e04\u0e27\u0e15\u0e32 / \u0e16\u0e39\u0e01\u0e08\u0e33\u0e01\u0e31\u0e14\u0e2d\u0e31\u0e15\u0e23\u0e32\u0e40\u0e23\u0e35\u0e22\u0e01\u0e43\u0e0a\u0e49 \u2014 \u0e23\u0e2d\u0e2a\u0e31\u0e01\u0e04\u0e23\u0e39\u0e48\u0e41\u0e25\u0e49\u0e27\u0e25\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48",
    err_big: "\u0e20\u0e32\u0e1e\u0e43\u0e2b\u0e0d\u0e48\u0e40\u0e01\u0e34\u0e19\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a API \u2014 \u0e22\u0e48\u0e2d\u0e02\u0e19\u0e32\u0e14\u0e41\u0e25\u0e49\u0e27\u0e25\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48",
    err_safety: "\u0e16\u0e39\u0e01\u0e1a\u0e25\u0e47\u0e2d\u0e01\u0e42\u0e14\u0e22\u0e15\u0e31\u0e27\u0e01\u0e23\u0e2d\u0e07\u0e04\u0e27\u0e32\u0e21\u0e1b\u0e25\u0e2d\u0e14\u0e20\u0e31\u0e22 \u2014 \u0e1b\u0e23\u0e31\u0e1a prompt \u0e2b\u0e23\u0e37\u0e2d\u0e20\u0e32\u0e1e\u0e41\u0e25\u0e49\u0e27\u0e25\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48",
    err_net: "\u0e1b\u0e31\u0e0d\u0e2b\u0e32\u0e40\u0e04\u0e23\u0e37\u0e2d\u0e02\u0e48\u0e32\u0e22 / \u0e40\u0e0b\u0e34\u0e23\u0e4c\u0e1f\u0e40\u0e27\u0e2d\u0e23\u0e4c \u2014 \u0e01\u0e23\u0e38\u0e13\u0e32\u0e25\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48",
    err_timeout: "\u0e04\u0e33\u0e02\u0e2d\u0e2b\u0e21\u0e14\u0e40\u0e27\u0e25\u0e32 \u2014 \u0e40\u0e0b\u0e34\u0e23\u0e4c\u0e1f\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e43\u0e0a\u0e49\u0e40\u0e27\u0e25\u0e32\u0e19\u0e32\u0e19\u0e40\u0e01\u0e34\u0e19\u0e44\u0e1b \u0e01\u0e23\u0e38\u0e13\u0e32\u0e25\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48",
    err_generic: "\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23\u0e15\u0e32\u0e21\u0e04\u0e33\u0e02\u0e2d\u0e44\u0e14\u0e49 \u2014 \u0e42\u0e1b\u0e23\u0e14\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07",
    err_img: "\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e20\u0e32\u0e1e\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49 \u2014 \u0e42\u0e1b\u0e23\u0e14\u0e25\u0e2d\u0e07\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07",
    err_mode: "\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e19\u0e35\u0e49\u0e44\u0e21\u0e48\u0e43\u0e0a\u0e48\u0e42\u0e2b\u0e21\u0e14 RGB \u2014 \u0e41\u0e1b\u0e25\u0e07\u0e01\u0e48\u0e2d\u0e19 (Image \u25b8 Mode \u25b8 RGB Color) \u0e41\u0e25\u0e49\u0e27\u0e25\u0e2d\u0e07\u0e43\u0e2b\u0e21\u0e48",
    cam_master: "\u0e1a\u0e25\u0e47\u0e2d\u0e01\u0e01\u0e25\u0e49\u0e2d\u0e07\u0e40\u0e1b\u0e34\u0e14 \u2014 \u0e15\u0e48\u0e2d\u0e17\u0e49\u0e32\u0e22\u0e17\u0e38\u0e01\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c",
    cam_body: "\u0e1a\u0e2d\u0e14\u0e35\u0e49\u0e01\u0e25\u0e49\u0e2d\u0e07",
    cam_lens: "\u0e40\u0e25\u0e19\u0e2a\u0e4c\u0e44\u0e1e\u0e23\u0e21\u0e4c (mm)",
    cam_f: "\u0e23\u0e39\u0e23\u0e31\u0e1a\u0e41\u0e2a\u0e07",
    cam_film: "\u0e25\u0e38\u0e04\u0e1f\u0e34\u0e25\u0e4c\u0e21",
    cam_bokeh: "\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e42\u0e1a\u0e40\u0e01\u0e49",
    cam_iso: "ISO",
    cam_k: "WB \u0e40\u0e04\u0e25\u0e27\u0e34\u0e19",
    cam_note: "\u0e40\u0e1b\u0e34\u0e14\u0e1a\u0e25\u0e47\u0e2d\u0e01\u0e01\u0e48\u0e2d\u0e19 \u0e41\u0e25\u0e49\u0e27\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 \u2014 \u0e0a\u0e34\u0e1b \u2013 \u0e08\u0e30\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e43\u0e2a\u0e48 \u0e17\u0e38\u0e01\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e08\u0e30\u0e44\u0e1b\u0e15\u0e48\u0e2d\u0e17\u0e49\u0e32\u0e22 prompt \u0e2a\u0e38\u0e14\u0e17\u0e49\u0e32\u0e22",
    ro_h_main: "REFERENCE OPS PRO (Ref1 / Ref2)",
    ro_note: "Ref1 = IMAGE 2 (\u0e1c\u0e39\u0e49\u0e2b\u0e0d\u0e34\u0e07) \u00b7 Ref2 = IMAGE 3 (\u0e1c\u0e39\u0e49\u0e0a\u0e32\u0e22) \u0e40\u0e25\u0e37\u0e2d\u0e01\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22\u0e01\u0e48\u0e2d\u0e19 \u0e41\u0e25\u0e49\u0e27\u0e08\u0e36\u0e07\u0e23\u0e31\u0e19 \u2014 \u0e04\u0e19\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e15\u0e23\u0e07\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22\u0e08\u0e30\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19",
    ro_target: "\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22",
    ro_solo: "\u0e40\u0e14\u0e35\u0e48\u0e22\u0e27",
    ro_couple: "\u0e04\u0e39\u0e48",
    ro_family: "\u0e04\u0e23\u0e2d\u0e1a\u0e04\u0e23\u0e31\u0e27",
    ro_mk: "\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e40\u0e21\u0e04\u0e2d\u0e31\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07",
    ro_hair: "\u0e40\u0e2d\u0e32\u0e17\u0e23\u0e07\u0e1c\u0e21\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07",
    ro_h_face: "\u0e07\u0e32\u0e19\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32",
    ro_h_bg: "\u0e07\u0e32\u0e19 BG / FG",
    ro_h_sub: "\u0e07\u0e32\u0e19\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a",
    ro_h_lc: "\u0e07\u0e32\u0e19\u0e41\u0e2a\u0e07 & \u0e2a\u0e35",
    ro_h_dress: "\u0e07\u0e32\u0e19\u0e0a\u0e38\u0e14",
    ro_h_mk: "\u0e07\u0e32\u0e19\u0e40\u0e21\u0e04\u0e2d\u0e31\u0e1e",
    ro_h_match: "\u2605 \u0e08\u0e31\u0e1a\u0e04\u0e39\u0e48\u0e2b\u0e25\u0e31\u0e01 (\u0e25\u0e38\u0e04\u0e40\u0e14\u0e35\u0e22\u0e27)",
    ro_match_note: "\u0e1b\u0e23\u0e31\u0e1a IMAGE 1 \u0e43\u0e2b\u0e49\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a reference \u0e08\u0e19\u0e14\u0e39\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e41\u0e01\u0e49\u0e21\u0e32\u0e0a\u0e38\u0e14\u0e40\u0e14\u0e35\u0e22\u0e27\u0e01\u0e31\u0e19 \u2014 \u0e15\u0e34\u0e4a\u0e01\u0e2a\u0e34\u0e48\u0e07\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e43\u0e2b\u0e49\u0e15\u0e23\u0e07\u0e01\u0e31\u0e19:",
    m_color: "\u0e2a\u0e35",
    m_light: "\u0e41\u0e2a\u0e07",
    m_makeup: "\u0e40\u0e21\u0e04\u0e2d\u0e31\u0e1e",
    m_skin: "\u0e23\u0e35\u0e17\u0e31\u0e0a\u0e1c\u0e34\u0e27",
    crd_pipe: "\u26d3 \u0e15\u0e31\u0e27\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e44\u0e1b\u0e1b\u0e4c\u0e44\u0e25\u0e19\u0e4c \u2014 \u0e40\u0e0a\u0e19\u0e44\u0e14\u0e49\u0e17\u0e38\u0e01\u0e2d\u0e22\u0e48\u0e32\u0e07",
    pipe_note: "\u0e15\u0e48\u0e2d\u0e02\u0e31\u0e49\u0e19\u0e15\u0e2d\u0e19\u0e43\u0e14\u0e01\u0e47\u0e44\u0e14\u0e49\u0e40\u0e02\u0e49\u0e32\u0e40\u0e1b\u0e47\u0e19\u0e2a\u0e32\u0e22\u0e40\u0e14\u0e35\u0e22\u0e27 \u2014 \u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e02\u0e2d\u0e07\u0e41\u0e15\u0e48\u0e25\u0e30\u0e02\u0e31\u0e49\u0e19\u0e08\u0e30\u0e2a\u0e48\u0e07\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e02\u0e31\u0e49\u0e19\u0e16\u0e31\u0e14\u0e44\u0e1b \u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14 6 \u0e02\u0e31\u0e49\u0e19",
    pipe_add: "+ \u0e40\u0e1e\u0e34\u0e48\u0e21",
    pipe_run: "\u25b6 \u0e23\u0e31\u0e19\u0e44\u0e1b\u0e1b\u0e4c\u0e44\u0e25\u0e19\u0e4c",
    pipe_clear: "\u0e25\u0e49\u0e32\u0e07",
    pipe_retouch: "\u0e43\u0e0a\u0e49\u0e23\u0e35\u0e17\u0e31\u0e0a (\u0e2a\u0e44\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19)",
    pipe_relight: "\u0e08\u0e31\u0e14\u0e41\u0e2a\u0e07\u0e43\u0e2b\u0e21\u0e48 (\u0e23\u0e34\u0e01\u0e44\u0e1f\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19)",
    pipe_prompt: "\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c (\u0e0a\u0e48\u0e2d\u0e07 EN \u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19)",
    pipe_empty: "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e02\u0e31\u0e49\u0e19\u0e01\u0e48\u0e2d\u0e19",
    pipe_max: "\u0e44\u0e1b\u0e1b\u0e4c\u0e44\u0e25\u0e19\u0e4c\u0e40\u0e15\u0e47\u0e21 (\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14 6 \u0e02\u0e31\u0e49\u0e19)",
    st_pipe: "\u0e02\u0e31\u0e49\u0e19\u0e44\u0e1b\u0e1b\u0e4c\u0e44\u0e25\u0e19\u0e4c",
    st_pipe_done: "\u0e44\u0e1b\u0e1b\u0e4c\u0e44\u0e25\u0e19\u0e4c\u0e40\u0e2a\u0e23\u0e47\u0e08",
    st_pipe_stop: "\u0e44\u0e1b\u0e1b\u0e4c\u0e44\u0e25\u0e19\u0e4c\u0e2b\u0e22\u0e38\u0e14 (\u0e02\u0e31\u0e49\u0e19\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27)",
    pipe_merge: "\u26a1 \u0e23\u0e27\u0e21\u0e22\u0e34\u0e07\u0e04\u0e23\u0e31\u0e49\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27 \u2014 \u0e17\u0e38\u0e01\u0e02\u0e31\u0e49\u0e19\u0e43\u0e19\u0e01\u0e32\u0e23\u0e40\u0e23\u0e35\u0e22\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27 (\u0e40\u0e23\u0e47\u0e27/\u0e1b\u0e23\u0e30\u0e2b\u0e22\u0e31\u0e14 \u00b7 \u0e40\u0e2b\u0e21\u0e32\u0e30\u0e01\u0e31\u0e1a \u2264 3 \u0e07\u0e32\u0e19)",
    crd_chainsrest: "\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e40\u0e0a\u0e19 + \u0e01\u0e39\u0e49\u0e20\u0e32\u0e1e\u0e40\u0e01\u0e48\u0e32",
    crd_refops: "Reference Ops Pro (Ref1 / Ref2)",
    crd_scenes: "\ud83c\udfac Scenes Pro \u2014 \u0e25\u0e47\u0e2d\u0e04\u0e0b\u0e31\u0e1a\u0e40\u0e08\u0e01\u0e15\u0e4c \u00b7 \u0e0b\u0e35\u0e19\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e19",
    scn_note: "\u0e25\u0e47\u0e2d\u0e04\u0e0b\u0e31\u0e1a\u0e40\u0e08\u0e01\u0e15\u0e4c (\u0e2b\u0e19\u0e49\u0e32 \u00b7 \u0e17\u0e48\u0e32\u0e42\u0e1e\u0e2a \u00b7 \u0e0a\u0e38\u0e14 \u00b7 \u0e40\u0e1f\u0e23\u0e21) \u0e41\u0e25\u0e49\u0e27\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e0b\u0e35\u0e19\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e43\u0e2b\u0e49\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a\u0e0b\u0e31\u0e1a\u0e40\u0e08\u0e01\u0e15\u0e4c \u2014 \u0e41\u0e2a\u0e07 \u0e40\u0e07\u0e32 \u0e2a\u0e35 \u0e09\u0e32\u0e01\u0e2b\u0e25\u0e31\u0e07 \u0e09\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32 \u0e27\u0e31\u0e15\u0e16\u0e38 \u0e1b\u0e23\u0e31\u0e1a\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34",
    scn_h_style: "\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e0b\u0e35\u0e19 (\u0e43\u0e19\u0e23\u0e48\u0e21 / \u0e27\u0e31\u0e12\u0e19\u0e18\u0e23\u0e23\u0e21)",
    scn_h_bday: "\ud83c\udf82 \u0e27\u0e31\u0e19\u0e40\u0e01\u0e34\u0e14 \u2014 \u0e2d\u0e32\u0e22\u0e38 1\u201345",
    scn_h_cap: "\u0e41\u0e04\u0e1b\u0e0a\u0e31\u0e19 / \u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21",
    scn_h_scarf: "\u0e01\u0e25\u0e32\u0e07\u0e41\u0e08\u0e49\u0e07 / \u0e1c\u0e49\u0e32\u0e1e\u0e31\u0e19\u0e04\u0e2d\u0e1b\u0e25\u0e34\u0e27",
    scn_grad: "\u0e23\u0e31\u0e1a\u0e1b\u0e23\u0e34\u0e0d\u0e0d\u0e32 (\u0e43\u0e19\u0e23\u0e48\u0e21)",
    scn_prewed: "\u0e1e\u0e23\u0e35\u0e40\u0e27\u0e14\u0e14\u0e34\u0e49\u0e07 (\u0e43\u0e19\u0e23\u0e48\u0e21)",
    scn_vietnam: "\u0e40\u0e27\u0e35\u0e22\u0e14\u0e19\u0e32\u0e21",
    scn_myanmar: "\u0e40\u0e21\u0e35\u0e22\u0e19\u0e21\u0e32",
    scn_chinese: "\u0e08\u0e35\u0e19",
    scn_shan: "\u0e44\u0e17\u0e43\u0e2b\u0e0d\u0e48",
    scn_newborn: "\u0e17\u0e32\u0e23\u0e01\u0e41\u0e23\u0e01\u0e40\u0e01\u0e34\u0e14",
    scn_age: "\u0e2d\u0e32\u0e22\u0e38",
    scn_bday_go: "\ud83c\udf82 \u0e09\u0e32\u0e01\u0e27\u0e31\u0e19\u0e40\u0e01\u0e34\u0e14",
    scn_cap_on: "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e41\u0e04\u0e1b\u0e0a\u0e31\u0e19",
    scn_cap_ph: "\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e41\u0e04\u0e1b\u0e0a\u0e31\u0e19 (\u0e40\u0e0a\u0e48\u0e19 Happy 1st Birthday, \u0e0a\u0e37\u0e48\u0e2d)\u2026",
    scn_cap_pos: "\u0e15\u0e33\u0e41\u0e2b\u0e19\u0e48\u0e07",
    scn_top: "\u0e1a\u0e19",
    scn_bottom: "\u0e25\u0e48\u0e32\u0e07",
    scn_scarf: "\u2726 \u0e09\u0e32\u0e01\u0e1c\u0e49\u0e32\u0e1e\u0e31\u0e19\u0e04\u0e2d\u0e1b\u0e25\u0e34\u0e27",
    scn_dir: "\u0e17\u0e34\u0e28\u0e17\u0e32\u0e07",
    scn_left: "\u0e0b\u0e49\u0e32\u0e22",
    scn_right: "\u0e02\u0e27\u0e32",
    scn_up: "\u0e02\u0e36\u0e49\u0e19",
    scn_len: "\u0e04\u0e27\u0e32\u0e21\u0e22\u0e32\u0e27",
    scn_short: "\u0e2a\u0e31\u0e49\u0e19",
    scn_long: "\u0e22\u0e32\u0e27",
    g_cat_scene: "SCENE OP \u2014 \u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e16\u0e39\u0e01\u0e25\u0e47\u0e2d\u0e01 (\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32 \u00b7 \u0e17\u0e48\u0e32\u0e17\u0e32\u0e07 \u00b7 \u0e0a\u0e38\u0e14 \u00b7 \u0e40\u0e1f\u0e23\u0e21) \u0e2a\u0e48\u0e27\u0e19\u0e09\u0e32\u0e01\u0e17\u0e35\u0e48\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e02\u0e36\u0e49\u0e19\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 (\u0e41\u0e2a\u0e07 \u0e40\u0e07\u0e32 \u0e2a\u0e35 \u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07 \u0e09\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32 \u0e27\u0e31\u0e15\u0e16\u0e38 \u0e1a\u0e23\u0e23\u0e22\u0e32\u0e01\u0e32\u0e28) \u0e08\u0e30\u0e16\u0e39\u0e01\u0e1b\u0e23\u0e31\u0e1a\u0e43\u0e2b\u0e49\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34 \u0e43\u0e2b\u0e49\u0e44\u0e14\u0e49\u0e20\u0e32\u0e1e\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e17\u0e35\u0e48\u0e14\u0e39\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e16\u0e48\u0e32\u0e22\u0e08\u0e23\u0e34\u0e07",
    crd_wed: "\u2665 Wedding Pro Suite",
    crd_recipes: "\u0e2a\u0e39\u0e15\u0e23 \u2014 \u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01 / \u0e41\u0e0a\u0e23\u0e4c",
    learn_lbl: "\ud83c\udf93 \u0e42\u0e2b\u0e21\u0e14\u0e40\u0e23\u0e35\u0e22\u0e19\u0e23\u0e39\u0e49 \u2014 \u0e41\u0e15\u0e30 1=\u0e04\u0e39\u0e48\u0e21\u0e37\u0e2d (\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07), 2=\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c (\u0e19\u0e49\u0e33\u0e40\u0e07\u0e34\u0e19), 3=\u0e23\u0e31\u0e19 (\u0e40\u0e02\u0e35\u0e22\u0e27)",
    guide_hint: "\u0e41\u0e15\u0e30\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07: \u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07 \u2192 \u0e19\u0e49\u0e33\u0e40\u0e07\u0e34\u0e19 (\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c) \u2192 \u0e40\u0e02\u0e35\u0e22\u0e27 (\u0e23\u0e31\u0e19) \u25b6",
    g_learn_next_prompt: "\u0e41\u0e15\u0e30\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07 \u2192 \u0e41\u0e2a\u0e14\u0e07\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e17\u0e35\u0e48\u0e41\u0e19\u0e48\u0e19\u0e2d\u0e19 (\u0e19\u0e49\u0e33\u0e40\u0e07\u0e34\u0e19)",
    g_learn_prompt_head: "\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e17\u0e35\u0e48\u0e1b\u0e38\u0e48\u0e21\u0e19\u0e35\u0e49\u0e08\u0e30\u0e2a\u0e48\u0e07 (\u0e41\u0e15\u0e30\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07 = \u0e23\u0e31\u0e19):",
    g_learn_next_run: "\u0e41\u0e15\u0e30\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07 \u2192 \u0e23\u0e31\u0e19 (\u0e40\u0e02\u0e35\u0e22\u0e27) \u0e2a\u0e23\u0e49\u0e32\u0e07",
    st_prompt_ready: "\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e1e\u0e23\u0e49\u0e2d\u0e21 \u2014 \u0e41\u0e15\u0e30\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07 (\u0e40\u0e02\u0e35\u0e22\u0e27) \u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e23\u0e31\u0e19 \u2713",
    g_step_doc: "\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e20\u0e32\u0e1e\u0e43\u0e19 Photoshop \u0e01\u0e48\u0e2d\u0e19",
    g_step_ref1: "\u0e42\u0e2b\u0e25\u0e14\u0e20\u0e32\u0e1e reference \u0e25\u0e07\u0e43\u0e19 Ref1 (\u0e08\u0e30\u0e01\u0e25\u0e32\u0e22\u0e40\u0e1b\u0e47\u0e19 IMAGE 2) \u0e2b\u0e32\u0e01\u0e21\u0e35\u0e04\u0e19\u0e17\u0e35\u0e48\u0e2a\u0e2d\u0e07 \u0e43\u0e2b\u0e49\u0e40\u0e1e\u0e34\u0e48\u0e21 Ref2",
    g_step_target: "\u0e40\u0e25\u0e37\u0e2d\u0e01 Target: Solo / Couple (Ref1 = \u0e1c\u0e39\u0e49\u0e2b\u0e0d\u0e34\u0e07, Ref2 = \u0e1c\u0e39\u0e49\u0e0a\u0e32\u0e22) / Family",
    g_step_mkhair: "\u0e44\u0e21\u0e48\u0e1a\u0e31\u0e07\u0e04\u0e31\u0e1a: \u0e15\u0e34\u0e4a\u0e01 \u2018Copy ref makeup\u2019 / \u2018Take ref hairstyle\u2019 \u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e40\u0e2b\u0e19\u0e37\u0e2d Face Ops",
    g_step_petal: "\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e2a\u0e35\u0e01\u0e25\u0e35\u0e1a\u0e01\u0e48\u0e2d\u0e19 (\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34 = \u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a\u0e09\u0e32\u0e01)",
    g_step_rest: "\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e2a\u0e35\u0e40\u0e15\u0e47\u0e21\u0e2b\u0e23\u0e37\u0e2d\u0e02\u0e32\u0e27-\u0e14\u0e33\u0e14\u0e49\u0e27\u0e22 \u2713 \u0e02\u0e49\u0e32\u0e07\u0e1a\u0e19",
    g_step_int: "\u0e15\u0e31\u0e49\u0e07\u0e2a\u0e44\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e04\u0e27\u0e32\u0e21\u0e40\u0e02\u0e49\u0e21\u0e15\u0e32\u0e21\u0e0a\u0e2d\u0e1a",
    g_step_confirm: "\u0e41\u0e15\u0e30\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e44\u0e1b\u0e02\u0e31\u0e49\u0e19\u0e16\u0e31\u0e14\u0e44\u0e1b: GUIDE (\u0e40\u0e2b\u0e25\u0e37\u0e2d\u0e07) \u2192 PROMPT (\u0e19\u0e49\u0e33\u0e40\u0e07\u0e34\u0e19) \u2192 RUN (\u0e40\u0e02\u0e35\u0e22\u0e27 = \u0e2a\u0e23\u0e49\u0e32\u0e07\u0e08\u0e23\u0e34\u0e07)",
    g_cat_face: "FACE OP \u2014 \u0e22\u0e49\u0e32\u0e22\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e32\u0e01 reference \u0e44\u0e1b\u0e22\u0e31\u0e07\u0e04\u0e19\u0e17\u0e35\u0e48\u0e15\u0e23\u0e07\u0e01\u0e31\u0e19 \u0e2a\u0e48\u0e27\u0e19\u0e04\u0e19\u0e2d\u0e37\u0e48\u0e19\u0e44\u0e21\u0e48\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19",
    g_cat_sub: "SUBJECT OP \u2014 \u0e19\u0e33/\u0e41\u0e1b\u0e25\u0e07\u0e04\u0e19\u0e08\u0e32\u0e01 reference \u0e40\u0e02\u0e49\u0e32\u0e21\u0e32\u0e43\u0e19\u0e09\u0e32\u0e01\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 \u0e09\u0e32\u0e01\u0e41\u0e25\u0e30\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e40\u0e1f\u0e23\u0e21\u0e04\u0e07\u0e40\u0e14\u0e34\u0e21",
    g_cat_bgfg: "BG/FG OP \u2014 \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07 / \u0e09\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32 \u0e42\u0e14\u0e22\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07\u0e08\u0e32\u0e01 reference",
    g_cat_lc: "LIGHT & COLOR OP \u2014 \u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e41\u0e2a\u0e07\u0e41\u0e25\u0e30\u0e42\u0e17\u0e19\u0e2a\u0e35\u0e08\u0e32\u0e01 reference \u0e15\u0e31\u0e27\u0e1a\u0e38\u0e04\u0e04\u0e25\u0e22\u0e31\u0e07\u0e04\u0e07\u0e17\u0e38\u0e01\u0e1e\u0e34\u0e01\u0e40\u0e0b\u0e25",
    g_cat_dress: "\u0e07\u0e32\u0e19\u0e0a\u0e38\u0e14 \u2014 \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e0a\u0e38\u0e14\u0e42\u0e14\u0e22\u0e43\u0e0a\u0e49\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07",
    g_cat_mkop: "\u0e07\u0e32\u0e19\u0e40\u0e21\u0e04\u0e2d\u0e31\u0e1e \u2014 \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e40\u0e21\u0e04\u0e2d\u0e31\u0e1e\u0e42\u0e14\u0e22\u0e43\u0e0a\u0e49\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07",
    g_cat_match: "MASTER MATCH \u2014 \u0e1b\u0e23\u0e31\u0e1a\u0e20\u0e32\u0e1e\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e43\u0e2b\u0e49\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a\u0e25\u0e38\u0e04\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e02\u0e2d\u0e07 reference (\u0e15\u0e34\u0e4a\u0e01\u0e0a\u0e31\u0e49\u0e19\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e14\u0e49\u0e32\u0e19\u0e1a\u0e19)",
    g_cat_trail: "WEDDING TRAIL \u2014 \u0e2a\u0e19\u0e32\u0e21\u0e2b\u0e0d\u0e49\u0e32\u0e2b\u0e23\u0e39\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e32\u0e07\u0e14\u0e2d\u0e01\u0e44\u0e21\u0e49\u0e17\u0e2d\u0e14\u0e22\u0e32\u0e27 \u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32/\u0e17\u0e48\u0e32\u0e17\u0e32\u0e07/\u0e40\u0e1f\u0e23\u0e21\u0e16\u0e39\u0e01\u0e25\u0e47\u0e2d\u0e01\u0e41\u0e19\u0e48\u0e19",
    g_cat_veil: "FLYING VEIL \u2014 \u0e40\u0e1e\u0e34\u0e48\u0e21/\u0e15\u0e48\u0e2d\u0e1c\u0e49\u0e32\u0e04\u0e25\u0e38\u0e21\u0e2b\u0e19\u0e49\u0e32\u0e1b\u0e25\u0e34\u0e27\u0e25\u0e21\u0e15\u0e32\u0e21\u0e04\u0e27\u0e32\u0e21\u0e22\u0e32\u0e27\u0e19\u0e35\u0e49 \u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e1a\u0e31\u0e07\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32",
    g_cat_gown: "GOWN \u2014 \u0e40\u0e01\u0e47\u0e1a\u0e07\u0e32\u0e19\u0e0a\u0e38\u0e14\u0e40\u0e14\u0e34\u0e21\u0e43\u0e2b\u0e49\u0e40\u0e19\u0e35\u0e49\u0e22\u0e1a (\u0e14\u0e35\u0e44\u0e0b\u0e19\u0e4c\u0e44\u0e21\u0e48\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19) \u0e41\u0e25\u0e30\u0e15\u0e31\u0e49\u0e07\u0e04\u0e27\u0e32\u0e21\u0e22\u0e32\u0e27\u0e2b\u0e32\u0e07\u0e0a\u0e38\u0e14\u0e15\u0e32\u0e21\u0e19\u0e35\u0e49",
    g_cat_petal: "FLYING PETALS \u2014 \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e01\u0e25\u0e35\u0e1a\u0e14\u0e2d\u0e01\u0e44\u0e21\u0e49\u0e1b\u0e25\u0e34\u0e27\u0e43\u0e19\u0e2d\u0e32\u0e01\u0e32\u0e28\u0e15\u0e32\u0e21\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e19\u0e35\u0e49 \u0e2a\u0e35\u0e15\u0e32\u0e21\u0e41\u0e16\u0e1a\u0e2a\u0e35\u0e14\u0e49\u0e32\u0e19\u0e1a\u0e19",
    g_cat_wedx: "WEDDING EXTRA \u2014 \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e19\u0e35\u0e49\u0e43\u0e2b\u0e49\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a\u0e09\u0e32\u0e01\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 \u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e22\u0e31\u0e07\u0e25\u0e47\u0e2d\u0e01\u0e2d\u0e22\u0e39\u0e48",
    g_cat_canvas: "REPLACE (CANVAS) \u2014 \u0e22\u0e49\u0e32\u0e22\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b\u0e43\u0e19\u0e09\u0e32\u0e01\u0e02\u0e2d\u0e07 reference \u0e42\u0e14\u0e22\u0e25\u0e1a\u0e04\u0e19\u0e43\u0e19 reference \u0e2d\u0e2d\u0e01",
    g_cat_restore: "OLD PHOTO RESTORE \u2014 \u0e0b\u0e48\u0e2d\u0e21\u0e04\u0e27\u0e32\u0e21\u0e40\u0e2a\u0e35\u0e22\u0e2b\u0e32\u0e22 \u0e42\u0e14\u0e22\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e14\u0e34\u0e21\u0e17\u0e38\u0e01\u0e04\u0e19\u0e22\u0e31\u0e07\u0e40\u0e2b\u0e21\u0e37\u0e2d\u0e19\u0e40\u0e14\u0e34\u0e21 100%",
    g_cat_generic: "\u0e1e\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15 \u2014 \u0e43\u0e0a\u0e49\u0e01\u0e32\u0e23\u0e41\u0e15\u0e48\u0e07\u0e21\u0e37\u0e2d\u0e2d\u0e32\u0e0a\u0e35\u0e1e\u0e19\u0e35\u0e49\u0e01\u0e31\u0e1a\u0e20\u0e32\u0e1e\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13",
    g_gen: "GENERATE \u2014 \u0e23\u0e31\u0e19\u0e0a\u0e48\u0e2d\u0e07 prompt (+ chains, \u0e25\u0e47\u0e2d\u0e01 Keep, \u0e1a\u0e25\u0e47\u0e2d\u0e01\u0e01\u0e25\u0e49\u0e2d\u0e07) \u0e01\u0e31\u0e1a\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13",
    g_retouchbtn: "RETOUCH APPLY \u2014 \u0e23\u0e31\u0e19\u0e04\u0e48\u0e32\u0e2a\u0e44\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e40\u0e1b\u0e47\u0e19\u0e01\u0e32\u0e23\u0e23\u0e35\u0e17\u0e31\u0e0a\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e21\u0e37\u0e2d\u0e2d\u0e32\u0e0a\u0e35\u0e1e\u0e04\u0e23\u0e31\u0e49\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27",
    g_relightbtn: "LIGHTING GENERATE \u2014 \u0e08\u0e31\u0e14\u0e41\u0e2a\u0e07\u0e20\u0e32\u0e1e\u0e43\u0e2b\u0e21\u0e48\u0e43\u0e2b\u0e49\u0e15\u0e23\u0e07\u0e01\u0e31\u0e1a\u0e41\u0e1c\u0e19\u0e20\u0e32\u0e1e\u0e44\u0e1f 3D \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e40\u0e1b\u0e4a\u0e30",
    g_scene: "SCENE GENERATE \u2014 \u0e2a\u0e23\u0e49\u0e32\u0e07\u0e09\u0e32\u0e01\u0e43\u0e2b\u0e21\u0e48\u0e08\u0e32\u0e01 prompt \u0e17\u0e35\u0e48\u0e2a\u0e01\u0e31\u0e14\u0e44\u0e27\u0e49 \u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e22\u0e31\u0e07\u0e04\u0e07\u0e40\u0e14\u0e34\u0e21",
    g_rmix: "REPLACE MIX \u2014 \u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e2a\u0e48\u0e27\u0e19\u0e17\u0e35\u0e48\u0e15\u0e34\u0e4a\u0e01 \u2713 \u0e44\u0e27\u0e49 \u0e08\u0e32\u0e01 reference",
    g_pipe: "RUN PIPELINE \u2014 \u0e23\u0e31\u0e19\u0e17\u0e38\u0e01\u0e02\u0e31\u0e49\u0e19\u0e17\u0e35\u0e48\u0e15\u0e48\u0e2d\u0e44\u0e27\u0e49\u0e15\u0e32\u0e21\u0e25\u0e33\u0e14\u0e31\u0e1a \u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e41\u0e15\u0e48\u0e25\u0e30\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e48\u0e07\u0e15\u0e48\u0e2d\u0e44\u0e1b\u0e02\u0e31\u0e49\u0e19\u0e16\u0e31\u0e14\u0e44\u0e1b",
    ro_faceRep: "\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32",
    ro_faceSwap: "\u0e2a\u0e25\u0e31\u0e1a\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32",
    ro_bgRep: "\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07",
    ro_bgSwap: "\u0e2a\u0e25\u0e31\u0e1a\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07",
    ro_fgRep: "\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e09\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32",
    ro_bg_note: "Doc = \u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a \u00b7 Ref1 = \u0e09\u0e32\u0e01\u0e43\u0e2b\u0e21\u0e48 Target (Solo/Couple/Family) \u0e40\u0e1b\u0e47\u0e19\u0e15\u0e31\u0e27\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e27\u0e48\u0e32\u0e08\u0e30\u0e40\u0e01\u0e47\u0e1a\u0e43\u0e04\u0e23\u0e44\u0e27\u0e49",
    ro_bg_frame: "\u0e04\u0e07\u0e40\u0e1f\u0e23\u0e21 & \u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a",
    ro_bg_light: "\u0e04\u0e07\u0e41\u0e2a\u0e07/\u0e2a\u0e35\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a",
    ro_subSwap: "\u0e2a\u0e25\u0e31\u0e1a\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a",
    ro_lcRef: "\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07\u0e41\u0e2a\u0e07&\u0e2a\u0e35",
    ro_lcCopy: "\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e41\u0e2a\u0e07&\u0e2a\u0e35",
    ro_dressRef: "\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07\u0e0a\u0e38\u0e14",
    ro_dressRep: "\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e0a\u0e38\u0e14",
    ro_mkCopy: "\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e40\u0e21\u0e04\u0e2d\u0e31\u0e1e",
    ro_matchBtn: "\u2605 MASTER MATCH",
    grp_retouch: "\u0e1e\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15\u0e23\u0e35\u0e17\u0e31\u0e0a\u0e1c\u0e34\u0e27",
    lbl_intensity: "\u0e04\u0e27\u0e32\u0e21\u0e41\u0e23\u0e07",
    p_evoto: "\u0e2a\u0e44\u0e15\u0e25\u0e4c Evoto",
    p_meitu: "\u0e2a\u0e44\u0e15\u0e25\u0e4c Meitu",
    auto_place: "\u0e27\u0e32\u0e07\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e40\u0e1b\u0e47\u0e19\u0e40\u0e25\u0e40\u0e22\u0e2d\u0e23\u0e4c\u0e43\u0e2b\u0e21\u0e48\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34",
    sec_retouchpro: "\u0e23\u0e35\u0e17\u0e31\u0e0a\u0e42\u0e1b\u0e23 \u2014 \u0e2a\u0e44\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c",
    rt_skin: "\u0e1c\u0e34\u0e27",
    rt_faceai: "\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32 AI",
    rt_hair: "\u0e1c\u0e21",
    rt_dress: "\u0e0a\u0e38\u0e14",
    rt_bg: "\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07",
    rt_smooth: "\u0e40\u0e01\u0e25\u0e35\u0e48\u0e22\u0e1c\u0e34\u0e27",
    rt_acne: "\u0e25\u0e1a\u0e2a\u0e34\u0e27",
    rt_spots: "\u0e08\u0e38\u0e14\u0e14\u0e48\u0e32\u0e07\u0e14\u0e33",
    rt_wrinkle: "\u0e23\u0e34\u0e49\u0e27\u0e23\u0e2d\u0e22",
    rt_tone: "\u0e02\u0e32\u0e27 / \u0e41\u0e17\u0e19",
    rt_glow: "\u0e2d\u0e2d\u0e23\u0e48\u0e32",
    rt_reshape: "AI \u0e08\u0e31\u0e14\u0e23\u0e39\u0e1b",
    rt_lash: "\u0e02\u0e19\u0e15\u0e32",
    rt_brow: "\u0e04\u0e34\u0e49\u0e27",
    rt_lipsmooth: "\u0e40\u0e01\u0e25\u0e35\u0e48\u0e22\u0e1b\u0e32\u0e01",
    rt_lipcolor: "\u0e2a\u0e35\u0e1b\u0e32\u0e01",
    rt_lenscolor: "\u0e2a\u0e35\u0e40\u0e25\u0e19\u0e2a\u0e4c",
    rt_hairstray: "\u0e1c\u0e21\u0e1f\u0e38\u0e49\u0e07",
    rt_hairsmooth: "\u0e40\u0e01\u0e25\u0e35\u0e48\u0e22\u0e1c\u0e21",
    rt_hairshine: "\u0e1c\u0e21\u0e40\u0e07\u0e32 (D&B)",
    rt_dresssmooth: "\u0e40\u0e01\u0e25\u0e35\u0e48\u0e22\u0e1c\u0e49\u0e32",
    rt_dressedge: "\u0e40\u0e01\u0e47\u0e1a\u0e02\u0e2d\u0e1a",
    rt_dresswrinkle: "\u0e25\u0e1a\u0e23\u0e2d\u0e22\u0e22\u0e31\u0e1a",
    rt_dresstexture: "\u0e1f\u0e37\u0e49\u0e19\u0e40\u0e17\u0e47\u0e01\u0e0b\u0e4c\u0e40\u0e08\u0e2d\u0e23\u0e4c",
    rt_bgsmooth: "\u0e17\u0e33\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e30\u0e2d\u0e32\u0e14/\u0e40\u0e01\u0e25\u0e35\u0e48\u0e22 BG",
    rt_bgcolor: "\u0e2a\u0e35 BG",
    rt_bgrecolor: "\u0e40\u0e01\u0e25\u0e35\u0e48\u0e22\u0e2a\u0e35 BG",
    rt_shape: "\u0e08\u0e31\u0e14\u0e23\u0e39\u0e1b\u0e42\u0e1b\u0e23 (\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32 + \u0e23\u0e39\u0e1b\u0e23\u0e48\u0e32\u0e07)",
    rt_teeth: "\u0e1f\u0e31\u0e19\u0e02\u0e32\u0e27",
    rt_eyewhite: "\u0e15\u0e32\u0e02\u0e32\u0e27\u0e43\u0e2a",
    rt_faceslim: "\u0e2b\u0e19\u0e49\u0e32\u0e40\u0e23\u0e35\u0e22\u0e27",
    rt_jaw: "\u0e01\u0e23\u0e32\u0e21",
    rt_chin: "\u0e04\u0e32\u0e07",
    rt_nosesize: "\u0e02\u0e19\u0e32\u0e14\u0e08\u0e21\u0e39\u0e01",
    rt_eyesize: "\u0e02\u0e19\u0e32\u0e14\u0e15\u0e32",
    rt_lipfull: "\u0e1b\u0e32\u0e01\u0e2d\u0e34\u0e48\u0e21",
    rt_waist: "\u0e40\u0e2d\u0e27\u0e04\u0e2d\u0e14",
    rt_bodyslim: "\u0e23\u0e39\u0e1b\u0e23\u0e48\u0e32\u0e07\u0e40\u0e1e\u0e23\u0e35\u0e22\u0e27",
    rt_shoulder: "\u0e44\u0e2b\u0e25\u0e48",
    rt_hip: "\u0e2a\u0e30\u0e42\u0e1e\u0e01\u0e40\u0e23\u0e35\u0e22\u0e27",
    rt_leglen: "\u0e04\u0e27\u0e32\u0e21\u0e22\u0e32\u0e27\u0e02\u0e32",
    rt_armslim: "\u0e41\u0e02\u0e19\u0e40\u0e23\u0e35\u0e22\u0e27",
    rt_dressfit: "\u0e0a\u0e38\u0e14\u0e40\u0e02\u0e49\u0e32\u0e23\u0e39\u0e1b",
    rt_dressclean: "\u0e0a\u0e38\u0e14\u0e2a\u0e30\u0e2d\u0e32\u0e14",
    rt_dresscolorpure: "\u0e2a\u0e35\u0e0a\u0e38\u0e14\u0e1a\u0e23\u0e34\u0e2a\u0e38\u0e17\u0e18\u0e34\u0e4c",
    rt_bodygrp: "\u0e1c\u0e34\u0e27\u0e01\u0e32\u0e22\u0e42\u0e1b\u0e23",
    rt_bodysmooth: "\u0e40\u0e01\u0e25\u0e35\u0e48\u0e22\u0e1c\u0e34\u0e27\u0e01\u0e32\u0e22",
    rt_bodyblemish: "\u0e25\u0e1a\u0e23\u0e2d\u0e22\u0e1c\u0e34\u0e27\u0e01\u0e32\u0e22",
    rt_bodytone: "\u0e1c\u0e34\u0e27\u0e01\u0e32\u0e22\u0e2a\u0e21\u0e48\u0e33\u0e40\u0e2a\u0e21\u0e2d",
    rt_bodyglow: "\u0e1c\u0e34\u0e27\u0e01\u0e32\u0e22\u0e2d\u0e2d\u0e23\u0e48\u0e32",
    rt_bodyhairrm: "\u0e25\u0e14\u0e02\u0e19\u0e01\u0e32\u0e22",
    rt_hairvolume: "\u0e27\u0e2d\u0e25\u0e38\u0e48\u0e21\u0e1c\u0e21",
    rt_hairgloss: "\u0e1c\u0e21\u0e40\u0e07\u0e32\u0e07\u0e32\u0e21",
    rt_hairfill: "\u0e40\u0e15\u0e34\u0e21\u0e1c\u0e21 (\u0e08\u0e38\u0e14\u0e1a\u0e32\u0e07)",
    wp_h_trail: "\u2665 \u0e07\u0e32\u0e19\u0e41\u0e15\u0e48\u0e07 \u2014 \u0e2a\u0e32\u0e22\u0e14\u0e2d\u0e01\u0e44\u0e21\u0e49\u0e2b\u0e23\u0e39",
    wp_h_veil: "\u2665 \u0e07\u0e32\u0e19\u0e41\u0e15\u0e48\u0e07 \u2014 \u0e1c\u0e49\u0e32\u0e04\u0e25\u0e38\u0e21\u0e1b\u0e25\u0e34\u0e27",
    wp_h_gown: "\u2665 \u0e07\u0e32\u0e19\u0e41\u0e15\u0e48\u0e07 \u2014 \u0e0a\u0e38\u0e14\u0e2a\u0e30\u0e2d\u0e32\u0e14 + \u0e2b\u0e32\u0e07\u0e01\u0e23\u0e30\u0e42\u0e1b\u0e23\u0e07",
    wp_h_petal: "\u2665 \u0e07\u0e32\u0e19\u0e41\u0e15\u0e48\u0e07 \u2014 \u0e01\u0e25\u0e35\u0e1a\u0e1b\u0e25\u0e34\u0e27",
    wp_h_extra: "\u2665 \u0e07\u0e32\u0e19\u0e41\u0e15\u0e48\u0e07 \u2014 \u0e21\u0e49\u0e32 \u00b7 \u0e19\u0e49\u0e33 \u00b7 \u0e2d\u0e32\u0e23\u0e21\u0e13\u0e4c",
    wp_note: "Face ID / \u0e17\u0e48\u0e32\u0e17\u0e32\u0e07 / \u0e40\u0e1f\u0e23\u0e21 / \u0e14\u0e35\u0e44\u0e0b\u0e19\u0e4c\u0e0a\u0e38\u0e14 \u0e16\u0e39\u0e01\u0e25\u0e47\u0e2d\u0e01\u0e41\u0e19\u0e48\u0e19 \u2014 \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e17\u0e35\u0e48\u0e23\u0e30\u0e1a\u0e38\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19",
    wp_petalcolor: "\u0e2a\u0e35\u0e01\u0e25\u0e35\u0e1a (\u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34 = \u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a\u0e09\u0e32\u0e01)",
    wp_trail_c: "\u0e2a\u0e35\u0e14\u0e2d\u0e01\u0e44\u0e21\u0e49",
    wp_trail_go: "\u25b6 \u0e2a\u0e32\u0e22\u0e14\u0e2d\u0e01\u0e44\u0e21\u0e49",
    wp_veil_c: "\u0e04\u0e27\u0e32\u0e21\u0e22\u0e32\u0e27\u0e1c\u0e49\u0e32\u0e04\u0e25\u0e38\u0e21",
    wp_veil_go: "\u25b6 \u0e1c\u0e49\u0e32\u0e04\u0e25\u0e38\u0e21\u0e1b\u0e25\u0e34\u0e27",
    wp_gown_c: "\u0e04\u0e27\u0e32\u0e21\u0e22\u0e32\u0e27\u0e2b\u0e32\u0e07",
    wp_gown_go: "\u25b6 \u0e0a\u0e38\u0e14\u0e2a\u0e30\u0e2d\u0e32\u0e14 + \u0e2b\u0e32\u0e07",
    wp_pet_c: "\u0e2a\u0e44\u0e15\u0e25\u0e4c\u0e01\u0e25\u0e35\u0e1a",
    wp_pet_go: "\u25b6 \u0e01\u0e25\u0e35\u0e1a\u0e1b\u0e25\u0e34\u0e27",
    wp_extra_c: "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21",
    wp_extra_go: "\u25b6 \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1e\u0e34\u0e40\u0e28\u0e29",
    btn_apply_rt: "\u0e43\u0e0a\u0e49\u0e23\u0e35\u0e17\u0e31\u0e0a",
    btn_reset: "\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15",
    rt_none: "\u0e15\u0e31\u0e49\u0e07\u0e2a\u0e44\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e23\u0e35\u0e17\u0e31\u0e0a\u0e2b\u0e23\u0e37\u0e2d\u0e2a\u0e35\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e19\u0e49\u0e2d\u0e22\u0e2b\u0e19\u0e36\u0e48\u0e07\u0e01\u0e48\u0e2d\u0e19",
    tab_setup: "\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32",
    tab_prompt: "\u0e2a\u0e15\u0e39\u0e14\u0e34\u0e42\u0e2d",
    tab_presets: "\u0e1e\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15",
    recent_lbl: "\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14\u2026",
    tab_retouch: "\u0e23\u0e35\u0e17\u0e31\u0e0a",
    tab_aitools: "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d AI",
    cap_warn: "Photoshop \u0e08\u0e33\u0e01\u0e31\u0e14\u0e0a\u0e48\u0e2d\u0e07\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e19\u0e35\u0e49\u0e17\u0e35\u0e48:",
    cleanup_note: "\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e17\u0e35\u0e48\u0e15\u0e34\u0e4a\u0e01\u0e17\u0e33\u0e07\u0e32\u0e19\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e17\u0e38\u0e01 \u0e2a\u0e23\u0e49\u0e32\u0e07 / \u0e1e\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15",
    btn_generate: "\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e20\u0e32\u0e1e",
    st_ready: "\u0e1e\u0e23\u0e49\u0e2d\u0e21",
    st_capture: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e08\u0e31\u0e1a\u0e20\u0e32\u0e1e\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23",
    st_gen: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07\u2026",
    st_place: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e27\u0e32\u0e07\u0e25\u0e07 Photoshop\u2026",
    st_placed_masked: "\u0e27\u0e32\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e01\u0e25\u0e38\u0e48\u0e21 Layer + Mask \u0e41\u0e25\u0e49\u0e27 \u2014 \u0e20\u0e32\u0e1e\u0e15\u0e49\u0e19\u0e09\u0e1a\u0e31\u0e1a\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e41\u0e15\u0e30 \u2713",
    st_placed_plain: "\u0e27\u0e32\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e40\u0e25\u0e40\u0e22\u0e2d\u0e23\u0e4c\u0e18\u0e23\u0e23\u0e21\u0e14\u0e32 (\u0e42\u0e2e\u0e2a\u0e15\u0e4c\u0e19\u0e35\u0e49\u0e44\u0e21\u0e48\u0e23\u0e2d\u0e07\u0e23\u0e31\u0e1a mask/group)",
    stage_queued: "\u0e2d\u0e22\u0e39\u0e48\u0e43\u0e19\u0e04\u0e34\u0e27",
    stage_uploading: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e2d\u0e31\u0e1b\u0e42\u0e2b\u0e25\u0e14",
    stage_generating: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e2a\u0e23\u0e49\u0e32\u0e07",
    stage_downloading: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e14\u0e32\u0e27\u0e19\u0e4c\u0e42\u0e2b\u0e25\u0e14",
    stage_placing: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e27\u0e32\u0e07\u0e25\u0e07 Photoshop",
    st_done: "\u0e40\u0e2a\u0e23\u0e47\u0e08 \u2713",
    st_err: "\u0e02\u0e49\u0e2d\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14",
    st_no_doc: "\u0e44\u0e21\u0e48\u0e21\u0e35\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19 \u2014 \u0e40\u0e1b\u0e34\u0e14\u0e20\u0e32\u0e1e\u0e01\u0e48\u0e2d\u0e19",
    st_no_prompt: "\u0e1e\u0e23\u0e2d\u0e21\u0e15\u0e4c\u0e27\u0e48\u0e32\u0e07",
    need_ref: "\u0e1e\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15\u0e19\u0e35\u0e49\u0e15\u0e49\u0e2d\u0e07\u0e21\u0e35\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07\u0e43\u0e19\u0e0a\u0e48\u0e2d\u0e07 1",
    st_new_doc: "\u0e40\u0e1b\u0e34\u0e14\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e40\u0e1b\u0e47\u0e19\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e43\u0e2b\u0e21\u0e48\u0e41\u0e25\u0e49\u0e27 \u2713",
    sec_preview: "\u0e15\u0e31\u0e27\u0e2d\u0e22\u0e48\u0e32\u0e07 \u2014 \u0e01\u0e48\u0e2d\u0e19 / \u0e2b\u0e25\u0e31\u0e07",
    before: "\u0e01\u0e48\u0e2d\u0e19",
    after: "\u0e2b\u0e25\u0e31\u0e07",
    btn_place: "\u0e27\u0e32\u0e07\u0e25\u0e07 Photoshop",
    btn_saveas: "\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e40\u0e1b\u0e47\u0e19\u2026",
    st_saved: "\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e41\u0e25\u0e49\u0e27 \u2713",
    sec_diag: "\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e23\u0e30\u0e1a\u0e1a",
    sec_log: "\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21",
    btn_diag: "\u0e23\u0e31\u0e19\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a",
    btn_copylog: "\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01",
    btn_clearlog: "\u0e25\u0e49\u0e32\u0e07",
    diag_host: "\u0e42\u0e2e\u0e2a\u0e15\u0e4c Photoshop",
    diag_uxp: "\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16 UXP",
    diag_gem: "Gemini API key",
    diag_oai: "OpenAI API key",
    diag_doc: "\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19",
    diag_set: "\u0e15\u0e31\u0e49\u0e07\u0e41\u0e25\u0e49\u0e27",
    diag_unset: "\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e15\u0e31\u0e49\u0e07",
    diag_open: "\u0e40\u0e1b\u0e34\u0e14",
    diag_none: "\u0e44\u0e21\u0e48\u0e21\u0e35\u0e17\u0e35\u0e48\u0e40\u0e1b\u0e34\u0e14",
    diag_missing: "\u0e02\u0e32\u0e14",
    diag_done: "\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a\u0e23\u0e30\u0e1a\u0e1a\u0e40\u0e2a\u0e23\u0e47\u0e08 \u2713",
    diag_lib: "\u0e04\u0e25\u0e31\u0e07\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07",
    diag_lib_open: "\u0e04\u0e27\u0e32\u0e21\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e1b\u0e34\u0e14\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c",
    sec_reflib: "\u0e04\u0e25\u0e31\u0e07\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07",
    reflib_note: "\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e20\u0e32\u0e1e reference \u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e0a\u0e2d\u0e1a\u0e44\u0e27\u0e49\u0e04\u0e23\u0e31\u0e49\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27 \u2014 Browse \u0e08\u0e30\u0e08\u0e33\u0e41\u0e25\u0e30\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e02\u0e49\u0e32\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e19\u0e31\u0e49\u0e19\u0e43\u0e2b\u0e49\u0e17\u0e38\u0e01\u0e17\u0e35\u0e48",
    btn_browse: "\u0e40\u0e23\u0e35\u0e22\u0e01\u0e14\u0e39",
    lib_choose: "\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c",
    lib_open: "\u0e40\u0e1b\u0e34\u0e14\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c",
    lib_change: "\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c",
    lib_reset: "\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15",
    lib_rescan: "\u0e2a\u0e41\u0e01\u0e19\u0e43\u0e2b\u0e21\u0e48",
    lib_current: "\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19",
    lib_found: "\u0e20\u0e32\u0e1e\u0e17\u0e35\u0e48\u0e1e\u0e1a",
    lib_status: "\u0e2a\u0e16\u0e32\u0e19\u0e30",
    lib_lastscan: "\u0e2a\u0e41\u0e01\u0e19\u0e25\u0e48\u0e32\u0e2a\u0e38\u0e14",
    lib_images: "\u0e20\u0e32\u0e1e",
    lib_connected: "\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d\u0e41\u0e25\u0e49\u0e27",
    lib_not_config: "\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32",
    lib_perm_lost: "\u0e2a\u0e34\u0e17\u0e18\u0e34\u0e4c\u0e2b\u0e32\u0e22 \u2014 \u0e40\u0e25\u0e37\u0e2d\u0e01\u0e43\u0e2b\u0e21\u0e48",
    lib_none: "(\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c)",
    lib_copy_only: "\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e1e\u0e32\u0e18\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19",
    lib_choose_msg: "\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e42\u0e1f\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e04\u0e25\u0e31\u0e07\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07 HNK \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13",
    lib_scanning: "\u0e01\u0e33\u0e25\u0e31\u0e07\u0e2a\u0e41\u0e01\u0e19\u0e04\u0e25\u0e31\u0e07\u2026",
    lib_scan_done: "\u0e2a\u0e41\u0e01\u0e19\u0e43\u0e2b\u0e21\u0e48\u0e40\u0e2a\u0e23\u0e47\u0e08 \u2713",
    lib_reset_done: "\u0e23\u0e35\u0e40\u0e0b\u0e47\u0e15\u0e04\u0e25\u0e31\u0e07\u0e41\u0e25\u0e49\u0e27 \u2713",
    lib_path_copied: "\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e1e\u0e32\u0e18\u0e41\u0e25\u0e49\u0e27",
    lib_unsupported: "\u0e0a\u0e19\u0e34\u0e14\u0e20\u0e32\u0e1e\u0e44\u0e21\u0e48\u0e23\u0e2d\u0e07\u0e23\u0e31\u0e1a",
    lib_restore_fail: "\u0e01\u0e39\u0e49\u0e04\u0e37\u0e19\u0e20\u0e32\u0e1e\u0e2d\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e07\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49",
    on: "\u0e40\u0e1b\u0e34\u0e14",
    off: "\u0e1b\u0e34\u0e14",
    ai_home_title: "\u0e04\u0e38\u0e13\u0e2d\u0e22\u0e32\u0e01\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e2d\u0e30\u0e44\u0e23",
    ai_free_generate: "\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e2d\u0e34\u0e2a\u0e23\u0e30",
    ai_free_sub: "\u0e40\u0e02\u0e35\u0e22\u0e19 prompt \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e40\u0e2d\u0e07",
    ai_more_tools: "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21",
    ai_more_sub: "Water Edit \u00b7 Text/Logo \u00b7 workflow \u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14",
    ai_nav_home: "\u0e2b\u0e19\u0e49\u0e32\u0e41\u0e23\u0e01",
    ai_nav_tools: "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d",
    ai_history: "\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34",
    ai_no_gen: "\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35\u0e1c\u0e25\u0e07\u0e32\u0e19",
    ai_rerun: "\u0e23\u0e31\u0e19\u0e43\u0e2b\u0e21\u0e48",
    ai_reuse: "\u0e43\u0e0a\u0e49\u0e0b\u0e49\u0e33",
    ai_clear_hist: "\u0e25\u0e49\u0e32\u0e07\u0e1b\u0e23\u0e30\u0e27\u0e31\u0e15\u0e34",
    ai_images: "\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e",
    ai_add_ref: "+ \u0e40\u0e1e\u0e34\u0e48\u0e21\u0e20\u0e32\u0e1e Reference",
    ai_prompt: "PROMPT",
    ai_prompt_ph: "\u0e2d\u0e18\u0e34\u0e1a\u0e32\u0e22\u0e2a\u0e34\u0e48\u0e07\u0e17\u0e35\u0e48\u0e04\u0e38\u0e13\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23\u2026",
    ai_model_output: "MODEL \u0e41\u0e25\u0e30 OUTPUT",
    ai_model_note: "AI Tools \u0e21\u0e35\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 model/size \u0e02\u0e2d\u0e07\u0e15\u0e31\u0e27\u0e40\u0e2d\u0e07 \u0e41\u0e22\u0e01\u0e08\u0e32\u0e01\u0e41\u0e17\u0e47\u0e1a Setup \u0e41\u0e25\u0e30 Create",
    ai_auto_model: "\u0e40\u0e25\u0e37\u0e2d\u0e01 Model \u0e2d\u0e31\u0e15\u0e42\u0e19\u0e21\u0e31\u0e15\u0e34",
    ai_wf_tools: "\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d Workflow",
    ai_direct_gen: "\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e17\u0e31\u0e19\u0e17\u0e35",
    ai_identity_lock: "\u0e25\u0e47\u0e2d\u0e01\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32",
    ai_ref_transfer: "\u0e16\u0e48\u0e32\u0e22\u0e17\u0e2d\u0e14 Reference",
    ai_req_images: "\u0e20\u0e32\u0e1e\u0e17\u0e35\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e43\u0e0a\u0e49",
    ai_opt_images: "\u0e20\u0e32\u0e1e\u0e40\u0e2a\u0e23\u0e34\u0e21 (\u0e44\u0e21\u0e48\u0e1a\u0e31\u0e07\u0e04\u0e31\u0e1a)",
    ai_model_lbl: "Model",
    ai_prepare: "\u0e40\u0e15\u0e23\u0e35\u0e22\u0e21 (\u0e42\u0e2b\u0e25\u0e14\u0e41\u0e25\u0e30\u0e15\u0e23\u0e27\u0e08)",
    ai_lib_bridge_off: "\u0e42\u0e2e\u0e2a\u0e15\u0e4c\u0e19\u0e35\u0e49\u0e43\u0e0a\u0e49 Library \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49",
    ai_lib_pick_first: "\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e20\u0e32\u0e1e\u0e08\u0e32\u0e01\u0e41\u0e17\u0e47\u0e1a Presets \u2192 Visual Library \u0e01\u0e48\u0e2d\u0e19",
    ai_lib_load_fail: "\u0e42\u0e2b\u0e25\u0e14\u0e20\u0e32\u0e1e\u0e08\u0e32\u0e01 Library \u0e44\u0e21\u0e48\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08",
    ai_missing: "\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e21\u0e35",
    ai_add: "\u0e40\u0e1e\u0e34\u0e48\u0e21",
    ai_library: "Library",
    ai_rh_sec: "RunningHub \u2014 \u0e40\u0e1e\u0e34\u0e48\u0e21 model endpoint (\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07 \u2014 \u0e44\u0e21\u0e48\u0e1a\u0e31\u0e07\u0e04\u0e31\u0e1a)",
    ai_rh_note: "\u0e42\u0e21\u0e40\u0e14\u0e25\u0e17\u0e35\u0e48\u0e21\u0e35\u0e21\u0e32\u0e43\u0e2b\u0e49\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49\u0e14\u0e49\u0e27\u0e22\u0e04\u0e35\u0e22\u0e4c\u0e14\u0e49\u0e32\u0e19\u0e1a\u0e19\u0e41\u0e25\u0e49\u0e27 \u2014 \u0e44\u0e21\u0e48\u0e15\u0e49\u0e2d\u0e07\u0e17\u0e33\u0e2d\u0e30\u0e44\u0e23 \u0e2b\u0e32\u0e01\u0e42\u0e21\u0e40\u0e14\u0e25\u0e43\u0e14\u0e02\u0e36\u0e49\u0e19\u0e27\u0e48\u0e32 \"not connected\" (\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e22\u0e37\u0e19\u0e22\u0e31\u0e19 endpoint path) \u0e43\u0e2b\u0e49\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01 path \u0e08\u0e32\u0e01 API docs \u0e02\u0e2d\u0e07 RunningHub \u0e21\u0e32\u0e27\u0e32\u0e07\u0e17\u0e35\u0e48\u0e19\u0e35\u0e48",
    ai_rh_save: "\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01 endpoint \u0e02\u0e2d\u0e07\u0e42\u0e21\u0e40\u0e14\u0e25\u0e19\u0e35\u0e49",
    ai_test_conn: "\u0e17\u0e14\u0e2a\u0e2d\u0e1a\u0e01\u0e32\u0e23\u0e40\u0e0a\u0e37\u0e48\u0e2d\u0e21\u0e15\u0e48\u0e2d",
    ai_oai_sec: "OpenAI (\u0e02\u0e31\u0e49\u0e19\u0e2a\u0e39\u0e07 \u2014 \u0e44\u0e21\u0e48\u0e1a\u0e31\u0e07\u0e04\u0e31\u0e1a)",
    ai_oai_note: "\u0e43\u0e0a\u0e49 OpenAI API key \u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e40\u0e2d\u0e07\u0e01\u0e31\u0e1a GPT Image 2 \u0e41\u0e17\u0e19 (\u0e2b\u0e23\u0e37\u0e2d\u0e04\u0e27\u0e1a\u0e04\u0e39\u0e48\u0e01\u0e31\u0e1a) RunningHub Enterprise",
    ai_save_verify: "\u0e1a\u0e31\u0e19\u0e17\u0e36\u0e01\u0e41\u0e25\u0e30\u0e15\u0e23\u0e27\u0e08\u0e2a\u0e2d\u0e1a",
    ai_settings: "\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32",
    ai_add_layers: "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e40\u0e1b\u0e47\u0e19 Layer \u0e43\u0e2b\u0e21\u0e48",
    ai_done: "\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27",
    ai_result_ready: "\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e41\u0e25\u0e49\u0e27",
    ai_ready_nolayer: "\u0e1c\u0e25\u0e25\u0e31\u0e1e\u0e18\u0e4c\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e41\u0e25\u0e49\u0e27 (\u0e01\u0e32\u0e23\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e1b\u0e47\u0e19 Layer \u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14\u0e44\u0e27\u0e49\u0e43\u0e19 Settings)",
    ai_place_failed: "\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e40\u0e2a\u0e23\u0e47\u0e08\u0e41\u0e25\u0e49\u0e27 \u0e41\u0e15\u0e48\u0e27\u0e32\u0e07\u0e25\u0e07\u0e43\u0e19 Photoshop \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49",
    ai_place_failed_fix: "\u0e40\u0e1b\u0e34\u0e14\u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e01\u0e48\u0e2d\u0e19 \u0e41\u0e25\u0e49\u0e27\u0e23\u0e31\u0e19\u0e43\u0e2b\u0e21\u0e48\u0e08\u0e32\u0e01 History",
    ai_placed_masked: "\u0e27\u0e32\u0e07\u0e25\u0e07\u0e43\u0e19\u0e01\u0e25\u0e38\u0e48\u0e21 \u201c{name}\u201d \u0e40\u0e1b\u0e47\u0e19 Layer + Mask \u0e41\u0e25\u0e49\u0e27 \u2014 \u0e20\u0e32\u0e1e\u0e15\u0e49\u0e19\u0e09\u0e1a\u0e31\u0e1a\u0e44\u0e21\u0e48\u0e16\u0e39\u0e01\u0e41\u0e01\u0e49\u0e44\u0e02",
    ai_placed_group: "\u0e27\u0e32\u0e07\u0e25\u0e07\u0e43\u0e19\u0e01\u0e25\u0e38\u0e48\u0e21 \u201c{name}\u201d \u0e40\u0e1b\u0e47\u0e19 Layer \u0e43\u0e2b\u0e21\u0e48\u0e41\u0e25\u0e49\u0e27 (\u0e42\u0e2e\u0e2a\u0e15\u0e4c\u0e19\u0e35\u0e49\u0e43\u0e0a\u0e49 mask \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49)",
    ai_placed_plain: "\u0e27\u0e32\u0e07\u0e40\u0e1b\u0e47\u0e19 Layer \u0e43\u0e2b\u0e21\u0e48\u0e41\u0e25\u0e49\u0e27 (\u0e42\u0e2e\u0e2a\u0e15\u0e4c\u0e19\u0e35\u0e49\u0e43\u0e0a\u0e49 group/mask \u0e44\u0e21\u0e48\u0e44\u0e14\u0e49)",
    ai_start_fail: "\u0e40\u0e23\u0e34\u0e48\u0e21 AI Tools \u0e44\u0e21\u0e48\u0e2a\u0e33\u0e40\u0e23\u0e47\u0e08",
    pgb_setup: "\u0e40\u0e23\u0e34\u0e48\u0e21\u0e17\u0e35\u0e48\u0e19\u0e35\u0e48 \u2014 \u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 API Key \u00b7 Model \u00b7 Library",
    pgb_studio: "Prompt \u2192 Reference \u2192 Generate \u2014 \u0e40\u0e27\u0e34\u0e23\u0e4c\u0e01\u0e42\u0e1f\u0e25\u0e27\u0e4c\u0e21\u0e37\u0e2d\u0e2d\u0e32\u0e0a\u0e35\u0e1e\u0e15\u0e48\u0e2d\u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07",
    pgb_create: "\u0e08\u0e32\u0e01\u0e44\u0e2d\u0e40\u0e14\u0e35\u0e22\u0e2a\u0e39\u0e48\u0e1c\u0e25\u0e07\u0e32\u0e19 \u2014 4 \u0e0a\u0e48\u0e2d\u0e07 reference \u00b7 Variations",
    pgb_presets: "Visual Library 366 \u00b7 Scenes \u00b7 Wedding \u00b7 Style Chains",
    pgb_aitools: "\u0e41\u0e15\u0e30\u0e04\u0e23\u0e31\u0e49\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e21\u0e37\u0e2d\u0e2d\u0e32\u0e0a\u0e35\u0e1e \u2014 Nano Banana \u00b7 GPT Image \u00b7 RunningHub",
    pgb_retouch: "\u0e1c\u0e34\u0e27 \u00b7 \u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32 \u00b7 \u0e23\u0e39\u0e1b\u0e23\u0e48\u0e32\u0e07 \u2014 \u0e2a\u0e44\u0e25\u0e40\u0e14\u0e2d\u0e23\u0e4c\u0e23\u0e30\u0e14\u0e31\u0e1a\u0e21\u0e37\u0e2d\u0e2d\u0e32\u0e0a\u0e35\u0e1e",
    wf_sum_bg_replace: "\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07",
    wf_sum_reference_transfer: "\u0e22\u0e49\u0e32\u0e22\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e40\u0e02\u0e49\u0e32\u0e44\u0e1b\u0e43\u0e19\u0e09\u0e32\u0e01 reference",
    wf_sum_master_bgfg_replace: "\u0e25\u0e1a\u0e04\u0e19\u0e43\u0e19\u0e09\u0e32\u0e01\u0e2d\u0e2d\u0e01 \u0e2a\u0e23\u0e49\u0e32\u0e07 bg/fg \u0e43\u0e2b\u0e21\u0e48 \u0e41\u0e25\u0e49\u0e27\u0e43\u0e2a\u0e48\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13",
    wf_sum_subject_face: "\u0e22\u0e49\u0e32\u0e22\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e2b\u0e23\u0e37\u0e2d\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32\u0e44\u0e1b\u0e22\u0e31\u0e07\u0e20\u0e32\u0e1e base",
    wf_sum_retouch: "\u0e23\u0e35\u0e17\u0e31\u0e0a\u0e20\u0e32\u0e1e\u0e1a\u0e38\u0e04\u0e04\u0e25\u0e43\u0e2b\u0e49\u0e14\u0e39\u0e40\u0e1b\u0e47\u0e19\u0e18\u0e23\u0e23\u0e21\u0e0a\u0e32\u0e15\u0e34",
    wf_sum_upscale: "\u0e02\u0e22\u0e32\u0e22\u0e20\u0e32\u0e1e\u0e42\u0e14\u0e22\u0e04\u0e07\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14",
    wf_sum_object_edit: "\u0e25\u0e1a \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 \u0e2b\u0e23\u0e37\u0e2d\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e27\u0e31\u0e15\u0e16\u0e38",
    wf_sum_water_edit: "\u0e41\u0e01\u0e49\u0e44\u0e02\u0e19\u0e49\u0e33\u0e41\u0e25\u0e30\u0e40\u0e07\u0e32\u0e2a\u0e30\u0e17\u0e49\u0e2d\u0e19",
    wf_sum_text_logo: "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2b\u0e23\u0e37\u0e2d\u0e41\u0e01\u0e49\u0e44\u0e02\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e41\u0e25\u0e30\u0e42\u0e25\u0e42\u0e01\u0e49",
    wfin_subject: "\u0e20\u0e32\u0e1e\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 (\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a)",
    wfin_new_bg: "\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07\u0e43\u0e2b\u0e21\u0e48 (\u0e44\u0e21\u0e48\u0e1a\u0e31\u0e07\u0e04\u0e31\u0e1a)",
    wfin_ref_scene: "\u0e09\u0e32\u0e01 reference",
    wfin_style_ref: "Style reference (\u0e44\u0e21\u0e48\u0e1a\u0e31\u0e07\u0e04\u0e31\u0e1a)",
    wfin_target_scene: "\u0e09\u0e32\u0e01\u0e40\u0e1b\u0e49\u0e32\u0e2b\u0e21\u0e32\u0e22\u0e17\u0e35\u0e48\u0e21\u0e35\u0e04\u0e19",
    wfin_base: "\u0e20\u0e32\u0e1e base",
    wfin_face_ref: "reference \u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32 / \u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a",
    wfin_portrait: "\u0e20\u0e32\u0e1e\u0e1a\u0e38\u0e04\u0e04\u0e25",
    wfin_image: "\u0e23\u0e39\u0e1b\u0e20\u0e32\u0e1e",
    wfin_object_ref: "reference \u0e27\u0e31\u0e15\u0e16\u0e38 (\u0e44\u0e21\u0e48\u0e1a\u0e31\u0e07\u0e04\u0e31\u0e1a)",
    wfin_logo_ref: "reference \u0e42\u0e25\u0e42\u0e01\u0e49 (\u0e44\u0e21\u0e48\u0e1a\u0e31\u0e07\u0e04\u0e31\u0e1a)",
    wf_exp_bg_replace: "\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07\u0e14\u0e49\u0e32\u0e19\u0e2b\u0e25\u0e31\u0e07\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a \u0e15\u0e31\u0e27\u0e04\u0e19 \u0e17\u0e48\u0e32\u0e17\u0e32\u0e07 \u0e02\u0e2d\u0e1a\u0e20\u0e32\u0e1e \u0e41\u0e25\u0e30\u0e41\u0e2a\u0e07\u0e22\u0e31\u0e07\u0e04\u0e07\u0e40\u0e14\u0e34\u0e21\u0e17\u0e38\u0e01\u0e2d\u0e22\u0e48\u0e32\u0e07 \u2014 \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e2a\u0e34\u0e48\u0e07\u0e17\u0e35\u0e48\u0e2d\u0e22\u0e39\u0e48\u0e14\u0e49\u0e32\u0e19\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19",
    wf_exp_reference_transfer: "\u0e19\u0e33\u0e09\u0e32\u0e01\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e02\u0e2d\u0e07\u0e20\u0e32\u0e1e reference \u0e21\u0e32\u0e43\u0e0a\u0e49 (\u0e41\u0e15\u0e48\u0e44\u0e21\u0e48\u0e40\u0e2d\u0e32\u0e04\u0e19\u0e43\u0e19\u0e20\u0e32\u0e1e) \u0e41\u0e25\u0e49\u0e27\u0e27\u0e32\u0e07\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e25\u0e07\u0e44\u0e1b \u2014 \u0e04\u0e07\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32 \u0e17\u0e48\u0e32\u0e17\u0e32\u0e07 \u0e41\u0e25\u0e30\u0e40\u0e1f\u0e23\u0e21\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e44\u0e27\u0e49 \u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e1b\u0e23\u0e31\u0e1a\u0e43\u0e2b\u0e49\u0e40\u0e02\u0e49\u0e32\u0e01\u0e31\u0e1a\u0e41\u0e2a\u0e07\u0e41\u0e25\u0e30\u0e21\u0e38\u0e21\u0e21\u0e2d\u0e07\u0e02\u0e2d\u0e07\u0e09\u0e32\u0e01",
    wf_exp_master_bgfg_replace: "\u0e01\u0e32\u0e23\u0e41\u0e17\u0e19\u0e17\u0e35\u0e48\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e43\u0e19\u0e09\u0e32\u0e01\u0e17\u0e35\u0e48\u0e40\u0e02\u0e49\u0e21\u0e07\u0e27\u0e14\u0e17\u0e35\u0e48\u0e2a\u0e38\u0e14: \u0e25\u0e1a\u0e04\u0e19\u0e2d\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e09\u0e32\u0e01 reference \u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14 \u0e2a\u0e23\u0e49\u0e32\u0e07\u0e1e\u0e37\u0e49\u0e19\u0e2b\u0e25\u0e31\u0e07\u0e41\u0e25\u0e30\u0e09\u0e32\u0e01\u0e2b\u0e19\u0e49\u0e32\u0e17\u0e35\u0e48\u0e16\u0e39\u0e01\u0e1a\u0e31\u0e07\u0e02\u0e36\u0e49\u0e19\u0e43\u0e2b\u0e21\u0e48\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e1b\u0e47\u0e19\u0e18\u0e23\u0e23\u0e21\u0e0a\u0e32\u0e15\u0e34 \u0e41\u0e25\u0e49\u0e27\u0e27\u0e32\u0e07\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13\u0e25\u0e07\u0e15\u0e23\u0e07\u0e15\u0e33\u0e41\u0e2b\u0e19\u0e48\u0e07\u0e19\u0e31\u0e49\u0e19\u0e1e\u0e2d\u0e14\u0e35 \u2014 \u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32 \u0e17\u0e48\u0e32\u0e17\u0e32\u0e07 \u0e2a\u0e31\u0e14\u0e2a\u0e48\u0e27\u0e19 \u0e17\u0e23\u0e07\u0e1c\u0e21 \u0e40\u0e2a\u0e37\u0e49\u0e2d\u0e1c\u0e49\u0e32 \u0e1c\u0e34\u0e27 \u0e41\u0e25\u0e30\u0e41\u0e2a\u0e07 \u0e16\u0e39\u0e01\u0e25\u0e47\u0e2d\u0e01\u0e08\u0e32\u0e01\u0e20\u0e32\u0e1e\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 \u0e2a\u0e48\u0e27\u0e19 reference \u0e43\u0e2b\u0e49\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e09\u0e32\u0e01 \u0e21\u0e38\u0e21\u0e01\u0e25\u0e49\u0e2d\u0e07 \u0e41\u0e25\u0e30\u0e04\u0e27\u0e32\u0e21\u0e25\u0e36\u0e01\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19",
    wf_exp_subject_face: "\u0e1c\u0e2a\u0e32\u0e19\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e2b\u0e23\u0e37\u0e2d\u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32\u0e08\u0e32\u0e01 reference \u0e25\u0e07\u0e1a\u0e19\u0e20\u0e32\u0e1e base \u0e2d\u0e22\u0e48\u0e32\u0e07\u0e41\u0e19\u0e1a\u0e40\u0e19\u0e35\u0e22\u0e19 \u0e42\u0e14\u0e22\u0e04\u0e07\u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e02\u0e2d\u0e07\u0e20\u0e32\u0e1e base \u0e44\u0e27\u0e49",
    wf_exp_retouch: "\u0e23\u0e35\u0e17\u0e31\u0e0a\u0e1c\u0e34\u0e27 \u0e1c\u0e21 \u0e41\u0e25\u0e30\u0e42\u0e17\u0e19\u0e2a\u0e35\u0e43\u0e2b\u0e49\u0e14\u0e39\u0e40\u0e1b\u0e47\u0e19\u0e18\u0e23\u0e23\u0e21\u0e0a\u0e32\u0e15\u0e34 \u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32 \u0e40\u0e2d\u0e01\u0e25\u0e31\u0e01\u0e29\u0e13\u0e4c \u0e41\u0e25\u0e30\u0e2a\u0e35\u0e2b\u0e19\u0e49\u0e32\u0e22\u0e31\u0e07\u0e04\u0e07\u0e40\u0e14\u0e34\u0e21 \u2014 \u0e1c\u0e34\u0e27\u0e44\u0e21\u0e48\u0e1e\u0e25\u0e32\u0e2a\u0e15\u0e34\u0e01 \u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32\u0e44\u0e21\u0e48\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19",
    wf_exp_upscale: "\u0e02\u0e22\u0e32\u0e22\u0e20\u0e32\u0e1e\u0e1e\u0e23\u0e49\u0e2d\u0e21\u0e01\u0e39\u0e49\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e18\u0e23\u0e23\u0e21\u0e0a\u0e32\u0e15\u0e34\u0e02\u0e2d\u0e07\u0e1c\u0e34\u0e27 \u0e1c\u0e21 \u0e41\u0e25\u0e30\u0e40\u0e19\u0e37\u0e49\u0e2d\u0e1c\u0e49\u0e32\u0e01\u0e25\u0e31\u0e1a\u0e21\u0e32 \u0e43\u0e1a\u0e2b\u0e19\u0e49\u0e32 \u0e17\u0e48\u0e32\u0e17\u0e32\u0e07 \u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a \u0e41\u0e25\u0e30\u0e2a\u0e35\u0e22\u0e31\u0e07\u0e04\u0e07\u0e40\u0e14\u0e34\u0e21\u0e17\u0e38\u0e01\u0e2d\u0e22\u0e48\u0e32\u0e07 \u2014 \u0e44\u0e21\u0e48\u0e21\u0e35\u0e01\u0e32\u0e23\u0e40\u0e01\u0e25\u0e35\u0e48\u0e22\u0e08\u0e19\u0e14\u0e39\u0e1e\u0e25\u0e32\u0e2a\u0e15\u0e34\u0e01",
    wf_exp_object_edit: "\u0e25\u0e1a \u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 \u0e2b\u0e23\u0e37\u0e2d\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e27\u0e31\u0e15\u0e16\u0e38\u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e41\u0e01\u0e49\u0e44\u0e02\u0e40\u0e09\u0e1e\u0e32\u0e30\u0e08\u0e38\u0e14\u0e17\u0e35\u0e48\u0e04\u0e27\u0e1a\u0e04\u0e38\u0e21\u0e44\u0e14\u0e49 \u0e17\u0e38\u0e01\u0e2a\u0e34\u0e48\u0e07\u0e17\u0e35\u0e48\u0e44\u0e21\u0e48\u0e44\u0e14\u0e49\u0e41\u0e15\u0e30\u0e22\u0e31\u0e07\u0e04\u0e07\u0e40\u0e14\u0e34\u0e21",
    wf_exp_water_edit: "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2b\u0e23\u0e37\u0e2d\u0e41\u0e01\u0e49\u0e44\u0e02\u0e19\u0e49\u0e33 \u0e40\u0e07\u0e32\u0e2a\u0e30\u0e17\u0e49\u0e2d\u0e19 \u0e41\u0e25\u0e30\u0e1e\u0e37\u0e49\u0e19\u0e1c\u0e34\u0e27\u0e40\u0e1b\u0e35\u0e22\u0e01\u0e43\u0e2b\u0e49\u0e14\u0e39\u0e2a\u0e21\u0e08\u0e23\u0e34\u0e07\u0e15\u0e32\u0e21\u0e1f\u0e34\u0e2a\u0e34\u0e01\u0e2a\u0e4c \u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e01\u0e23\u0e30\u0e17\u0e1a\u0e15\u0e31\u0e27\u0e41\u0e1a\u0e1a\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13",
    wf_exp_text_logo: "\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e2b\u0e23\u0e37\u0e2d\u0e41\u0e01\u0e49\u0e44\u0e02\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e2b\u0e23\u0e37\u0e2d\u0e42\u0e25\u0e42\u0e01\u0e49\u0e17\u0e35\u0e48\u0e2a\u0e30\u0e2d\u0e32\u0e14\u0e41\u0e25\u0e30\u0e2d\u0e48\u0e32\u0e19\u0e07\u0e48\u0e32\u0e22\u0e1a\u0e19\u0e20\u0e32\u0e1e \u0e42\u0e14\u0e22\u0e22\u0e31\u0e07\u0e04\u0e07\u0e2d\u0e07\u0e04\u0e4c\u0e1b\u0e23\u0e30\u0e01\u0e2d\u0e1a\u0e40\u0e14\u0e34\u0e21"
  },
  /* ---- Chinese (Simplified) (zh) — 587 keys, complete ---- */
  zh: {
    gate_sub_login: "请用你的 HNK 账户登录后使用本面板。",
    gate_email_ph: "邮箱",
    gate_pass_ph: "密码",
    gate_signin: "登录",
    gate_checking: "正在检查你的套餐…",
    gate_need: "请输入邮箱和密码。",
    gate_bad: "邮箱或密码不正确。",
    gate_offline: "没有网络 — 无法检查你的套餐。请联网后再次检查。",
    gate_locked: "一次付费，两个都能用 — 入会费和月费同时开通网页应用和这个 Photoshop 面板。请在网站上购买或续费，然后再次检查。",
    gate_buy: "打开网站",
    gate_retry: "再次检查",
    gate_signout: "退出登录",
    gate_days: "剩余 {D} 天",
    gate_grace: "离线 — 还可离线使用 {D} 天",
    gate_open_fail: "无法打开浏览器。网址：{U}",
    app_title: "HNK Ai \u9762\u677f\uff08\u5b66\u751f\u7248\uff09",
    sec_api: "Gemini API \u5bc6\u94a5",
    btn_show: "\u663e\u793a",
    btn_hide: "\u9690\u85cf",
    btn_test: "\u6d4b\u8bd5",
    btn_save: "\u4fdd\u5b58",
    st_testing: "\u6b63\u5728\u6d4b\u8bd5\u5bc6\u94a5",
    st_key_ok: "\u2713 API \u5bc6\u94a5\u53ef\u7528",
    st_key_bad: "API \u5bc6\u94a5\u5931\u8d25",
    st_key_saved: "\u5df2\u4fdd\u5b58 API \u5bc6\u94a5 \u2713",
    st_need_key: "\u8bf7\u5148\u8f93\u5165 Gemini API \u5bc6\u94a5",
    sec_model: "\u6a21\u578b\u4e0e\u8f93\u51fa",
    scope_model_note: "\u7528\u4e8e\u4e0b\u65b9 Prompt \u6807\u7b7e\u9875\u7684 Generate \u6309\u94ae \u2014 Create \u4e0e AI Tools \u5404\u6709\u72ec\u7acb\u7684\u6a21\u578b\u8bbe\u7f6e\u3002",
    model_auto: "\u81ea\u52a8\uff08\u63a8\u8350\uff09",
    model_flash: "Flash \u2014 \u5feb\u901f (2.5)",
    model_pro: "Pro \u2014 \u9ad8\u8d28 (3.0)",
    lbl_ratio: "\u6bd4\u4f8b",
    ratio_auto: "\u81ea\u52a8\u6bd4\u4f8b\uff08\u6765\u81ea\u6587\u6863\uff09",
    lbl_size: "\u5c3a\u5bf8",
    lbl_quality: "\u8d28\u91cf",
    qual_auto: "\u81ea\u52a8",
    qual_low: "\u4f4e",
    qual_med: "\u4e2d",
    qual_high: "\u9ad8",
    sec_prompt: "\u63d0\u793a\u8bcd",
    hint_prompt: "\u5728\u6b64\u8f93\u5165\u63d0\u793a\u8bcd\u2026\uff08\u6700\u591a 20,000 \u5b57\u7b26\uff09",
    btn_improve: "\u4f18\u5316",
    btn_clear: "\u6e05\u9664",
    st_improving: "\u6b63\u5728\u4f18\u5316\u63d0\u793a\u8bcd",
    st_improved: "\u63d0\u793a\u8bcd\u5df2\u4f18\u5316 \u2713",
    sec_refs: "\u53c2\u8003\u56fe",
    base_note: "\u57fa\u7840\u56fe = \u5f53\u524d\u6253\u5f00\u7684 Photoshop \u6587\u6863\uff08\u81ea\u52a8\u6293\u53d6\uff09\u3002",
    btn_ref_layer: "+ \u56fe\u5c42",
    btn_ref_file: "\u6587\u4ef6",
    btn_ref_web: "\u7f51\u9875",
    st_ref_layer_added: "\u56fe\u5c42\u5df2\u6dfb\u52a0\u4e3a\u53c2\u8003\u56fe \u2713",
    st_ref_file_added: "\u6587\u4ef6\u5df2\u6dfb\u52a0\u4e3a\u53c2\u8003\u56fe \u2713",
    st_importing: "\u6b63\u5728\u5bfc\u5165\u6587\u4ef6",
    url_title: "\u4ece URL \u52a0\u8f7d\u56fe\u7247",
    url_ph: "https://\u2026 \u56fe\u7247\u5730\u5740\u6216 Pinterest \u94fe\u63a5",
    btn_paste: "\u7c98\u8d34",
    btn_load: "\u52a0\u8f7d",
    btn_cancel: "\u53d6\u6d88",
    st_url_loading: "\u6b63\u5728\u4e0b\u8f7d\u7f51\u7edc\u56fe\u7247",
    st_ref_web_added: "\u7f51\u7edc\u56fe\u7247\u5df2\u6dfb\u52a0\u4e3a\u53c2\u8003\u56fe \u2713",
    st_url_bad: "\u65e0\u6cd5\u4ece\u8be5 URL \u8f7d\u5165\u56fe\u7247 \u2014 \u8bf7\u590d\u5236\u56fe\u7247\u5730\u5740\u540e\u91cd\u8bd5",
    no_layer: "\u672a\u9009\u62e9\u56fe\u5c42",
    sec_presets: "AI \u9884\u8bbe",
    auto_run: "\u70b9\u51fb\u9884\u8bbe \u2192 \u81ea\u52a8\u751f\u6210\uff08\u5173 = \u4ec5\u63d2\u5165\u63d0\u793a\u8bcd\uff09",
    grp_cleanup: "\u6e05\u7406\u5de5\u5177",
    p_remove_people: "\u79fb\u9664\u4eba\u7269",
    p_fix_hands: "\u4fee\u590d\u591a\u4f59\u7684\u624b",
    p_fix_legs: "\u4fee\u590d\u591a\u4f59\u7684\u817f",
    p_full_clean: "\u5168\u9762\u6e05\u7406",
    grp_moved_note: "Reference \u5de5\u5177\u5df2\u79fb\u5230\u4e0b\u65b9\u7684 Reference Ops Pro \u5361\u7247\uff08\u96c6\u4e2d\u4e00\u5904\uff0c\u542b Solo/Couple/Family \u4e0e\u6307\u5f15\uff09\u3002",
    ro_h_detail: "\u5934\u53d1 \u00b7 \u914d\u9970 \u00b7 \u59ff\u52bf (\u2190 Ref1)",
    ro_h_comp: "\u5408\u6210 \u00b7 \u98ce\u683c \u00b7 \u6587\u5b57 (\u2190 Ref1)",
    p_fgbglc: "\u524d\u666f=\u6587\u6863 \u00b7 \u80cc\u666f=Ref1 \u00b7 \u5149=Ref2",
    p_hair: "\u53d1\u578b (\u2190 Ref1)",
    p_access: "\u73e0\u5b9d+\u914d\u9970 (\u2190 Ref1)",
    p_pose: "\u59ff\u52bf\u5339\u914d\uff08\u6587\u6863 \u2192 Ref1\uff09",
    p_fgprops: "\u524d\u666f\u9053\u5177 (\u2190 Ref1)",
    p_textlogo: "\u6587\u5b57 / \u6807\u5fd7 (\u2190 Ref1)",
    p_style: "\u7167\u7247\u98ce\u683c (\u2190 Ref1)",
    grp_repsubj: "\u66ff\u6362\u4e3b\u4f53\uff08\u6587\u6863 \u2192 Ref1 \u573a\u666f\uff09",
    p_rep_solo: "\u66ff\u6362\u5355\u4eba",
    p_rep_couple: "\u66ff\u6362\u60c5\u4fa3",
    p_rep_family: "\u66ff\u6362\u5bb6\u5ead",
    grp_rmix: "\u6df7\u5408\u66ff\u6362 \u2014 \u52fe\u9009\u5e76\u53d6\u81ea Ref1",
    rm_bg: "\u80cc\u666f (BG)",
    rm_fg: "\u524d\u666f (FG)",
    rm_light: "\u5149\u7ebf",
    rm_color: "\u989c\u8272",
    rm_object: "\u7269\u4f53 / \u9053\u5177",
    btn_rmix: "\u66ff\u6362\u751f\u6210",
    rm_none: "\u8bf7\u5148\u52fe\u9009\u81f3\u5c11\u4e00\u9879",
    grp_i2p: "\u56fe\u7247 \u2192 \u63d0\u793a\u8bcd\uff08\u573a\u666f\u6784\u5efa\uff09",
    i2p_note: "1) \u63d0\u53d6\uff1aRef1 \u573a\u666f \u2192 \u8be6\u7ec6\u6587\u5b57 prompt\uff08\u4e0d\u542b\u4eba\u7269\uff09\u30022) \u5728 Prompt \u9875\u9762\u7f16\u8f91\u30023) SCENE GENERATE \u56f4\u7ed5\u4f60\u6587\u6863\u4e2d\u7684\u4e3b\u4f53\u91cd\u5efa\u573a\u666f \u2014 \u81ea\u52a8\u9002\u914d\u4efb\u610f\u89d2\u5ea6\u3002Face/Pose/Frame \u9501 = \u4fdd\u6301\u539f\u6837\u3002",
    i2p_objects: "\u7269\u4f53\u4e0e\u9053\u5177\u7ec6\u8282",
    i2p_light: "\u5149\u7ebf\u7ec6\u8282",
    i2p_color: "\u989c\u8272 / \u8c03\u8272\u7ec6\u8282",
    i2p_bg: "\u80cc\u666f\u7ec6\u8282",
    i2p_fg: "\u524d\u666f\u7ec6\u8282",
    btn_i2p: "\u56fe\u7247 \u2192 \u63d0\u793a\u8bcd\uff08\u63d0\u53d6\u573a\u666f\uff09",
    i2p_fit: "Scene Auto-Fit \u2014 \u5c06\u573a\u666f\u91cd\u6295\u5f71\u5230\u6587\u6863\u7684\u89d2\u5ea6\uff0f\u8ddd\u79bb\uff0f\u955c\u5934",
    i2p_adapt: "\u8ba9\u4e3b\u4f53\u5149\u8272\u9002\u914d\u573a\u666f",
    btn_scenegen: "\u573a\u666f\u751f\u6210",
    st_extract: "\u6b63\u5728\u628a\u573a\u666f\u63d0\u53d6\u4e3a\u63d0\u793a\u8bcd",
    st_extract_done: "\u573a\u666f\u63d0\u793a\u8bcd\u5c31\u7eea \u2014 \u5728\u63d0\u793a\u8bcd\u9875\u67e5\u770b",
    scene_no_prompt: "\u63d0\u793a\u6846\u4e3a\u7a7a \u2014 \u8bf7\u5148\u8fd0\u884c \u56fe\u7247 \u2192 \u63d0\u793a\u8bcd",
    i2p_none: "\u8bf7\u5148\u52fe\u9009\u81f3\u5c11\u4e00\u9879\u7ec6\u8282",
    sec_light: "\u5f71\u5ba4\u706f\u5149 \u2014 AI \u91cd\u65b0\u5e03\u5149",
    light_note: "\u52fe\u9009\u5f00\u706f\uff0c\u70b9\u6309\u67d0\u4e00\u884c\u9009\u4e2d\uff0c\u518d\u7528\u6ed1\u6746\u5851\u5f62 \u2014 3D \u9876\u89c6\u56fe\u5b9e\u65f6\u8ddf\u968f\uff08\u25b4 = \u9ad8\u4f4d\uff0c\u25be = \u4f4e\u4f4d\uff09\u3002LIGHTING GENERATE \u4f1a\u4e25\u683c\u6309\u6b64\u5e03\u5149\u91cd\u65b0\u6253\u5149\uff1b\u8138\u90e8\uff0f\u59ff\u52bf\uff0f\u6784\u56fe\u4fdd\u6301\u9501\u5b9a\u3002",
    lbl_my_prompt: "\u7f05\u7538\u8bed\u63d0\u793a\u8bcd",
    lstage_model: "\u6a21\u7279",
    lstage_cam: "\u76f8\u673a",
    l_key: "\u4e3b\u5149",
    l_fill: "\u8865\u5149 / \u6b63\u9762",
    l_butterfly: "\u8774\u8776\u5149\uff08\u4e0a-\u524d\uff09",
    l_side: "\u4fa7\u5149",
    l_rim: "\u8f6e\u5ed3\u5149",
    l_back: "\u80cc\u5149",
    l_hair: "\u53d1\u5149",
    l_bglight: "\u80cc\u666f\u5149",
    lt_softbox: "\u67d4\u5149\u7bb1",
    lt_octa: "\u516b\u89d2",
    lt_strip: "\u957f\u6761",
    lt_umbrella: "\u4f1e",
    lt_beauty: "\u7f8e\u989c\u7897",
    lt_hard: "\u786c\u5149",
    li_int: "\u5f3a\u5ea6",
    li_angle: "\u89d2\u5ea6",
    li_height: "\u9ad8\u5ea6",
    li_dist: "\u8ddd\u79bb",
    li_size: "\u5c3a\u5bf8",
    btn_lightgen: "\u706f\u5149\u751f\u6210",
    light_none: "\u8bf7\u5148\u6253\u5f00\u81f3\u5c11\u4e00\u76cf\u706f",
    lg_equip: "\u5728\u7167\u7247\u4e2d\u663e\u793a\u706f\u5177\uff08\u53ef\u89c1\u67d4\u5149\u7bb1 / \u706f\u67b6\uff09",
    grp_chains: "\u98ce\u683c\u94fe \u2014 \u7ec4\u5408 \u2713 \u98ce\u683c",
    chains_note: "\u5f00\u542f\u4efb\u610f\u98ce\u683c \u2014 \u5b83\u4eec\u4f1a\u4e00\u5e76\u878d\u5165\u6bcf\u4e00\u6b21 Generate / preset / Retouch\u3002",
    grp_restore: "\u8001\u7167\u7247\u4fee\u590d",
    p_restore: "\u8001\u7167\u7247\u4fee\u590d",
    rest_color: "\u5168\u5f69",
    rest_bw: "\u9ed1\u767d",
    restore_note: "\u4fee\u590d\u6495\u88c2\u3001\u6c34\u6e0d\uff0f\u70e7\u635f\u4e0e\u892a\u8272 \u2014 \u6bcf\u4e00\u5f20\u539f\u59cb\u9762\u5b54\u4fdd\u6301 100% \u4e00\u81f4\u3002",
    rt_browstyle: "\u7709\u5f62",
    rt_lashstyle: "\u776b\u6bdb\u6837\u5f0f",
    rt_blush: "\u816e\u7ea2\u989c\u8272",
    rt_contour: "\u4fee\u5bb9\u6837\u5f0f",
    rt_bust: "\u80f8\u90e8",
    rt_butt: "\u81c0\u90e8",
    rt_thigh: "\u5927\u817f",
    rt_calf: "\u5c0f\u817f",
    rt_neck: "\u9888\u90e8",
    rt_fingers: "\u624b\u6307",
    hint_prompt_my: "\u53ef\u4ee5\u76f4\u63a5\u7528\u4e2d\u6587\u5199 \u2014 Generate \u65f6\u4f1a\u81ea\u52a8\u7ffb\u8bd1\u6210\u82f1\u6587\uff08\u6700\u591a 20,000 \u5b57\u7b26\uff09",
    st_translate: "\u6b63\u5728\u628a\u7f05\u7538\u8bed\u63d0\u793a\u8bcd\u8bd1\u4e3a\u82f1\u6587",
    live_trans: "\u5b9e\u65f6\u7ffb\u8bd1 (EN \u21c4 MY)",
    st_retry: "\u6b63\u5728\u91cd\u8bd5",
    grp_recipes: "\u914d\u65b9 \u2014 \u4fdd\u5b58 / \u5206\u4eab\u8bbe\u7f6e",
    recipe_note: "\u628a\u5168\u90e8\u8bbe\u7f6e\uff08chains\u3001retouch\u3001\u706f\u5149\u3001\u9501\u5b9a\u3001prompt\uff09\u5b58\u6210\u4e00\u4e2a .json \u914d\u65b9 \u2014 \u5b66\u751f\u53ea\u9700 Load\u3002",
    btn_recipe_save: "\u4fdd\u5b58\u914d\u65b9",
    btn_recipe_load: "\u8f7d\u5165\u914d\u65b9",
    st_recipe_saved: "\u914d\u65b9\u5df2\u4fdd\u5b58 \u2713",
    st_recipe_loaded: "\u914d\u65b9\u5df2\u8f7d\u5165 \u2713 \u2014 \u6240\u6709\u63a7\u4ef6\u5df2\u66f4\u65b0",
    st_recipe_bad: "\u4e0d\u662f HNK \u914d\u65b9\u6587\u4ef6",
    sec_final: "\u6700\u7ec8\u63d0\u793a\u8bcd",
    btn_copy: "\u590d\u5236",
    st_copied: "\u5df2\u590d\u5236 \u2713",
    hist_note: "\u5386\u53f2 \u2014 \u6700\u8fd1 6 \u4e2a\u7ed3\u679c\uff0c\u70b9\u6309\u67e5\u770b\uff1a",
    btn_hist_prompt: "\u2192 \u63d0\u793a\u8bcd",
    sec_batch: "\u6279\u5904\u7406\u6a21\u5f0f",
    batch_note: "\u9009\u62e9\u591a\u5f20\u7167\u7247 + \u4e00\u4e2a\u8f93\u51fa\u6587\u4ef6\u5939 \u2014 \u5f53\u524d\u7684 prompt\u3001chains\u3001cleanup \u4e0e Keep \u9501\u4f1a\u4f5c\u7528\u4e8e\u6bcf\u5f20\u7167\u7247\uff1b\u7ed3\u679c\u4fdd\u5b58\u4e3a *_HNK.png\u3002",
    btn_batch: "\u8fd0\u884c\u6279\u5904\u7406",
    btn_batch_stop: "\u505c\u6b62",
    st_batch: "\u6279\u5904\u7406",
    st_batch_done: "\u6279\u5904\u7406\u5b8c\u6210",
    sec_web: "Web AI \u2014 \u8ff7\u4f60\u6d4f\u89c8\u5668",
    web_note: "\u5728 Photoshop \u5185\u6253\u5f00\u4efb\u610f\u7f51\u9875\u7248 AI \u7f16\u8f91\u5668\u3002\u5728\u90a3\u91cc\u751f\u6210\uff0c\u518d\u628a\u7ed3\u679c\u4f5c\u4e3a layer \u53d6\u56de\uff1a",
    web_import_note: "\u5bfc\u5165\uff1a\u2460 \u5728\u7f51\u9875\u5e94\u7528\u4e2d\u4f7f\u7528 Copy image address\uff0c\u7136\u540e\u70b9 IMPORT COPIED LINK \u00b7 \u2461 \u6216\u4e0b\u8f7d\u6587\u4ef6\u540e\u4f7f\u7528 IMPORT FILE \u00b7 \u2462 \u5e26 HNK bridge \u7684\u5408\u4f5c\u7f51\u9875\u5e94\u7528\u4f1a\u81ea\u52a8\u9001\u5165\u56fe\u7247\u3002",
    btn_web_go: "\u524d\u5f80",
    btn_web_home: "\u4e3b\u9875",
    btn_web_reload: "\u91cd\u8f7d",
    btn_web_import_link: "\u5bfc\u5165\u5df2\u590d\u5236\u94fe\u63a5 \u2192 PS",
    btn_web_import_file: "\u5bfc\u5165\u6587\u4ef6 \u2192 PS",
    st_web_import: "\u5df2\u4f5c\u4e3a\u56fe\u5c42\u5bfc\u5165 Photoshop \u2713",
    st_web_nourl: "\u8bf7\u5148\u590d\u5236\u56fe\u7247\u94fe\u63a5\uff08\u53f3\u952e \u2192 \u590d\u5236\u56fe\u7247\u5730\u5740\uff09",
    st_web_fetch: "\u6b63\u5728\u4ece\u94fe\u63a5\u83b7\u53d6\u56fe\u7247",
    st_web_notallowed: "\u8be5\u57df\u540d\u4e0d\u5728\u5141\u8bb8\u5217\u8868\u4e2d \u2014 \u9875\u9762\u53ef\u80fd\u4fdd\u6301\u7a7a\u767d\u3002\u53ef\u8bf7 HNK \u6dfb\u52a0\u3002",
    st_need_doc: "\u8bf7\u5148\u5728 Photoshop \u4e2d\u6253\u5f00\u7167\u7247\u6587\u6863",
    sec_campro: "\u76f8\u673a Pro \u4e0e\u753b\u8d28",
    autosave_lbl: "\u6bcf\u4e2a\u7ed3\u679c\u81ea\u52a8\u5bfc\u51fa\uff08PNG + \u63d0\u793a\u8bcd\u65e5\u5fd7 \u2192 \u6587\u4ef6\u5939\uff09",
    st_folder_ok: "\u5df2\u8bbe\u7f6e\u5bfc\u51fa\u6587\u4ef6\u5939 \u2713",
    st_exported: "\u5df2\u5bfc\u51fa \u2713",
    st_export_fail: "\u5bfc\u51fa\u5931\u8d25 \u2014 \u8bf7\u68c0\u67e5\u6587\u4ef6\u5939",
    st_pro_fallback: "Pro \u6a21\u578b\u4e0d\u53ef\u7528 \u2014 \u672c\u6b21\u6539\u7528 Flash",
    st_img_bad: "\u56fe\u7247\u6570\u636e\u672a\u901a\u8fc7\u5b8c\u6574\u6027\u68c0\u67e5 \u2014 \u8bf7\u91cd\u65b0\u6dfb\u52a0\u7167\u7247",
    st_auto_comp: "\u81ea\u52a8\u5408\u6210\uff1aIMAGE 1 \u4e3b\u4f53 \u2192 \u53c2\u8003\u573a\u666f",
    prov_lbl: "AI \u63d0\u4f9b\u65b9",
    oai_key_ph: "sk-...\uff08OpenAI API \u5bc6\u94a5\uff09",
    tab_create: "\u521b\u5efa",
    create_note: "\u521b\u5efa\u6a21\u5f0f \u2014 \u4ec5\u51ed\u63d0\u793a\u8bcd\u751f\u6210\u5168\u65b0\u56fe\u7247\uff08\u542b\u81ea\u5e26 4 \u5f20\u53c2\u8003\u56fe\uff09",
    create_ph: "\u63cf\u8ff0\u4f60\u60f3\u521b\u5efa\u7684\u56fe\u7247\u2026",
    btn_create_ps: "\u2b07 \u53d1\u9001\u5230 Photoshop",
    btn_to_ref: "\u21ba \u7528\u4f5c Ref 1",
    st_to_ref: "\u7ed3\u679c\u5df2\u8f7d\u5165 Ref 1 \u2713",
    scope_create_note: "\u72ec\u7acb\u4e8e Setup \u7684 Model & Output \u2014 \u8fd9\u4e9b\u8bbe\u7f6e\u53ea\u4f5c\u7528\u4e8e Create \u7684 Generate\u3002",
    cr_ratio: "\u6bd4\u4f8b",
    cr_var: "\u53d8\u4f53\u6570",
    cr_restyle: "\u267b \u91cd\u5851\u98ce\u683c",
    cr_lib: "\u63d0\u793a\u8bcd\u5e93 \u2014 \u70b9\u6309\u63d2\u5165",
    cr_improve: "\u2728 \u4f18\u5316",
    cr_describe: "\ud83d\udd0d \u63cf\u8ff0 Ref 1 \u2192 \u63d0\u793a\u8bcd",
    st_describing: "\u6b63\u5728\u8bfb\u53d6\u53c2\u8003\u56fe\u2026",
    st_described: "\u5df2\u7531 Ref 1 \u751f\u6210\u63d0\u793a\u8bcd \u2713",
    st_need_gem: "\u8bf7\u6dfb\u52a0 Gemini API \u5bc6\u94a5\uff08\u8bbe\u7f6e\uff09\u2014 \u6b64\u529f\u80fd\u7528 Gemini \u6587\u672c",
    st_need_ref1: "\u8bf7\u5148\u7ed9 Ref 1 \u6dfb\u52a0\u56fe\u7247",
    st_lib_added: "\u5df2\u6dfb\u52a0\u63d0\u793a\u8bcd \u2713",
    cr_refs: "\u53c2\u8003\u56fe\uff08\u6700\u591a 4 \u5f20\uff09",
    cr_refs_note: "\u53ef\u9009 \u2014 \u7528 Layer / File / Web \u6dfb\u52a0\u3002Create \u53ea\u53d6\u7528\u4f60 prompt \u4e2d\u8981\u6c42\u7684\u5185\u5bb9\u3002",
    cr_results: "\u7ed3\u679c",
    cr_gal_empty: "\u6682\u65e0\u7ed3\u679c \u2014 \u70b9\u6309\u751f\u6210\u3002",
    cr_gal_have: "\u4e2a\u7ed3\u679c \u00b7 \u70b9\u7f29\u7565\u56fe\u9884\u89c8 / \u64cd\u4f5c",
    cr_save: "\u2b07 \u4fdd\u5b58 PNG",
    cr_engine: "\u5f15\u64ce",
    cr_need_result: "\u8bf7\u5148\u751f\u6210\u56fe\u7247",
    btn_web_import_url: "\u2b07 \u5bfc\u5165 URL",
    st_clip_help: "\u526a\u8d34\u677f\u4e3a\u7a7a\u6216\u88ab\u963b\u6b62 \u2014 \u8bf7\u628a\u94fe\u63a5\u7c98\u8d34\u5230 URL \u680f\uff0c\u518d\u70b9 \u2b07 Import URL",
    st_web_blob: "\u90a3\u662f\u4e34\u65f6\u7684 blob: \u94fe\u63a5 \u2014 \u8bf7\u53f3\u952e \u2192 Copy IMAGE Address\uff0c\u6216\u4fdd\u5b58\u6587\u4ef6\u540e\u4f7f\u7528 Import File",
    err_key: "API key \u65e0\u6548 \u2014 \u8bf7\u5728 Setup \u6807\u7b7e\u9875\u91cd\u65b0\u68c0\u67e5\u5bc6\u94a5",
    err_quota: "\u914d\u989d\uff0f\u901f\u7387\u53d7\u9650 \u2014 \u8bf7\u7a0d\u5019\u518d\u91cd\u8bd5",
    err_big: "\u56fe\u7247\u8d85\u51fa API \u9650\u5236 \u2014 \u8bf7\u7f29\u5c0f\u540e\u91cd\u8bd5",
    err_safety: "\u88ab\u5b89\u5168\u8fc7\u6ee4\u5668\u62e6\u622a \u2014 \u8bf7\u8c03\u6574 prompt \u6216\u7167\u7247\u540e\u91cd\u8bd5",
    err_net: "\u7f51\u7edc\uff0f\u670d\u52a1\u5668\u95ee\u9898 \u2014 \u8bf7\u91cd\u8bd5",
    err_timeout: "\u8bf7\u6c42\u8d85\u65f6 \u2014 \u670d\u52a1\u5668\u8017\u65f6\u8fc7\u957f\uff0c\u8bf7\u91cd\u8bd5",
    err_generic: "\u8bf7\u6c42\u672a\u80fd\u5b8c\u6210 \u2014 \u8bf7\u91cd\u8bd5",
    err_img: "\u672a\u751f\u6210\u53ef\u7528\u7684\u56fe\u7247 \u2014 \u8bf7\u91cd\u8bd5",
    err_mode: "\u6b64\u6587\u6863\u4e0d\u662f RGB \u6a21\u5f0f \u2014 \u8bf7\u5148\u8f6c\u6362\uff08\u56fe\u50cf \u25b8 \u6a21\u5f0f \u25b8 RGB \u989c\u8272\uff09\u518d\u91cd\u8bd5",
    cam_master: "\u76f8\u673a\u5757\u5f00\u542f \u2014 \u8ffd\u52a0\u5230\u6bcf\u4e2a\u63d0\u793a\u8bcd\u672b\u5c3e",
    cam_body: "\u673a\u8eab",
    cam_lens: "\u5b9a\u7126\u955c\u5934 (mm)",
    cam_f: "\u5149\u5708",
    cam_film: "\u80f6\u7247\u98ce\u683c",
    cam_bokeh: "\u6563\u666f\u6837\u5f0f",
    cam_iso: "ISO",
    cam_k: "\u767d\u5e73\u8861\u5f00\u5c14\u6587",
    cam_note: "\u5148\u5f00\u542f\u6b64\u533a\u5757\uff0c\u518d\u53ea\u6311\u4f60\u9700\u8981\u7684 \u2014 \u6807\u4e3a \u2013 \u7684 chip \u4e0d\u4f1a\u5199\u5165\u3002\u6240\u6709\u5185\u5bb9\u90fd\u8ffd\u52a0\u5230\u6700\u7ec8 prompt \u672b\u5c3e\u3002",
    ro_h_main: "REFERENCE OPS PRO (Ref1 / Ref2)",
    ro_note: "Ref1 = IMAGE 2\uff08\u5973\u65b9\uff09\u00b7 Ref2 = IMAGE 3\uff08\u7537\u65b9\uff09\u3002\u5148\u9009\u76ee\u6807\u518d\u6267\u884c \u2014 \u672a\u5339\u914d\u7684\u4eba\u7269\u7edd\u4e0d\u4f1a\u88ab\u6539\u52a8\u3002",
    ro_target: "\u76ee\u6807",
    ro_solo: "\u5355\u4eba",
    ro_couple: "\u60c5\u4fa3",
    ro_family: "\u5bb6\u5ead",
    ro_mk: "\u590d\u5236\u53c2\u8003\u5986\u5bb9",
    ro_hair: "\u53d6\u53c2\u8003\u53d1\u578b",
    ro_h_face: "\u9762\u90e8\u64cd\u4f5c",
    ro_h_bg: "\u80cc\u666f / \u524d\u666f\u64cd\u4f5c",
    ro_h_sub: "\u4e3b\u4f53\u64cd\u4f5c",
    ro_h_lc: "\u5149\u4e0e\u8272\u64cd\u4f5c",
    ro_h_dress: "\u670d\u88c5\u64cd\u4f5c",
    ro_h_mk: "\u5986\u5bb9\u64cd\u4f5c",
    ro_h_match: "\u2605 \u4e3b\u5339\u914d\uff08\u7edf\u4e00\u98ce\u683c\uff09",
    ro_match_note: "\u8ba9 IMAGE 1 \u4e0e reference \u76f8\u5339\u914d\uff0c\u770b\u8d77\u6765\u50cf\u540c\u4e00\u6b21\u8c03\u8272 \u2014 \u52fe\u9009\u8981\u5339\u914d\u7684\u9879\uff1a",
    m_color: "\u989c\u8272",
    m_light: "\u5149\u7ebf",
    m_makeup: "\u5986\u5bb9",
    m_skin: "\u76ae\u80a4\u4fee\u9970",
    crd_pipe: "\u26d3 \u6d41\u6c34\u7ebf\u6784\u5efa\u5668 \u2014 \u4efb\u610f\u4e32\u8054",
    pipe_note: "\u628a\u4efb\u610f\u6b65\u9aa4\u4e32\u6210\u4e00\u6761\u94fe \u2014 \u6bcf\u4e00\u6b65\u7684\u7ed3\u679c\u90fd\u4f1a\u9001\u8fdb\u4e0b\u4e00\u6b65\u3002\u6700\u591a 6 \u6b65\u3002",
    pipe_add: "+ \u6dfb\u52a0",
    pipe_run: "\u25b6 \u8fd0\u884c\u6d41\u6c34\u7ebf",
    pipe_clear: "\u6e05\u7a7a",
    pipe_retouch: "\u5e94\u7528\u4fee\u9970\uff08\u5f53\u524d\u6ed1\u5757\uff09",
    pipe_relight: "\u91cd\u65b0\u5e03\u5149\uff08\u5f53\u524d\u706f\u7ec4\uff09",
    pipe_prompt: "\u63d0\u793a\u8bcd\uff08\u5f53\u524d\u82f1\u6587\u6846\uff09",
    pipe_empty: "\u8bf7\u5148\u6dfb\u52a0\u81f3\u5c11\u4e00\u6b65",
    pipe_max: "\u6d41\u6c34\u7ebf\u5df2\u6ee1\uff08\u6700\u591a 6 \u6b65\uff09",
    st_pipe: "\u6d41\u6c34\u7ebf\u6b65\u9aa4",
    st_pipe_done: "\u6d41\u6c34\u7ebf\u5b8c\u6210",
    st_pipe_stop: "\u6d41\u6c34\u7ebf\u505c\u6b62\uff08\u67d0\u6b65\u5931\u8d25\uff09",
    pipe_merge: "\u26a1 \u4e00\u6b21\u6027\u5408\u5e76 \u2014 \u6240\u6709\u6b65\u9aa4\u5408\u5e76\u4e3a\u4e00\u6b21\u8c03\u7528\uff08\u5feb\u4e14\u7701 \u00b7 \u5efa\u8bae \u2264 3 \u9879\u4efb\u52a1\uff09",
    crd_chainsrest: "\u98ce\u683c\u94fe + \u8001\u7167\u7247\u4fee\u590d",
    crd_refops: "Reference Ops Pro (Ref1 / Ref2)",
    crd_scenes: "\ud83c\udfac Scenes Pro \u2014 \u9501\u5b9a\u4e3b\u4f53 \u00b7 \u573a\u666f\u5339\u914d",
    scn_note: "\u9501\u5b9a\u4e3b\u4f53\uff08\u8138 \u00b7 \u59ff\u52bf \u00b7 \u670d\u88c5 \u00b7 \u6784\u56fe\uff09\uff0c\u7136\u540e\u91cd\u5efa\u6574\u4e2a\u573a\u666f\u6765\u5339\u914d\u4e3b\u4f53 \u2014 \u5149\u7ebf\u3001\u9634\u5f71\u3001\u989c\u8272\u3001\u80cc\u666f\u3001\u524d\u666f\u3001\u7269\u4f53\u5168\u90e8\u81ea\u52a8\u9002\u914d",
    scn_h_style: "\u573a\u666f\u98ce\u683c\uff08\u5ba4\u5185 / \u6587\u5316\uff09",
    scn_h_bday: "\ud83c\udf82 \u751f\u65e5 \u2014 \u5e74\u9f84 1\u201345",
    scn_h_cap: "\u6807\u9898 / \u6587\u5b57",
    scn_h_scarf: "\u6237\u5916 / \u98d8\u52a8\u4e1d\u5dfe",
    scn_grad: "\u6bd5\u4e1a\uff08\u5ba4\u5185\uff09",
    scn_prewed: "\u5a5a\u7eb1\uff08\u5ba4\u5185\uff09",
    scn_vietnam: "\u8d8a\u5357",
    scn_myanmar: "\u7f05\u7538",
    scn_chinese: "\u4e2d\u5f0f",
    scn_shan: "\u63b8\u65cf",
    scn_newborn: "\u65b0\u751f\u513f",
    scn_age: "\u5e74\u9f84",
    scn_bday_go: "\ud83c\udf82 \u751f\u65e5\u573a\u666f",
    scn_cap_on: "\u6dfb\u52a0\u6807\u9898\u6587\u5b57",
    scn_cap_ph: "\u6807\u9898\u6587\u5b57\uff08\u4f8b\u5982 Happy 1st Birthday\u3001\u540d\u5b57\uff09\u2026",
    scn_cap_pos: "\u4f4d\u7f6e",
    scn_top: "\u9876\u90e8",
    scn_bottom: "\u5e95\u90e8",
    scn_scarf: "\u2726 \u98d8\u52a8\u4e1d\u5dfe\u573a\u666f",
    scn_dir: "\u65b9\u5411",
    scn_left: "\u5de6",
    scn_right: "\u53f3",
    scn_up: "\u4e0a",
    scn_len: "\u957f\u5ea6",
    scn_short: "\u77ed",
    scn_long: "\u957f",
    g_cat_scene: "SCENE OP \u2014 \u4f60\u7684\u4e3b\u4f53\u88ab\u9501\u5b9a\uff08\u8138\u90e8 \u00b7 \u59ff\u52bf \u00b7 \u670d\u88c5 \u00b7 \u6784\u56fe\uff09\uff1b\u751f\u6210\u7684\u6574\u4e2a\u573a\u666f\uff08\u5149\u7ebf\u3001\u9634\u5f71\u3001\u8272\u5f69\u3001\u80cc\u666f\u3001\u524d\u666f\u3001\u7269\u4ef6\u3001\u6c1b\u56f4\uff09\u90fd\u4f1a\u81ea\u52a8\u5339\u914d\u4e3b\u4f53\uff0c\u5408\u6210\u51fa\u771f\u5b9e\u7167\u7247\u822c\u7684\u6548\u679c\u3002",
    crd_wed: "\u2665 \u5a5a\u793c\u4e13\u4e1a\u5957\u4ef6",
    crd_recipes: "\u914d\u65b9 \u2014 \u4fdd\u5b58 / \u5206\u4eab",
    learn_lbl: "\ud83c\udf93 \u5b66\u4e60\u6a21\u5f0f \u2014 \u7b2c1\u6b21\u70b9\u6309=\u6307\u5357(\u9ec4), \u7b2c2\u6b21=\u63d0\u793a\u8bcd(\u84dd), \u7b2c3\u6b21=\u8fd0\u884c(\u7eff)",
    guide_hint: "\u518d\u6b21\u70b9\u6309\uff1a\u9ec4 \u2192 \u84dd\uff08\u63d0\u793a\u8bcd\uff09\u2192 \u7eff\uff08\u8fd0\u884c\uff09\u25b6",
    g_learn_next_prompt: "\u518d\u6b21\u70b9\u6309 \u2192 \u663e\u793a\u786e\u5207\u63d0\u793a\u8bcd\uff08\u84dd\uff09",
    g_learn_prompt_head: "\u6b64\u6309\u94ae\u5c06\u53d1\u9001\u7684\u63d0\u793a\u8bcd\uff08\u518d\u6b21\u70b9\u6309 = \u8fd0\u884c\uff09\uff1a",
    g_learn_next_run: "\u518d\u70b9\u4e00\u6b21 \u2192 \u8fd0\u884c\uff08\u7eff\uff09\u751f\u6210",
    st_prompt_ready: "\u63d0\u793a\u8bcd\u5c31\u7eea \u2014 \u518d\u6b21\u70b9\u6309\uff08\u7eff\uff09\u8fd0\u884c \u2713",
    g_step_doc: "\u8bf7\u5148\u5728 Photoshop \u6253\u5f00\u7167\u7247\u6587\u6863",
    g_step_ref1: "\u628a\u53c2\u8003\u56fe\u8f7d\u5165 Ref1\uff08\u5b83\u4f1a\u6210\u4e3a IMAGE 2\uff09\u3002\u82e5\u6709\u7b2c\u4e8c\u4e2a\u4eba\uff0c\u8bf7\u518d\u52a0 Ref2\u3002",
    g_step_target: "\u9009\u62e9 Target\uff1aSolo / Couple\uff08Ref1 = \u5973\u65b9\uff0cRef2 = \u7537\u65b9\uff09/ Family\u3002",
    g_step_mkhair: "\u53ef\u9009\uff1a\u52fe\u9009 Face Ops \u4e0a\u65b9\u7684 \u2018Copy ref makeup\u2019 / \u2018Take ref hairstyle\u2019\u3002",
    g_step_petal: "\u8bf7\u5148\u9009\u82b1\u74e3\u989c\u8272\uff08\u81ea\u52a8 = \u5339\u914d\u573a\u666f\uff09",
    g_step_rest: "\u7528\u4e0a\u65b9 \u2713 \u9009\u62e9\u5168\u5f69\u6216\u9ed1\u767d",
    g_step_int: "\u6309\u559c\u597d\u8bbe\u7f6e\u5f3a\u5ea6\u6ed1\u5757",
    g_step_confirm: "\u518d\u6b21\u70b9\u6309\u4ee5\u63a8\u8fdb\uff1aGUIDE\uff08\u9ec4\uff09\u2192 PROMPT\uff08\u84dd\uff09\u2192 RUN\uff08\u7eff\u8272\u5373\u5f00\u59cb\u751f\u6210\uff09\u3002",
    g_cat_face: "FACE OP \u2014 \u5c06\u53c2\u8003\u56fe\u7684\u8138\u79fb\u690d\u5230\u5bf9\u5e94\u7684\u4eba\u7269\u8eab\u4e0a\uff1b\u5176\u4ed6\u4eba\u4fdd\u6301\u4e0d\u53d8\u3002",
    g_cat_sub: "SUBJECT OP \u2014 \u628a\u53c2\u8003\u56fe\u4e2d\u7684\u4eba\u7269\u5e26\u5165\uff0f\u878d\u5408\u8fdb\u4f60\u7684\u573a\u666f\uff1b\u573a\u666f\u4e0e\u6784\u56fe\u4fdd\u6301\u4e0d\u53d8\u3002",
    g_cat_bgfg: "BG/FG OP \u2014 \u53ea\u4f9d\u636e reference \u66f4\u6362\u80cc\u666f\uff0f\u524d\u666f\u3002",
    g_cat_lc: "LIGHT & COLOR OP \u2014 \u590d\u5236 reference \u7684\u5149\u7ebf\u4e0e\u8272\u8c03\uff1b\u4eba\u7269\u4fdd\u6301\u9010\u50cf\u7d20\u5fe0\u5b9e\u3002",
    g_cat_dress: "\u670d\u88c5\u64cd\u4f5c \u2014 \u4ec5\u7528\u53c2\u8003\u56fe\u66f4\u6362\u670d\u88c5",
    g_cat_mkop: "\u5986\u5bb9\u64cd\u4f5c \u2014 \u4ec5\u7528\u53c2\u8003\u56fe\u66f4\u6362\u5986\u5bb9",
    g_cat_match: "MASTER MATCH \u2014 \u8ba9\u4f60\u7684\u7167\u7247\u5339\u914d reference \u7684\u6574\u4f53\u8d28\u611f\uff08\u52fe\u9009\u4e0a\u65b9\u5404\u5c42\uff09\u3002",
    g_cat_trail: "WEDDING TRAIL \u2014 \u534e\u4e3d\u8349\u5730 + \u873f\u8712\u82b1\u5f84\uff1b\u8138\u90e8\uff0f\u59ff\u52bf\uff0f\u6784\u56fe\u88ab\u786c\u9501\u5b9a\u3002",
    g_cat_veil: "FLYING VEIL \u2014 \u6309\u6b64\u957f\u5ea6\u6dfb\u52a0\uff0f\u5ef6\u957f\u968f\u98ce\u98d8\u626c\u7684\u5934\u7eb1\uff1b\u7edd\u4e0d\u906e\u6321\u9762\u90e8\u3002",
    g_cat_gown: "GOWN \u2014 \u6e05\u6574\u73b0\u6709\u793c\u670d\uff08\u8bbe\u8ba1\u4e0d\u53d8\uff09\u5e76\u8bbe\u5b9a\u6b64\u62d6\u5c3e\u957f\u5ea6\u3002",
    g_cat_petal: "FLYING PETALS \u2014 \u6309\u6b64\u98ce\u683c\u5728\u7a7a\u4e2d\u52a0\u5165\u82b1\u74e3\uff1b\u989c\u8272\u53d6\u81ea\u4e0a\u65b9\u8272\u677f\u3002",
    g_cat_wedx: "WEDDING EXTRA \u2014 \u6dfb\u52a0\u4e0e\u4f60\u573a\u666f\u76f8\u914d\u7684\u8be5\u5143\u7d20\uff1b\u4e3b\u4f53\u4fdd\u6301\u9501\u5b9a\u3002",
    g_cat_canvas: "REPLACE (CANVAS) \u2014 \u628a\u4f60\u7684\u4e3b\u4f53\u653e\u8fdb reference \u7684\u573a\u666f\uff1b\u79fb\u9664 reference \u4e2d\u7684\u4eba\u7269\u3002",
    g_cat_restore: "OLD PHOTO RESTORE \u2014 \u4fee\u590d\u7834\u635f\uff1b\u6bcf\u4e00\u5f20\u539f\u59cb\u9762\u5b54\u4fdd\u6301 100% \u4e00\u81f4\u3002",
    g_cat_generic: "\u9884\u8bbe \u2014 \u5bf9\u4f60\u7684\u7167\u7247\u5e94\u7528\u8fd9\u9879\u4e13\u4e1a\u4fee\u9970",
    g_gen: "GENERATE \u2014 \u5c06 prompt \u6846\uff08+ chains\u3001Keep \u9501\u3001\u76f8\u673a\u533a\u5757\uff09\u4f5c\u7528\u4e8e\u4f60\u7684\u6587\u6863\u3002",
    g_retouchbtn: "RETOUCH APPLY \u2014 \u628a\u4f60\u6240\u6709\u6ed1\u6746\u8bbe\u7f6e\u4f5c\u4e3a\u4e00\u6b21\u4e13\u4e1a\u7cbe\u4fee\u6267\u884c\u3002",
    g_relightbtn: "LIGHTING GENERATE \u2014 \u4e25\u683c\u6309\u4f60\u7684 3D \u706f\u4f4d\u56fe\u4e3a\u7167\u7247\u91cd\u65b0\u6253\u5149\u3002",
    g_scene: "SCENE GENERATE \u2014 \u4f9d\u636e\u63d0\u53d6\u51fa\u7684 prompt \u91cd\u5efa\u573a\u666f\uff1b\u4e3b\u4f53\u4fdd\u6301\u4e0d\u53d8\u3002",
    g_rmix: "REPLACE MIX \u2014 \u53ea\u66ff\u6362\u4ece reference \u4e2d\u52fe\u9009 \u2713 \u7684\u90e8\u5206\u3002",
    g_pipe: "RUN PIPELINE \u2014 \u6309\u987a\u5e8f\u6267\u884c\u6bcf\u4e2a\u5df2\u4e32\u8054\u7684\u6b65\u9aa4\uff1b\u6bcf\u6b65\u7ed3\u679c\u9001\u5165\u4e0b\u4e00\u6b65\u3002",
    ro_faceRep: "\u66ff\u6362\u9762\u90e8",
    ro_faceSwap: "\u6362\u8138",
    ro_bgRep: "\u66ff\u6362\u80cc\u666f",
    ro_bgSwap: "\u4ea4\u6362\u80cc\u666f",
    ro_fgRep: "\u66ff\u6362\u524d\u666f",
    ro_bg_note: "Doc = \u4e3b\u4f53 \u00b7 Ref1 = \u65b0\u573a\u666f\u3002Target\uff08Solo/Couple/Family\uff09\u51b3\u5b9a\u4fdd\u7559\u8c01\u3002",
    ro_bg_frame: "\u4fdd\u6301\u753b\u6846\u4e0e\u6784\u56fe",
    ro_bg_light: "\u4fdd\u7559\u4e3b\u4f53\u5149/\u8272",
    ro_subSwap: "\u66ff\u6362\u4e3b\u4f53",
    ro_lcRef: "\u5149\u8272\u53c2\u8003",
    ro_lcCopy: "\u5149\u8272\u590d\u5236",
    ro_dressRef: "\u670d\u88c5\u53c2\u8003",
    ro_dressRep: "\u66ff\u6362\u670d\u88c5",
    ro_mkCopy: "\u590d\u5236\u5986\u5bb9",
    ro_matchBtn: "\u2605 MASTER MATCH",
    grp_retouch: "\u76ae\u80a4\u4fee\u9970\u9884\u8bbe",
    lbl_intensity: "\u5f3a\u5ea6",
    p_evoto: "Evoto \u98ce\u683c",
    p_meitu: "\u7f8e\u56fe\u98ce\u683c",
    auto_place: "\u81ea\u52a8\u5c06\u7ed3\u679c\u4f5c\u4e3a\u65b0\u56fe\u5c42\u653e\u5165",
    sec_retouchpro: "\u4fee\u9970 Pro \u2014 \u6ed1\u5757",
    rt_skin: "\u76ae\u80a4",
    rt_faceai: "\u9762\u90e8 AI",
    rt_hair: "\u5934\u53d1",
    rt_dress: "\u670d\u88c5",
    rt_bg: "\u80cc\u666f",
    rt_smooth: "\u78e8\u76ae",
    rt_acne: "\u53bb\u75d8",
    rt_spots: "\u53bb\u6591",
    rt_wrinkle: "\u76b1\u7eb9",
    rt_tone: "\u7f8e\u767d / \u5c0f\u9ea6\u8272",
    rt_glow: "\u5149\u6cfd",
    rt_reshape: "AI \u5851\u5f62",
    rt_lash: "\u776b\u6bdb",
    rt_brow: "\u7709\u6bdb",
    rt_lipsmooth: "\u5507\u90e8\u5e73\u6ed1",
    rt_lipcolor: "\u5507\u8272",
    rt_lenscolor: "\u955c\u7247\u989c\u8272",
    rt_hairstray: "\u788e\u53d1",
    rt_hairsmooth: "\u987a\u53d1",
    rt_hairshine: "\u53d1\u4e1d\u5149\u6cfd (D&B)",
    rt_dresssmooth: "\u5e03\u6599\u5e73\u6ed1",
    rt_dressedge: "\u8fb9\u7f18\u6e05\u7406",
    rt_dresswrinkle: "\u53bb\u8936\u76b1",
    rt_dresstexture: "\u6062\u590d\u7eb9\u7406",
    rt_bgsmooth: "\u80cc\u666f\u6e05\u7406/\u5e73\u6ed1",
    rt_bgcolor: "\u80cc\u666f\u989c\u8272",
    rt_bgrecolor: "\u80cc\u666f\u989c\u8272\u5e73\u6ed1",
    rt_shape: "\u5851\u5f62 Pro\uff08\u9762\u90e8 + \u8eab\u5f62\uff09",
    rt_teeth: "\u7259\u9f7f\u7f8e\u767d",
    rt_eyewhite: "\u773c\u767d\u6e05\u6d01",
    rt_faceslim: "\u7626\u8138",
    rt_jaw: "\u4e0b\u988c\u7ebf",
    rt_chin: "\u4e0b\u5df4",
    rt_nosesize: "\u9f3b\u5b50\u5927\u5c0f",
    rt_eyesize: "\u773c\u775b\u5927\u5c0f",
    rt_lipfull: "\u5507\u90e8\u4e30\u76c8",
    rt_waist: "\u6536\u8170",
    rt_bodyslim: "\u8eab\u5f62\u7ea4\u7ec6",
    rt_shoulder: "\u80a9\u8180",
    rt_hip: "\u7626\u81c0",
    rt_leglen: "\u817f\u957f",
    rt_armslim: "\u7626\u81c2",
    rt_dressfit: "\u670d\u88c5\u8d34\u5408",
    rt_dressclean: "\u670d\u88c5\u6e05\u6d01",
    rt_dresscolorpure: "\u670d\u88c5\u7eaf\u8272",
    rt_bodygrp: "\u8eab\u4f53\u76ae\u80a4 Pro",
    rt_bodysmooth: "\u8eab\u4f53\u78e8\u76ae",
    rt_bodyblemish: "\u8eab\u4f53\u7455\u75b5\u6e05\u7406",
    rt_bodytone: "\u8eab\u4f53\u5300\u80a4",
    rt_bodyglow: "\u8eab\u4f53\u5149\u6cfd",
    rt_bodyhairrm: "\u51cf\u5c11\u4f53\u6bdb",
    rt_hairvolume: "\u53d1\u91cf",
    rt_hairgloss: "\u53d1\u4e1d\u4eae\u6cfd",
    rt_hairfill: "\u8865\u53d1\uff08\u7a00\u758f\u5904\uff09",
    wp_h_trail: "\u2665 \u5a5a\u793c \u2014 \u5962\u534e\u82b1\u5f84",
    wp_h_veil: "\u2665 \u5a5a\u793c \u2014 \u98d8\u52a8\u5934\u7eb1",
    wp_h_gown: "\u2665 \u5a5a\u793c \u2014 \u793c\u670d\u6e05\u7406 + \u62d6\u5c3e",
    wp_h_petal: "\u2665 \u5a5a\u793c \u2014 \u98d8\u843d\u82b1\u74e3",
    wp_h_extra: "\u2665 \u5a5a\u793c \u2014 \u9a6c \u00b7 \u6c34 \u00b7 \u6c1b\u56f4",
    wp_note: "Face ID\uff0f\u59ff\u52bf\uff0f\u6784\u56fe\uff0f\u793c\u670d\u8bbe\u8ba1\u5747\u88ab\u786c\u9501\u5b9a \u2014 \u53ea\u6539\u52a8\u6307\u5b9a\u7684\u90a3\u4e00\u9879\u5143\u7d20\u3002",
    wp_petalcolor: "\u82b1\u74e3\u989c\u8272\uff08\u81ea\u52a8 = \u5339\u914d\u573a\u666f\uff09",
    wp_trail_c: "\u82b1\u8272",
    wp_trail_go: "\u25b6 \u82b1\u5f84",
    wp_veil_c: "\u5934\u7eb1\u957f\u5ea6",
    wp_veil_go: "\u25b6 \u98d8\u52a8\u5934\u7eb1",
    wp_gown_c: "\u62d6\u5c3e\u957f\u5ea6",
    wp_gown_go: "\u25b6 \u793c\u670d\u6e05\u7406 + \u62d6\u5c3e",
    wp_pet_c: "\u82b1\u74e3\u6837\u5f0f",
    wp_pet_go: "\u25b6 \u98d8\u843d\u82b1\u74e3",
    wp_extra_c: "\u989d\u5916",
    wp_extra_go: "\u25b6 \u6dfb\u52a0\u989d\u5916",
    btn_apply_rt: "\u5e94\u7528\u4fee\u9970",
    btn_reset: "\u91cd\u7f6e",
    rt_none: "\u8bf7\u5148\u8bbe\u7f6e\u81f3\u5c11\u4e00\u4e2a\u4fee\u9970\u6ed1\u5757\u6216\u989c\u8272",
    tab_setup: "\u8bbe\u7f6e",
    tab_prompt: "\u5de5\u4f5c\u5ba4",
    tab_presets: "\u9884\u8bbe",
    recent_lbl: "\u6700\u8fd1\u63d0\u793a\u8bcd\u2026",
    tab_retouch: "\u4fee\u56fe",
    tab_aitools: "AI \u5de5\u5177",
    cap_warn: "Photoshop \u5c06\u6b64\u63d0\u793a\u6846\u9650\u5236\u4e3a\uff1a",
    cleanup_note: "\u52fe\u9009\u9879\u4f1a\u968f\u6bcf\u6b21 \u751f\u6210 / \u9884\u8bbe \u4e00\u8d77\u8fd0\u884c\u3002",
    btn_generate: "\u751f\u6210",
    st_ready: "\u5c31\u7eea",
    st_capture: "\u6b63\u5728\u6355\u83b7\u6587\u6863",
    st_gen: "\u751f\u6210\u4e2d\u2026",
    st_place: "\u6b63\u5728\u653e\u5165 Photoshop\u2026",
    st_placed_masked: "\u5df2\u4f5c\u4e3a Layer + Mask \u7ec4\u653e\u5165 \u2014 \u539f\u56fe\u672a\u88ab\u6539\u52a8 \u2713",
    st_placed_plain: "\u5df2\u4f5c\u4e3a\u666e\u901a\u56fe\u5c42\u653e\u5165\uff08\u6b64\u4e3b\u673a\u4e0d\u652f\u6301\u8499\u7248/\u7f16\u7ec4\uff09",
    stage_queued: "\u6392\u961f\u4e2d",
    stage_uploading: "\u4e0a\u4f20\u4e2d",
    stage_generating: "\u751f\u6210\u4e2d",
    stage_downloading: "\u4e0b\u8f7d\u4e2d",
    stage_placing: "\u6b63\u5728\u653e\u5165 Photoshop",
    st_done: "\u5b8c\u6210 \u2713",
    st_err: "\u9519\u8bef",
    st_no_doc: "\u6ca1\u6709\u6d3b\u52a8\u6587\u6863 \u2014 \u8bf7\u5148\u6253\u5f00\u7167\u7247",
    st_no_prompt: "\u63d0\u793a\u8bcd\u4e3a\u7a7a",
    need_ref: "\u6b64\u9884\u8bbe\u9700\u8981\u5728\u69fd 1 \u653e\u53c2\u8003\u56fe",
    st_new_doc: "\u7ed3\u679c\u5df2\u4f5c\u4e3a\u65b0\u6587\u6863\u6253\u5f00 \u2713",
    sec_preview: "\u9884\u89c8 \u2014 \u524d / \u540e",
    before: "\u524d",
    after: "\u540e",
    btn_place: "\u653e\u5165 Photoshop",
    btn_saveas: "\u53e6\u5b58\u4e3a\u2026",
    st_saved: "\u5df2\u4fdd\u5b58 \u2713",
    sec_diag: "\u7cfb\u7edf\u68c0\u67e5",
    sec_log: "\u6d3b\u52a8\u65e5\u5fd7",
    btn_diag: "\u8fd0\u884c\u68c0\u67e5",
    btn_copylog: "\u590d\u5236\u65e5\u5fd7",
    btn_clearlog: "\u6e05\u7a7a",
    diag_host: "Photoshop \u4e3b\u673a",
    diag_uxp: "UXP \u80fd\u529b",
    diag_gem: "Gemini API \u5bc6\u94a5",
    diag_oai: "OpenAI API \u5bc6\u94a5",
    diag_doc: "\u6d3b\u52a8\u6587\u6863",
    diag_set: "\u5df2\u8bbe\u7f6e",
    diag_unset: "\u672a\u8bbe\u7f6e",
    diag_open: "\u5df2\u6253\u5f00",
    diag_none: "\u65e0\u6253\u5f00",
    diag_missing: "\u7f3a\u5931",
    diag_done: "\u7cfb\u7edf\u68c0\u67e5\u5b8c\u6210 \u2713",
    diag_lib: "\u53c2\u8003\u56fe\u5e93",
    diag_lib_open: "\u6253\u5f00\u6587\u4ef6\u5939\u80fd\u529b",
    sec_reflib: "\u53c2\u8003\u56fe\u5e93",
    reflib_note: "\u53ea\u9700\u9009\u5b9a\u4e00\u6b21\u4f60\u5e38\u7528\u7684 reference \u56fe\u7247\u6587\u4ef6\u5939 \u2014 Browse \u4f1a\u8bb0\u4f4f\u5b83\uff0c\u5e76\u5728\u5404\u5904\u76f4\u63a5\u4ece\u4e2d\u6253\u5f00\u3002",
    btn_browse: "\u6d4f\u89c8",
    lib_choose: "\u9009\u62e9\u6587\u4ef6\u5939",
    lib_open: "\u6253\u5f00\u6587\u4ef6\u5939",
    lib_change: "\u66f4\u6539\u6587\u4ef6\u5939",
    lib_reset: "\u91cd\u7f6e",
    lib_rescan: "\u91cd\u65b0\u626b\u63cf",
    lib_current: "\u5f53\u524d\u6587\u4ef6\u5939",
    lib_found: "\u627e\u5230\u56fe\u7247",
    lib_status: "\u72b6\u6001",
    lib_lastscan: "\u4e0a\u6b21\u626b\u63cf",
    lib_images: "\u5f20",
    lib_connected: "\u5df2\u8fde\u63a5",
    lib_not_config: "\u672a\u914d\u7f6e",
    lib_perm_lost: "\u6743\u9650\u4e22\u5931 \u2014 \u8bf7\u91cd\u65b0\u9009\u62e9",
    lib_none: "\uff08\u672a\u9009\u62e9\u6587\u4ef6\u5939\uff09",
    lib_copy_only: "\u4ec5\u590d\u5236\u8def\u5f84",
    lib_choose_msg: "\u9009\u62e9\u4f60\u7684 HNK \u53c2\u8003\u56fe\u5e93\u6587\u4ef6\u5939\u3002",
    lib_scanning: "\u6b63\u5728\u626b\u63cf\u56fe\u5e93\u2026",
    lib_scan_done: "\u91cd\u65b0\u626b\u63cf\u5b8c\u6210 \u2713",
    lib_reset_done: "\u56fe\u5e93\u5df2\u91cd\u7f6e \u2713",
    lib_path_copied: "\u5df2\u590d\u5236\u8def\u5f84",
    lib_unsupported: "\u4e0d\u652f\u6301\u7684\u56fe\u7247\u7c7b\u578b",
    lib_restore_fail: "\u65e0\u6cd5\u6062\u590d\u53c2\u8003\u56fe",
    on: "\u5f00",
    off: "\u5173",
    ai_home_title: "\u4f60\u60f3\u521b\u4f5c\u4ec0\u4e48\uff1f",
    ai_free_generate: "\u81ea\u7531\u751f\u6210",
    ai_free_sub: "\u81ea\u5df1\u5199 prompt",
    ai_more_tools: "\u66f4\u591a\u5de5\u5177",
    ai_more_sub: "Water Edit \u00b7 Text/Logo \u00b7 \u5168\u90e8 workflow",
    ai_nav_home: "\u4e3b\u9875",
    ai_nav_tools: "\u5de5\u5177",
    ai_history: "\u5386\u53f2\u8bb0\u5f55",
    ai_no_gen: "\u8fd8\u6ca1\u6709\u751f\u6210\u8bb0\u5f55\u3002",
    ai_rerun: "\u91cd\u65b0\u8fd0\u884c",
    ai_reuse: "\u518d\u6b21\u4f7f\u7528",
    ai_clear_hist: "\u6e05\u9664\u5386\u53f2\u8bb0\u5f55",
    ai_images: "\u56fe\u7247",
    ai_add_ref: "+ \u6dfb\u52a0 Reference \u56fe\u7247",
    ai_prompt: "PROMPT",
    ai_prompt_ph: "\u63cf\u8ff0\u4f60\u60f3\u8981\u7684\u6548\u679c\u2026",
    ai_model_output: "MODEL \u4e0e OUTPUT",
    ai_model_note: "AI Tools \u6709\u81ea\u5df1\u7684 model/size \u8bbe\u7f6e\uff0c\u4e0e Setup \u548c Create \u6807\u7b7e\u9875\u76f8\u4e92\u72ec\u7acb\u3002",
    ai_auto_model: "\u81ea\u52a8\u9009\u62e9 Model",
    ai_wf_tools: "Workflow \u5de5\u5177",
    ai_direct_gen: "\u76f4\u63a5\u751f\u6210",
    ai_identity_lock: "\u9501\u5b9a\u4eba\u7269\u8eab\u4efd",
    ai_ref_transfer: "Reference \u8fc1\u79fb",
    ai_req_images: "\u5fc5\u9700\u7684\u56fe\u7247",
    ai_opt_images: "\u53ef\u9009\u56fe\u7247",
    ai_model_lbl: "Model",
    ai_prepare: "\u51c6\u5907\uff08\u8f7d\u5165\u5e76\u68c0\u67e5\uff09",
    ai_lib_bridge_off: "\u6b64 host \u65e0\u6cd5\u8fde\u63a5 Library\u3002",
    ai_lib_pick_first: "\u8bf7\u5148\u5728 Presets \u6807\u7b7e\u9875 \u2192 Visual Library \u4e2d\u9009\u4e00\u5f20\u56fe\u7247\u3002",
    ai_lib_load_fail: "\u65e0\u6cd5\u8f7d\u5165 Library \u56fe\u7247\u3002",
    ai_missing: "\u7f3a\u5c11",
    ai_add: "\u6dfb\u52a0",
    ai_library: "Library",
    ai_rh_sec: "RunningHub \u2014 \u6dfb\u52a0 model endpoint\uff08\u9ad8\u7ea7 \u2014 \u53ef\u9009\uff09",
    ai_rh_note: "\u5185\u7f6e model \u5df2\u53ef\u7528\u4e0a\u65b9\u7684 key \u8fd0\u884c\uff0c\u65e0\u9700\u8bbe\u7f6e\u3002\u82e5\u67d0\u4e2a model \u663e\u793a \"not connected\"\uff08\u5176 endpoint path \u5c1a\u672a\u786e\u8ba4\uff09\uff0c\u8bf7\u4ece RunningHub \u7684 API \u6587\u6863\u590d\u5236 path \u5e76\u7c98\u8d34\u5230\u8fd9\u91cc\u3002",
    ai_rh_save: "\u4fdd\u5b58\u6b64 model \u7684 endpoint",
    ai_test_conn: "\u6d4b\u8bd5\u8fde\u63a5",
    ai_oai_sec: "OpenAI\uff08\u9ad8\u7ea7 \u2014 \u53ef\u9009\uff09",
    ai_oai_note: "\u7528\u4f60\u81ea\u5df1\u7684 OpenAI API key \u642d\u914d GPT Image 2\uff0c\u66ff\u4ee3\uff08\u6216\u4e0e\uff09RunningHub Enterprise \u5e76\u7528\u3002",
    ai_save_verify: "\u4fdd\u5b58\u5e76\u9a8c\u8bc1",
    ai_settings: "\u8bbe\u7f6e",
    ai_add_layers: "\u5c06\u7ed3\u679c\u6dfb\u52a0\u4e3a\u65b0 Layer",
    ai_done: "\u5b8c\u6210\u3002",
    ai_result_ready: "\u7ed3\u679c\u5df2\u5c31\u7eea\u3002",
    ai_ready_nolayer: "\u7ed3\u679c\u5df2\u5c31\u7eea\uff08Settings \u4e2d\u5df2\u5173\u95ed\u201c\u6dfb\u52a0\u4e3a Layer\u201d\uff09\u3002",
    ai_place_failed: "\u5df2\u751f\u6210\uff0c\u4f46\u65e0\u6cd5\u7f6e\u5165 Photoshop\u3002",
    ai_place_failed_fix: "\u8bf7\u5148\u6253\u5f00\u4e00\u4e2a\u6587\u6863\uff0c\u518d\u4ece History \u91cd\u65b0\u8fd0\u884c\u3002",
    ai_placed_masked: "\u5df2\u4f5c\u4e3a Layer + Mask \u7f6e\u5165 \u201c{name}\u201d \u7ec4 \u2014 \u539f\u56fe\u672a\u88ab\u6539\u52a8\u3002",
    ai_placed_group: "\u5df2\u4f5c\u4e3a\u65b0 Layer \u7f6e\u5165 \u201c{name}\u201d \u7ec4\uff08\u6b64 host \u4e0d\u652f\u6301 mask\uff09\u3002",
    ai_placed_plain: "\u5df2\u4f5c\u4e3a\u65b0 Layer \u7f6e\u5165\uff08\u6b64 host \u4e0d\u652f\u6301 group/mask\uff09\u3002",
    ai_start_fail: "AI Tools \u542f\u52a8\u5931\u8d25",
    pgb_setup: "\u4ece\u8fd9\u91cc\u5f00\u59cb \u2014 \u914d\u7f6e API Key \u00b7 Model \u00b7 Library",
    pgb_studio: "Prompt \u2192 Reference \u2192 Generate \u2014 \u4e00\u6c14\u5475\u6210\u7684\u4e13\u4e1a\u6d41\u7a0b",
    pgb_create: "\u4ece\u7075\u611f\u5230\u4f5c\u54c1 \u2014 4 \u4e2a reference \u69fd\u4f4d \u00b7 Variations",
    pgb_presets: "Visual Library 366 \u00b7 Scenes \u00b7 Wedding \u00b7 Style Chains",
    pgb_aitools: "\u4e00\u952e\u4e13\u4e1a\u51fa\u56fe \u2014 Nano Banana \u00b7 GPT Image \u00b7 RunningHub",
    pgb_retouch: "\u808c\u80a4 \u00b7 \u9762\u90e8 \u00b7 \u4f53\u578b \u2014 \u4e13\u4e1a\u6ed1\u6746",
    wf_sum_bg_replace: "\u66ff\u6362\u80cc\u666f",
    wf_sum_reference_transfer: "\u628a\u4f60\u7684\u4e3b\u4f53\u653e\u8fdb reference \u573a\u666f",
    wf_sum_master_bgfg_replace: "\u79fb\u9664\u573a\u666f\u4e2d\u7684\u4eba\u7269\uff0c\u91cd\u5efa bg/fg\uff0c\u518d\u653e\u5165\u4f60\u7684\u4e3b\u4f53",
    wf_sum_subject_face: "\u628a\u4e3b\u4f53\u6216\u8138\u8fc1\u79fb\u5230 base \u56fe\u4e0a",
    wf_sum_retouch: "\u81ea\u7136\u611f\u4eba\u50cf\u7cbe\u4fee",
    wf_sum_upscale: "\u4fdd\u7ec6\u8282\u653e\u5927",
    wf_sum_object_edit: "\u79fb\u9664\u3001\u66ff\u6362\u6216\u6dfb\u52a0\u7269\u4ef6",
    wf_sum_water_edit: "\u6c34\u9762\u4e0e\u5012\u5f71\u5904\u7406",
    wf_sum_text_logo: "\u6dfb\u52a0\u6216\u7f16\u8f91\u6587\u5b57\u4e0e logo",
    wfin_subject: "\u4f60\u7684\u7167\u7247\uff08\u4e3b\u4f53\uff09",
    wfin_new_bg: "\u65b0\u80cc\u666f\uff08\u53ef\u9009\uff09",
    wfin_ref_scene: "Reference \u573a\u666f",
    wfin_style_ref: "Style reference\uff08\u53ef\u9009\uff09",
    wfin_target_scene: "\u542b\u4eba\u7269\u7684\u76ee\u6807\u573a\u666f",
    wfin_base: "Base \u56fe",
    wfin_face_ref: "\u8138\u90e8\uff0f\u4e3b\u4f53 reference",
    wfin_portrait: "\u4eba\u50cf",
    wfin_image: "\u56fe\u7247",
    wfin_object_ref: "\u7269\u4ef6 reference\uff08\u53ef\u9009\uff09",
    wfin_logo_ref: "Logo reference\uff08\u53ef\u9009\uff09",
    wf_exp_bg_replace: "\u66ff\u6362\u4e3b\u4f53\u8eab\u540e\u7684\u80cc\u666f\u3002\u4eba\u7269\u3001\u59ff\u52bf\u3001\u8fb9\u7f18\u548c\u5149\u7ebf\u5b8c\u5168\u4fdd\u6301\u4e0d\u53d8 \u2014 \u53ea\u6709\u8eab\u540e\u7684\u5185\u5bb9\u6539\u53d8\u3002",
    wf_exp_reference_transfer: "\u53d6\u7528 reference \u7167\u7247\u7684\u6574\u4e2a\u573a\u666f\uff08\u4f46\u4e0d\u53d6\u5176\u4e2d\u7684\u4eba\u7269\uff09\uff0c\u628a\u4f60\u7684\u4e3b\u4f53\u653e\u8fdb\u53bb \u2014 \u4fdd\u7559\u4e3b\u4f53\u7684\u8eab\u4efd\u3001\u59ff\u52bf\u4e0e\u6784\u56fe\uff0c\u5e76\u5339\u914d\u573a\u666f\u7684\u5149\u7ebf\u548c\u900f\u89c6\u3002",
    wf_exp_master_bgfg_replace: "\u6700\u4e25\u683c\u7684\u573a\u666f\u6362\u4eba\uff1a\u628a reference \u573a\u666f\u4e2d\u7684\u4eba\u7269\u5f7b\u5e95\u79fb\u9664\uff0c\u81ea\u7136\u91cd\u5efa\u88ab\u906e\u6321\u7684\u80cc\u666f\u4e0e\u524d\u666f\uff0c\u518d\u628a\u4f60\u7684\u4e3b\u4f53\u7cbe\u786e\u653e\u5165\u90a3\u4e2a\u4f4d\u7f6e \u2014 \u8eab\u4efd\u3001\u59ff\u52bf\u3001\u6bd4\u4f8b\u3001\u53d1\u578b\u3001\u670d\u88c5\u3001\u80a4\u8d28\u4e0e\u5149\u7ebf\u5168\u90e8\u9501\u5b9a\u81ea\u4f60\u7684\u7167\u7247\uff0creference \u53ea\u63d0\u4f9b\u573a\u666f\u3001\u673a\u4f4d\u4e0e\u666f\u6df1\u3002",
    wf_exp_subject_face: "\u628a reference \u4e2d\u7684\u4e3b\u4f53\u6216\u8138\u81ea\u7136\u878d\u5408\u5230\u4f60\u7684 base \u56fe\u4e0a\uff0c\u540c\u65f6\u4fdd\u6301 base \u7684\u6784\u56fe\u4e0d\u53d8\u3002",
    wf_exp_retouch: "\u5bf9\u808c\u80a4\u3001\u5934\u53d1\u4e0e\u8272\u8c03\u505a\u81ea\u7136\u7cbe\u4fee\u3002\u8eab\u4efd\u3001\u4e94\u5b98\u4e0e\u8868\u60c5\u90fd\u4fdd\u7559 \u2014 \u4e0d\u4f1a\u6709\u5851\u6599\u611f\u808c\u80a4\uff0c\u4e5f\u4e0d\u6539\u8138\u3002",
    wf_exp_upscale: "\u5728\u653e\u5927\u7684\u540c\u65f6\u6062\u590d\u808c\u80a4\u3001\u5934\u53d1\u4e0e\u7ec7\u7269\u7684\u81ea\u7136\u7ec6\u8282\u3002\u8eab\u4efd\u3001\u59ff\u52bf\u3001\u6784\u56fe\u4e0e\u8272\u5f69\u5b8c\u5168\u4e0d\u53d8 \u2014 \u4e0d\u505a\u5851\u6599\u611f\u78e8\u76ae\u3002",
    wf_exp_object_edit: "\u4ee5\u53ef\u63a7\u7684\u5c40\u90e8\u7f16\u8f91\u79fb\u9664\u3001\u66ff\u6362\u6216\u6dfb\u52a0\u7269\u4ef6\u3002\u4f60\u6ca1\u6709\u52a8\u5230\u7684\u90e8\u5206\u4e00\u5f8b\u4fdd\u6301\u539f\u6837\u3002",
    wf_exp_water_edit: "\u6dfb\u52a0\u6216\u8c03\u6574\u6c34\u4f53\u3001\u5012\u5f71\u4e0e\u6e7f\u6da6\u8868\u9762\uff0c\u4f7f\u5176\u7b26\u5408\u7269\u7406\u76f4\u89c9\uff0c\u540c\u65f6\u4e0d\u5f71\u54cd\u4f60\u7684\u4e3b\u4f53\u3002",
    wf_exp_text_logo: "\u5728\u56fe\u4e0a\u6dfb\u52a0\u6216\u4fee\u6539\u5e72\u51c0\u6613\u8bfb\u7684\u6587\u5b57\u6216 logo\uff0c\u540c\u65f6\u4fdd\u6301\u539f\u6709\u6784\u56fe\u3002"
  },
  /* ---- Vietnamese (vi) — 587 keys, complete ---- */
  vi: {
    gate_sub_login: "Đăng nhập bằng tài khoản HNK của bạn để dùng bảng này.",
    gate_email_ph: "Email",
    gate_pass_ph: "Mật khẩu",
    gate_signin: "Đăng nhập",
    gate_checking: "Đang kiểm tra gói của bạn…",
    gate_need: "Nhập email và mật khẩu.",
    gate_bad: "Email hoặc mật khẩu không đúng.",
    gate_offline: "Không có mạng — không kiểm tra được gói. Hãy kết nối rồi kiểm tra lại.",
    gate_locked: "Một lần thanh toán dùng được cả hai — phí gia nhập và phí hàng tháng mở cả ứng dụng web VÀ bảng Photoshop này. Hãy mua hoặc gia hạn trên website, rồi bấm kiểm tra lại.",
    gate_buy: "Mở website",
    gate_retry: "Kiểm tra lại",
    gate_signout: "Đăng xuất",
    gate_days: "còn {D} ngày",
    gate_grace: "Ngoại tuyến — còn dùng ngoại tuyến được {D} ngày",
    gate_open_fail: "Không mở được trình duyệt. Địa chỉ: {U}",
    app_title: "HNK Photoshop Ai Panel (H\u1ecdc vi\u00ean)",
    sec_api: "Gemini API Key",
    btn_show: "Hi\u1ec7n",
    btn_hide: "\u1ea8n",
    btn_test: "Ki\u1ec3m tra key",
    btn_save: "L\u01b0u",
    st_testing: "\u0110ang ki\u1ec3m tra key",
    st_key_ok: "\u2713 API key ho\u1ea1t \u0111\u1ed9ng t\u1ed1t",
    st_key_bad: "API key kh\u00f4ng d\u00f9ng \u0111\u01b0\u1ee3c",
    st_key_saved: "\u0110\u00e3 l\u01b0u API key \u2713",
    st_need_key: "H\u00e3y nh\u1eadp Gemini API key tr\u01b0\u1edbc",
    sec_model: "Model & Output",
    scope_model_note: "D\u00f9ng cho n\u00fat Generate c\u1ee7a tab Prompt b\u00ean d\u01b0\u1edbi \u2014 Create v\u00e0 AI Tools \u0111\u1ec1u c\u00f3 thi\u1ebft l\u1eadp model ri\u00eang.",
    model_auto: "T\u1ef1 \u0111\u1ed9ng (khuy\u00ean d\u00f9ng)",
    model_flash: "Flash \u2014 nhanh (2.5)",
    model_pro: "Pro \u2014 ch\u1ea5t l\u01b0\u1ee3ng (3.0)",
    lbl_ratio: "T\u1ec9 l\u1ec7",
    ratio_auto: "T\u1ec9 l\u1ec7 t\u1ef1 \u0111\u1ed9ng (theo t\u00e0i li\u1ec7u)",
    lbl_size: "K\u00edch th\u01b0\u1edbc",
    lbl_quality: "Ch\u1ea5t l\u01b0\u1ee3ng",
    qual_auto: "T\u1ef1 \u0111\u1ed9ng",
    qual_low: "Th\u1ea5p",
    qual_med: "Trung b\u00ecnh",
    qual_high: "Cao",
    sec_prompt: "Prompt",
    hint_prompt: "Nh\u1eadp prompt c\u1ee7a b\u1ea1n t\u1ea1i \u0111\u00e2y\u2026 (t\u1ed1i \u0111a 20.000 k\u00fd t\u1ef1)",
    btn_improve: "C\u1ea3i thi\u1ec7n prompt",
    btn_clear: "X\u00f3a",
    st_improving: "\u0110ang c\u1ea3i thi\u1ec7n prompt",
    st_improved: "\u0110\u00e3 c\u1ea3i thi\u1ec7n prompt \u2713",
    sec_refs: "\u1ea2nh tham chi\u1ebfu (2 \u00f4)",
    base_note: "\u1ea2nh g\u1ed1c = t\u00e0i li\u1ec7u Photoshop \u0111ang m\u1edf c\u1ee7a b\u1ea1n (t\u1ef1 \u0111\u1ed9ng l\u1ea5y).",
    btn_ref_layer: "+ Layer",
    btn_ref_file: "T\u1ec7p",
    btn_ref_web: "Web",
    st_ref_layer_added: "\u0110\u00e3 th\u00eam layer l\u00e0m tham chi\u1ebfu \u2713",
    st_ref_file_added: "\u0110\u00e3 th\u00eam t\u1ec7p l\u00e0m tham chi\u1ebfu \u2713",
    st_importing: "\u0110ang nh\u1eadp t\u1ec7p",
    url_title: "Tham chi\u1ebfu t\u1eeb URL \u2014 Chrome / Pinterest",
    url_ph: "https://\u2026 \u0111\u1ecba ch\u1ec9 \u1ea3nh ho\u1eb7c link ghim Pinterest",
    btn_paste: "D\u00e1n",
    btn_load: "T\u1ea3i",
    btn_cancel: "H\u1ee7y",
    st_url_loading: "\u0110ang t\u1ea3i \u1ea3nh t\u1eeb web",
    st_ref_web_added: "\u0110\u00e3 th\u00eam \u1ea3nh web l\u00e0m tham chi\u1ebfu \u2713",
    st_url_bad: "Kh\u00f4ng t\u1ea3i \u0111\u01b0\u1ee3c \u1ea3nh t\u1eeb URL n\u00e0y \u2014 h\u00e3y copy \u0111\u1ecba ch\u1ec9 \u1ea3nh r\u1ed3i th\u1eed l\u1ea1i",
    no_layer: "Ch\u01b0a ch\u1ecdn layer n\u00e0o",
    sec_presets: "AI Presets",
    auto_run: "B\u1ea5m preset \u2192 t\u1ef1 Generate (T\u1eaeT = ch\u1ec9 ch\u00e8n v\u00e0o prompt)",
    grp_cleanup: "C\u00f4ng c\u1ee5 d\u1ecdn \u1ea3nh",
    p_remove_people: "X\u00f3a ng\u01b0\u1eddi th\u1eeba",
    p_fix_hands: "S\u1eeda tay th\u1eeba",
    p_fix_legs: "S\u1eeda ch\u00e2n th\u1eeba",
    p_full_clean: "D\u1ecdn to\u00e0n b\u1ed9",
    grp_moved_note: "C\u00e1c c\u00f4ng c\u1ee5 Reference nay n\u1eb1m trong th\u1ebb Reference Ops Pro b\u00ean d\u01b0\u1edbi (m\u1ed9t ch\u1ed7 duy nh\u1ea5t, c\u00f3 Solo/Couple/Family + h\u01b0\u1edbng d\u1eabn).",
    ro_h_detail: "T\u00f3c \u00b7 Ph\u1ee5 ki\u1ec7n \u00b7 D\u00e1ng (\u2190 Ref1)",
    ro_h_comp: "Gh\u00e9p \u00b7 Phong c\u00e1ch \u00b7 Ch\u1eef (\u2190 Ref1)",
    p_fgbglc: "FG=Doc \u00b7 BG=Ref1 \u00b7 Light=Ref2",
    p_hair: "Ki\u1ec3u t\u00f3c (\u2190 Ref1)",
    p_access: "Trang s\u1ee9c + ph\u1ee5 ki\u1ec7n (\u2190 Ref1)",
    p_pose: "Kh\u1edbp d\u00e1ng (Doc \u2192 Ref1)",
    p_fgprops: "V\u1eadt th\u1ec3 ti\u1ec1n c\u1ea3nh (\u2190 Ref1)",
    p_textlogo: "Ch\u1eef / Logo (\u2190 Ref1)",
    p_style: "Phong c\u00e1ch \u1ea3nh (\u2190 Ref1)",
    grp_repsubj: "Thay ch\u1ee7 th\u1ec3 (Doc \u2192 c\u1ea3nh Ref1)",
    p_rep_solo: "Thay ng\u01b0\u1eddi \u0111\u01a1n",
    p_rep_couple: "Thay c\u1eb7p \u0111\u00f4i",
    p_rep_family: "Thay gia \u0111\u00ecnh",
    grp_rmix: "Replace Mix \u2014 tick r\u1ed3i l\u1ea5y t\u1eeb Ref1",
    rm_bg: "N\u1ec1n (BG)",
    rm_fg: "Ti\u1ec1n c\u1ea3nh (FG)",
    rm_light: "\u00c1nh s\u00e1ng",
    rm_color: "M\u00e0u s\u1eafc",
    rm_object: "V\u1eadt th\u1ec3 / \u0111\u1ea1o c\u1ee5",
    btn_rmix: "REPLACE GENERATE",
    rm_none: "H\u00e3y tick \u00edt nh\u1ea5t m\u1ed9t m\u1ee5c tr\u01b0\u1edbc",
    grp_i2p: "Image \u2192 Prompt (Scene Builder)",
    i2p_note: "1) Tr\u00edch: c\u1ea3nh Ref1 \u2192 prompt ch\u1eef chi ti\u1ebft (b\u1ecf ng\u01b0\u1eddi). 2) S\u1eeda l\u1ea1i \u1edf trang Prompt. 3) SCENE GENERATE d\u1ef1ng c\u1ea3nh \u0111\u00f3 quanh ch\u1ee7 th\u1ec3 trong t\u00e0i li\u1ec7u \u2014 t\u1ef1 kh\u1edbp m\u1ecdi g\u00f3c m\u00e1y. Kh\u00f3a Face/Pose/Frame = gi\u1eef nguy\u00ean b\u1ea3n.",
    i2p_objects: "Chi ti\u1ebft v\u1eadt th\u1ec3 & \u0111\u1ea1o c\u1ee5",
    i2p_light: "Chi ti\u1ebft \u00e1nh s\u00e1ng",
    i2p_color: "Chi ti\u1ebft m\u00e0u / grade",
    i2p_bg: "Chi ti\u1ebft n\u1ec1n",
    i2p_fg: "Chi ti\u1ebft ti\u1ec1n c\u1ea3nh",
    btn_i2p: "Image \u2192 Prompt (Tr\u00edch c\u1ea3nh)",
    i2p_fit: "Scene Auto-Fit \u2014 chi\u1ebfu l\u1ea1i c\u1ea3nh theo g\u00f3c / kho\u1ea3ng c\u00e1ch / \u1ed1ng k\u00ednh c\u1ee7a t\u00e0i li\u1ec7u",
    i2p_adapt: "\u0110i\u1ec1u ch\u1ec9nh s\u00e1ng & m\u00e0u c\u1ee7a ch\u1ee7 th\u1ec3 theo c\u1ea3nh",
    btn_scenegen: "SCENE GENERATE",
    st_extract: "\u0110ang tr\u00edch c\u1ea3nh th\u00e0nh prompt",
    st_extract_done: "Prompt c\u1ea3nh \u0111\u00e3 s\u1eb5n s\u00e0ng \u2014 xem l\u1ea1i \u1edf trang Prompt",
    scene_no_prompt: "\u00d4 prompt tr\u1ed1ng \u2014 h\u00e3y ch\u1ea1y Image \u2192 Prompt tr\u01b0\u1edbc",
    i2p_none: "H\u00e3y tick \u00edt nh\u1ea5t m\u1ed9t m\u1ee5c chi ti\u1ebft tr\u01b0\u1edbc",
    sec_light: "Studio Lighting \u2014 AI Relight",
    light_note: "Tick b\u1eadt \u0111\u00e8n, ch\u1ea1m m\u1ed9t h\u00e0ng \u0111\u1ec3 ch\u1ecdn, r\u1ed3i t\u1ea1o d\u00e1ng s\u00e1ng b\u1eb1ng sliders \u2014 s\u01a1 \u0111\u1ed3 3D nh\u00ecn t\u1eeb tr\u00ean c\u1eadp nh\u1eadt tr\u1ef1c ti\u1ebfp (\u25b4 = cao, \u25be = th\u1ea5p). LIGHTING GENERATE \u0111\u00e1nh s\u00e1ng l\u1ea1i \u0111\u00fang theo b\u1ed9 \u0111\u00e8n n\u00e0y; m\u1eb7t / d\u00e1ng / khung v\u1eabn kh\u00f3a.",
    lbl_my_prompt: "PROMPT TI\u1ebeNG VI\u1ec6T",
    lstage_model: "MODEL",
    lstage_cam: "CAM",
    l_key: "\u0110\u00e8n ch\u00ednh",
    l_fill: "\u0110\u00e8n ph\u1ee5 / tr\u01b0\u1edbc",
    l_butterfly: "Butterfly (tr\u00ean-tr\u01b0\u1edbc)",
    l_side: "\u0110\u00e8n c\u1ea1nh",
    l_rim: "\u0110\u00e8n vi\u1ec1n",
    l_back: "\u0110\u00e8n sau",
    l_hair: "\u0110\u00e8n t\u00f3c",
    l_bglight: "\u0110\u00e8n n\u1ec1n",
    lt_softbox: "Softbox",
    lt_octa: "Octa",
    lt_strip: "Strip",
    lt_umbrella: "Umbrella",
    lt_beauty: "Beauty",
    lt_hard: "Hard",
    li_int: "C\u01b0\u1eddng \u0111\u1ed9",
    li_angle: "G\u00f3c",
    li_height: "\u0110\u1ed9 cao",
    li_dist: "Kho\u1ea3ng c\u00e1ch",
    li_size: "K\u00edch th\u01b0\u1edbc",
    btn_lightgen: "LIGHTING GENERATE",
    light_none: "H\u00e3y b\u1eadt \u00edt nh\u1ea5t m\u1ed9t \u0111\u00e8n tr\u01b0\u1edbc",
    lg_equip: "Cho th\u1ea5y thi\u1ebft b\u1ecb \u0111\u00e8n trong \u1ea3nh (softbox / ch\u00e2n \u0111\u00e8n l\u1ed9 ra)",
    grp_chains: "Style Chains \u2014 k\u1ebft h\u1ee3p c\u00e1c style \u2713",
    chains_note: "B\u1eadt b\u1ea5t k\u1ef3 style n\u00e0o \u2014 ch\u00fang h\u00f2a v\u00e0o M\u1eccI Generate / preset / Retouch c\u00f9ng l\u00fac.",
    grp_restore: "Ph\u1ee5c ch\u1ebf \u1ea3nh c\u0169",
    p_restore: "Ph\u1ee5c ch\u1ebf \u1ea3nh c\u0169",
    rest_color: "M\u00e0u \u0111\u1ea7y \u0111\u1ee7",
    rest_bw: "\u0110en & tr\u1eafng",
    restore_note: "V\u00e1 v\u1ebft r\u00e1ch, h\u01b0 h\u1ea1i do n\u01b0\u1edbc / ch\u00e1y, b\u1ea1c m\u00e0u \u2014 gi\u1eef m\u1ecdi khu\u00f4n m\u1eb7t g\u1ed1c gi\u1ed1ng h\u1ec7t 100%.",
    rt_browstyle: "Ki\u1ec3u l\u00f4ng m\u00e0y",
    rt_lashstyle: "Ki\u1ec3u mi",
    rt_blush: "M\u00e0u m\u00e1 h\u1ed3ng",
    rt_contour: "Ki\u1ec3u t\u1ea1o kh\u1ed1i",
    rt_bust: "V\u00f2ng m\u1ed9t",
    rt_butt: "V\u00f2ng ba",
    rt_thigh: "\u0110\u00f9i",
    rt_calf: "B\u1eafp ch\u00e2n",
    rt_neck: "C\u1ed5",
    rt_fingers: "Ng\u00f3n tay",
    hint_prompt_my: "C\u1ee9 vi\u1ebft ti\u1ebfng Vi\u1ec7t \u2014 khi Generate s\u1ebd t\u1ef1 d\u1ecbch sang ti\u1ebfng Anh (t\u1ed1i \u0111a 20.000)",
    st_translate: "\u0110ang d\u1ecbch prompt sang ti\u1ebfng Anh",
    live_trans: "T\u1ef1 d\u1ecbch tr\u1ef1c ti\u1ebfp \u21c4 (EN \u2194 VI, sau khi b\u1ea1n ng\u1eebng g\u00f5)",
    st_retry: "\u0110ang th\u1eed l\u1ea1i",
    grp_recipes: "Recipes \u2014 l\u01b0u / chia s\u1ebb c\u00e0i \u0111\u1eb7t",
    recipe_note: "L\u01b0u T\u1ea4T C\u1ea2 (chains, retouch, \u0111\u00e8n, kh\u00f3a, prompt) th\u00e0nh m\u1ed9t t\u1ec7p .json \u2014 h\u1ecdc vi\u00ean ch\u1ec9 c\u1ea7n Load.",
    btn_recipe_save: "L\u01b0u Recipe",
    btn_recipe_load: "T\u1ea3i Recipe",
    st_recipe_saved: "\u0110\u00e3 l\u01b0u Recipe \u2713",
    st_recipe_loaded: "\u0110\u00e3 t\u1ea3i Recipe \u2713 \u2014 m\u1ecdi thi\u1ebft l\u1eadp \u0111\u00e3 c\u1eadp nh\u1eadt",
    st_recipe_bad: "Kh\u00f4ng ph\u1ea3i t\u1ec7p Recipe c\u1ee7a HNK",
    sec_final: "Prompt cu\u1ed1i (g\u1eedi t\u1edbi AI)",
    btn_copy: "Sao ch\u00e9p",
    st_copied: "\u0110\u00e3 sao ch\u00e9p \u2713",
    hist_note: "L\u1ecbch s\u1eed \u2014 6 k\u1ebft qu\u1ea3 g\u1ea7n nh\u1ea5t, ch\u1ea1m \u0111\u1ec3 xem:",
    btn_hist_prompt: "\u2192 Prompt",
    sec_batch: "Batch Mode",
    batch_note: "Ch\u1ecdn nhi\u1ec1u \u1ea3nh + m\u1ed9t th\u01b0 m\u1ee5c xu\u1ea5t \u2014 prompt, chains, cleanup v\u00e0 kh\u00f3a Keep hi\u1ec7n t\u1ea1i s\u1ebd ch\u1ea1y tr\u00ean m\u1ecdi \u1ea3nh; k\u1ebft qu\u1ea3 l\u01b0u d\u1ea1ng *_HNK.png.",
    btn_batch: "CH\u1ea0Y BATCH",
    btn_batch_stop: "D\u1eebng",
    st_batch: "Batch",
    st_batch_done: "Batch xong",
    sec_web: "Web AI \u2014 tr\u00ecnh duy\u1ec7t mini",
    web_note: "M\u1edf b\u1ea5t k\u1ef3 tr\u00ecnh s\u1eeda \u1ea3nh AI tr\u00ean web ngay trong Photoshop. T\u1ea1o \u1edf \u0111\u00f3, r\u1ed3i mang k\u1ebft qu\u1ea3 v\u1ec1 th\u00e0nh layer:",
    web_import_note: "Nh\u1eadp: \u2460 trong web app d\u00f9ng Copy image address r\u1ed3i b\u1ea5m IMPORT COPIED LINK \u00b7 \u2461 ho\u1eb7c t\u1ea3i t\u1ec7p v\u1ec1 v\u00e0 d\u00f9ng IMPORT FILE \u00b7 \u2462 c\u00e1c web app \u0111\u1ed1i t\u00e1c c\u00f3 HNK bridge s\u1ebd t\u1ef1 g\u1eedi \u1ea3nh v\u00e0o.",
    btn_web_go: "\u0110i",
    btn_web_home: "Trang ch\u1ee7",
    btn_web_reload: "T\u1ea3i l\u1ea1i",
    btn_web_import_link: "NH\u1eacP LINK \u0110\u00c3 COPY \u2192 PS",
    btn_web_import_file: "NH\u1eacP T\u1ec6P \u2192 PS",
    st_web_import: "\u0110\u00e3 nh\u1eadp v\u00e0o Photoshop th\u00e0nh layer \u2713",
    st_web_nourl: "H\u00e3y copy link \u1ea3nh tr\u01b0\u1edbc (chu\u1ed9t ph\u1ea3i \u2192 Copy image address)",
    st_web_fetch: "\u0110ang l\u1ea5y \u1ea3nh t\u1eeb link",
    st_web_notallowed: "T\u00ean mi\u1ec1n n\u00e0y kh\u00f4ng n\u1eb1m trong danh s\u00e1ch cho ph\u00e9p \u2014 c\u00f3 th\u1ec3 s\u1ebd tr\u1eafng trang. H\u00e3y nh\u1edd HNK th\u00eam v\u00e0o.",
    st_need_doc: "H\u00e3y m\u1edf m\u1ed9t t\u00e0i li\u1ec7u \u1ea3nh trong Photoshop tr\u01b0\u1edbc",
    sec_campro: "Camera Pro & ch\u1ea5t l\u01b0\u1ee3ng",
    autosave_lbl: "T\u1ef1 xu\u1ea5t m\u1ecdi k\u1ebft qu\u1ea3 (PNG + nh\u1eadt k\u00fd prompt \u2192 th\u01b0 m\u1ee5c)",
    st_folder_ok: "\u0110\u00e3 \u0111\u1eb7t th\u01b0 m\u1ee5c xu\u1ea5t \u2713",
    st_exported: "\u0110\u00e3 xu\u1ea5t \u2713",
    st_export_fail: "Xu\u1ea5t th\u1ea5t b\u1ea1i \u2014 ki\u1ec3m tra l\u1ea1i th\u01b0 m\u1ee5c",
    st_pro_fallback: "Model Pro kh\u00f4ng kh\u1ea3 d\u1ee5ng \u2014 \u0111\u00e3 chuy\u1ec3n sang Flash cho l\u1ea7n ch\u1ea1y n\u00e0y",
    st_img_bad: "D\u1eef li\u1ec7u \u1ea3nh kh\u00f4ng qua \u0111\u01b0\u1ee3c ki\u1ec3m tra to\u00e0n v\u1eb9n \u2014 h\u00e3y th\u00eam l\u1ea1i \u1ea3nh",
    st_auto_comp: "Gh\u00e9p t\u1ef1 \u0111\u1ed9ng: ch\u1ee7 th\u1ec3 IMAGE 1 \u2192 c\u1ea3nh tham chi\u1ebfu",
    prov_lbl: "Nh\u00e0 cung c\u1ea5p AI",
    oai_key_ph: "sk-... (OpenAI API key)",
    tab_create: "Create",
    create_note: "CH\u1ebe \u0110\u1ed8 CREATE \u2014 t\u1ea1o \u1ea3nh ho\u00e0n to\u00e0n m\u1edbi t\u1eeb prompt c\u1ee7a b\u1ea1n (+ 4 ref ri\u00eang). Ho\u00e0n to\u00e0n \u0111\u1ed9c l\u1eadp: kh\u00f4ng \u0111\u1ecdc t\u00e0i li\u1ec7u, preset, chains hay kh\u00f3a n\u00e0o.",
    create_ph: "M\u00f4 t\u1ea3 b\u1ee9c \u1ea3nh b\u1ea1n mu\u1ed1n t\u1ea1o\u2026",
    btn_create_ps: "\u2b07 G\u1eedi sang Photoshop",
    btn_to_ref: "\u21ba D\u00f9ng l\u00e0m Ref 1",
    st_to_ref: "\u0110\u00e3 n\u1ea1p k\u1ebft qu\u1ea3 v\u00e0o Ref 1 \u2713",
    scope_create_note: "\u0110\u1ed9c l\u1eadp v\u1edbi Model & Output c\u1ee7a Setup \u2014 c\u00e1c thi\u1ebft l\u1eadp n\u00e0y ch\u1ec9 \u00e1p d\u1ee5ng cho Generate c\u1ee7a Create.",
    cr_ratio: "T\u1ec9 l\u1ec7",
    cr_var: "Bi\u1ebfn th\u1ec3",
    cr_restyle: "\u267b \u0110\u1ed5i style k\u1ebft qu\u1ea3",
    cr_lib: "Th\u01b0 vi\u1ec7n prompt \u2014 ch\u1ea1m \u0111\u1ec3 ch\u00e8n",
    cr_improve: "\u2728 C\u1ea3i thi\u1ec7n",
    cr_describe: "\ud83d\udd0d \u0110\u1ecdc Ref 1 \u2192 Prompt",
    st_describing: "\u0110ang \u0111\u1ecdc \u1ea3nh tham chi\u1ebfu\u2026",
    st_described: "\u0110\u00e3 vi\u1ebft prompt t\u1eeb Ref 1 \u2713",
    st_need_gem: "H\u00e3y th\u00eam Gemini API key (Setup) \u2014 ch\u1ee9c n\u0103ng n\u00e0y d\u00f9ng Gemini text",
    st_need_ref1: "H\u00e3y th\u00eam \u1ea3nh v\u00e0o Ref 1 tr\u01b0\u1edbc",
    st_lib_added: "\u0110\u00e3 th\u00eam prompt \u2713",
    cr_refs: "\u1ea2nh tham chi\u1ebfu (t\u1ed1i \u0111a 4)",
    cr_refs_note: "T\u00f9y ch\u1ecdn \u2014 th\u00eam b\u1eb1ng Layer / File / Web. Create ch\u1ec9 l\u1ea5y nh\u1eefng g\u00ec prompt c\u1ee7a b\u1ea1n y\u00eau c\u1ea7u.",
    cr_results: "K\u1ebft qu\u1ea3",
    cr_gal_empty: "Ch\u01b0a c\u00f3 k\u1ebft qu\u1ea3 \u2014 h\u00e3y b\u1ea5m Generate.",
    cr_gal_have: "k\u1ebft qu\u1ea3 \u00b7 ch\u1ea1m v\u00e0o \u1ea3nh nh\u1ecf \u0111\u1ec3 xem / thao t\u00e1c",
    cr_save: "\u2b07 L\u01b0u PNG",
    cr_engine: "Engine",
    cr_need_result: "H\u00e3y t\u1ea1o m\u1ed9t \u1ea3nh tr\u01b0\u1edbc",
    btn_web_import_url: "\u2b07 Nh\u1eadp URL",
    st_clip_help: "Clipboard tr\u1ed1ng ho\u1eb7c b\u1ecb ch\u1eb7n \u2014 h\u00e3y d\u00e1n link v\u00e0o thanh URL r\u1ed3i b\u1ea5m \u2b07 Import URL",
    st_web_blob: "\u0110\u00f3 l\u00e0 link blob: t\u1ea1m th\u1eddi \u2014 h\u00e3y chu\u1ed9t ph\u1ea3i \u2192 Copy IMAGE Address, ho\u1eb7c l\u01b0u t\u1ec7p r\u1ed3i d\u00f9ng Import File",
    err_key: "API key kh\u00f4ng h\u1ee3p l\u1ec7 \u2014 ki\u1ec3m tra l\u1ea1i key \u1edf tab Setup",
    err_quota: "H\u1ebft quota / b\u1ecb gi\u1edbi h\u1ea1n t\u1ea7n su\u1ea5t \u2014 ch\u1edd m\u1ed9t l\u00e1t r\u1ed3i th\u1eed l\u1ea1i",
    err_big: "\u1ea2nh qu\u00e1 l\u1edbn so v\u1edbi API \u2014 h\u00e3y thu nh\u1ecf r\u1ed3i th\u1eed l\u1ea1i",
    err_safety: "B\u1ecb b\u1ed9 l\u1ecdc an to\u00e0n ch\u1eb7n \u2014 h\u00e3y ch\u1ec9nh prompt ho\u1eb7c \u1ea3nh r\u1ed3i th\u1eed l\u1ea1i",
    err_net: "S\u1ef1 c\u1ed1 m\u1ea1ng / m\u00e1y ch\u1ee7 \u2014 vui l\u00f2ng th\u1eed l\u1ea1i",
    err_timeout: "Y\u00eau c\u1ea7u qu\u00e1 h\u1ea1n \u2014 m\u00e1y ch\u1ee7 ph\u1ea3n h\u1ed3i qu\u00e1 l\u00e2u; vui l\u00f2ng th\u1eed l\u1ea1i",
    err_generic: "Kh\u00f4ng th\u1ec3 ho\u00e0n t\u1ea5t y\u00eau c\u1ea7u \u2014 vui l\u00f2ng th\u1eed l\u1ea1i",
    err_img: "Kh\u00f4ng t\u1ea1o \u0111\u01b0\u1ee3c \u1ea3nh d\u00f9ng \u0111\u01b0\u1ee3c \u2014 vui l\u00f2ng th\u1eed l\u1ea1i",
    err_mode: "T\u00e0i li\u1ec7u n\u00e0y kh\u00f4ng \u1edf ch\u1ebf \u0111\u1ed9 RGB \u2014 h\u00e3y chuy\u1ec3n \u0111\u1ed5i tr\u01b0\u1edbc (Image \u25b8 Mode \u25b8 RGB Color) r\u1ed3i th\u1eed l\u1ea1i",
    cam_master: "B\u1eadt kh\u1ed1i Camera \u2014 n\u1ed1i v\u00e0o cu\u1ed1i M\u1eccI prompt",
    cam_body: "Th\u00e2n m\u00e1y",
    cam_lens: "\u1ed0ng k\u00ednh prime (mm)",
    cam_f: "Kh\u1ea9u \u0111\u1ed9",
    cam_film: "Ch\u1ea5t phim",
    cam_bokeh: "Ki\u1ec3u bokeh",
    cam_iso: "ISO",
    cam_k: "WB Kelvin",
    cam_note: "B\u1eadt kh\u1ed1i n\u00e0y tr\u01b0\u1edbc, r\u1ed3i ch\u1ec9 ch\u1ecdn th\u1ee9 b\u1ea1n c\u1ea7n \u2014 chip \u2013 s\u1ebd kh\u00f4ng \u0111\u01b0\u1ee3c ghi. M\u1ecdi th\u1ee9 n\u1ed1i v\u00e0o cu\u1ed1i prompt cu\u1ed1i c\u00f9ng.",
    ro_h_main: "REFERENCE OPS PRO (Ref1 / Ref2)",
    ro_note: "Ref1 = IMAGE 2 (n\u1eef) \u00b7 Ref2 = IMAGE 3 (nam). Ch\u1ecdn m\u1ee5c ti\u00eau r\u1ed3i ch\u1ea1y \u2014 ng\u01b0\u1eddi kh\u00f4ng kh\u1edbp kh\u00f4ng bao gi\u1edd b\u1ecb \u0111\u1ed5i.",
    ro_target: "M\u1ee5c ti\u00eau:",
    ro_solo: "\u0110\u01a1n",
    ro_couple: "C\u1eb7p \u0111\u00f4i",
    ro_family: "Gia \u0111\u00ecnh",
    ro_mk: "Ch\u00e9p makeup t\u1eeb ref",
    ro_hair: "L\u1ea5y ki\u1ec3u t\u00f3c t\u1eeb ref",
    ro_h_face: "Face Ops",
    ro_h_bg: "BG / FG Ops",
    ro_h_sub: "Subject Ops",
    ro_h_lc: "Light & Color Ops",
    ro_h_dress: "Dress Ops",
    ro_h_mk: "Makeup Ops",
    ro_h_match: "\u2605 Master Match (m\u1ed9t l\u1ed1i nh\u00ecn)",
    ro_match_note: "Kh\u1edbp IMAGE 1 v\u1edbi \u1ea3nh tham chi\u1ebfu \u0111\u1ec3 c\u1ea3 hai nh\u01b0 c\u00f9ng m\u1ed9t b\u1ea3n ch\u1ec9nh \u2014 tick nh\u1eefng g\u00ec c\u1ea7n kh\u1edbp:",
    m_color: "M\u00e0u",
    m_light: "S\u00e1ng",
    m_makeup: "Makeup",
    m_skin: "Retouch da",
    crd_pipe: "\u26d3 Pipeline Builder \u2014 n\u1ed1i b\u1ea5t c\u1ee9 th\u1ee9 g\u00ec",
    pipe_note: "N\u1ed1i B\u1ea4T K\u1ef2 b\u01b0\u1edbc n\u00e0o th\u00e0nh m\u1ed9t chu\u1ed7i \u2014 k\u1ebft qu\u1ea3 m\u1ed7i b\u01b0\u1edbc l\u00e0 \u0111\u1ea7u v\u00e0o c\u1ee7a b\u01b0\u1edbc sau. T\u1ed1i \u0111a 6.",
    pipe_add: "+ Th\u00eam",
    pipe_run: "\u25b6 CH\u1ea0Y PIPELINE",
    pipe_clear: "X\u00f3a",
    pipe_retouch: "\u00c1p d\u1ee5ng Retouch (sliders hi\u1ec7n t\u1ea1i)",
    pipe_relight: "Relight (b\u1ed9 \u0111\u00e8n hi\u1ec7n t\u1ea1i)",
    pipe_prompt: "Prompt (\u00f4 EN hi\u1ec7n t\u1ea1i)",
    pipe_empty: "H\u00e3y th\u00eam \u00edt nh\u1ea5t m\u1ed9t b\u01b0\u1edbc tr\u01b0\u1edbc",
    pipe_max: "Pipeline \u0111\u00e3 \u0111\u1ea7y (t\u1ed1i \u0111a 6 b\u01b0\u1edbc)",
    st_pipe: "B\u01b0\u1edbc pipeline",
    st_pipe_done: "Pipeline xong",
    st_pipe_stop: "Pipeline d\u1eebng (m\u1ed9t b\u01b0\u1edbc th\u1ea5t b\u1ea1i)",
    pipe_merge: "\u26a1 G\u1ed9p m\u1ed9t l\u1ea7n \u2014 T\u1ea4T C\u1ea2 c\u00e1c b\u01b0\u1edbc trong M\u1ed8T l\u1ea7n g\u1ecdi (nhanh/r\u1ebb \u00b7 t\u1ed1t nh\u1ea5t \u2264 3 vi\u1ec7c)",
    crd_chainsrest: "Style Chains + ph\u1ee5c ch\u1ebf \u1ea3nh c\u0169",
    crd_refops: "Reference Ops Pro (Ref1 / Ref2)",
    crd_scenes: "\ud83c\udfac Scenes Pro \u2014 ch\u1ee7 th\u1ec3 kh\u00f3a \u00b7 c\u1ea3nh kh\u1edbp theo",
    scn_note: "Kh\u00f3a ch\u1ee7 th\u1ec3 c\u1ee7a b\u1ea1n (m\u1eb7t \u00b7 d\u00e1ng \u00b7 trang ph\u1ee5c \u00b7 khung) r\u1ed3i d\u1ef1ng l\u1ea1i to\u00e0n c\u1ea3nh cho kh\u1edbp \u2014 \u00e1nh s\u00e1ng, b\u00f3ng \u0111\u1ed5, m\u00e0u, n\u1ec1n, ti\u1ec1n c\u1ea3nh v\u00e0 v\u1eadt th\u1ec3 \u0111\u1ec1u t\u1ef1 th\u00edch \u1ee9ng \u0111\u1ec3 ra \u1ea3nh nh\u01b0 ch\u1ee5p th\u1eadt.",
    scn_h_style: "Phong c\u00e1ch c\u1ea3nh (trong nh\u00e0 / v\u0103n h\u00f3a)",
    scn_h_bday: "\ud83c\udf82 Sinh nh\u1eadt \u2014 s\u1ed1 tu\u1ed5i 1\u201345",
    scn_h_cap: "Ch\u00fa th\u00edch / ch\u1eef (b\u00e9 \u00b7 Miss Universe \u00b7 sinh nh\u1eadt)",
    scn_h_scarf: "Ngo\u00e0i tr\u1eddi / kh\u0103n bay",
    scn_grad: "T\u1ed1t nghi\u1ec7p trong nh\u00e0",
    scn_prewed: "Prewedding trong nh\u00e0",
    scn_vietnam: "Vi\u1ec7t Nam",
    scn_myanmar: "Myanmar",
    scn_chinese: "Trung Hoa",
    scn_shan: "Shan",
    scn_newborn: "S\u01a1 sinh / em b\u00e9",
    scn_age: "Tu\u1ed5i",
    scn_bday_go: "\ud83c\udf82 C\u1ea2NH SINH NH\u1eacT",
    scn_cap_on: "Th\u00eam ch\u1eef ch\u00fa th\u00edch",
    scn_cap_ph: "N\u1ed9i dung ch\u1eef (vd. Happy 1st Birthday, t\u00ean)\u2026",
    scn_cap_pos: "V\u1ecb tr\u00ed",
    scn_top: "Tr\u00ean",
    scn_bottom: "D\u01b0\u1edbi",
    scn_scarf: "\u2726 C\u1ea2NH KH\u0102N BAY",
    scn_dir: "H\u01b0\u1edbng",
    scn_left: "Tr\u00e1i",
    scn_right: "Ph\u1ea3i",
    scn_up: "L\u00ean",
    scn_len: "\u0110\u1ed9 d\u00e0i",
    scn_short: "Ng\u1eafn",
    scn_long: "D\u00e0i",
    g_cat_scene: "SCENE OP \u2014 ch\u1ee7 th\u1ec3 c\u1ee7a b\u1ea1n b\u1ecb kh\u00f3a (m\u1eb7t \u00b7 d\u00e1ng \u00b7 trang ph\u1ee5c \u00b7 khung); to\u00e0n b\u1ed9 c\u1ea3nh \u0111\u01b0\u1ee3c t\u1ea1o (s\u00e1ng, b\u00f3ng, m\u00e0u, n\u1ec1n, ti\u1ec1n c\u1ea3nh, v\u1eadt th\u1ec3, kh\u00f4ng kh\u00ed) t\u1ef1 kh\u1edbp theo ch\u1ee7 th\u1ec3 \u0111\u1ec3 ra \u1ea3nh gh\u00e9p nh\u01b0 ch\u1ee5p th\u1eadt.",
    crd_wed: "\u2665 Wedding Pro Suite",
    crd_recipes: "Recipes \u2014 l\u01b0u / chia s\u1ebb",
    learn_lbl: "\ud83c\udf93 Learn Mode \u2014 ch\u1ea1m 1 = h\u01b0\u1edbng d\u1eabn (v\u00e0ng), 2 = prompt (xanh d\u01b0\u01a1ng), 3 = CH\u1ea0Y (xanh l\u00e1)",
    guide_hint: "Ch\u1ea1m l\u1ea7n n\u1eefa: v\u00e0ng \u2192 xanh d\u01b0\u01a1ng (prompt) \u2192 xanh l\u00e1 (ch\u1ea1y) \u25b6",
    g_learn_next_prompt: "Ch\u1ea1m l\u1ea7n n\u1eefa \u2192 hi\u1ec7n \u0111\u00fang PROMPT s\u1ebd g\u1eedi (xanh d\u01b0\u01a1ng).",
    g_learn_prompt_head: "PROMPT n\u00fat n\u00e0y s\u1ebd g\u1eedi (ch\u1ea1m l\u1ea7n n\u1eefa = CH\u1ea0Y):",
    g_learn_next_run: "Ch\u1ea1m th\u00eam m\u1ed9t l\u1ea7n \u2192 RUN (xanh l\u00e1) b\u1eaft \u0111\u1ea7u t\u1ea1o.",
    st_prompt_ready: "Prompt \u0111\u00e3 s\u1eb5n s\u00e0ng \u2014 ch\u1ea1m l\u1ea7n n\u1eefa (xanh l\u00e1) \u0111\u1ec3 ch\u1ea1y \u2713",
    g_step_doc: "H\u00e3y m\u1edf t\u00e0i li\u1ec7u \u1ea3nh c\u1ee7a b\u1ea1n trong Photoshop tr\u01b0\u1edbc.",
    g_step_ref1: "N\u1ea1p \u1ea3nh tham chi\u1ebfu v\u00e0o Ref1 (n\u00f3 th\u00e0nh IMAGE 2). Th\u00eam Ref2 n\u1ebfu c\u00f3 ng\u01b0\u1eddi th\u1ee9 hai.",
    g_step_target: "Ch\u1ecdn Target: Solo / Couple (Ref1 = n\u1eef, Ref2 = nam) / Family.",
    g_step_mkhair: "T\u00f9y ch\u1ecdn: tick \u2018Copy ref makeup\u2019 / \u2018Take ref hairstyle\u2019 ph\u00eda tr\u00ean Face Ops.",
    g_step_petal: "H\u00e3y ch\u1ecdn m\u00e0u c\u00e1nh hoa tr\u01b0\u1edbc (auto = kh\u1edbp c\u1ea3nh c\u1ee7a b\u1ea1n).",
    g_step_rest: "Ch\u1ecdn Full Color ho\u1eb7c B&W b\u1eb1ng d\u1ea5u \u2713 ph\u00eda tr\u00ean.",
    g_step_int: "Ch\u1ec9nh thanh Intensity theo \u00fd b\u1ea1n.",
    g_step_confirm: "Ch\u1ea1m l\u1ea7n n\u1eefa \u0111\u1ec3 \u0111i ti\u1ebfp: GUIDE (v\u00e0ng) \u2192 PROMPT (xanh d\u01b0\u01a1ng) \u2192 RUN (XANH L\u00c1 l\u00e0 ch\u1ea1y th\u1eadt).",
    g_cat_face: "FACE OP \u2014 chuy\u1ec3n khu\u00f4n m\u1eb7t tham chi\u1ebfu sang \u0111\u00fang ng\u01b0\u1eddi t\u01b0\u01a1ng \u1ee9ng; nh\u1eefng ng\u01b0\u1eddi kh\u00e1c gi\u1eef nguy\u00ean.",
    g_cat_sub: "SUBJECT OP \u2014 \u0111\u01b0a/bi\u1ebfn NG\u01af\u1edcI trong \u1ea3nh tham chi\u1ebfu v\u00e0o c\u1ea3nh c\u1ee7a b\u1ea1n; c\u1ea3nh v\u00e0 khung h\u00ecnh gi\u1eef nguy\u00ean.",
    g_cat_bgfg: "BG/FG OP \u2014 ch\u1ec9 \u0111\u1ed5i n\u1ec1n / ti\u1ec1n c\u1ea3nh theo \u1ea3nh tham chi\u1ebfu.",
    g_cat_lc: "LIGHT & COLOR OP \u2014 ch\u00e9p \u00e1nh s\u00e1ng v\u00e0 t\u00f4ng m\u00e0u c\u1ee7a \u1ea3nh tham chi\u1ebfu; con ng\u01b0\u1eddi gi\u1eef trung th\u1ef1c t\u1eebng pixel.",
    g_cat_dress: "DRESS OP \u2014 ch\u1ec9 \u0111\u1ed5i trang ph\u1ee5c theo \u1ea3nh tham chi\u1ebfu.",
    g_cat_mkop: "MAKEUP OP \u2014 ch\u1ec9 \u0111\u1ed5i l\u1edbp trang \u0111i\u1ec3m theo \u1ea3nh tham chi\u1ebfu.",
    g_cat_match: "MASTER MATCH \u2014 l\u00e0m \u1ea3nh c\u1ee7a b\u1ea1n kh\u1edbp to\u00e0n b\u1ed9 l\u1ed1i nh\u00ecn c\u1ee7a \u1ea3nh tham chi\u1ebfu (tick c\u00e1c l\u1edbp ph\u00eda tr\u00ean).",
    g_cat_trail: "WEDDING TRAIL \u2014 th\u1ea3m c\u1ecf sang tr\u1ecdng + l\u1ed1i hoa tr\u1ea3i d\u00e0i; m\u1eb7t/d\u00e1ng/khung b\u1ecb kh\u00f3a ch\u1eb7t.",
    g_cat_veil: "FLYING VEIL \u2014 th\u00eam/k\u00e9o d\u00e0i voan bay trong gi\u00f3 theo \u0111\u1ed9 d\u00e0i n\u00e0y; kh\u00f4ng bao gi\u1edd che m\u1eb7t.",
    g_cat_gown: "GOWN \u2014 l\u00e0m s\u1ea1ch chi\u1ebfc v\u00e1y s\u1eb5n c\u00f3 (gi\u1eef nguy\u00ean thi\u1ebft k\u1ebf) v\u00e0 \u0111\u1eb7t \u0111\u1ed9 d\u00e0i \u0111u\u00f4i v\u00e1y n\u00e0y.",
    g_cat_petal: "FLYING PETALS \u2014 th\u00eam c\u00e1nh hoa bay theo ki\u1ec3u n\u00e0y; m\u00e0u l\u1ea5y t\u1eeb b\u1ea3ng m\u00e0u ph\u00eda tr\u00ean.",
    g_cat_wedx: "WEDDING EXTRA \u2014 th\u00eam chi ti\u1ebft n\u00e0y cho kh\u1edbp c\u1ea3nh c\u1ee7a b\u1ea1n; ch\u1ee7 th\u1ec3 v\u1eabn kh\u00f3a.",
    g_cat_canvas: "REPLACE (CANVAS) \u2014 \u0111\u01b0a ch\u1ee7 th\u1ec3 C\u1ee6A B\u1ea0N v\u00e0o c\u1ea3nh c\u1ee7a \u1ea3nh tham chi\u1ebfu; ng\u01b0\u1eddi trong ref b\u1ecb x\u00f3a.",
    g_cat_restore: "OLD PHOTO RESTORE \u2014 v\u00e1 h\u01b0 h\u1ea1i; m\u1ecdi khu\u00f4n m\u1eb7t g\u1ed1c gi\u1eef gi\u1ed1ng h\u1ec7t 100%.",
    g_cat_generic: "PRESET \u2014 \u00e1p d\u1ee5ng b\u1ea3n ch\u1ec9nh chuy\u00ean nghi\u1ec7p n\u00e0y l\u00ean \u1ea3nh c\u1ee7a b\u1ea1n.",
    g_gen: "GENERATE \u2014 ch\u1ea1y \u00f4 prompt (+ chains, kh\u00f3a Keep, kh\u1ed1i camera) tr\u00ean t\u00e0i li\u1ec7u c\u1ee7a b\u1ea1n.",
    g_retouchbtn: "RETOUCH APPLY \u2014 ch\u1ea1y to\u00e0n b\u1ed9 thi\u1ebft l\u1eadp sliders th\u00e0nh m\u1ed9t l\u01b0\u1ee3t retouch chuy\u00ean nghi\u1ec7p.",
    g_relightbtn: "LIGHTING GENERATE \u2014 \u0111\u00e1nh s\u00e1ng l\u1ea1i \u1ea3nh \u0111\u00fang theo s\u01a1 \u0111\u1ed3 \u0111\u00e8n 3D c\u1ee7a b\u1ea1n.",
    g_scene: "SCENE GENERATE \u2014 d\u1ef1ng l\u1ea1i c\u1ea3nh t\u1eeb prompt \u0111\u00e3 tr\u00edch; ch\u1ee7 th\u1ec3 gi\u1eef nguy\u00ean.",
    g_rmix: "REPLACE MIX \u2014 ch\u1ec9 thay c\u00e1c ph\u1ea7n \u0111\u00e3 tick \u2713 t\u1eeb \u1ea3nh tham chi\u1ebfu.",
    g_pipe: "RUN PIPELINE \u2014 ch\u1ea1y m\u1ecdi b\u01b0\u1edbc \u0111\u00e3 n\u1ed1i theo th\u1ee9 t\u1ef1; k\u1ebft qu\u1ea3 m\u1ed7i b\u01b0\u1edbc v\u00e0o b\u01b0\u1edbc k\u1ebf.",
    ro_faceRep: "Face Replace",
    ro_faceSwap: "Face Swap",
    ro_bgRep: "BG Replace",
    ro_bgSwap: "BG Swap",
    ro_fgRep: "FG Replace",
    ro_bg_note: "Doc = ch\u1ee7 th\u1ec3 \u00b7 Ref1 = c\u1ea3nh m\u1edbi. Target (Solo/Couple/Family) ch\u1ecdn gi\u1eef l\u1ea1i ai.",
    ro_bg_frame: "Gi\u1eef khung & b\u1ed1 c\u1ee5c",
    ro_bg_light: "Gi\u1eef s\u00e1ng/m\u00e0u c\u1ee7a ch\u1ee7 th\u1ec3",
    ro_subSwap: "Subject Swap",
    ro_lcRef: "L&C Reference",
    ro_lcCopy: "L&C Copy-Paste",
    ro_dressRef: "Dress Reference",
    ro_dressRep: "Dress Replace",
    ro_mkCopy: "Makeup Copy",
    ro_matchBtn: "\u2605 MASTER MATCH",
    grp_retouch: "Preset retouch da",
    lbl_intensity: "C\u01b0\u1eddng \u0111\u1ed9",
    p_evoto: "Evoto Style",
    p_meitu: "Meitu Style",
    auto_place: "T\u1ef1 \u0111\u1eb7t k\u1ebft qu\u1ea3 v\u00e0o Photoshop th\u00e0nh layer m\u1edbi",
    sec_retouchpro: "Retouch Pro \u2014 Sliders",
    rt_skin: "Da",
    rt_faceai: "Face AI",
    rt_hair: "T\u00f3c",
    rt_dress: "Trang ph\u1ee5c",
    rt_bg: "N\u1ec1n",
    rt_smooth: "M\u1ecbn da",
    rt_acne: "X\u00f3a m\u1ee5n",
    rt_spots: "\u0110\u1ed1m th\u00e2m",
    rt_wrinkle: "N\u1ebfp nh\u0103n",
    rt_tone: "Tr\u1eafng / n\u00e2u da",
    rt_glow: "R\u1ea1ng r\u1ee1",
    rt_reshape: "AI Reshape",
    rt_lash: "L\u00f4ng mi",
    rt_brow: "L\u00f4ng m\u00e0y",
    rt_lipsmooth: "M\u1ecbn m\u00f4i",
    rt_lipcolor: "M\u00e0u m\u00f4i",
    rt_lenscolor: "M\u00e0u lens m\u1eaft",
    rt_hairstray: "T\u00f3c con",
    rt_hairsmooth: "M\u01b0\u1ee3t t\u00f3c",
    rt_hairshine: "B\u00f3ng t\u00f3c (D&B)",
    rt_dresssmooth: "M\u1ecbn v\u1ea3i",
    rt_dressedge: "D\u1ecdn vi\u1ec1n",
    rt_dresswrinkle: "X\u00f3a nh\u0103n v\u1ea3i",
    rt_dresstexture: "Ph\u1ee5c h\u1ed3i v\u00e2n v\u1ea3i",
    rt_bgsmooth: "L\u00e0m s\u1ea1ch/m\u1ecbn n\u1ec1n",
    rt_bgcolor: "M\u00e0u n\u1ec1n",
    rt_bgrecolor: "M\u01b0\u1ee3t m\u00e0u n\u1ec1n",
    rt_shape: "Reshape Pro (m\u1eb7t + d\u00e1ng)",
    rt_teeth: "Tr\u1eafng r\u0103ng",
    rt_eyewhite: "L\u00e0m s\u1ea1ch l\u00f2ng tr\u1eafng m\u1eaft",
    rt_faceslim: "Thon m\u1eb7t",
    rt_jaw: "\u0110\u01b0\u1eddng h\u00e0m",
    rt_chin: "C\u1eb1m",
    rt_nosesize: "K\u00edch c\u1ee1 m\u0169i",
    rt_eyesize: "K\u00edch c\u1ee1 m\u1eaft",
    rt_lipfull: "M\u00f4i \u0111\u1ea7y",
    rt_waist: "Thon eo",
    rt_bodyslim: "Thon d\u00e1ng",
    rt_shoulder: "Vai",
    rt_hip: "Thon h\u00f4ng",
    rt_leglen: "D\u00e0i ch\u00e2n",
    rt_armslim: "Thon tay",
    rt_dressfit: "V\u1eeba v\u1eb7n trang ph\u1ee5c",
    rt_dressclean: "L\u00e0m s\u1ea1ch trang ph\u1ee5c",
    rt_dresscolorpure: "M\u00e0u trang ph\u1ee5c thu\u1ea7n",
    rt_bodygrp: "Body Skin Pro",
    rt_bodysmooth: "M\u1ecbn da to\u00e0n th\u00e2n",
    rt_bodyblemish: "X\u00f3a khuy\u1ebft \u0111i\u1ec3m da",
    rt_bodytone: "\u0110\u1ec1u m\u00e0u da",
    rt_bodyglow: "Da r\u1ea1ng r\u1ee1",
    rt_bodyhairrm: "Gi\u1ea3m l\u00f4ng",
    rt_hairvolume: "\u0110\u1ed9 ph\u1ed3ng t\u00f3c",
    rt_hairgloss: "\u00d3ng t\u00f3c",
    rt_hairfill: "L\u1ea5p t\u00f3c (v\u00f9ng th\u01b0a)",
    wp_h_trail: "\u2665 Wedding \u2014 th\u1ea3m hoa sang tr\u1ecdng",
    wp_h_veil: "\u2665 Wedding \u2014 voan bay",
    wp_h_gown: "\u2665 Wedding \u2014 l\u00e0m s\u1ea1ch v\u00e1y + \u0111u\u00f4i v\u00e1y",
    wp_h_petal: "\u2665 Wedding \u2014 c\u00e1nh hoa bay",
    wp_h_extra: "\u2665 Wedding \u2014 ng\u1ef1a \u00b7 n\u01b0\u1edbc \u00b7 kh\u00f4ng kh\u00ed",
    wp_note: "Face ID / d\u00e1ng / khung / thi\u1ebft k\u1ebf v\u00e1y b\u1ecb kh\u00f3a ch\u1eb7t \u2014 ch\u1ec9 chi ti\u1ebft \u0111\u01b0\u1ee3c n\u00eau t\u00ean m\u1edbi thay \u0111\u1ed5i.",
    wp_petalcolor: "M\u00e0u c\u00e1nh hoa (auto = kh\u1edbp c\u1ea3nh)",
    wp_trail_c: "M\u00e0u hoa",
    wp_trail_go: "\u25b6 Th\u1ea3m hoa",
    wp_veil_c: "\u0110\u1ed9 d\u00e0i voan",
    wp_veil_go: "\u25b6 Voan bay",
    wp_gown_c: "\u0110\u1ed9 d\u00e0i \u0111u\u00f4i v\u00e1y",
    wp_gown_go: "\u25b6 L\u00e0m s\u1ea1ch v\u00e1y + \u0111u\u00f4i",
    wp_pet_c: "Ki\u1ec3u c\u00e1nh hoa",
    wp_pet_go: "\u25b6 C\u00e1nh hoa bay",
    wp_extra_c: "Th\u00eam",
    wp_extra_go: "\u25b6 Th\u00eam chi ti\u1ebft",
    btn_apply_rt: "\u00c1p d\u1ee5ng Retouch",
    btn_reset: "\u0110\u1eb7t l\u1ea1i",
    rt_none: "H\u00e3y ch\u1ec9nh \u00edt nh\u1ea5t m\u1ed9t slider ho\u1eb7c m\u00e0u retouch tr\u01b0\u1edbc",
    tab_setup: "Setup",
    tab_prompt: "Studio",
    tab_presets: "Presets",
    recent_lbl: "Prompt g\u1ea7n \u0111\u00e2y\u2026",
    tab_retouch: "Retouch",
    tab_aitools: "AI Tools",
    cap_warn: "Photoshop gi\u1edbi h\u1ea1n \u00f4 prompt n\u00e0y \u1edf:",
    cleanup_note: "C\u00e1c m\u1ee5c \u0111\u00e3 tick s\u1ebd ch\u1ea1y k\u00e8m M\u1eccI Generate / preset.",
    btn_generate: "GENERATE",
    st_ready: "S\u1eb5n s\u00e0ng",
    st_capture: "\u0110ang l\u1ea5y t\u00e0i li\u1ec7u",
    st_gen: "\u0110ang t\u1ea1o\u2026",
    st_place: "\u0110ang \u0111\u1eb7t v\u00e0o Photoshop\u2026",
    st_placed_masked: "\u0110\u00e3 \u0111\u1eb7t th\u00e0nh nh\u00f3m Layer + Mask \u2014 \u1ea3nh g\u1ed1c nguy\u00ean v\u1eb9n \u2713",
    st_placed_plain: "\u0110\u00e3 \u0111\u1eb7t th\u00e0nh layer th\u01b0\u1eddng (host n\u00e0y kh\u00f4ng h\u1ed7 tr\u1ee3 mask/group)",
    stage_queued: "\u0110ang ch\u1edd",
    stage_uploading: "\u0110ang t\u1ea3i l\u00ean",
    stage_generating: "\u0110ang t\u1ea1o",
    stage_downloading: "\u0110ang t\u1ea3i v\u1ec1",
    stage_placing: "\u0110ang \u0111\u1eb7t",
    st_done: "Xong \u2713",
    st_err: "L\u1ed7i",
    st_no_doc: "Kh\u00f4ng c\u00f3 t\u00e0i li\u1ec7u \u0111ang m\u1edf \u2014 h\u00e3y m\u1edf m\u1ed9t \u1ea3nh tr\u01b0\u1edbc",
    st_no_prompt: "Prompt \u0111ang tr\u1ed1ng",
    need_ref: "Preset n\u00e0y c\u1ea7n m\u1ed9t \u1ea3nh tham chi\u1ebfu \u1edf \u00f4 1",
    st_new_doc: "K\u1ebft qu\u1ea3 \u0111\u00e3 m\u1edf th\u00e0nh t\u00e0i li\u1ec7u m\u1edbi \u2713",
    sec_preview: "Xem tr\u01b0\u1edbc \u2014 Before / After",
    before: "TR\u01af\u1edaC",
    after: "SAU",
    btn_place: "\u0110\u1eb7t v\u00e0o Photoshop",
    btn_saveas: "L\u01b0u th\u00e0nh\u2026",
    st_saved: "\u0110\u00e3 l\u01b0u \u2713",
    sec_diag: "Ki\u1ec3m tra h\u1ec7 th\u1ed1ng",
    sec_log: "Nh\u1eadt k\u00fd ho\u1ea1t \u0111\u1ed9ng",
    btn_diag: "Ch\u1ea1y ki\u1ec3m tra",
    btn_copylog: "Copy log",
    btn_clearlog: "X\u00f3a",
    diag_host: "\u1ee8ng d\u1ee5ng Photoshop",
    diag_uxp: "Kh\u1ea3 n\u0103ng UXP",
    diag_gem: "Gemini API key",
    diag_oai: "OpenAI API key",
    diag_doc: "T\u00e0i li\u1ec7u \u0111ang m\u1edf",
    diag_set: "\u0111\u00e3 \u0111\u1eb7t",
    diag_unset: "ch\u01b0a \u0111\u1eb7t",
    diag_open: "\u0111ang m\u1edf",
    diag_none: "kh\u00f4ng c\u00f3",
    diag_missing: "thi\u1ebfu",
    diag_done: "Ki\u1ec3m tra h\u1ec7 th\u1ed1ng ho\u00e0n t\u1ea5t \u2713",
    diag_lib: "Th\u01b0 vi\u1ec7n tham chi\u1ebfu",
    diag_lib_open: "Kh\u1ea3 n\u0103ng m\u1edf th\u01b0 m\u1ee5c",
    sec_reflib: "Th\u01b0 vi\u1ec7n \u1ea3nh tham chi\u1ebfu",
    reflib_note: "Ch\u1ec9 c\u1ea7n ch\u1ecdn m\u1ed9t l\u1ea7n th\u01b0 m\u1ee5c \u1ea3nh tham chi\u1ebfu \u01b0a th\u00edch \u2014 Browse s\u1ebd nh\u1edb v\u00e0 m\u1edf s\u1eb5n trong \u0111\u00f3 \u1edf m\u1ecdi n\u01a1i.",
    btn_browse: "Duy\u1ec7t",
    lib_choose: "Ch\u1ecdn th\u01b0 m\u1ee5c",
    lib_open: "M\u1edf th\u01b0 m\u1ee5c",
    lib_change: "\u0110\u1ed5i th\u01b0 m\u1ee5c",
    lib_reset: "\u0110\u1eb7t l\u1ea1i",
    lib_rescan: "Qu\u00e9t l\u1ea1i",
    lib_current: "Th\u01b0 m\u1ee5c hi\u1ec7n t\u1ea1i",
    lib_found: "\u1ea2nh t\u00ecm th\u1ea5y",
    lib_status: "Tr\u1ea1ng th\u00e1i",
    lib_lastscan: "L\u1ea7n qu\u00e9t cu\u1ed1i",
    lib_images: "\u1ea3nh",
    lib_connected: "\u0110\u00e3 k\u1ebft n\u1ed1i",
    lib_not_config: "Ch\u01b0a thi\u1ebft l\u1eadp",
    lib_perm_lost: "M\u1ea5t quy\u1ec1n \u2014 h\u00e3y ch\u1ecdn l\u1ea1i",
    lib_none: "(ch\u01b0a ch\u1ecdn th\u01b0 m\u1ee5c)",
    lib_copy_only: "ch\u1ec9 copy \u0111\u01b0\u1eddng d\u1eabn",
    lib_choose_msg: "H\u00e3y ch\u1ecdn th\u01b0 m\u1ee5c Th\u01b0 vi\u1ec7n \u1ea3nh tham chi\u1ebfu HNK c\u1ee7a b\u1ea1n.",
    lib_scanning: "\u0110ang qu\u00e9t th\u01b0 vi\u1ec7n\u2026",
    lib_scan_done: "Qu\u00e9t l\u1ea1i ho\u00e0n t\u1ea5t \u2713",
    lib_reset_done: "\u0110\u00e3 \u0111\u1eb7t l\u1ea1i th\u01b0 vi\u1ec7n \u2713",
    lib_path_copied: "\u0110\u00e3 copy \u0111\u01b0\u1eddng d\u1eabn",
    lib_unsupported: "\u0110\u1ecbnh d\u1ea1ng \u1ea3nh kh\u00f4ng h\u1ed7 tr\u1ee3",
    lib_restore_fail: "Kh\u00f4ng kh\u00f4i ph\u1ee5c \u0111\u01b0\u1ee3c \u1ea3nh tham chi\u1ebfu",
    on: "B\u1eacT",
    off: "T\u1eaeT",
    ai_home_title: "B\u1ea1n mu\u1ed1n t\u1ea1o g\u00ec?",
    ai_free_generate: "T\u1ea1o t\u1ef1 do",
    ai_free_sub: "T\u1ef1 vi\u1ebft prompt",
    ai_more_tools: "Th\u00eam c\u00f4ng c\u1ee5",
    ai_more_sub: "Water Edit \u00b7 Text/Logo \u00b7 m\u1ecdi workflow",
    ai_nav_home: "Trang ch\u00ednh",
    ai_nav_tools: "C\u00f4ng c\u1ee5",
    ai_history: "L\u1ecbch s\u1eed",
    ai_no_gen: "Ch\u01b0a c\u00f3 k\u1ebft qu\u1ea3 n\u00e0o.",
    ai_rerun: "Ch\u1ea1y l\u1ea1i",
    ai_reuse: "D\u00f9ng l\u1ea1i",
    ai_clear_hist: "X\u00f3a l\u1ecbch s\u1eed",
    ai_images: "H\u00ccNH \u1ea2NH",
    ai_add_ref: "+ Th\u00eam \u1ea3nh Reference",
    ai_prompt: "PROMPT",
    ai_prompt_ph: "M\u00f4 t\u1ea3 \u0111i\u1ec1u b\u1ea1n mu\u1ed1n\u2026",
    ai_model_output: "MODEL & OUTPUT",
    ai_model_note: "AI Tools c\u00f3 c\u00e0i \u0111\u1eb7t model/size ri\u00eang, t\u00e1ch bi\u1ec7t v\u1edbi tab Setup v\u00e0 Create.",
    ai_auto_model: "Model t\u1ef1 \u0111\u1ed9ng",
    ai_wf_tools: "C\u00f4ng c\u1ee5 Workflow",
    ai_direct_gen: "T\u1ea1o tr\u1ef1c ti\u1ebfp",
    ai_identity_lock: "Kh\u00f3a nh\u1eadn d\u1ea1ng",
    ai_ref_transfer: "Chuy\u1ec3n Reference",
    ai_req_images: "\u1ea2nh b\u1eaft bu\u1ed9c",
    ai_opt_images: "\u1ea2nh t\u00f9y ch\u1ecdn",
    ai_model_lbl: "Model",
    ai_prepare: "Chu\u1ea9n b\u1ecb (t\u1ea3i & ki\u1ec3m tra)",
    ai_lib_bridge_off: "Host n\u00e0y kh\u00f4ng d\u00f9ng \u0111\u01b0\u1ee3c Library.",
    ai_lib_pick_first: "H\u00e3y ch\u1ecdn \u1ea3nh \u1edf tab Presets \u2192 Visual Library tr\u01b0\u1edbc.",
    ai_lib_load_fail: "Kh\u00f4ng t\u1ea3i \u0111\u01b0\u1ee3c \u1ea3nh t\u1eeb Library.",
    ai_missing: "C\u00f2n thi\u1ebfu",
    ai_add: "Th\u00eam",
    ai_library: "Library",
    ai_rh_sec: "RunningHub \u2014 th\u00eam model endpoint (N\u00e2ng cao \u2014 t\u00f9y ch\u1ecdn)",
    ai_rh_note: "C\u00e1c model t\u00edch h\u1ee3p \u0111\u00e3 ch\u1ea1y \u0111\u01b0\u1ee3c v\u1edbi key \u1edf tr\u00ean \u2014 kh\u00f4ng c\u1ea7n l\u00e0m g\u00ec. N\u1ebfu m\u1ed9t model hi\u1ec7n \"not connected\" (endpoint path ch\u01b0a \u0111\u01b0\u1ee3c x\u00e1c nh\u1eadn), h\u00e3y sao ch\u00e9p path t\u1eeb t\u00e0i li\u1ec7u API c\u1ee7a RunningHub v\u00e0 d\u00e1n v\u00e0o \u0111\u00e2y.",
    ai_rh_save: "L\u01b0u endpoint c\u1ee7a model n\u00e0y",
    ai_test_conn: "Ki\u1ec3m tra k\u1ebft n\u1ed1i",
    ai_oai_sec: "OpenAI (N\u00e2ng cao \u2014 t\u00f9y ch\u1ecdn)",
    ai_oai_note: "D\u00f9ng OpenAI API key c\u1ee7a b\u1ea1n v\u1edbi GPT Image 2 thay cho (ho\u1eb7c song song v\u1edbi) RunningHub Enterprise.",
    ai_save_verify: "L\u01b0u & x\u00e1c minh",
    ai_settings: "C\u00e0i \u0111\u1eb7t",
    ai_add_layers: "Th\u00eam k\u1ebft qu\u1ea3 th\u00e0nh Layer m\u1edbi",
    ai_done: "Xong.",
    ai_result_ready: "K\u1ebft qu\u1ea3 \u0111\u00e3 s\u1eb5n s\u00e0ng.",
    ai_ready_nolayer: "K\u1ebft qu\u1ea3 \u0111\u00e3 s\u1eb5n s\u00e0ng (t\u00f9y ch\u1ecdn th\u00eam th\u00e0nh Layer \u0111ang t\u1eaft trong Settings).",
    ai_place_failed: "\u0110\u00e3 t\u1ea1o xong, nh\u01b0ng kh\u00f4ng \u0111\u1eb7t \u0111\u01b0\u1ee3c v\u00e0o Photoshop.",
    ai_place_failed_fix: "H\u00e3y m\u1edf m\u1ed9t t\u00e0i li\u1ec7u, r\u1ed3i ch\u1ea1y l\u1ea1i t\u1eeb History.",
    ai_placed_masked: "\u0110\u00e3 \u0111\u1eb7t v\u00e0o nh\u00f3m \u201c{name}\u201d d\u01b0\u1edbi d\u1ea1ng Layer + Mask \u2014 \u1ea3nh g\u1ed1c kh\u00f4ng b\u1ecb \u0111\u1ee5ng t\u1edbi.",
    ai_placed_group: "\u0110\u00e3 \u0111\u1eb7t v\u00e0o nh\u00f3m \u201c{name}\u201d d\u01b0\u1edbi d\u1ea1ng Layer m\u1edbi (host n\u00e0y kh\u00f4ng h\u1ed7 tr\u1ee3 mask).",
    ai_placed_plain: "\u0110\u00e3 \u0111\u1eb7t th\u00e0nh Layer m\u1edbi (host n\u00e0y kh\u00f4ng h\u1ed7 tr\u1ee3 group/mask).",
    ai_start_fail: "AI Tools kh\u00f4ng kh\u1edfi \u0111\u1ed9ng \u0111\u01b0\u1ee3c",
    pgb_setup: "B\u1eaft \u0111\u1ea7u t\u1ea1i \u0111\u00e2y \u2014 thi\u1ebft l\u1eadp API Key \u00b7 Model \u00b7 Library",
    pgb_studio: "Prompt \u2192 Reference \u2192 Generate \u2014 quy tr\u00ecnh pro li\u1ec1n m\u1ea1ch",
    pgb_create: "T\u1eeb \u00fd t\u01b0\u1edfng \u0111\u1ebfn t\u00e1c ph\u1ea9m \u2014 4 \u00f4 reference \u00b7 Variations",
    pgb_presets: "Visual Library 366 \u00b7 Scenes \u00b7 Wedding \u00b7 Style Chains",
    pgb_aitools: "M\u1ed9t ch\u1ea1m chuy\u00ean nghi\u1ec7p \u2014 Nano Banana \u00b7 GPT Image \u00b7 RunningHub",
    pgb_retouch: "Da \u00b7 Khu\u00f4n m\u1eb7t \u00b7 V\u00f3c d\u00e1ng \u2014 sliders chuy\u00ean nghi\u1ec7p",
    wf_sum_bg_replace: "Thay n\u1ec1n",
    wf_sum_reference_transfer: "\u0110\u01b0a ch\u1ee7 th\u1ec3 c\u1ee7a b\u1ea1n v\u00e0o c\u1ea3nh reference",
    wf_sum_master_bgfg_replace: "X\u00f3a ng\u01b0\u1eddi trong c\u1ea3nh, d\u1ef1ng l\u1ea1i bg/fg, r\u1ed3i \u0111\u01b0a ch\u1ee7 th\u1ec3 c\u1ee7a b\u1ea1n v\u00e0o",
    wf_sum_subject_face: "Chuy\u1ec3n ch\u1ee7 th\u1ec3 ho\u1eb7c khu\u00f4n m\u1eb7t l\u00ean \u1ea3nh base",
    wf_sum_retouch: "Tinh ch\u1ec9nh ch\u00e2n dung t\u1ef1 nhi\u00ean",
    wf_sum_upscale: "Ph\u00f3ng to gi\u1eef nguy\u00ean chi ti\u1ebft",
    wf_sum_object_edit: "X\u00f3a, thay ho\u1eb7c th\u00eam v\u1eadt th\u1ec3",
    wf_sum_water_edit: "Ch\u1ec9nh n\u01b0\u1edbc v\u00e0 ph\u1ea3n chi\u1ebfu",
    wf_sum_text_logo: "Th\u00eam ho\u1eb7c s\u1eeda ch\u1eef v\u00e0 logo",
    wfin_subject: "\u1ea2nh c\u1ee7a b\u1ea1n (ch\u1ee7 th\u1ec3)",
    wfin_new_bg: "N\u1ec1n m\u1edbi (t\u00f9y ch\u1ecdn)",
    wfin_ref_scene: "C\u1ea3nh reference",
    wfin_style_ref: "Style reference (t\u00f9y ch\u1ecdn)",
    wfin_target_scene: "C\u1ea3nh \u0111\u00edch c\u00f3 ng\u01b0\u1eddi",
    wfin_base: "\u1ea2nh base",
    wfin_face_ref: "Reference khu\u00f4n m\u1eb7t / ch\u1ee7 th\u1ec3",
    wfin_portrait: "\u1ea2nh ch\u00e2n dung",
    wfin_image: "H\u00ecnh \u1ea3nh",
    wfin_object_ref: "Reference v\u1eadt th\u1ec3 (t\u00f9y ch\u1ecdn)",
    wfin_logo_ref: "Reference logo (t\u00f9y ch\u1ecdn)",
    wf_exp_bg_replace: "Thay n\u1ec1n ph\u00eda sau ch\u1ee7 th\u1ec3. Con ng\u01b0\u1eddi, d\u00e1ng, vi\u1ec1n v\u00e0 \u00e1nh s\u00e1ng gi\u1eef nguy\u00ean ho\u00e0n to\u00e0n \u2014 ch\u1ec9 ph\u1ea7n ph\u00eda sau thay \u0111\u1ed5i.",
    wf_exp_reference_transfer: "L\u1ea5y to\u00e0n b\u1ed9 c\u1ea3nh c\u1ee7a \u1ea3nh reference (nh\u01b0ng KH\u00d4NG l\u1ea5y ng\u01b0\u1eddi trong \u0111\u00f3) v\u00e0 \u0111\u1eb7t ch\u1ee7 th\u1ec3 C\u1ee6A B\u1ea0N v\u00e0o \u2014 gi\u1eef nguy\u00ean nh\u1eadn d\u1ea1ng, d\u00e1ng v\u00e0 khung h\u00ecnh, \u0111\u1ed3ng th\u1eddi kh\u1edbp \u00e1nh s\u00e1ng v\u00e0 ph\u1ed1i c\u1ea3nh c\u1ee7a c\u1ea3nh.",
    wf_exp_master_bgfg_replace: "Ki\u1ec3u thay ch\u1ee7 th\u1ec3 trong c\u1ea3nh nghi\u00eam ng\u1eb7t nh\u1ea5t: x\u00f3a ho\u00e0n to\u00e0n ng\u01b0\u1eddi kh\u1ecfi c\u1ea3nh reference, d\u1ef1ng l\u1ea1i t\u1ef1 nhi\u00ean ph\u1ea7n n\u1ec1n v\u00e0 ti\u1ec1n c\u1ea3nh b\u1ecb che, r\u1ed3i \u0111\u1eb7t \u0111\u00fang ch\u1ee7 th\u1ec3 c\u1ee7a b\u1ea1n v\u00e0o \u0111\u00fang ch\u1ed7 \u0111\u00f3 \u2014 nh\u1eadn d\u1ea1ng, d\u00e1ng, t\u1ec9 l\u1ec7, ki\u1ec3u t\u00f3c, trang ph\u1ee5c, da v\u00e0 \u00e1nh s\u00e1ng \u0111\u1ec1u kh\u00f3a theo \u1ea3nh c\u1ee7a b\u1ea1n, c\u00f2n reference ch\u1ec9 cung c\u1ea5p c\u1ea3nh, g\u00f3c m\u00e1y v\u00e0 chi\u1ec1u s\u00e2u.",
    wf_exp_subject_face: "H\u00f2a tr\u1ed9n ch\u1ee7 th\u1ec3 ho\u1eb7c khu\u00f4n m\u1eb7t t\u1eeb reference l\u00ean \u1ea3nh base m\u1ed9t c\u00e1ch li\u1ec1n m\u1ea1ch, gi\u1eef nguy\u00ean b\u1ed1 c\u1ee5c c\u1ee7a \u1ea3nh base.",
    wf_exp_retouch: "Tinh ch\u1ec9nh t\u1ef1 nhi\u00ean cho da, t\u00f3c v\u00e0 t\u00f4ng m\u00e0u. Nh\u1eadn d\u1ea1ng, \u0111\u01b0\u1eddng n\u00e9t v\u00e0 bi\u1ec3u c\u1ea3m \u0111\u01b0\u1ee3c gi\u1eef nguy\u00ean \u2014 kh\u00f4ng da nh\u1ef1a, kh\u00f4ng \u0111\u1ed5i m\u1eb7t.",
    wf_exp_upscale: "Ph\u00f3ng to \u1ea3nh \u0111\u1ed3ng th\u1eddi ph\u1ee5c h\u1ed3i chi ti\u1ebft t\u1ef1 nhi\u00ean \u1edf da, t\u00f3c v\u00e0 v\u1ea3i. Nh\u1eadn d\u1ea1ng, d\u00e1ng, b\u1ed1 c\u1ee5c v\u00e0 m\u00e0u s\u1eafc gi\u1eef nguy\u00ean ho\u00e0n to\u00e0n \u2014 kh\u00f4ng l\u00e0m m\u1ecbn ki\u1ec3u nh\u1ef1a.",
    wf_exp_object_edit: "X\u00f3a, thay ho\u1eb7c th\u00eam v\u1eadt th\u1ec3 b\u1eb1ng m\u1ed9t ch\u1ec9nh s\u1eeda c\u1ee5c b\u1ed9 c\u00f3 ki\u1ec3m so\u00e1t. M\u1ecdi th\u1ee9 b\u1ea1n kh\u00f4ng \u0111\u1ee5ng t\u1edbi \u0111\u1ec1u gi\u1eef nguy\u00ean.",
    wf_exp_water_edit: "Th\u00eam ho\u1eb7c ch\u1ec9nh n\u01b0\u1edbc, ph\u1ea3n chi\u1ebfu v\u00e0 b\u1ec1 m\u1eb7t \u01b0\u1edbt sao cho tr\u00f4ng \u0111\u00fang v\u1eadt l\u00fd, \u0111\u1ed3ng th\u1eddi gi\u1eef nguy\u00ean ch\u1ee7 th\u1ec3 c\u1ee7a b\u1ea1n.",
    wf_exp_text_logo: "Th\u00eam ho\u1eb7c s\u1eeda ch\u1eef hay logo s\u1ea1ch, d\u1ec5 \u0111\u1ecdc tr\u00ean \u1ea3nh m\u00e0 v\u1eabn gi\u1eef nguy\u00ean b\u1ed1 c\u1ee5c."
  },
  /* ---- Indonesian (id) — 587 keys, complete ---- */
  id: {
    gate_sub_login: "Masuk dengan akun HNK Anda untuk memakai panel ini.",
    gate_email_ph: "Email",
    gate_pass_ph: "Kata sandi",
    gate_signin: "Masuk",
    gate_checking: "Memeriksa paket Anda…",
    gate_need: "Masukkan email dan kata sandi.",
    gate_bad: "Email atau kata sandi salah.",
    gate_offline: "Tidak ada internet — paket tidak bisa diperiksa. Sambungkan lalu periksa lagi.",
    gate_locked: "Satu pembayaran untuk keduanya — biaya pendaftaran dan biaya bulanan membuka aplikasi web DAN panel Photoshop ini. Beli atau perpanjang di website, lalu periksa lagi.",
    gate_buy: "Buka website",
    gate_retry: "Periksa lagi",
    gate_signout: "Keluar",
    gate_days: "sisa {D} hari",
    gate_grace: "Offline — sisa {D} hari pemakaian offline",
    gate_open_fail: "Tidak bisa membuka browser. Alamat: {U}",
    app_title: "HNK Photoshop Ai Panel (Pelajar)",
    sec_api: "Gemini API Key",
    btn_show: "Tampilkan",
    btn_hide: "Sembunyikan",
    btn_test: "Uji Key",
    btn_save: "Simpan",
    st_testing: "Menguji key",
    st_key_ok: "\u2713 API key berfungsi",
    st_key_bad: "API key gagal",
    st_key_saved: "API key tersimpan \u2713",
    st_need_key: "Masukkan Gemini API key Anda dulu",
    sec_model: "Model & Output",
    scope_model_note: "Dipakai oleh tombol Generate di tab Prompt bawah \u2014 Create dan AI Tools punya pengaturan model sendiri-sendiri.",
    model_auto: "Otomatis (disarankan)",
    model_flash: "Flash \u2014 cepat (2.5)",
    model_pro: "Pro \u2014 kualitas (3.0)",
    lbl_ratio: "Rasio",
    ratio_auto: "Rasio otomatis (dari dokumen)",
    lbl_size: "Ukuran",
    lbl_quality: "Kualitas",
    qual_auto: "Otomatis",
    qual_low: "Rendah",
    qual_med: "Sedang",
    qual_high: "Tinggi",
    sec_prompt: "Prompt",
    hint_prompt: "Tulis prompt Anda di sini\u2026 (maks 20.000 karakter)",
    btn_improve: "Perbaiki Prompt",
    btn_clear: "Bersihkan",
    st_improving: "Memperbaiki prompt",
    st_improved: "Prompt diperbaiki \u2713",
    sec_refs: "Gambar Referensi (2 slot)",
    base_note: "Gambar dasar = dokumen Photoshop Anda yang aktif (diambil otomatis).",
    btn_ref_layer: "+ Layer",
    btn_ref_file: "Berkas",
    btn_ref_web: "Web",
    st_ref_layer_added: "Layer ditambahkan sebagai referensi \u2713",
    st_ref_file_added: "Berkas ditambahkan sebagai referensi \u2713",
    st_importing: "Mengimpor berkas",
    url_title: "Referensi dari URL \u2014 Chrome / Pinterest",
    url_ph: "https://\u2026 alamat gambar atau tautan pin Pinterest",
    btn_paste: "Tempel",
    btn_load: "Muat",
    btn_cancel: "Batal",
    st_url_loading: "Mengunduh gambar dari web",
    st_ref_web_added: "Gambar web ditambahkan sebagai referensi \u2713",
    st_url_bad: "Gagal memuat gambar dari URL ini \u2014 salin alamat gambarnya lalu coba lagi",
    no_layer: "Belum ada layer yang dipilih",
    sec_presets: "AI Presets",
    auto_run: "Klik preset \u2192 Generate otomatis (MATI = hanya sisipkan ke prompt)",
    grp_cleanup: "Alat Pembersih",
    p_remove_people: "Hapus Orang",
    p_fix_hands: "Perbaiki Tangan Berlebih",
    p_fix_legs: "Perbaiki Kaki Berlebih",
    p_full_clean: "Bersihkan Total",
    grp_moved_note: "Alat Reference kini ada di kartu Reference Ops Pro di bawah (satu tempat, lengkap dengan Solo/Couple/Family + panduan).",
    ro_h_detail: "Rambut \u00b7 Aksesori \u00b7 Pose (\u2190 Ref1)",
    ro_h_comp: "Komposit \u00b7 Gaya \u00b7 Teks (\u2190 Ref1)",
    p_fgbglc: "FG=Doc \u00b7 BG=Ref1 \u00b7 Light=Ref2",
    p_hair: "Gaya Rambut (\u2190 Ref1)",
    p_access: "Perhiasan + Aksesori (\u2190 Ref1)",
    p_pose: "Samakan Pose (Doc \u2192 Ref1)",
    p_fgprops: "Properti Depan (\u2190 Ref1)",
    p_textlogo: "Teks / Logo (\u2190 Ref1)",
    p_style: "Gaya Foto (\u2190 Ref1)",
    grp_repsubj: "Ganti Subjek (Doc \u2192 adegan Ref1)",
    p_rep_solo: "Ganti Solo",
    p_rep_couple: "Ganti Pasangan",
    p_rep_family: "Ganti Keluarga",
    grp_rmix: "Replace Mix \u2014 centang lalu ambil dari Ref1",
    rm_bg: "Latar (BG)",
    rm_fg: "Latar Depan (FG)",
    rm_light: "Pencahayaan",
    rm_color: "Warna",
    rm_object: "Objek / Properti",
    btn_rmix: "REPLACE GENERATE",
    rm_none: "Centang minimal satu aspek dulu",
    grp_i2p: "Image \u2192 Prompt (Scene Builder)",
    i2p_note: "1) Ekstrak: adegan Ref1 \u2192 prompt teks terperinci (tanpa orang). 2) Sunting di halaman Prompt. 3) SCENE GENERATE membangunnya di sekitar subjek dokumen Anda \u2014 otomatis menyesuaikan sudut apa pun. Kunci Face/Pose/Frame = pertahankan aslinya.",
    i2p_objects: "Detail objek & properti",
    i2p_light: "Detail pencahayaan",
    i2p_color: "Detail warna / grade",
    i2p_bg: "Detail latar",
    i2p_fg: "Detail latar depan",
    btn_i2p: "Image \u2192 Prompt (Ekstrak Adegan)",
    i2p_fit: "Scene Auto-Fit \u2014 proyeksikan ulang adegan ke sudut / jarak / lensa dokumen",
    i2p_adapt: "Sesuaikan cahaya & warna subjek dengan adegan",
    btn_scenegen: "SCENE GENERATE",
    st_extract: "Mengekstrak adegan menjadi prompt",
    st_extract_done: "Prompt adegan siap \u2014 periksa di halaman Prompt",
    scene_no_prompt: "Kotak prompt kosong \u2014 jalankan Image \u2192 Prompt dulu",
    i2p_none: "Centang minimal satu aspek detail dulu",
    sec_light: "Studio Lighting \u2014 AI Relight",
    light_note: "Centang lampu untuk menyalakan, ketuk satu baris untuk memilihnya, bentuk dengan slider \u2014 diagram 3D tampak-atas mengikuti langsung (\u25b4 = tinggi, \u25be = rendah). LIGHTING GENERATE menyinari ulang dokumen persis sesuai susunan ini; wajah / pose / bingkai tetap terkunci.",
    lbl_my_prompt: "PROMPT BAHASA INDONESIA",
    lstage_model: "MODEL",
    lstage_cam: "CAM",
    l_key: "Key Light",
    l_fill: "Fill / Depan",
    l_butterfly: "Butterfly (atas-depan)",
    l_side: "Cahaya Samping",
    l_rim: "Rim Light",
    l_back: "Back Light",
    l_hair: "Hair Light",
    l_bglight: "Cahaya Latar",
    lt_softbox: "Softbox",
    lt_octa: "Octa",
    lt_strip: "Strip",
    lt_umbrella: "Umbrella",
    lt_beauty: "Beauty",
    lt_hard: "Hard",
    li_int: "Intensitas",
    li_angle: "Sudut",
    li_height: "Tinggi",
    li_dist: "Jarak",
    li_size: "Ukuran",
    btn_lightgen: "LIGHTING GENERATE",
    light_none: "Nyalakan minimal satu lampu dulu",
    lg_equip: "Tampilkan peralatan lampu dalam foto (softbox / stand terlihat)",
    grp_chains: "Style Chains \u2014 gabungkan gaya \u2713",
    chains_note: "Nyalakan gaya mana pun \u2014 semuanya menyatu ke SETIAP Generate / preset / Retouch sekaligus.",
    grp_restore: "Restorasi Foto Lama",
    p_restore: "Restorasi Foto Lama",
    rest_color: "Berwarna Penuh",
    rest_bw: "Hitam & Putih",
    restore_note: "Memperbaiki sobekan, kerusakan air / terbakar, dan pudar \u2014 menjaga setiap wajah asli tetap 100% sama.",
    rt_browstyle: "Gaya Alis",
    rt_lashstyle: "Gaya Bulu Mata",
    rt_blush: "Warna Perona",
    rt_contour: "Gaya Contour",
    rt_bust: "Dada",
    rt_butt: "Bokong",
    rt_thigh: "Paha",
    rt_calf: "Betis",
    rt_neck: "Leher",
    rt_fingers: "Jari",
    hint_prompt_my: "Tulis saja dalam bahasa Indonesia \u2014 saat Generate akan diterjemahkan otomatis ke Inggris (maks 20.000)",
    st_translate: "Menerjemahkan prompt ke bahasa Inggris",
    live_trans: "Terjemah otomatis langsung \u21c4 (EN \u2194 ID, setelah Anda berhenti mengetik)",
    st_retry: "Mencoba lagi",
    grp_recipes: "Recipes \u2014 simpan / bagikan pengaturan",
    recipe_note: "Simpan SEMUANYA (chains, retouch, lampu, kunci, prompt) sebagai satu berkas .json \u2014 pelajar tinggal Load.",
    btn_recipe_save: "Simpan Recipe",
    btn_recipe_load: "Muat Recipe",
    st_recipe_saved: "Recipe tersimpan \u2713",
    st_recipe_loaded: "Recipe dimuat \u2713 \u2014 semua kontrol diperbarui",
    st_recipe_bad: "Bukan berkas Recipe HNK",
    sec_final: "Prompt Akhir (dikirim ke AI)",
    btn_copy: "Salin",
    st_copied: "Tersalin \u2713",
    hist_note: "Riwayat \u2014 6 hasil terakhir, ketuk untuk melihat:",
    btn_hist_prompt: "\u2192 Prompt",
    sec_batch: "Batch Mode",
    batch_note: "Pilih banyak foto + satu folder keluaran \u2014 prompt, chains, cleanup, dan kunci Keep saat ini dijalankan pada tiap foto; hasil disimpan sebagai *_HNK.png.",
    btn_batch: "JALANKAN BATCH",
    btn_batch_stop: "Berhenti",
    st_batch: "Batch",
    st_batch_done: "Batch selesai",
    sec_web: "Web AI \u2014 Peramban Mini",
    web_note: "Buka editor AI web mana pun di dalam Photoshop. Buat di sana, lalu bawa hasilnya masuk sebagai layer:",
    web_import_note: "Impor: \u2460 di web app pakai Copy image address, lalu IMPORT COPIED LINK \u00b7 \u2461 atau unduh berkasnya dan pakai IMPORT FILE \u00b7 \u2462 web app mitra dengan HNK bridge mengirim gambar masuk secara otomatis.",
    btn_web_go: "Buka",
    btn_web_home: "Beranda",
    btn_web_reload: "Muat ulang",
    btn_web_import_link: "IMPOR TAUTAN TERSALIN \u2192 PS",
    btn_web_import_file: "IMPOR BERKAS \u2192 PS",
    st_web_import: "Diimpor ke Photoshop sebagai layer \u2713",
    st_web_nourl: "Salin tautan gambar dulu (klik kanan \u2192 Copy image address)",
    st_web_fetch: "Mengambil gambar dari tautan",
    st_web_notallowed: "Domain ini tidak ada di daftar izin \u2014 halaman bisa tetap kosong. Minta HNK menambahkannya.",
    st_need_doc: "Buka dokumen foto di Photoshop dulu",
    sec_campro: "Camera Pro & Kualitas",
    autosave_lbl: "Ekspor otomatis setiap hasil (PNG + catatan prompt \u2192 folder)",
    st_folder_ok: "Folder ekspor ditetapkan \u2713",
    st_exported: "Terekspor \u2713",
    st_export_fail: "Ekspor gagal \u2014 periksa foldernya",
    st_pro_fallback: "Model Pro tidak tersedia \u2014 dialihkan ke Flash untuk kali ini",
    st_img_bad: "Data gambar gagal pemeriksaan integritas \u2014 tambahkan ulang fotonya",
    st_auto_comp: "Komposit Otomatis: subjek IMAGE 1 \u2192 adegan referensi",
    prov_lbl: "Penyedia AI",
    oai_key_ph: "sk-... (OpenAI API key)",
    tab_create: "Create",
    create_note: "MODE CREATE \u2014 gambar baru sepenuhnya dari prompt Anda (+ 4 ref miliknya sendiri). Berdiri sendiri: tidak pernah membaca dokumen, preset, chains, atau kunci.",
    create_ph: "Jelaskan gambar yang ingin Anda buat\u2026",
    btn_create_ps: "\u2b07 Kirim ke Photoshop",
    btn_to_ref: "\u21ba Pakai sebagai Ref 1",
    st_to_ref: "Hasil dimuat ke Ref 1 \u2713",
    scope_create_note: "Terpisah dari Model & Output milik Setup \u2014 pengaturan ini hanya berlaku untuk Generate di Create.",
    cr_ratio: "Rasio",
    cr_var: "Variasi",
    cr_restyle: "\u267b Ubah gaya hasil",
    cr_lib: "Pustaka Prompt \u2014 ketuk untuk menyisipkan",
    cr_improve: "\u2728 Perbaiki",
    cr_describe: "\ud83d\udd0d Baca Ref 1 \u2192 Prompt",
    st_describing: "Membaca gambar referensi\u2026",
    st_described: "Prompt ditulis dari Ref 1 \u2713",
    st_need_gem: "Tambahkan Gemini API key (Setup) \u2014 fitur ini memakai Gemini text",
    st_need_ref1: "Tambahkan gambar ke Ref 1 dulu",
    st_lib_added: "Prompt ditambahkan \u2713",
    cr_refs: "Gambar Referensi (maks 4)",
    cr_refs_note: "Opsional \u2014 tambahkan lewat Layer / File / Web. Create hanya mengambil apa yang diminta prompt Anda.",
    cr_results: "Hasil",
    cr_gal_empty: "Belum ada hasil \u2014 ketuk Generate.",
    cr_gal_have: "hasil \u00b7 ketuk gambar kecil untuk melihat / mengolah",
    cr_save: "\u2b07 Simpan PNG",
    cr_engine: "Engine",
    cr_need_result: "Buat gambar dulu",
    btn_web_import_url: "\u2b07 Impor URL",
    st_clip_help: "Papan klip kosong/diblokir \u2014 tempel tautannya ke bilah URL, lalu ketuk \u2b07 Import URL",
    st_web_blob: "Itu tautan blob: sementara \u2014 pakai klik kanan \u2192 Copy IMAGE Address, atau simpan berkasnya lalu pakai Import File",
    err_key: "API key tidak valid \u2014 periksa ulang key di tab Setup",
    err_quota: "Kuota / batas laju tercapai \u2014 tunggu sebentar lalu coba lagi",
    err_big: "Gambar terlalu besar untuk API \u2014 perkecil lalu coba lagi",
    err_safety: "Diblokir filter keamanan \u2014 sesuaikan prompt atau fotonya lalu coba lagi",
    err_net: "Masalah jaringan / server \u2014 silakan coba lagi",
    err_timeout: "Permintaan kehabisan waktu \u2014 server terlalu lama merespons; silakan coba lagi",
    err_generic: "Permintaan tidak dapat diselesaikan \u2014 silakan coba lagi",
    err_img: "Tidak ada gambar yang dapat dipakai \u2014 silakan coba lagi",
    err_mode: "Dokumen ini bukan mode RGB \u2014 konversikan dulu (Image \u25b8 Mode \u25b8 RGB Color), lalu coba lagi",
    cam_master: "Blok Camera AKTIF \u2014 tempelkan ke akhir SETIAP prompt",
    cam_body: "Bodi Kamera",
    cam_lens: "Lensa Prime (mm)",
    cam_f: "Bukaan",
    cam_film: "Nuansa Film",
    cam_bokeh: "Gaya Bokeh",
    cam_iso: "ISO",
    cam_k: "WB Kelvin",
    cam_note: "Nyalakan bloknya dulu, lalu pilih hanya yang Anda perlukan \u2014 chip \u2013 tidak ikut ditulis. Semuanya menempel di akhir prompt final.",
    ro_h_main: "REFERENCE OPS PRO (Ref1 / Ref2)",
    ro_note: "Ref1 = IMAGE 2 (perempuan) \u00b7 Ref2 = IMAGE 3 (laki-laki). Pilih target dulu, baru jalankan \u2014 orang yang tidak cocok tidak pernah berubah.",
    ro_target: "Target:",
    ro_solo: "Solo",
    ro_couple: "Pasangan",
    ro_family: "Keluarga",
    ro_mk: "Salin makeup ref",
    ro_hair: "Ambil gaya rambut ref",
    ro_h_face: "Face Ops",
    ro_h_bg: "BG / FG Ops",
    ro_h_sub: "Subject Ops",
    ro_h_lc: "Light & Color Ops",
    ro_h_dress: "Dress Ops",
    ro_h_mk: "Makeup Ops",
    ro_h_match: "\u2605 Master Match (satu tampilan)",
    ro_match_note: "Samakan IMAGE 1 dengan referensi agar keduanya tampak seperti satu hasil edit \u2014 centang apa yang harus disamakan:",
    m_color: "Warna",
    m_light: "Cahaya",
    m_makeup: "Makeup",
    m_skin: "Retouch Kulit",
    crd_pipe: "\u26d3 Pipeline Builder \u2014 rangkai apa saja",
    pipe_note: "Rangkai langkah APA PUN menjadi satu rantai \u2014 hasil tiap langkah menjadi masukan langkah berikutnya. Maks 6.",
    pipe_add: "+ Tambah",
    pipe_run: "\u25b6 JALANKAN PIPELINE",
    pipe_clear: "Bersihkan",
    pipe_retouch: "Terapkan Retouch (slider saat ini)",
    pipe_relight: "Relight (rig lampu saat ini)",
    pipe_prompt: "Prompt (kotak EN saat ini)",
    pipe_empty: "Tambahkan minimal satu langkah dulu",
    pipe_max: "Pipeline penuh (maks 6 langkah)",
    st_pipe: "Langkah pipeline",
    st_pipe_done: "Pipeline selesai",
    st_pipe_stop: "Pipeline berhenti (satu langkah gagal)",
    pipe_merge: "\u26a1 Gabung sekali jalan \u2014 SEMUA langkah dalam SATU panggilan (cepat/hemat \u00b7 terbaik \u2264 3 tugas)",
    crd_chainsrest: "Style Chains + Restorasi Foto Lama",
    crd_refops: "Reference Ops Pro (Ref1 / Ref2)",
    crd_scenes: "\ud83c\udfac Scenes Pro \u2014 subjek terkunci \u00b7 adegan menyesuaikan",
    scn_note: "Kunci subjek Anda (wajah \u00b7 pose \u00b7 busana \u00b7 bingkai) lalu bangun ulang seluruh adegan agar cocok \u2014 cahaya, bayangan, warna, latar, latar depan, dan objek menyesuaikan otomatis demi tampilan foto sungguhan.",
    scn_h_style: "Gaya Adegan (dalam ruang / budaya)",
    scn_h_bday: "\ud83c\udf82 Ulang tahun \u2014 angka usia 1\u201345",
    scn_h_cap: "Keterangan / Teks (anak \u00b7 Miss Universe \u00b7 ulang tahun)",
    scn_h_scarf: "Luar Ruang / Selendang Terbang",
    scn_grad: "Wisuda Dalam Ruang",
    scn_prewed: "Prewedding Dalam Ruang",
    scn_vietnam: "Vietnam",
    scn_myanmar: "Myanmar",
    scn_chinese: "Tionghoa",
    scn_shan: "Shan",
    scn_newborn: "Bayi Baru Lahir",
    scn_age: "Usia",
    scn_bday_go: "\ud83c\udf82 ADEGAN ULANG TAHUN",
    scn_cap_on: "Tambahkan teks keterangan",
    scn_cap_ph: "Teks keterangan (mis. Happy 1st Birthday, nama)\u2026",
    scn_cap_pos: "Posisi",
    scn_top: "Atas",
    scn_bottom: "Bawah",
    scn_scarf: "\u2726 ADEGAN SELENDANG TERBANG",
    scn_dir: "Arah",
    scn_left: "Kiri",
    scn_right: "Kanan",
    scn_up: "Atas",
    scn_len: "Panjang",
    scn_short: "Pendek",
    scn_long: "Panjang",
    g_cat_scene: "SCENE OP \u2014 subjek Anda terkunci (wajah \u00b7 pose \u00b7 busana \u00b7 bingkai); seluruh adegan yang dihasilkan (cahaya, bayangan, warna, latar, latar depan, objek, atmosfer) otomatis diselaraskan dengan subjek agar hasil komposit tampak seperti foto sungguhan.",
    crd_wed: "\u2665 Wedding Pro Suite",
    crd_recipes: "Recipes \u2014 simpan / bagikan",
    learn_lbl: "\ud83c\udf93 Learn Mode \u2014 ketukan 1 = panduan (kuning), 2 = prompt (biru), 3 = JALANKAN (hijau)",
    guide_hint: "Ketuk lagi: kuning \u2192 biru (prompt) \u2192 hijau (jalankan) \u25b6",
    g_learn_next_prompt: "Ketuk lagi \u2192 menampilkan PROMPT persisnya (biru).",
    g_learn_prompt_head: "PROMPT yang akan dikirim tombol ini (ketuk lagi = JALANKAN):",
    g_learn_next_run: "Ketuk sekali lagi \u2192 RUN (hijau) mulai membuat.",
    st_prompt_ready: "Prompt siap \u2014 ketuk lagi (hijau) untuk menjalankan \u2713",
    g_step_doc: "Buka dokumen foto Anda di Photoshop dulu.",
    g_step_ref1: "Muat gambar referensi ke Ref1 (jadi IMAGE 2). Tambahkan Ref2 untuk orang kedua.",
    g_step_target: "Pilih Target: Solo / Couple (Ref1 = perempuan, Ref2 = laki-laki) / Family.",
    g_step_mkhair: "Opsional: centang \u2018Copy ref makeup\u2019 / \u2018Take ref hairstyle\u2019 di atas Face Ops.",
    g_step_petal: "Pilih warna kelopak dulu (auto = mengikuti adegan Anda).",
    g_step_rest: "Pilih Full Color atau B&W dengan \u2713 di atas.",
    g_step_int: "Atur slider Intensity sesuai selera.",
    g_step_confirm: "Ketuk lagi untuk lanjut: GUIDE (kuning) \u2192 PROMPT (biru) \u2192 RUN (HIJAU mulai membuat).",
    g_cat_face: "FACE OP \u2014 memindahkan wajah referensi ke orang yang bersesuaian; yang lain tetap tidak berubah.",
    g_cat_sub: "SUBJECT OP \u2014 membawa/melebur ORANG dari referensi ke adegan Anda; adegan dan bingkai tetap.",
    g_cat_bgfg: "BG/FG OP \u2014 hanya mengubah latar / latar depan memakai referensi.",
    g_cat_lc: "LIGHT & COLOR OP \u2014 menyalin pencahayaan dan grade referensi; orangnya tetap setia piksel demi piksel.",
    g_cat_dress: "DRESS OP \u2014 hanya mengubah busana memakai referensi.",
    g_cat_mkop: "MAKEUP OP \u2014 hanya mengubah riasan memakai referensi.",
    g_cat_match: "MASTER MATCH \u2014 membuat foto Anda menyamai keseluruhan tampilan referensi (centang lapisannya di atas).",
    g_cat_trail: "WEDDING TRAIL \u2014 rumput mewah + jalur bunga yang mengalir; wajah/pose/bingkai terkunci mati.",
    g_cat_veil: "FLYING VEIL \u2014 menambah/memanjangkan kerudung tertiup angin sepanjang ini; wajah tak pernah tertutup.",
    g_cat_gown: "GOWN \u2014 merapikan gaun yang ada (desain tidak berubah) dan menetapkan panjang ekor ini.",
    g_cat_petal: "FLYING PETALS \u2014 menambahkan kelopak melayang dengan gaya ini; warnanya dari palet di atas.",
    g_cat_wedx: "WEDDING EXTRA \u2014 menambahkan elemen ini agar selaras dengan adegan Anda; subjek tetap terkunci.",
    g_cat_canvas: "REPLACE (CANVAS) \u2014 menempatkan subjek ANDA ke adegan referensi; orang di referensi dihapus.",
    g_cat_restore: "OLD PHOTO RESTORE \u2014 memperbaiki kerusakan; setiap wajah asli tetap 100% sama.",
    g_cat_generic: "PRESET \u2014 menerapkan hasil edit profesional ini ke foto Anda.",
    g_gen: "GENERATE \u2014 menjalankan kotak prompt (+ chains, kunci Keep, blok kamera) pada dokumen Anda.",
    g_retouchbtn: "RETOUCH APPLY \u2014 menjalankan seluruh setelan slider Anda sebagai satu proses retouch profesional.",
    g_relightbtn: "LIGHTING GENERATE \u2014 menyinari ulang foto persis sesuai diagram lampu 3D Anda.",
    g_scene: "SCENE GENERATE \u2014 membangun ulang adegan dari prompt hasil ekstraksi; subjek tetap.",
    g_rmix: "REPLACE MIX \u2014 hanya mengganti bagian yang dicentang \u2713 dari referensi.",
    g_pipe: "RUN PIPELINE \u2014 menjalankan setiap langkah berantai secara berurutan; tiap hasil masuk ke langkah berikutnya.",
    ro_faceRep: "Face Replace",
    ro_faceSwap: "Face Swap",
    ro_bgRep: "BG Replace",
    ro_bgSwap: "BG Swap",
    ro_fgRep: "FG Replace",
    ro_bg_note: "Doc = subjek \u00b7 Ref1 = adegan baru. Target (Solo/Couple/Family) menentukan siapa yang dipertahankan.",
    ro_bg_frame: "Pertahankan bingkai & komposisi",
    ro_bg_light: "Pertahankan cahaya/warna subjek",
    ro_subSwap: "Subject Swap",
    ro_lcRef: "L&C Reference",
    ro_lcCopy: "L&C Copy-Paste",
    ro_dressRef: "Dress Reference",
    ro_dressRep: "Dress Replace",
    ro_mkCopy: "Makeup Copy",
    ro_matchBtn: "\u2605 MASTER MATCH",
    grp_retouch: "Preset Retouch Kulit",
    lbl_intensity: "Kekuatan",
    p_evoto: "Evoto Style",
    p_meitu: "Meitu Style",
    auto_place: "Otomatis tempatkan hasil ke Photoshop sebagai layer baru",
    sec_retouchpro: "Retouch Pro \u2014 Sliders",
    rt_skin: "Kulit",
    rt_faceai: "Face AI",
    rt_hair: "Rambut",
    rt_dress: "Busana",
    rt_bg: "Latar",
    rt_smooth: "Haluskan Kulit",
    rt_acne: "Hapus Jerawat",
    rt_spots: "Noda Gelap",
    rt_wrinkle: "Kerutan",
    rt_tone: "Cerah / Sawo Matang",
    rt_glow: "Kilau",
    rt_reshape: "AI Reshape",
    rt_lash: "Bulu Mata",
    rt_brow: "Alis",
    rt_lipsmooth: "Haluskan Bibir",
    rt_lipcolor: "Warna Bibir",
    rt_lenscolor: "Warna Lensa Mata",
    rt_hairstray: "Rambut Liar",
    rt_hairsmooth: "Haluskan Rambut",
    rt_hairshine: "Kilau Rambut (D&B)",
    rt_dresssmooth: "Haluskan Kain",
    rt_dressedge: "Rapikan Tepi",
    rt_dresswrinkle: "Hapus Kusut",
    rt_dresstexture: "Pulihkan Tekstur",
    rt_bgsmooth: "Bersihkan/Haluskan Latar",
    rt_bgcolor: "Warna Latar",
    rt_bgrecolor: "Haluskan Warna Latar",
    rt_shape: "Reshape Pro (Wajah + Tubuh)",
    rt_teeth: "Putihkan Gigi",
    rt_eyewhite: "Bersihkan Putih Mata",
    rt_faceslim: "Tirus Wajah",
    rt_jaw: "Garis Rahang",
    rt_chin: "Dagu",
    rt_nosesize: "Ukuran Hidung",
    rt_eyesize: "Ukuran Mata",
    rt_lipfull: "Bibir Berisi",
    rt_waist: "Ramping Pinggang",
    rt_bodyslim: "Ramping Tubuh",
    rt_shoulder: "Bahu",
    rt_hip: "Ramping Pinggul",
    rt_leglen: "Panjang Kaki",
    rt_armslim: "Ramping Lengan",
    rt_dressfit: "Kepasan Busana",
    rt_dressclean: "Bersihkan Busana",
    rt_dresscolorpure: "Murnikan Warna Busana",
    rt_bodygrp: "Body Skin Pro",
    rt_bodysmooth: "Haluskan Kulit Tubuh",
    rt_bodyblemish: "Bersihkan Noda Tubuh",
    rt_bodytone: "Ratakan Warna Kulit",
    rt_bodyglow: "Kilau Tubuh",
    rt_bodyhairrm: "Kurangi Bulu",
    rt_hairvolume: "Volume Rambut",
    rt_hairgloss: "Gloss Rambut",
    rt_hairfill: "Isi Rambut (area tipis)",
    wp_h_trail: "\u2665 Wedding \u2014 Jalur Bunga Mewah",
    wp_h_veil: "\u2665 Wedding \u2014 Kerudung Terbang",
    wp_h_gown: "\u2665 Wedding \u2014 Rapikan Gaun + Ekor",
    wp_h_petal: "\u2665 Wedding \u2014 Kelopak Terbang",
    wp_h_extra: "\u2665 Wedding \u2014 Kuda \u00b7 Air \u00b7 Suasana",
    wp_note: "Face ID / pose / bingkai / desain gaun terkunci mati \u2014 hanya elemen yang disebut yang berubah.",
    wp_petalcolor: "Warna Kelopak (auto = ikut adegan)",
    wp_trail_c: "Warna bunga",
    wp_trail_go: "\u25b6 Jalur Bunga",
    wp_veil_c: "Panjang kerudung",
    wp_veil_go: "\u25b6 Kerudung Terbang",
    wp_gown_c: "Panjang ekor",
    wp_gown_go: "\u25b6 Rapikan Gaun + Ekor",
    wp_pet_c: "Gaya kelopak",
    wp_pet_go: "\u25b6 Kelopak Terbang",
    wp_extra_c: "Tambahan",
    wp_extra_go: "\u25b6 Tambah Elemen",
    btn_apply_rt: "Terapkan Retouch",
    btn_reset: "Atur Ulang",
    rt_none: "Atur minimal satu slider atau warna retouch dulu",
    tab_setup: "Setup",
    tab_prompt: "Studio",
    tab_presets: "Presets",
    recent_lbl: "Prompt terbaru\u2026",
    tab_retouch: "Retouch",
    tab_aitools: "AI Tools",
    cap_warn: "Photoshop membatasi kotak prompt ini pada:",
    cleanup_note: "Item yang dicentang ikut berjalan pada SETIAP Generate / preset.",
    btn_generate: "GENERATE",
    st_ready: "Siap",
    st_capture: "Mengambil dokumen",
    st_gen: "Membuat\u2026",
    st_place: "Menempatkan ke Photoshop\u2026",
    st_placed_masked: "Ditempatkan sebagai grup Layer + Mask \u2014 aslinya tidak tersentuh \u2713",
    st_placed_plain: "Ditempatkan sebagai layer biasa (mask/group tidak tersedia di host ini)",
    stage_queued: "Antre",
    stage_uploading: "Mengunggah",
    stage_generating: "Membuat",
    stage_downloading: "Mengunduh",
    stage_placing: "Menempatkan",
    st_done: "Selesai \u2713",
    st_err: "Kesalahan",
    st_no_doc: "Tidak ada dokumen aktif \u2014 buka foto dulu",
    st_no_prompt: "Prompt masih kosong",
    need_ref: "Preset ini butuh gambar referensi di slot 1",
    st_new_doc: "Hasil dibuka sebagai dokumen baru \u2713",
    sec_preview: "Pratinjau \u2014 Before / After",
    before: "SEBELUM",
    after: "SESUDAH",
    btn_place: "Tempatkan ke Photoshop",
    btn_saveas: "Simpan Sebagai\u2026",
    st_saved: "Tersimpan \u2713",
    sec_diag: "Pemeriksaan Sistem",
    sec_log: "Catatan Aktivitas",
    btn_diag: "Jalankan Pemeriksaan",
    btn_copylog: "Salin Log",
    btn_clearlog: "Bersihkan",
    diag_host: "Aplikasi Photoshop",
    diag_uxp: "Kemampuan UXP",
    diag_gem: "Gemini API key",
    diag_oai: "OpenAI API key",
    diag_doc: "Dokumen aktif",
    diag_set: "tersetel",
    diag_unset: "belum disetel",
    diag_open: "terbuka",
    diag_none: "tidak ada",
    diag_missing: "tidak ditemukan",
    diag_done: "Pemeriksaan sistem selesai \u2713",
    diag_lib: "Pustaka Referensi",
    diag_lib_open: "Kemampuan buka folder",
    sec_reflib: "Pustaka Gambar Referensi",
    reflib_note: "Pilih sekali saja folder gambar referensi favorit Anda \u2014 Browse akan mengingatnya dan langsung membukanya di mana pun.",
    btn_browse: "Telusuri",
    lib_choose: "Pilih Folder",
    lib_open: "Buka Folder",
    lib_change: "Ganti Folder",
    lib_reset: "Atur Ulang",
    lib_rescan: "Pindai Ulang",
    lib_current: "Folder Saat Ini",
    lib_found: "Gambar Ditemukan",
    lib_status: "Status",
    lib_lastscan: "Pindai Terakhir",
    lib_images: "gambar",
    lib_connected: "Terhubung",
    lib_not_config: "Belum dikonfigurasi",
    lib_perm_lost: "Izin hilang \u2014 pilih ulang",
    lib_none: "(belum ada folder dipilih)",
    lib_copy_only: "salin path saja",
    lib_choose_msg: "Pilih folder Pustaka Gambar Referensi HNK Anda.",
    lib_scanning: "Memindai pustaka\u2026",
    lib_scan_done: "Pindai ulang selesai \u2713",
    lib_reset_done: "Pustaka diatur ulang \u2713",
    lib_path_copied: "Path tersalin",
    lib_unsupported: "Jenis gambar tidak didukung",
    lib_restore_fail: "Referensi tidak dapat dipulihkan",
    on: "AKTIF",
    off: "MATI",
    ai_home_title: "Anda ingin membuat apa?",
    ai_free_generate: "Buat Bebas",
    ai_free_sub: "Tulis prompt Anda sendiri",
    ai_more_tools: "Alat Lainnya",
    ai_more_sub: "Water Edit \u00b7 Text/Logo \u00b7 semua workflow",
    ai_nav_home: "Beranda",
    ai_nav_tools: "Alat",
    ai_history: "Riwayat",
    ai_no_gen: "Belum ada hasil.",
    ai_rerun: "Jalankan Ulang",
    ai_reuse: "Pakai Lagi",
    ai_clear_hist: "Hapus riwayat",
    ai_images: "GAMBAR",
    ai_add_ref: "+ Tambah gambar Reference",
    ai_prompt: "PROMPT",
    ai_prompt_ph: "Jelaskan yang Anda inginkan\u2026",
    ai_model_output: "MODEL & OUTPUT",
    ai_model_note: "AI Tools punya pengaturan model/size sendiri, terpisah dari tab Setup dan Create.",
    ai_auto_model: "Model Otomatis",
    ai_wf_tools: "Alat Workflow",
    ai_direct_gen: "Buat Langsung",
    ai_identity_lock: "Kunci Identitas",
    ai_ref_transfer: "Transfer Reference",
    ai_req_images: "Gambar Wajib",
    ai_opt_images: "Gambar Opsional",
    ai_model_lbl: "Model",
    ai_prepare: "Siapkan (muat & periksa)",
    ai_lib_bridge_off: "Library tidak tersedia di host ini.",
    ai_lib_pick_first: "Pilih foto dari tab Presets \u2192 Visual Library dulu.",
    ai_lib_load_fail: "Gambar Library gagal dimuat.",
    ai_missing: "Belum ada",
    ai_add: "Tambah",
    ai_library: "Library",
    ai_rh_sec: "RunningHub \u2014 tambah model endpoint (Lanjutan \u2014 opsional)",
    ai_rh_note: "Model bawaan sudah berjalan dengan key di atas \u2014 tidak perlu diatur. Jika sebuah model menampilkan \"not connected\" (endpoint path-nya belum dipastikan), salin path dari dokumentasi API RunningHub lalu tempel di sini.",
    ai_rh_save: "Simpan endpoint model ini",
    ai_test_conn: "Uji koneksi",
    ai_oai_sec: "OpenAI (Lanjutan \u2014 opsional)",
    ai_oai_note: "Gunakan OpenAI API key Anda dengan GPT Image 2 sebagai pengganti (atau pendamping) RunningHub Enterprise.",
    ai_save_verify: "Simpan & Verifikasi",
    ai_settings: "Pengaturan",
    ai_add_layers: "Tambahkan hasil sebagai Layer baru",
    ai_done: "Selesai.",
    ai_result_ready: "Hasil siap.",
    ai_ready_nolayer: "Hasil siap (opsi tambah sebagai Layer nonaktif di Settings).",
    ai_place_failed: "Berhasil dibuat, tetapi gagal ditempatkan ke Photoshop.",
    ai_place_failed_fix: "Buka sebuah dokumen, lalu jalankan ulang dari History.",
    ai_placed_masked: "Ditempatkan ke grup \u201c{name}\u201d sebagai Layer + Mask \u2014 gambar asli tidak diubah.",
    ai_placed_group: "Ditempatkan ke grup \u201c{name}\u201d sebagai Layer baru (mask tidak tersedia di host ini).",
    ai_placed_plain: "Ditempatkan sebagai Layer baru (group/mask tidak tersedia di host ini).",
    ai_start_fail: "AI Tools gagal dijalankan",
    pgb_setup: "Mulai di sini \u2014 atur API Key \u00b7 Model \u00b7 Library",
    pgb_studio: "Prompt \u2192 Reference \u2192 Generate \u2014 alur kerja pro tanpa putus",
    pgb_create: "Dari ide jadi karya \u2014 4 slot reference \u00b7 Variations",
    pgb_presets: "Visual Library 366 \u00b7 Scenes \u00b7 Wedding \u00b7 Style Chains",
    pgb_aitools: "Sekali ketuk profesional \u2014 Nano Banana \u00b7 GPT Image \u00b7 RunningHub",
    pgb_retouch: "Kulit \u00b7 Wajah \u00b7 Tubuh \u2014 slider profesional",
    wf_sum_bg_replace: "Ganti latar",
    wf_sum_reference_transfer: "Masukkan subjek Anda ke adegan reference",
    wf_sum_master_bgfg_replace: "Hapus orang di adegan, bangun ulang bg/fg, masukkan subjek Anda",
    wf_sum_subject_face: "Pindahkan subjek atau wajah ke gambar base",
    wf_sum_retouch: "Penyempurnaan potret yang natural",
    wf_sum_upscale: "Perbesar tanpa kehilangan detail",
    wf_sum_object_edit: "Hapus, ganti, atau tambah objek",
    wf_sum_water_edit: "Edit air dan pantulan",
    wf_sum_text_logo: "Tambah atau edit teks dan logo",
    wfin_subject: "Foto Anda (subjek)",
    wfin_new_bg: "Latar baru (opsional)",
    wfin_ref_scene: "Adegan reference",
    wfin_style_ref: "Style reference (opsional)",
    wfin_target_scene: "Adegan target yang ada orangnya",
    wfin_base: "Gambar base",
    wfin_face_ref: "Reference wajah / subjek",
    wfin_portrait: "Foto potret",
    wfin_image: "Gambar",
    wfin_object_ref: "Reference objek (opsional)",
    wfin_logo_ref: "Reference logo (opsional)",
    wf_exp_bg_replace: "Mengganti latar di belakang subjek. Orang, pose, tepi, dan pencahayaan tetap persis sama \u2014 hanya bagian di belakangnya yang berubah.",
    wf_exp_reference_transfer: "Mengambil seluruh adegan foto reference (tetapi BUKAN orang di dalamnya) lalu menempatkan subjek ANDA ke sana \u2014 menjaga identitas, pose, dan bingkai subjek, serta menyelaraskan cahaya dan perspektif adegan.",
    wf_exp_master_bgfg_replace: "Penggantian subjek dalam adegan yang paling ketat: menghapus orang dari adegan reference sepenuhnya, merekonstruksi latar dan latar depan yang tertutup secara alami, lalu menempatkan subjek Anda persis di titik itu \u2014 identitas, pose, proporsi, gaya rambut, busana, kulit, dan pencahayaan dikunci dari foto Anda, sedangkan reference hanya menyediakan adegan, sudut kamera, dan kedalaman.",
    wf_exp_subject_face: "Memadukan subjek atau wajah dari reference ke gambar base secara mulus, dengan komposisi base tetap utuh.",
    wf_exp_retouch: "Memberi retouch alami pada kulit, rambut, dan tona. Identitas, fitur, dan ekspresi tetap dipertahankan \u2014 tanpa kulit plastik, tanpa perubahan wajah.",
    wf_exp_upscale: "Memperbesar gambar sekaligus memulihkan detail alami pada kulit, rambut, dan kain. Identitas, pose, komposisi, dan warna tetap persis sama \u2014 tanpa penghalusan plastik.",
    wf_exp_object_edit: "Menghapus, mengganti, atau menambah objek lewat edit lokal yang terkontrol. Semua yang tidak Anda sentuh tetap sama.",
    wf_exp_water_edit: "Menambah atau mengedit air, pantulan, dan permukaan basah agar tampak wajar secara fisik, tanpa mengubah subjek Anda.",
    wf_exp_text_logo: "Menambah atau mengedit teks atau logo yang bersih dan mudah dibaca pada gambar, dengan komposisi tetap terjaga."
  },
  /* ---- Malay (ms) — 587 keys, complete ---- */
  ms: {
    gate_sub_login: "Log masuk dengan akaun HNK anda untuk menggunakan panel ini.",
    gate_email_ph: "E-mel",
    gate_pass_ph: "Kata laluan",
    gate_signin: "Log masuk",
    gate_checking: "Menyemak pelan anda…",
    gate_need: "Masukkan e-mel dan kata laluan.",
    gate_bad: "E-mel atau kata laluan salah.",
    gate_offline: "Tiada internet — pelan tidak dapat disemak. Sambung, kemudian semak semula.",
    gate_locked: "Satu bayaran untuk kedua-duanya — yuran masuk dan yuran bulanan membuka apl web DAN panel Photoshop ini. Beli atau perbaharui di laman web, kemudian semak semula.",
    gate_buy: "Buka laman web",
    gate_retry: "Semak semula",
    gate_signout: "Log keluar",
    gate_days: "tinggal {D} hari",
    gate_grace: "Luar talian — tinggal {D} hari penggunaan luar talian",
    gate_open_fail: "Tidak dapat membuka pelayar. Alamat: {U}",
    app_title: "HNK Photoshop Ai Panel (Pelajar)",
    sec_api: "Gemini API Key",
    btn_show: "Papar",
    btn_hide: "Sembunyi",
    btn_test: "Uji Key",
    btn_save: "Simpan",
    st_testing: "Menguji key",
    st_key_ok: "\u2713 API key berfungsi",
    st_key_bad: "API key gagal",
    st_key_saved: "API key disimpan \u2713",
    st_need_key: "Masukkan Gemini API key anda dahulu",
    sec_model: "Model & Output",
    scope_model_note: "Digunakan oleh butang Generate pada tab Prompt di bawah \u2014 Create dan AI Tools masing-masing ada tetapan model tersendiri.",
    model_auto: "Automatik (disyorkan)",
    model_flash: "Flash \u2014 pantas (2.5)",
    model_pro: "Pro \u2014 kualiti (3.0)",
    lbl_ratio: "Nisbah",
    ratio_auto: "Nisbah automatik (dari dokumen)",
    lbl_size: "Saiz",
    lbl_quality: "Kualiti",
    qual_auto: "Automatik",
    qual_low: "Rendah",
    qual_med: "Sederhana",
    qual_high: "Tinggi",
    sec_prompt: "Prompt",
    hint_prompt: "Taip prompt anda di sini\u2026 (maks 20,000 aksara)",
    btn_improve: "Perbaik Prompt",
    btn_clear: "Kosongkan",
    st_improving: "Memperbaik prompt",
    st_improved: "Prompt diperbaik \u2713",
    sec_refs: "Imej Rujukan (2 slot)",
    base_note: "Imej asas = dokumen Photoshop anda yang aktif (diambil secara automatik).",
    btn_ref_layer: "+ Layer",
    btn_ref_file: "Fail",
    btn_ref_web: "Web",
    st_ref_layer_added: "Layer ditambah sebagai rujukan \u2713",
    st_ref_file_added: "Fail ditambah sebagai rujukan \u2713",
    st_importing: "Mengimport fail",
    url_title: "Rujukan dari URL \u2014 Chrome / Pinterest",
    url_ph: "https://\u2026 alamat imej atau pautan pin Pinterest",
    btn_paste: "Tampal",
    btn_load: "Muat",
    btn_cancel: "Batal",
    st_url_loading: "Memuat turun imej web",
    st_ref_web_added: "Imej web ditambah sebagai rujukan \u2713",
    st_url_bad: "Tidak dapat memuatkan imej dari URL ini \u2014 salin alamat imej dan cuba lagi",
    no_layer: "Tiada layer dipilih",
    sec_presets: "AI Presets",
    auto_run: "Klik preset \u2192 Generate automatik (MATI = sisip ke prompt sahaja)",
    grp_cleanup: "Alat Pembersihan",
    p_remove_people: "Buang Orang",
    p_fix_hands: "Betulkan Tangan Berlebihan",
    p_fix_legs: "Betulkan Kaki Berlebihan",
    p_full_clean: "Bersih Sepenuhnya",
    grp_moved_note: "Alat Reference kini berada dalam kad Reference Ops Pro di bawah (satu tempat, dengan Solo/Couple/Family + panduan).",
    ro_h_detail: "Rambut \u00b7 Aksesori \u00b7 Pose (\u2190 Ref1)",
    ro_h_comp: "Komposit \u00b7 Gaya \u00b7 Teks (\u2190 Ref1)",
    p_fgbglc: "FG=Doc \u00b7 BG=Ref1 \u00b7 Light=Ref2",
    p_hair: "Gaya Rambut (\u2190 Ref1)",
    p_access: "Barang Kemas + Aksesori (\u2190 Ref1)",
    p_pose: "Padan Pose (Doc \u2192 Ref1)",
    p_fgprops: "Prop Latar Depan (\u2190 Ref1)",
    p_textlogo: "Teks / Logo (\u2190 Ref1)",
    p_style: "Gaya Foto (\u2190 Ref1)",
    grp_repsubj: "Ganti Subjek (Doc \u2192 adegan Ref1)",
    p_rep_solo: "Ganti Solo",
    p_rep_couple: "Ganti Pasangan",
    p_rep_family: "Ganti Keluarga",
    grp_rmix: "Replace Mix \u2014 tanda dan ambil dari Ref1",
    rm_bg: "Latar (BG)",
    rm_fg: "Latar Depan (FG)",
    rm_light: "Pencahayaan",
    rm_color: "Warna",
    rm_object: "Objek / Prop",
    btn_rmix: "REPLACE GENERATE",
    rm_none: "Tandakan sekurang-kurangnya satu aspek dahulu",
    grp_i2p: "Image \u2192 Prompt (Scene Builder)",
    i2p_note: "1) Ekstrak: adegan Ref1 \u2192 prompt teks terperinci (tanpa orang). 2) Sunting di halaman Prompt. 3) SCENE GENERATE membinanya mengelilingi subjek dokumen anda \u2014 dipadankan automatik ke sebarang sudut. Kunci Face/Pose/Frame = kekalkan asal.",
    i2p_objects: "Perincian objek & prop",
    i2p_light: "Perincian pencahayaan",
    i2p_color: "Perincian warna / grade",
    i2p_bg: "Perincian latar",
    i2p_fg: "Perincian latar depan",
    btn_i2p: "Image \u2192 Prompt (Ekstrak Adegan)",
    i2p_fit: "Scene Auto-Fit \u2014 unjur semula adegan mengikut sudut / jarak / lensa dokumen",
    i2p_adapt: "Sesuaikan cahaya & warna subjek dengan adegan",
    btn_scenegen: "SCENE GENERATE",
    st_extract: "Mengekstrak adegan menjadi prompt",
    st_extract_done: "Prompt adegan sedia \u2014 semak di halaman Prompt",
    scene_no_prompt: "Kotak prompt kosong \u2014 jalankan Image \u2192 Prompt dahulu",
    i2p_none: "Tandakan sekurang-kurangnya satu aspek perincian dahulu",
    sec_light: "Studio Lighting \u2014 AI Relight",
    light_note: "Tandakan lampu untuk hidupkan, ketik satu baris untuk memilihnya, bentuknya dengan slider \u2014 rajah pandangan atas 3D mengikut secara langsung (\u25b4 = tinggi, \u25be = rendah). LIGHTING GENERATE menyinari semula dokumen tepat mengikut susunan ini; wajah / pose / bingkai kekal terkunci.",
    lbl_my_prompt: "PROMPT BAHASA MELAYU",
    lstage_model: "MODEL",
    lstage_cam: "CAM",
    l_key: "Key Light",
    l_fill: "Fill / Depan",
    l_butterfly: "Butterfly (atas-depan)",
    l_side: "Cahaya Sisi",
    l_rim: "Rim Light",
    l_back: "Back Light",
    l_hair: "Hair Light",
    l_bglight: "Cahaya Latar",
    lt_softbox: "Softbox",
    lt_octa: "Octa",
    lt_strip: "Strip",
    lt_umbrella: "Umbrella",
    lt_beauty: "Beauty",
    lt_hard: "Hard",
    li_int: "Keamatan",
    li_angle: "Sudut",
    li_height: "Ketinggian",
    li_dist: "Jarak",
    li_size: "Saiz",
    btn_lightgen: "LIGHTING GENERATE",
    light_none: "Hidupkan sekurang-kurangnya satu lampu dahulu",
    lg_equip: "Tunjuk peralatan lampu dalam foto (softbox / stand kelihatan)",
    grp_chains: "Style Chains \u2014 gabungkan gaya \u2713",
    chains_note: "Hidupkan mana-mana gaya \u2014 semuanya bergabung ke dalam SETIAP Generate / preset / Retouch sekali gus.",
    grp_restore: "Pemulihan Foto Lama",
    p_restore: "Pemulihan Foto Lama",
    rest_color: "Warna Penuh",
    rest_bw: "Hitam & Putih",
    restore_note: "Membaiki koyakan, kerosakan air / terbakar dan warna pudar \u2014 mengekalkan setiap wajah asal 100% serupa.",
    rt_browstyle: "Gaya Kening",
    rt_lashstyle: "Gaya Bulu Mata",
    rt_blush: "Warna Pemerah Pipi",
    rt_contour: "Gaya Kontur",
    rt_bust: "Dada",
    rt_butt: "Punggung",
    rt_thigh: "Peha",
    rt_calf: "Betis",
    rt_neck: "Leher",
    rt_fingers: "Jari",
    hint_prompt_my: "Tulis sahaja dalam bahasa Melayu \u2014 semasa Generate ia diterjemah automatik ke bahasa Inggeris (maks 20,000)",
    st_translate: "Menterjemah prompt ke bahasa Inggeris",
    live_trans: "Terjemah automatik langsung \u21c4 (EN \u2194 MS, selepas anda berhenti menaip)",
    st_retry: "Mencuba semula",
    grp_recipes: "Recipes \u2014 simpan / kongsi tetapan",
    recipe_note: "Simpan SEMUANYA (chains, retouch, lampu, kunci, prompt) sebagai satu fail .json \u2014 pelajar hanya perlu Load.",
    btn_recipe_save: "Simpan Recipe",
    btn_recipe_load: "Muat Recipe",
    st_recipe_saved: "Recipe disimpan \u2713",
    st_recipe_loaded: "Recipe dimuat \u2713 \u2014 semua kawalan dikemas kini",
    st_recipe_bad: "Bukan fail Recipe HNK",
    sec_final: "Prompt Akhir (dihantar ke AI)",
    btn_copy: "Salin",
    st_copied: "Disalin \u2713",
    hist_note: "Sejarah \u2014 6 hasil terkini, ketik untuk lihat:",
    btn_hist_prompt: "\u2192 Prompt",
    sec_batch: "Batch Mode",
    batch_note: "Pilih banyak foto + satu folder output \u2014 prompt, chains, cleanup dan kunci Keep semasa dijalankan pada setiap foto; hasil disimpan sebagai *_HNK.png.",
    btn_batch: "JALANKAN BATCH",
    btn_batch_stop: "Berhenti",
    st_batch: "Batch",
    st_batch_done: "Batch selesai",
    sec_web: "Web AI \u2014 Pelayar Mini",
    web_note: "Buka mana-mana editor AI web di dalam Photoshop. Jana di sana, kemudian bawa hasilnya masuk sebagai layer:",
    web_import_note: "Import: \u2460 dalam web app guna Copy image address, kemudian IMPORT COPIED LINK \u00b7 \u2461 atau muat turun failnya dan guna IMPORT FILE \u00b7 \u2462 web app rakan yang mempunyai HNK bridge menghantar imej masuk secara automatik.",
    btn_web_go: "Pergi",
    btn_web_home: "Utama",
    btn_web_reload: "Muat semula",
    btn_web_import_link: "IMPORT PAUTAN DISALIN \u2192 PS",
    btn_web_import_file: "IMPORT FAIL \u2192 PS",
    st_web_import: "Diimport ke Photoshop sebagai layer \u2713",
    st_web_nourl: "Salin pautan imej dahulu (klik kanan \u2192 Copy image address)",
    st_web_fetch: "Mengambil imej dari pautan",
    st_web_notallowed: "Domain ini tiada dalam senarai dibenarkan \u2014 ia mungkin kekal kosong. Minta HNK menambahkannya.",
    st_need_doc: "Buka dokumen foto dalam Photoshop dahulu",
    sec_campro: "Camera Pro & Kualiti",
    autosave_lbl: "Auto-eksport setiap hasil (PNG + log prompt \u2192 folder)",
    st_folder_ok: "Folder eksport ditetapkan \u2713",
    st_exported: "Dieksport \u2713",
    st_export_fail: "Eksport gagal \u2014 periksa foldernya",
    st_pro_fallback: "Model Pro tidak tersedia \u2014 beralih ke Flash untuk larian ini",
    st_img_bad: "Data imej gagal pemeriksaan integriti \u2014 tambah semula fotonya",
    st_auto_comp: "Komposit Automatik: subjek IMAGE 1 \u2192 adegan rujukan",
    prov_lbl: "Pembekal AI",
    oai_key_ph: "sk-... (OpenAI API key)",
    tab_create: "Create",
    create_note: "MOD CREATE \u2014 imej baharu sepenuhnya daripada prompt anda (+ 4 ref tersendiri). Berdiri sendiri: tidak pernah membaca dokumen, preset, chains atau kunci.",
    create_ph: "Terangkan imej yang anda mahu cipta\u2026",
    btn_create_ps: "\u2b07 Hantar ke Photoshop",
    btn_to_ref: "\u21ba Guna sebagai Ref 1",
    st_to_ref: "Hasil dimuat ke Ref 1 \u2713",
    scope_create_note: "Berasingan daripada Model & Output milik Setup \u2014 tetapan ini hanya digunakan untuk Generate dalam Create.",
    cr_ratio: "Nisbah",
    cr_var: "Variasi",
    cr_restyle: "\u267b Ubah gaya hasil",
    cr_lib: "Pustaka Prompt \u2014 ketik untuk sisip",
    cr_improve: "\u2728 Perbaik",
    cr_describe: "\ud83d\udd0d Baca Ref 1 \u2192 Prompt",
    st_describing: "Membaca imej rujukan\u2026",
    st_described: "Prompt ditulis daripada Ref 1 \u2713",
    st_need_gem: "Tambah Gemini API key (Setup) \u2014 ciri ini menggunakan Gemini text",
    st_need_ref1: "Tambah imej ke Ref 1 dahulu",
    st_lib_added: "Prompt ditambah \u2713",
    cr_refs: "Imej Rujukan (sehingga 4)",
    cr_refs_note: "Pilihan \u2014 tambah melalui Layer / File / Web. Create hanya mengambil apa yang diminta oleh prompt anda.",
    cr_results: "Hasil",
    cr_gal_empty: "Belum ada hasil \u2014 ketik Generate.",
    cr_gal_have: "hasil \u00b7 ketik imej kecil untuk lihat / bertindak",
    cr_save: "\u2b07 Simpan PNG",
    cr_engine: "Engine",
    cr_need_result: "Jana satu imej dahulu",
    btn_web_import_url: "\u2b07 Import URL",
    st_clip_help: "Papan keratan kosong/disekat \u2014 tampal pautan ke bar URL, kemudian ketik \u2b07 Import URL",
    st_web_blob: "Itu pautan blob: sementara \u2014 guna klik kanan \u2192 Copy IMAGE Address, atau simpan failnya dan guna Import File",
    err_key: "API key tidak sah \u2014 semak semula key pada tab Setup",
    err_quota: "Kuota / had kadar dicapai \u2014 tunggu sebentar, kemudian cuba lagi",
    err_big: "Imej terlalu besar untuk API \u2014 kecilkan, kemudian cuba lagi",
    err_safety: "Disekat penapis keselamatan \u2014 laraskan prompt atau fotonya, kemudian cuba lagi",
    err_net: "Masalah rangkaian / pelayan \u2014 sila cuba lagi",
    err_timeout: "Permintaan tamat masa \u2014 pelayan mengambil masa terlalu lama; sila cuba lagi",
    err_generic: "Permintaan tidak dapat diselesaikan \u2014 sila cuba lagi",
    err_img: "Tiada imej yang boleh digunakan dihasilkan \u2014 sila cuba lagi",
    err_mode: "Dokumen ini bukan dalam mod RGB \u2014 tukar dahulu (Image \u25b8 Mode \u25b8 RGB Color), kemudian cuba lagi",
    cam_master: "Blok Camera HIDUP \u2014 tambah pada hujung SETIAP prompt",
    cam_body: "Badan Kamera",
    cam_lens: "Lensa Prime (mm)",
    cam_f: "Bukaan",
    cam_film: "Rupa Filem",
    cam_bokeh: "Gaya Bokeh",
    cam_iso: "ISO",
    cam_k: "WB Kelvin",
    cam_note: "Hidupkan blok ini dahulu, kemudian pilih hanya apa yang anda perlukan \u2014 chip \u2013 kekal senyap. Semuanya diletakkan di hujung prompt akhir.",
    ro_h_main: "REFERENCE OPS PRO (Ref1 / Ref2)",
    ro_note: "Ref1 = IMAGE 2 (perempuan) \u00b7 Ref2 = IMAGE 3 (lelaki). Pilih sasaran, kemudian jalankan \u2014 orang yang tidak sepadan tidak pernah berubah.",
    ro_target: "Sasaran:",
    ro_solo: "Solo",
    ro_couple: "Pasangan",
    ro_family: "Keluarga",
    ro_mk: "Salin makeup ref",
    ro_hair: "Ambil gaya rambut ref",
    ro_h_face: "Face Ops",
    ro_h_bg: "BG / FG Ops",
    ro_h_sub: "Subject Ops",
    ro_h_lc: "Light & Color Ops",
    ro_h_dress: "Dress Ops",
    ro_h_mk: "Makeup Ops",
    ro_h_match: "\u2605 Master Match (satu rupa)",
    ro_match_note: "Padankan IMAGE 1 dengan rujukan supaya kedua-duanya kelihatan seperti satu suntingan \u2014 tandakan apa yang perlu dipadankan:",
    m_color: "Warna",
    m_light: "Cahaya",
    m_makeup: "Makeup",
    m_skin: "Retouch Kulit",
    crd_pipe: "\u26d3 Pipeline Builder \u2014 rantai apa sahaja",
    pipe_note: "Rangkaikan MANA-MANA langkah menjadi satu rantai \u2014 hasil setiap langkah menyuap langkah berikutnya. Maks 6.",
    pipe_add: "+ Tambah",
    pipe_run: "\u25b6 JALANKAN PIPELINE",
    pipe_clear: "Kosongkan",
    pipe_retouch: "Guna Retouch (slider semasa)",
    pipe_relight: "Relight (rig lampu semasa)",
    pipe_prompt: "Prompt (kotak EN semasa)",
    pipe_empty: "Tambah sekurang-kurangnya satu langkah dahulu",
    pipe_max: "Pipeline penuh (maks 6 langkah)",
    st_pipe: "Langkah pipeline",
    st_pipe_done: "Pipeline selesai",
    st_pipe_stop: "Pipeline berhenti (satu langkah gagal)",
    pipe_merge: "\u26a1 Gabung sekali jalan \u2014 SEMUA langkah dalam SATU panggilan (pantas/jimat \u00b7 terbaik \u2264 3 tugas)",
    crd_chainsrest: "Style Chains + Pemulihan Foto Lama",
    crd_refops: "Reference Ops Pro (Ref1 / Ref2)",
    crd_scenes: "\ud83c\udfac Scenes Pro \u2014 subjek dikunci \u00b7 adegan menyesuaikan",
    scn_note: "Kunci subjek anda (wajah \u00b7 pose \u00b7 pakaian \u00b7 bingkai) dan bina semula keseluruhan adegan supaya padan \u2014 cahaya, bayang, warna, latar, latar depan dan objek semuanya menyesuaikan sendiri untuk rupa foto sebenar.",
    scn_h_style: "Gaya Adegan (dalam bangunan / budaya)",
    scn_h_bday: "\ud83c\udf82 Hari jadi \u2014 nombor umur 1\u201345",
    scn_h_cap: "Kapsyen / Teks (kanak-kanak \u00b7 Miss Universe \u00b7 hari jadi)",
    scn_h_scarf: "Luar / Selendang Berterbangan",
    scn_grad: "Konvokesyen Dalam Bangunan",
    scn_prewed: "Prewedding Dalam Bangunan",
    scn_vietnam: "Vietnam",
    scn_myanmar: "Myanmar",
    scn_chinese: "Cina",
    scn_shan: "Shan",
    scn_newborn: "Bayi Baru Lahir",
    scn_age: "Umur",
    scn_bday_go: "\ud83c\udf82 ADEGAN HARI JADI",
    scn_cap_on: "Tambah teks kapsyen",
    scn_cap_ph: "Teks kapsyen (cth. Happy 1st Birthday, nama)\u2026",
    scn_cap_pos: "Kedudukan",
    scn_top: "Atas",
    scn_bottom: "Bawah",
    scn_scarf: "\u2726 ADEGAN SELENDANG BERTERBANGAN",
    scn_dir: "Arah",
    scn_left: "Kiri",
    scn_right: "Kanan",
    scn_up: "Atas",
    scn_len: "Panjang",
    scn_short: "Pendek",
    scn_long: "Panjang",
    g_cat_scene: "SCENE OP \u2014 subjek anda dikunci (wajah \u00b7 pose \u00b7 pakaian \u00b7 bingkai); keseluruhan adegan yang dijana (cahaya, bayang, warna, latar, latar depan, objek, suasana) dipadankan automatik dengan subjek untuk komposit seperti foto sebenar.",
    crd_wed: "\u2665 Wedding Pro Suite",
    crd_recipes: "Recipes \u2014 simpan / kongsi",
    learn_lbl: "\ud83c\udf93 Learn Mode \u2014 ketikan 1 = panduan (kuning), 2 = prompt (biru), 3 = JALAN (hijau)",
    guide_hint: "Ketik lagi: kuning \u2192 biru (prompt) \u2192 hijau (jalan) \u25b6",
    g_learn_next_prompt: "Ketik lagi \u2192 memaparkan PROMPT sebenar (biru).",
    g_learn_prompt_head: "PROMPT yang akan dihantar butang ini (ketik lagi = JALAN):",
    g_learn_next_run: "Ketik sekali lagi \u2192 RUN (hijau) mula menjana.",
    st_prompt_ready: "Prompt sedia \u2014 ketik lagi (hijau) untuk jalankan \u2713",
    g_step_doc: "Buka dokumen foto anda dalam Photoshop dahulu.",
    g_step_ref1: "Muatkan imej rujukan ke Ref1 (ia menjadi IMAGE 2). Tambah Ref2 untuk orang kedua.",
    g_step_target: "Pilih Target: Solo / Couple (Ref1 = perempuan, Ref2 = lelaki) / Family.",
    g_step_mkhair: "Pilihan: tandakan \u2018Copy ref makeup\u2019 / \u2018Take ref hairstyle\u2019 di atas Face Ops.",
    g_step_petal: "Pilih warna kelopak dahulu (auto = padan dengan adegan anda).",
    g_step_rest: "Pilih Full Color atau B&W dengan \u2713 di atas.",
    g_step_int: "Laraskan slider Intensity mengikut citarasa anda.",
    g_step_confirm: "Ketik lagi untuk maju: GUIDE (kuning) \u2192 PROMPT (biru) \u2192 RUN (HIJAU mula menjana).",
    g_cat_face: "FACE OP \u2014 memindahkan wajah rujukan kepada orang yang sepadan; orang lain kekal tidak berubah.",
    g_cat_sub: "SUBJECT OP \u2014 membawa/mengadun ORANG dalam rujukan ke adegan anda; adegan dan bingkai kekal.",
    g_cat_bgfg: "BG/FG OP \u2014 hanya menukar latar / latar depan menggunakan rujukan.",
    g_cat_lc: "LIGHT & COLOR OP \u2014 menyalin pencahayaan dan grade rujukan; orangnya kekal setia piksel demi piksel.",
    g_cat_dress: "DRESS OP \u2014 hanya menukar pakaian menggunakan rujukan.",
    g_cat_mkop: "MAKEUP OP \u2014 hanya menukar solekan menggunakan rujukan.",
    g_cat_match: "MASTER MATCH \u2014 menjadikan foto anda padan dengan keseluruhan rupa rujukan (tandakan lapisan di atas).",
    g_cat_trail: "WEDDING TRAIL \u2014 rumput mewah + laluan bunga yang mengalir; wajah/pose/bingkai dikunci ketat.",
    g_cat_veil: "FLYING VEIL \u2014 menambah/memanjangkan tudung ditiup angin pada panjang ini; wajah tidak pernah terlindung.",
    g_cat_gown: "GOWN \u2014 mengemas gaun sedia ada (reka bentuk tidak berubah) dan menetapkan panjang ekor ini.",
    g_cat_petal: "FLYING PETALS \u2014 menambah kelopak berterbangan dalam gaya ini; warna daripada palet di atas.",
    g_cat_wedx: "WEDDING EXTRA \u2014 menambah elemen ini supaya padan dengan adegan anda; subjek kekal terkunci.",
    g_cat_canvas: "REPLACE (CANVAS) \u2014 meletakkan subjek ANDA ke dalam adegan rujukan; orang dalam rujukan dibuang.",
    g_cat_restore: "OLD PHOTO RESTORE \u2014 membaiki kerosakan; setiap wajah asal kekal 100% serupa.",
    g_cat_generic: "PRESET \u2014 menggunakan suntingan profesional ini pada foto anda.",
    g_gen: "GENERATE \u2014 menjalankan kotak prompt (+ chains, kunci Keep, blok kamera) pada dokumen anda.",
    g_retouchbtn: "RETOUCH APPLY \u2014 menjalankan semua tetapan slider anda sebagai satu pusingan retouch profesional.",
    g_relightbtn: "LIGHTING GENERATE \u2014 menyinari semula foto tepat mengikut rajah lampu 3D anda.",
    g_scene: "SCENE GENERATE \u2014 membina semula adegan daripada prompt yang diekstrak; subjek kekal.",
    g_rmix: "REPLACE MIX \u2014 hanya menggantikan bahagian bertanda \u2713 daripada rujukan.",
    g_pipe: "RUN PIPELINE \u2014 menjalankan setiap langkah berantai mengikut urutan; setiap hasil menyuap langkah seterusnya.",
    ro_faceRep: "Face Replace",
    ro_faceSwap: "Face Swap",
    ro_bgRep: "BG Replace",
    ro_bgSwap: "BG Swap",
    ro_fgRep: "FG Replace",
    ro_bg_note: "Doc = subjek \u00b7 Ref1 = adegan baharu. Target (Solo/Couple/Family) menentukan siapa yang dikekalkan.",
    ro_bg_frame: "Kekalkan bingkai & komposisi",
    ro_bg_light: "Kekalkan cahaya/warna subjek",
    ro_subSwap: "Subject Swap",
    ro_lcRef: "L&C Reference",
    ro_lcCopy: "L&C Copy-Paste",
    ro_dressRef: "Dress Reference",
    ro_dressRep: "Dress Replace",
    ro_mkCopy: "Makeup Copy",
    ro_matchBtn: "\u2605 MASTER MATCH",
    grp_retouch: "Preset Retouch Kulit",
    lbl_intensity: "Kekuatan",
    p_evoto: "Evoto Style",
    p_meitu: "Meitu Style",
    auto_place: "Letak hasil ke Photoshop sebagai layer baharu secara automatik",
    sec_retouchpro: "Retouch Pro \u2014 Sliders",
    rt_skin: "Kulit",
    rt_faceai: "Face AI",
    rt_hair: "Rambut",
    rt_dress: "Pakaian",
    rt_bg: "Latar",
    rt_smooth: "Haluskan Kulit",
    rt_acne: "Buang Jerawat",
    rt_spots: "Tompok Gelap",
    rt_wrinkle: "Kedutan",
    rt_tone: "Cerah / Sawo",
    rt_glow: "Seri",
    rt_reshape: "AI Reshape",
    rt_lash: "Bulu Mata",
    rt_brow: "Kening",
    rt_lipsmooth: "Haluskan Bibir",
    rt_lipcolor: "Warna Bibir",
    rt_lenscolor: "Warna Kanta Mata",
    rt_hairstray: "Rambut Terurai",
    rt_hairsmooth: "Haluskan Rambut",
    rt_hairshine: "Kilau Rambut (D&B)",
    rt_dresssmooth: "Haluskan Kain",
    rt_dressedge: "Kemas Tepi",
    rt_dresswrinkle: "Buang Kedutan Kain",
    rt_dresstexture: "Pulih Tekstur",
    rt_bgsmooth: "Bersih/Haluskan Latar",
    rt_bgcolor: "Warna Latar",
    rt_bgrecolor: "Haluskan Warna Latar",
    rt_shape: "Reshape Pro (Wajah + Badan)",
    rt_teeth: "Putihkan Gigi",
    rt_eyewhite: "Bersihkan Putih Mata",
    rt_faceslim: "Tirus Wajah",
    rt_jaw: "Garis Rahang",
    rt_chin: "Dagu",
    rt_nosesize: "Saiz Hidung",
    rt_eyesize: "Saiz Mata",
    rt_lipfull: "Bibir Penuh",
    rt_waist: "Ramping Pinggang",
    rt_bodyslim: "Ramping Badan",
    rt_shoulder: "Bahu",
    rt_hip: "Ramping Punggung",
    rt_leglen: "Panjang Kaki",
    rt_armslim: "Ramping Lengan",
    rt_dressfit: "Kesesuaian Pakaian",
    rt_dressclean: "Bersihkan Pakaian",
    rt_dresscolorpure: "Warna Pakaian Tulen",
    rt_bodygrp: "Body Skin Pro",
    rt_bodysmooth: "Haluskan Kulit Badan",
    rt_bodyblemish: "Bersihkan Cacat Kulit",
    rt_bodytone: "Ratakan Warna Kulit",
    rt_bodyglow: "Seri Badan",
    rt_bodyhairrm: "Kurangkan Bulu",
    rt_hairvolume: "Volum Rambut",
    rt_hairgloss: "Gilap Rambut",
    rt_hairfill: "Isi Rambut (kawasan nipis)",
    wp_h_trail: "\u2665 Wedding \u2014 Laluan Bunga Mewah",
    wp_h_veil: "\u2665 Wedding \u2014 Tudung Berterbangan",
    wp_h_gown: "\u2665 Wedding \u2014 Kemas Gaun + Ekor",
    wp_h_petal: "\u2665 Wedding \u2014 Kelopak Berterbangan",
    wp_h_extra: "\u2665 Wedding \u2014 Kuda \u00b7 Air \u00b7 Suasana",
    wp_note: "Face ID / pose / bingkai / reka bentuk gaun dikunci ketat \u2014 hanya elemen yang dinamakan berubah.",
    wp_petalcolor: "Warna Kelopak (auto = padan adegan)",
    wp_trail_c: "Warna bunga",
    wp_trail_go: "\u25b6 Laluan Bunga",
    wp_veil_c: "Panjang tudung",
    wp_veil_go: "\u25b6 Tudung Berterbangan",
    wp_gown_c: "Panjang ekor",
    wp_gown_go: "\u25b6 Kemas Gaun + Ekor",
    wp_pet_c: "Gaya kelopak",
    wp_pet_go: "\u25b6 Kelopak Berterbangan",
    wp_extra_c: "Tambahan",
    wp_extra_go: "\u25b6 Tambah Elemen",
    btn_apply_rt: "Guna Retouch",
    btn_reset: "Set Semula",
    rt_none: "Tetapkan sekurang-kurangnya satu slider atau warna retouch dahulu",
    tab_setup: "Setup",
    tab_prompt: "Studio",
    tab_presets: "Presets",
    recent_lbl: "Prompt terkini\u2026",
    tab_retouch: "Retouch",
    tab_aitools: "AI Tools",
    cap_warn: "Photoshop mengehadkan kotak prompt ini kepada:",
    cleanup_note: "Item bertanda dijalankan bersama SETIAP Generate / preset.",
    btn_generate: "GENERATE",
    st_ready: "Sedia",
    st_capture: "Mengambil dokumen",
    st_gen: "Menjana\u2026",
    st_place: "Meletakkan ke Photoshop\u2026",
    st_placed_masked: "Diletakkan sebagai kumpulan Layer + Mask \u2014 asal tidak disentuh \u2713",
    st_placed_plain: "Diletakkan sebagai layer biasa (mask/group tiada pada host ini)",
    stage_queued: "Menunggu",
    stage_uploading: "Memuat naik",
    stage_generating: "Menjana",
    stage_downloading: "Memuat turun",
    stage_placing: "Meletakkan",
    st_done: "Selesai \u2713",
    st_err: "Ralat",
    st_no_doc: "Tiada dokumen aktif \u2014 buka foto dahulu",
    st_no_prompt: "Prompt masih kosong",
    need_ref: "Preset ini memerlukan imej rujukan dalam slot 1",
    st_new_doc: "Hasil dibuka sebagai dokumen baharu \u2713",
    sec_preview: "Pratonton \u2014 Before / After",
    before: "SEBELUM",
    after: "SELEPAS",
    btn_place: "Letak ke Photoshop",
    btn_saveas: "Simpan Sebagai\u2026",
    st_saved: "Disimpan \u2713",
    sec_diag: "Pemeriksaan Sistem",
    sec_log: "Log Aktiviti",
    btn_diag: "Jalankan Pemeriksaan",
    btn_copylog: "Salin Log",
    btn_clearlog: "Kosongkan",
    diag_host: "Aplikasi Photoshop",
    diag_uxp: "Keupayaan UXP",
    diag_gem: "Gemini API key",
    diag_oai: "OpenAI API key",
    diag_doc: "Dokumen aktif",
    diag_set: "ditetapkan",
    diag_unset: "belum ditetapkan",
    diag_open: "terbuka",
    diag_none: "tiada",
    diag_missing: "tiada",
    diag_done: "Pemeriksaan sistem selesai \u2713",
    diag_lib: "Pustaka Rujukan",
    diag_lib_open: "Keupayaan buka folder",
    sec_reflib: "Pustaka Imej Rujukan",
    reflib_note: "Pilih sekali sahaja folder imej rujukan kegemaran anda \u2014 Browse akan mengingatinya dan terus membukanya di mana-mana.",
    btn_browse: "Semak Imbas",
    lib_choose: "Pilih Folder",
    lib_open: "Buka Folder",
    lib_change: "Tukar Folder",
    lib_reset: "Set Semula",
    lib_rescan: "Imbas Semula",
    lib_current: "Folder Semasa",
    lib_found: "Imej Dijumpai",
    lib_status: "Status",
    lib_lastscan: "Imbasan Terakhir",
    lib_images: "imej",
    lib_connected: "Bersambung",
    lib_not_config: "Belum dikonfigurasi",
    lib_perm_lost: "Kebenaran hilang \u2014 pilih semula",
    lib_none: "(tiada folder dipilih)",
    lib_copy_only: "salin laluan sahaja",
    lib_choose_msg: "Pilih folder Pustaka Imej Rujukan HNK anda.",
    lib_scanning: "Mengimbas pustaka\u2026",
    lib_scan_done: "Imbasan semula selesai \u2713",
    lib_reset_done: "Pustaka diset semula \u2713",
    lib_path_copied: "Laluan disalin",
    lib_unsupported: "Jenis imej tidak disokong",
    lib_restore_fail: "Rujukan tidak dapat dipulihkan",
    on: "HIDUP",
    off: "MATI",
    ai_home_title: "Anda mahu cipta apa?",
    ai_free_generate: "Jana Bebas",
    ai_free_sub: "Tulis prompt anda sendiri",
    ai_more_tools: "Lagi Alat",
    ai_more_sub: "Water Edit \u00b7 Text/Logo \u00b7 semua workflow",
    ai_nav_home: "Utama",
    ai_nav_tools: "Alat",
    ai_history: "Sejarah",
    ai_no_gen: "Belum ada hasil.",
    ai_rerun: "Jalan Semula",
    ai_reuse: "Guna Semula",
    ai_clear_hist: "Kosongkan sejarah",
    ai_images: "IMEJ",
    ai_add_ref: "+ Tambah imej Reference",
    ai_prompt: "PROMPT",
    ai_prompt_ph: "Terangkan apa yang anda mahu\u2026",
    ai_model_output: "MODEL & OUTPUT",
    ai_model_note: "AI Tools ada tetapan model/size sendiri, berasingan daripada tab Setup dan Create.",
    ai_auto_model: "Model Automatik",
    ai_wf_tools: "Alat Workflow",
    ai_direct_gen: "Jana Terus",
    ai_identity_lock: "Kunci Identiti",
    ai_ref_transfer: "Pindah Reference",
    ai_req_images: "Imej Diperlukan",
    ai_opt_images: "Imej Pilihan",
    ai_model_lbl: "Model",
    ai_prepare: "Sedia (muat & semak)",
    ai_lib_bridge_off: "Library tidak tersedia pada host ini.",
    ai_lib_pick_first: "Pilih foto dari tab Presets \u2192 Visual Library dahulu.",
    ai_lib_load_fail: "Imej Library gagal dimuatkan.",
    ai_missing: "Belum ada",
    ai_add: "Tambah",
    ai_library: "Library",
    ai_rh_sec: "RunningHub \u2014 tambah model endpoint (Lanjutan \u2014 pilihan)",
    ai_rh_note: "Model terbina dalam sudah berfungsi dengan key di atas \u2014 tiada apa perlu dibuat. Jika sesuatu model memaparkan \"not connected\" (endpoint path belum disahkan), salin path dari dokumentasi API RunningHub dan tampal di sini.",
    ai_rh_save: "Simpan endpoint model ini",
    ai_test_conn: "Uji sambungan",
    ai_oai_sec: "OpenAI (Lanjutan \u2014 pilihan)",
    ai_oai_note: "Guna OpenAI API key anda dengan GPT Image 2 sebagai ganti (atau bersama) RunningHub Enterprise.",
    ai_save_verify: "Simpan & Sahkan",
    ai_settings: "Tetapan",
    ai_add_layers: "Tambah hasil sebagai Layer baharu",
    ai_done: "Selesai.",
    ai_result_ready: "Hasil sedia.",
    ai_ready_nolayer: "Hasil sedia (pilihan tambah sebagai Layer dimatikan dalam Settings).",
    ai_place_failed: "Berjaya dijana, tetapi gagal diletakkan ke Photoshop.",
    ai_place_failed_fix: "Buka satu dokumen, kemudian jalankan semula dari History.",
    ai_placed_masked: "Diletakkan ke dalam kumpulan \u201c{name}\u201d sebagai Layer + Mask \u2014 imej asal tidak disentuh.",
    ai_placed_group: "Diletakkan ke dalam kumpulan \u201c{name}\u201d sebagai Layer baharu (mask tiada pada host ini).",
    ai_placed_plain: "Diletakkan sebagai Layer baharu (group/mask tiada pada host ini).",
    ai_start_fail: "AI Tools gagal dimulakan",
    pgb_setup: "Mula di sini \u2014 sediakan API Key \u00b7 Model \u00b7 Library",
    pgb_studio: "Prompt \u2192 Reference \u2192 Generate \u2014 aliran kerja pro berterusan",
    pgb_create: "Dari idea ke karya \u2014 4 slot reference \u00b7 Variations",
    pgb_presets: "Visual Library 366 \u00b7 Scenes \u00b7 Wedding \u00b7 Style Chains",
    pgb_aitools: "Satu ketikan profesional \u2014 Nano Banana \u00b7 GPT Image \u00b7 RunningHub",
    pgb_retouch: "Kulit \u00b7 Wajah \u00b7 Tubuh \u2014 slider profesional",
    wf_sum_bg_replace: "Ganti latar",
    wf_sum_reference_transfer: "Letak subjek anda ke dalam adegan reference",
    wf_sum_master_bgfg_replace: "Buang orang dalam adegan, bina semula bg/fg, masukkan subjek anda",
    wf_sum_subject_face: "Pindahkan subjek atau wajah ke imej base",
    wf_sum_retouch: "Penambahbaikan potret yang semula jadi",
    wf_sum_upscale: "Besarkan tanpa hilang perincian",
    wf_sum_object_edit: "Buang, ganti atau tambah objek",
    wf_sum_water_edit: "Sunting air dan pantulan",
    wf_sum_text_logo: "Tambah atau sunting teks dan logo",
    wfin_subject: "Foto anda (subjek)",
    wfin_new_bg: "Latar baharu (pilihan)",
    wfin_ref_scene: "Adegan reference",
    wfin_style_ref: "Style reference (pilihan)",
    wfin_target_scene: "Adegan sasaran yang ada orang",
    wfin_base: "Imej base",
    wfin_face_ref: "Reference wajah / subjek",
    wfin_portrait: "Foto potret",
    wfin_image: "Imej",
    wfin_object_ref: "Reference objek (pilihan)",
    wfin_logo_ref: "Reference logo (pilihan)",
    wf_exp_bg_replace: "Menggantikan latar di belakang subjek. Orang, pose, tepi dan pencahayaan kekal sama \u2014 hanya bahagian di belakangnya berubah.",
    wf_exp_reference_transfer: "Mengambil keseluruhan adegan foto reference (tetapi BUKAN orang di dalamnya) dan meletakkan subjek ANDA ke dalamnya \u2014 mengekalkan identiti, pose dan bingkai subjek, serta memadankan cahaya dan perspektif adegan.",
    wf_exp_master_bgfg_replace: "Penggantian subjek dalam adegan yang paling ketat: membuang orang dari adegan reference sepenuhnya, membina semula latar dan latar depan yang terlindung secara semula jadi, kemudian meletakkan subjek anda tepat di tempat itu \u2014 identiti, pose, perkadaran, gaya rambut, pakaian, kulit dan pencahayaan dikunci dari foto anda, manakala reference hanya membekalkan adegan, sudut kamera dan kedalaman.",
    wf_exp_subject_face: "Menggabungkan subjek atau wajah dari reference ke imej base dengan lancar, sambil mengekalkan komposisi base.",
    wf_exp_retouch: "Memberikan retouch semula jadi pada kulit, rambut dan tona. Identiti, ciri wajah dan ekspresi dikekalkan \u2014 tiada kulit plastik, tiada perubahan wajah.",
    wf_exp_upscale: "Membesarkan imej sambil memulihkan perincian semula jadi pada kulit, rambut dan kain. Identiti, pose, komposisi dan warna kekal sama \u2014 tiada pelicinan plastik.",
    wf_exp_object_edit: "Membuang, mengganti atau menambah objek melalui suntingan setempat yang terkawal. Segala yang anda tidak sentuh kekal sama.",
    wf_exp_water_edit: "Menambah atau menyunting air, pantulan dan permukaan basah supaya kelihatan wajar dari segi fizikal, tanpa mengubah subjek anda.",
    wf_exp_text_logo: "Menambah atau menyunting teks atau logo yang bersih dan mudah dibaca pada imej, sambil mengekalkan komposisi."
  }
};
/*I18N_END*/

/* Supported UI languages. `code` matches an I18N table; `label` is the short chip
   shown in the header picker; `native` is the endonym used in the dropdown. Any
   key missing from a language falls back to English via t(). */
/* v6.10: one version source, painted into the header, plus a once-a-day
   update probe against the site so studios stop running stale builds. The
   probe is fail-silent: offline hosts and blocked networks just skip it. */
const PANEL_VERSION = "6.23.0";
const PANEL_VERSION_URL = "https://hnk-ai-tools-3-s4nnu.ondigitalocean.app/download/panel-version.json";
function panelVerNewer(a, b) {
  const pa = String(a).split(".").map(Number), pb = String(b).split(".").map(Number);
  for (let i = 0; i < 3; i++) { const x = pa[i] || 0, y = pb[i] || 0; if (x !== y) return x > y; }
  return false;
}
function paintPanelVersion(doc) {
  try {
    const el = (doc || document).getElementById("brandVer");
    if (el) el.textContent = "v" + PANEL_VERSION;
  } catch (e) {}
}
let _updChecked = false;
async function checkPanelUpdate(doc) {
  try {
    /* one probe per panel launch — no persistence needed, and a studio that
       leaves Photoshop open for days still gets a fresh probe next launch */
    if (_updChecked) return;
    _updChecked = true;
    const r = await hnkFetch(PANEL_VERSION_URL, { cache: "no-store" }, 15000);
    if (!r.ok) return;
    const j = await r.json();
    if (j && j.v && panelVerNewer(j.v, PANEL_VERSION)) {
      const el = (doc || document).getElementById("brandVer");
      if (el) {
        el.textContent = "v" + PANEL_VERSION + " → v" + j.v + " ရနိုင်ပြီ";
        el.style.color = "#f4d488";
        el.title = "Panel update available — download the new CCX from the HNK site";
      }
    }
  } catch (e) {}
}

/* ==========================================================================
   v6.22.0 — ACCOUNT GATE

   Until this release the panel was the hole in the paywall. The web app has
   been behind a joining fee plus a monthly fee since v5.31.0; anyone who
   found the .ccx got the whole panel free, forever. One HNK account now opens
   BOTH products, and one payment buys the pair — the joining fee and the
   monthly fee are for the web app AND this panel together, not one each.

   SELLING HAPPENS ON THE WEBSITE. The panel never takes money, never shows a
   QR, never uploads a slip. It signs in, reads the plan the website sold, and
   sends people to the buy screen when there is nothing to read. There is one
   price list and it lives in app_settings, which is why no amount is written
   into this file: a number hardcoded here would go stale the day the owner
   changes it in the dashboard.

   WHAT THIS IS, AND WHAT IT IS NOT. This is a client-side check and a .ccx is
   a plain zip: somebody willing to open main.js in a text editor can delete
   it. It is exactly as strong as the web app's access wall and not one bit
   stronger, and the README says so in those words. What it does buy is real:
   the honest majority is asked to pay, the owner can see which machines run
   the panel, and a lapsed plan stops working by itself instead of needing a
   re-download.

   FAIL-CLOSED. The overlay ships VISIBLE in index.html and JavaScript is what
   takes it down. A parse error, a thrown exception, a missing element -- every
   one of those leaves the panel locked rather than open. The one deliberate
   exception is the offline grace window below.

   The anon key is publishable by design; RLS on every table is the real
   boundary, and this is the same key the web app embeds in a public HTML file.
   ========================================================================== */
const GATE_SB_URL  = "https://vmtwuuybnalefpgvrast.supabase.co";
const GATE_SB_ANON = "sb_publishable_brvtaDa8uJCvlf2P2sTe3A_BZNXhxUJ";
const GATE_BUY_URL = "https://hnk-ai-tools-3-s4nnu.ondigitalocean.app/app/";
/* A studio on location has no internet. Locking the panel the moment a probe
   fails would punish the paying customer for the network, so a plan that was
   confirmed good keeps working offline for this many days -- and never one
   hour past the expiry date it was confirmed with. Two fences; whichever is
   hit first stops the car. */
const GATE_GRACE_DAYS = 7;
const GATE_TIMEOUT = 20000;
const GATE_DAY = 86400000;

const gateS = { sess: null, prof: null, seenAt: 0, devId: "", busy: false, view: "", run: 0 };

/* Every gateCheck takes a ticket. It is reachable from boot, from the Retry
   button and from sign-in, each of which awaits two network round trips, and a
   measured failure had two runs interleaving: a slow boot check for the
   account already on disk finished AFTER a different account had signed in,
   and quietly restored the first account's session over the second's. A run
   whose ticket is no longer the current one writes nothing and paints
   nothing. */
function gateStale(ticket) { return ticket !== gateS.run; }

function gateEl(id) { try { return document.getElementById(id); } catch (e) { return null; } }
function gateTxt(id, s) { const el = gateEl(id); if (el) el.textContent = s || ""; }
function gateT(k) { try { return t(k); } catch (e) { return k; } }
function gateErr(s) { gateTxt("gateErr", s); }

function gateHeaders(tok, json) {
  const h = { "apikey": GATE_SB_ANON, "Authorization": "Bearer " + (tok || GATE_SB_ANON) };
  if (json) h["Content-Type"] = "application/json";
  return h;
}
/* hnkFetch already carries the AbortController timeout and the single retry on
   a 5xx or a dropped connection, and it throws HNKERR:err_net: when the network
   is genuinely gone -- which is exactly the signal the offline path needs. */
async function gateReq(path, opts, tok) {
  const o = Object.assign({}, opts || {});
  o.headers = Object.assign({}, gateHeaders(tok, !!o.body), o.headers || {});
  return await hnkFetch(GATE_SB_URL + path, o, GATE_TIMEOUT);
}

function gateUuid() {
  let s = "";
  for (let i = 0; i < 32; i++) s += "0123456789abcdef".charAt(Math.floor(Math.random() * 16));
  return s.slice(0, 8) + "-" + s.slice(8, 12) + "-4" + s.slice(13, 16) +
         "-a" + s.slice(17, 20) + "-" + s.slice(20, 32);
}
function gateDevLabel() {
  let plat = "";
  try { plat = (typeof navigator !== "undefined" && navigator.platform) ? String(navigator.platform) : ""; }
  catch (e) { }
  return ("Photoshop panel" + (plat ? " · " + plat : "")).slice(0, 60);
}

/* Only the refresh token is persisted. The access token is short-lived and
   re-minted at every launch, so writing it to disk would buy nothing and
   leave one more credential lying in the data folder. */
function gateSaveSess(j) {
  if (!j || !j.access_token) return false;
  const u = (j.user && typeof j.user === "object") ? j.user : j;
  const uid = (u && u.id) || (gateS.sess && gateS.sess.uid) || "";
  if (!uid) return false;
  gateS.sess = {
    access: j.access_token,
    refresh: j.refresh_token || (gateS.sess && gateS.sess.refresh) || "",
    uid: uid,
    email: (u && u.email) || (gateS.sess && gateS.sess.email) || ""
  };
  state.accRefresh = gateS.sess.refresh;
  state.accUid = gateS.sess.uid;
  state.accEmail = gateS.sess.email;
  saveSettings();
  return true;
}
function gateForget() {
  gateS.sess = null; gateS.prof = null; gateS.seenAt = 0;
  gatePaintPlan();                 /* the header chip is about a plan we no longer have */
  state.accRefresh = ""; state.accUid = ""; state.accEmail = "";
  state.accProfile = null; state.accSeenAt = 0;
  saveSettings();
}

/* true | "dead" (a real non-2xx answer) | "offline" (threw -- keep the session).
   Getting this backwards signs out every customer who opens Photoshop on a
   train, which is the same mistake the web app documents at accRefreshOnce. */
async function gateRefresh(ticket) {
  if (!gateS.sess || !gateS.sess.refresh) return "dead";
  try {
    const r = await gateReq("/auth/v1/token?grant_type=refresh_token",
      { method: "POST", body: JSON.stringify({ refresh_token: gateS.sess.refresh }) }, null);
    /* the answer to a question nobody is waiting for is not written to disk */
    if (ticket !== undefined && gateStale(ticket)) return "stale";
    if (r.ok) {
      const j = await r.json();
      return gateSaveSess(j) ? true : "dead";
    }
    /* Only the auth service SAYING NO is a dead session, and it says no with a
       credential verdict. EVERYTHING ELSE is something between here and GoTrue
       failing to answer -- a Cloudflare 502/503/504, a GoTrue 429 rate limit,
       a proxy 407, a captive portal's 511 -- and answering those with
       gateForget() wipes a paying customer's refresh token and their entire
       offline cache because the venue wifi had a bad minute, leaving a machine
       that may have no keyboard-typed password to get back in with.

       Listed as a whitelist, not a blacklist, on purpose: the first fix here
       enumerated the failure statuses (>=500, 429, 408) and still destroyed
       the session on 407 and 511, because a blacklist is only ever as complete
       as the last outage somebody thought of. */
    if (r.status === 400 || r.status === 401 || r.status === 403 || r.status === 422) return "dead";
    return "offline";
  } catch (e) { return "offline"; }
}

/* Three outcomes, and the difference between them is the whole point:

     dead      the session is gone (401, after a refresh that just succeeded)
     offline   the server did not ANSWER -- unreachable, or any non-2xx that
               is not a 401. Routing a 500 here rather than shrugging matters:
               the first version of this fell through to the cached profile on
               a 5xx, so a server erroring forever granted PERMANENT access off
               a stale cache, outside the grace window and outside every time
               bound in this file. Now it gets the bounded window like any
               other outage.
     answered  a real 200. `prof` may be null, and null is a definitive "there
               is no such profile" -- which must CLEAR the cache, not leave the
               last good one standing. */
async function gateLoadProfile() {
  const path = "/rest/v1/profiles?select=*&id=eq." + encodeURIComponent(gateS.sess.uid) + "&limit=1";
  try {
    const r = await gateReq(path, { method: "GET" }, gateS.sess.access);
    if (r.status === 401) return { dead: true };
    if (!r.ok) return { offline: true };
    const rows = await r.json();
    return { answered: true, prof: (rows && rows[0]) || null };
  } catch (e) { return { offline: true }; }
}

/* Mirrors the web app's isPremium() field for field. BOTH fields, because the
   server extends plan_expires_at on approval but never sweeps plan_status back
   to "none" when a plan lapses -- a status-only check grants Premium forever. */
function gatePremium(p) {
  if (!p) return false;
  if (p.plan_status !== "active") return false;
  if (!p.plan_expires_at) return false;
  const exp = Date.parse(p.plan_expires_at);
  if (isNaN(exp)) return false;
  return exp > Date.now();
}
function gateDaysLeft(p) {
  if (!p || !p.plan_expires_at) return 0;
  const ms = Date.parse(p.plan_expires_at) - Date.now();
  if (isNaN(ms)) return 0;
  return Math.max(0, Math.ceil(ms / GATE_DAY));
}
function gateGraceLeft() {
  if (!gateS.seenAt) return 0;
  const used = Math.max(0, Date.now() - gateS.seenAt);
  return Math.max(0, Math.ceil((GATE_GRACE_DAYS * GATE_DAY - used) / GATE_DAY));
}
function gateGraceOk() {
  if (!gateS.prof || !gateS.seenAt) return false;
  if (!gatePremium(gateS.prof)) return false;      /* the expiry date still rules */
  return Math.max(0, Date.now() - gateS.seenAt) < GATE_GRACE_DAYS * GATE_DAY;
}

/* ---------------- views ---------------- */
/* Every string on the card, and nothing else. Safe to call at any time. */
function gateTexts() {
  const busy = (gateS.view === "checking");
  gateTxt("gateSub", busy ? gateT("gate_checking")
                   : (gateS.view === "locked") ? "" : gateT("gate_sub_login"));
  gateTxt("gateLockedMsg", gateT("gate_locked"));
  gateTxt("gateSignIn", gateT("gate_signin"));
  gateTxt("gateBuy", gateT("gate_buy"));
  gateTxt("gateRetry", gateT("gate_retry"));
  gateTxt("gateSignOut", gateT("gate_signout"));
  const em = gateEl("gateEmail"), pw = gateEl("gatePass");
  if (em) em.placeholder = gateT("gate_email_ph");
  if (pw) pw.placeholder = gateT("gate_pass_ph");
}
function gateShow(view) {
  gateS.view = view;
  const g = gateEl("hnkGate"); if (g) g.classList.remove("off");
  /* display, driven from JavaScript. The draft this replaces hid .app with a
     CSS rule, `#hnkGate:not(.off) ~ .app{visibility:hidden;pointer-events:none}`,
     and three of its four pieces are things this codebase will not vouch for:
     styles.css's own header says "UXP-SAFE: ... no pointer-events" and
     main.js:11216 repeats it in prose ("UXP has NO pointer-events:none"), while
     `:not()` and the `~` combinator appear zero times in the panel's 860-line
     stylesheet. (visibility itself is fine -- Adobe documents it as supported
     since UXP v3.0 -- but it was carried by a selector that is not.) Chromium,
     which the test drives, supports all four, so the assertions were green for
     a wall that may not have covered anything. display:none set from JS is what
     the other 28 show/hide sites in this file already use. */
  const appEl = gateEl("app"); if (appEl) appEl.style.display = "none";
  const login = gateEl("gateLogin"), locked = gateEl("gateLocked");
  if (login) login.className = (view === "login") ? "" : "gate-hide";
  if (locked) locked.className = (view === "locked") ? "" : "gate-hide";
  gateTexts();
  if (view !== "checking") gateBusy(false);
}
function gateBusy(on) {
  gateS.busy = !!on;
  const mark = function (id, extra) {
    const el = gateEl(id);
    if (!el) return;
    el.disabled = !!on;
    el.className = (on ? "gate-b gate-busy" : "gate-b") + (extra ? " " + extra : "");
  };
  mark("gateSignIn", "");
  mark("gateRetry", "gate-b2");
}
function gateUnlock() {
  const g = gateEl("hnkGate"); if (g) g.classList.add("off");
  const appEl = gateEl("app"); if (appEl) appEl.style.display = "";
  gateS.view = "open";
  gatePaintPlan();
}
/* The header chip. A plan that quietly runs out mid-shoot is the worst way to
   learn about it, so the last week counts down in gold. */
function gatePaintPlan() {
  const el = gateEl("brandPlan"); if (!el) return;
  const d = gateDaysLeft(gateS.prof);
  if (!d) { el.textContent = ""; return; }
  el.textContent = gateT("gate_days").replace("{D}", String(d));
  el.style.color = (d <= 7) ? "#f4d488" : "";
}

/* ---------------- flow ---------------- */
/* Records this machine so the owner can see which installs are running, and
   nothing more. It does NOT gate.

   v6.22.0 shipped a draft that DID refuse on the cap, on the reasoning that a
   panel which shrugged made one account worth unlimited installs. That was
   wrong twice over. The web app has never failed a login on the cap, so the
   panel refusing would punish the same customer differently on two products
   bought with one payment -- while the buy screen this wave added says, in
   every language, "one payment covers both". And allowed_devices defaults to
   2, which a studio spends on a phone and a desktop browser before Photoshop
   is even opened. Whether the panel should consume a paid device slot is a
   pricing decision for the owner to make deliberately, not something to bolt
   on inside a gate. */
async function gateRegisterDevice() {
  try {
    const q = "/rest/v1/devices?select=id,device_id&user_id=eq." + encodeURIComponent(gateS.sess.uid);
    const g = await gateReq(q, { method: "GET" }, gateS.sess.access);
    if (g.ok) {
      const rows = await g.json();
      const list = Array.isArray(rows) ? rows : [];
      for (let i = 0; i < list.length; i++) {
        if (list[i] && list[i].device_id === gateS.devId) return { ok: true };
      }
    }
    await gateReq("/rest/v1/devices", {
      method: "POST", headers: { "Prefer": "return=minimal" },
      body: JSON.stringify({ user_id: gateS.sess.uid, device_id: gateS.devId, label: gateDevLabel() })
    }, gateS.sess.access);
    return { ok: true };
  } catch (e) { return { ok: true, offline: true }; }
}

/* DELIBERATE DIVERGENCE from the web app, which never fails a login on the
   device cap. Here the cap has to bite: allowed_devices is a priced SKU, and a
   panel that shrugged at it would make one account worth unlimited panel
   installs -- the exact hole this release closes. The message names the screen
   that fixes it and the buy button is one tap away. */
async function gateCheck() {
  const ticket = ++gateS.run;
  if (!gateS.sess || !gateS.sess.refresh) { gateShow("login"); return; }
  gateShow("checking");
  gateBusy(true);
  const rf = await gateRefresh(ticket);
  if (gateStale(ticket)) return;
  if (rf === "offline") { gateOffline(); return; }
  if (rf !== true) { gateForget(); gateShow("login"); gateErr(gateT("gate_bad")); return; }

  const res = await gateLoadProfile();
  if (gateStale(ticket)) return;
  if (res.offline) { gateOffline(); return; }
  if (res.dead) { gateForget(); gateShow("login"); return; }

  const prof = res.answered ? res.prof : gateS.prof;
  if (res.answered) {
    gateS.prof = res.prof;
    state.accProfile = res.prof;
  }
  /* The grace stamp is written ONLY by a launch that actually opens the panel.
     An earlier draft stamped it before the remaining checks ran, so a launch
     that was then refused still left a good profile and a fresh timestamp on
     disk -- and the next launch, offline, found them and opened the grace
     window on a machine that had just been turned away. */
  if (!gatePremium(prof)) {
    gateS.seenAt = 0; state.accSeenAt = 0;
    saveSettings();
    gateShow("locked"); gateErr("");
    return;
  }
  gateS.seenAt = Date.now();
  state.accSeenAt = gateS.seenAt;
  saveSettings();
  gateErr("");
  gateUnlock();
  gateRegisterDevice();          /* visibility only; never blocks entry */
}

function gateOffline() {
  if (gateGraceOk()) {
    gateUnlock();
    /* NOT the shared status line. init() writes "ready" into it a moment after
       the gate starts its async work, so a notice put there is erased before
       anybody reads it -- measured, not assumed: the first version of this did
       exactly that and the offline assertion caught it. The header chip belongs
       to the gate and stays put. */
    const el = gateEl("brandPlan");
    if (el) {
      el.textContent = gateT("gate_grace").replace("{D}", String(gateGraceLeft()));
      el.style.color = "#f4d488";
    }
    return;
  }
  gateShow(gateS.sess ? "locked" : "login");
  gateErr(gateT("gate_offline"));
}

async function gateSignIn() {
  if (gateS.busy) return;
  const em = ((gateEl("gateEmail") || {}).value || "").trim();
  const pw = (gateEl("gatePass") || {}).value || "";
  if (!em || !pw) { gateErr(gateT("gate_need")); return; }
  gateBusy(true); gateErr("");
  try {
    const r = await gateReq("/auth/v1/token?grant_type=password",
      { method: "POST", body: JSON.stringify({ email: em, password: pw }) }, null);
    if (!r.ok) { gateErr(gateT("gate_bad")); gateBusy(false); return; }
    const j = await r.json();
    if (!gateSaveSess(j)) { gateErr(gateT("gate_bad")); gateBusy(false); return; }
    const p = gateEl("gatePass"); if (p) p.value = "";
    gateS.run++;                 /* whatever was in flight is about another account */
    await gateCheck();
  } catch (e) {
    gateErr(gateT("gate_offline"));
    gateBusy(false);
  }
}

async function gateOpenSite() {
  try {
    if (shell && shell.openExternal) { await shell.openExternal(GATE_BUY_URL); return; }
  } catch (e) { }
  try {
    if (typeof require === "function") {
      const u = require("uxp");
      if (u && u.shell && u.shell.openExternal) { await u.shell.openExternal(GATE_BUY_URL); return; }
    }
  } catch (e) { }
  /* Last resort: the address itself, on screen, and in the clipboard if the
     host allows it. Telling somebody "could not open the browser" and nothing
     else leaves them stuck on the one screen that has no way forward. */
  /* navigator.clipboard, exactly as copyLog and the library path-copy in this
     same file already do it. require("uxp").clipboard is not a thing -- the
     uxp module has no clipboard export, so the draft that reached for it threw
     and swallowed, leaving the locked screen's last way out doing nothing. */
  try {
    if (navigator.clipboard && navigator.clipboard.writeText) await navigator.clipboard.writeText(GATE_BUY_URL);
    else if (navigator.clipboard && navigator.clipboard.setContent) await navigator.clipboard.setContent({ "text/plain": GATE_BUY_URL });
  } catch (e) { }
  gateErr(gateT("gate_open_fail").replace("{U}", GATE_BUY_URL));
}

function gateWire() {
  const on = function (id, fn) {
    const el = gateEl(id);
    if (el && el.addEventListener) el.addEventListener("click", fn);
  };
  on("gateSignIn", function () { gateSignIn(); });
  on("gateRetry", function () { if (!gateS.busy) gateCheck(); });
  on("gateBuy", function () { gateOpenSite(); });
  on("gateSignOut", function () { gateForget(); gateShow("login"); gateErr(""); });
  const pw = gateEl("gatePass");
  if (pw && pw.addEventListener) {
    pw.addEventListener("keydown", function (ev) {
      if (ev && (ev.key === "Enter" || ev.keyCode === 13)) { ev.preventDefault(); gateSignIn(); }
    });
  }
  /* The language picker lives in the header, which is behind this overlay. A
     first-run Burmese or Shan customer would otherwise have to read an English
     login screen to reach the control that makes it Burmese. */
  const sl = gateEl("gateLang");
  if (sl) {
    /* fillSelect, not innerHTML and not a hand-rolled loop: it is this panel's
       own helper and it sets BOTH o.text and o.textContent, which is a UXP
       workaround the rest of the file has needed since v1. */
    try {
      fillSelect(sl, LANGS.map(function (l) { return { v: l.code, label: l.native }; }));
      sl.value = state.lang;
    } catch (e) { }
    if (sl.addEventListener) sl.addEventListener("change", function () {
      state.lang = (LANG_CODES.indexOf(sl.value) >= 0) ? sl.value : "en";
      saveSettings();
      try { applyI18n(); } catch (e) { }
      const other = gateEl("selLang"); if (other) other.value = state.lang;
      /* gateTexts, NOT gateShow: gateShow(view) also clears the busy flag, and
         the one moment this handler is reachable mid-flight is while a check is
         running -- so re-rendering through gateShow re-enabled Sign In under a
         check already in progress, and a second run could finish against the
         first one's session. Only the strings change here. */
      gateTexts();
    });
  }
}

async function gateBoot() {
  try {
    gateS.devId = state.accDevId || "";
    if (!gateS.devId) { gateS.devId = gateUuid(); state.accDevId = gateS.devId; saveSettings(); }
    gateS.prof = state.accProfile || null;
    gateS.seenAt = +state.accSeenAt || 0;
    if (state.accRefresh && state.accUid) {
      gateS.sess = { access: "", refresh: state.accRefresh, uid: state.accUid,
                     email: state.accEmail || "" };
    }
    gateWire();
    gateShow(gateS.sess ? "checking" : "login");
    await gateCheck();
  } catch (e) {
    herr("gate:", e);
    try { gateShow("login"); } catch (e2) { }
  }
}

const LANGS = [
  { code: "en", label: "EN", native: "English" },
  { code: "my", label: "MY", native: "မြန်မာ" },
  { code: "shn", label: "SHN", native: "တႆး" },
  { code: "kac", label: "KAC", native: "Jinghpaw" },
  { code: "th", label: "TH", native: "ไทย" },
  { code: "zh", label: "ZH", native: "中文" },
  { code: "vi", label: "VI", native: "Tiếng Việt" },
  { code: "id", label: "ID", native: "Indonesia" },
  { code: "ms", label: "MS", native: "Melayu" },
  /* v6.11 — Myanmar ethnic languages (Burmese-script fallback UI; no
     machine-guessed native text until reviewed packs land) */
  { code: "mnw", label: "MNW", native: "မွန်" },
  { code: "rki", label: "RKI", native: "ရခိုင်" },
  { code: "ksw", label: "KSW", native: "ကညီ (ကရင်)" },
  { code: "kyu", label: "KYU", native: "ကယား" },
  { code: "cnh", label: "CNH", native: "ချင်း (Laiholh)" },
  { code: "blk", label: "BLK", native: "ပအိုဝ်" },
  { code: "pll", label: "PLL", native: "တအာင်း (ပလောင်)" },
  { code: "khb", label: "KHB", native: "တႆးလိုဝ်ႉ" },
  { code: "ahk", label: "AHK", native: "အာခါ (Akha)" },
  { code: "lhu", label: "LHU", native: "လားဟူ (Lahu)" },
  { code: "lis", label: "LIS", native: "လီဆူ (Lisu)" },
  /* v6.11 — India family (native starter packs + English fallback) */
  { code: "hi", label: "HI", native: "हिन्दी" },
  { code: "bn", label: "BN", native: "বাংলা" },
  { code: "ta", label: "TA", native: "தமிழ்" },
  { code: "te", label: "TE", native: "తెలుగు" },
  { code: "mr", label: "MR", native: "मराठी" },
  { code: "gu", label: "GU", native: "ગુજરાતી" },
  { code: "kn", label: "KN", native: "ಕನ್ನಡ" },
  { code: "ml", label: "ML", native: "മലയാളം" },
  { code: "pa", label: "PA", native: "ਪੰਜਾਬੀ" },
  { code: "ur", label: "UR", native: "اردو" },
  /* v6.11 — Asia set (native starter packs; Lao falls back to Thai) */
  { code: "ne", label: "NE", native: "नेपाली" },
  { code: "lo", label: "LO", native: "ລາວ" },
  { code: "km", label: "KM", native: "ខ្មែរ" },
  { code: "ja", label: "JA", native: "日本語" },
  { code: "ko", label: "KO", native: "한국어" }
];
const LANG_CODES = LANGS.map(function (l) { return l.code; });
/* Which full I18N table an extended code reads when its starter pack misses:
   Myanmar ethnic -> Burmese, Tai Lue -> Shan, Lao -> Thai (closest readable),
   everything else -> English. */
const LANG_FB = { kyu: "my", ksw: "my", cnh: "my", mnw: "my", rki: "my", ahk: "my", lhu: "my", lis: "my", blk: "my", pll: "my", khb: "shn",
  hi: "en", bn: "en", ta: "en", te: "en", mr: "en", gu: "en", kn: "en", ml: "en", pa: "en", ur: "en",
  ne: "en", lo: "th", km: "en", ja: "en", ko: "en" };
/* v6.11 — native STARTER PACKS: the short, always-on-screen chrome (tabs,
   GENERATE, key statuses, common buttons) in each language's own script.
   Long-form text falls through LANG_FB. Same honest posture as the web app:
   Myanmar ethnic languages ship no guessed text. */
const I18N_L = {
bn:{app_title:"HNK Photoshop Ai Panel (শিক্ষার্থীদের জন্য)",sec_api:"Gemini API Key",btn_show:"দেখান",btn_hide:"লুকান",btn_test:"Key পরীক্ষা",btn_save:"সংরক্ষণ",st_testing:"কী পরীক্ষা করা হচ্ছে",st_key_ok:"✓ API key কাজ করছে",st_key_bad:"API key কাজ করেনি",st_key_saved:"API key সংরক্ষিত হয়েছে ✓",st_need_key:"আগে Gemini API key দিন",sec_model:"মডেল ও আউটপুট",scope_model_note:"নিচের প্রম্পট ট্যাবের জেনারেট বোতামে এটি ব্যবহৃত হয় — Create এবং AI Tools-এর প্রতিটির নিজস্ব আলাদা মডেল সেটিংস আছে।",model_auto:"অটো (প্রস্তাবিত)",model_flash:"Flash — দ্রুত (2.5)",model_pro:"Pro — উন্নত মান (3.0)",lbl_ratio:"অনুপাত",ratio_auto:"অটো অনুপাত (ডকুমেন্ট থেকে)",lbl_size:"আকার",lbl_quality:"মান",qual_auto:"অটো",qual_low:"নিম্ন",qual_med:"মাঝারি",qual_high:"উচ্চ",sec_prompt:"প্রম্পট",hint_prompt:"এখানে আপনার প্রম্পট লিখুন… (সর্বোচ্চ 20,000 অক্ষর)",btn_improve:"Prompt উন্নত করুন",btn_clear:"মুছুন",st_improving:"প্রম্পট উন্নত করা হচ্ছে",st_improved:"প্রম্পট উন্নত হয়েছে ✓",sec_refs:"রেফারেন্স ছবি (2টি স্লট)",base_note:"বেস ছবি = আপনার সক্রিয় Photoshop ডকুমেন্ট (স্বয়ংক্রিয়ভাবে নেওয়া হয়)।",btn_ref_layer:"+ লেয়ার",btn_ref_file:"ফাইল",btn_ref_web:"ওয়েব",st_ref_layer_added:"লেয়ার রেফারেন্স হিসেবে যোগ হয়েছে ✓",st_ref_file_added:"ফাইল রেফারেন্স হিসেবে যোগ হয়েছে ✓",st_importing:"ফাইল ইমপোর্ট হচ্ছে",url_title:"URL থেকে রেফারেন্স — Chrome / Pinterest",url_ph:"https://… ছবির ঠিকানা বা Pinterest পিন লিংক",btn_paste:"পেস্ট",btn_load:"লোড",btn_cancel:"বাতিল",st_url_loading:"ওয়েব ছবি ডাউনলোড হচ্ছে",st_ref_web_added:"ওয়েব ছবি রেফারেন্স হিসেবে যোগ হয়েছে ✓",st_url_bad:"এই URL থেকে ছবি লোড করা যায়নি — ছবির ঠিকানা কপি করে আবার চেষ্টা করুন",no_layer:"কোনো লেয়ার নির্বাচিত নেই",sec_presets:"AI প্রিসেট",auto_run:"প্রিসেটে ক্লিক → অটো জেনারেট (OFF = শুধু প্রম্পটে যোগ হবে)",grp_cleanup:"ক্লিনআপ টুল",p_remove_people:"মানুষ সরান",p_fix_hands:"অতিরিক্ত হাত ঠিক করুন",p_fix_legs:"অতিরিক্ত পা ঠিক করুন",p_full_clean:"সম্পূর্ণ ক্লিনআপ",grp_moved_note:"রেফারেন্স টুলগুলো এখন নিচের Reference Ops Pro কার্ডে আছে (এক জায়গায়, Solo/Couple/Family + গাইডসহ)।",ro_h_detail:"চুল · অ্যাক্সেসরিজ · পোজ (← Ref1)",ro_h_comp:"কম্পোজিট · স্টাইল · টেক্সট (← Ref1)",p_fgbglc:"FG=Doc · BG=Ref1 · Light=Ref2",p_hair:"হেয়ারস্টাইল (← Ref1)",p_access:"গয়না+অ্যাক্সেসরিজ (← Ref1)",p_pose:"পোজ মিলিয়ে নিন (Doc → Ref1)",p_fgprops:"FG প্রপস (← Ref1)",p_textlogo:"টেক্সট / লোগো (← Ref1)",p_style:"ফটো স্টাইল (← Ref1)",grp_repsubj:"সাবজেক্ট প্রতিস্থাপন (Doc → Ref1 দৃশ্য)",p_rep_solo:"সোলো প্রতিস্থাপন",p_rep_couple:"কাপল প্রতিস্থাপন",p_rep_family:"পরিবার প্রতিস্থাপন",grp_rmix:"Replace Mix — টিক দিয়ে Ref1 থেকে নিন",rm_bg:"ব্যাকগ্রাউন্ড (BG)",rm_fg:"ফোরগ্রাউন্ড (FG)",rm_light:"লাইটিং",rm_color:"রং",rm_object:"অবজেক্ট / প্রপস",btn_rmix:"রিপ্লেস জেনারেট",rm_none:"আগে অন্তত একটি দিক টিক দিন",grp_i2p:"Image → Prompt (সিন বিল্ডার)",i2p_note:"1) এক্সট্র্যাক্ট: Ref1 দৃশ্য → বিস্তারিত টেক্সট প্রম্পট (মানুষ বাদ)। 2) প্রম্পট পেজে সেটি সম্পাদনা করুন। 3) সিন জেনারেট সেটিকে আপনার ডকুমেন্টের সাবজেক্ট ঘিরে তৈরি করে — যেকোনো অ্যাঙ্গেলে অটো-ফিট হয়। Face/Pose/Frame লক = আসলটা অপরিবর্তিত থাকে।",i2p_objects:"অবজেক্ট ও প্রপসের বিবরণ",i2p_light:"লাইটিংয়ের বিবরণ",i2p_color:"রং / গ্রেডের বিবরণ",i2p_bg:"ব্যাকগ্রাউন্ডের বিবরণ",i2p_fg:"ফোরগ্রাউন্ডের বিবরণ",btn_i2p:"Image → Prompt (সিন এক্সট্র্যাক্ট)",i2p_fit:"সিন অটো-ফিট — ডকুমেন্টের অ্যাঙ্গেল / দূরত্ব / লেন্স অনুযায়ী দৃশ্য পুনর্বিন্যাস",i2p_adapt:"সাবজেক্টের আলো ও রং দৃশ্যের সাথে মানিয়ে নিন",btn_scenegen:"সিন জেনারেট",st_extract:"দৃশ্য থেকে প্রম্পট তৈরি হচ্ছে",st_extract_done:"সিন প্রম্পট প্রস্তুত — প্রম্পট পেজে দেখে নিন",scene_no_prompt:"প্রম্পট বক্স খালি — আগে Image → Prompt চালান",i2p_none:"আগে অন্তত একটি বিবরণের দিক টিক দিন",sec_light:"স্টুডিও লাইটিং — AI রিলাইট",light_note:"লাইটগুলো ON করুন, একটি সারিতে ট্যাপ করে নির্বাচন করুন, স্লাইডার দিয়ে আকার দিন — 3D টপ-ভিউ ডায়াগ্রাম সাথে সাথে বদলায় (▴ = উঁচু, ▾ = নিচু)। লাইটিং জেনারেট আপনার ডকুমেন্টকে ঠিক এই সেটআপ অনুযায়ী রিলাইট করে; মুখ / পোজ / ফ্রেম লক থাকে।",lbl_my_prompt:"মিয়ানমার প্রম্পট",lstage_model:"মডেল",lstage_cam:"ক্যাম",l_key:"কী লাইট",l_fill:"ফিল / ফ্রন্ট",l_butterfly:"বাটারফ্লাই (উপরে-সামনে)",l_side:"সাইড লাইট",l_rim:"রিম লাইট",l_back:"ব্যাক লাইট",l_hair:"হেয়ার লাইট",l_bglight:"ব্যাকগ্রাউন্ড লাইট",lt_softbox:"সফটবক্স",lt_octa:"অক্টা",lt_strip:"স্ট্রিপ",lt_umbrella:"আমব্রেলা",lt_beauty:"বিউটি",lt_hard:"হার্ড",li_int:"তীব্রতা",li_angle:"কোণ",li_height:"উচ্চতা",li_dist:"দূরত্ব",li_size:"আকার",btn_lightgen:"লাইটিং জেনারেট",light_none:"আগে অন্তত একটি লাইট ON করুন",lg_equip:"ছবিতে লাইটের সরঞ্জাম দেখান (সফটবক্স / স্ট্যান্ড দৃশ্যমান)",grp_chains:"স্টাইল চেইন — ✓ স্টাইলগুলো একসাথে মেশান",chains_note:"যেকোনো স্টাইল ON করুন — সেগুলো প্রতিটি জেনারেট / প্রিসেট / রিটাচে একসাথে মিশে যায়।",grp_restore:"পুরনো ছবি পুনরুদ্ধার",p_restore:"পুরনো ছবি পুনরুদ্ধার",rest_color:"সম্পূর্ণ রঙিন",rest_bw:"সাদা-কালো",restore_note:"ছেঁড়া, পানি / পোড়া দাগ ও বিবর্ণতা মেরামত করে — প্রতিটি আসল মুখ 100% অবিকল থাকে।",rt_browstyle:"ভ্রুর স্টাইল",rt_lashstyle:"আইল্যাশ স্টাইল",rt_blush:"ব্লাশের রং",rt_contour:"কনট্যুর স্টাইল",rt_bust:"বাস্ট",rt_butt:"নিতম্ব",rt_thigh:"ঊরু",rt_calf:"কাফ",rt_neck:"ঘাড়",rt_fingers:"আঙুল",hint_prompt_my:"မြန်မာလို ရေးပါ — Generate မှာ English အလိုပြောင်းပေးမယ် (အများဆုံး 20,000)",st_translate:"মিয়ানমার প্রম্পট ইংরেজিতে অনুবাদ হচ্ছে",live_trans:"লাইভ ⇄ স্বয়ংক্রিয় অনুবাদ (EN ↔ MY, টাইপ থামানোর পরে)",st_retry:"আবার চেষ্টা করা হচ্ছে",grp_recipes:"রেসিপি — সেটিংস সংরক্ষণ / শেয়ার",recipe_note:"সবকিছু (চেইন, রিটাচ, লাইট, লক, প্রম্পট) একটি .json রেসিপি হিসেবে সংরক্ষণ করুন — শিক্ষার্থীরা শুধু লোড করলেই হবে।",btn_recipe_save:"রেসিপি সংরক্ষণ",btn_recipe_load:"রেসিপি লোড",st_recipe_saved:"রেসিপি সংরক্ষিত ✓",st_recipe_loaded:"রেসিপি লোড হয়েছে ✓ — সব কন্ট্রোল আপডেট হয়েছে",st_recipe_bad:"এটি HNK রেসিপি ফাইল নয়",sec_final:"চূড়ান্ত প্রম্পট (AI-এ পাঠানো হয়)",btn_copy:"কপি",st_copied:"কপি হয়েছে ✓",hist_note:"ইতিহাস — শেষ 6টি ফলাফল, দেখতে ট্যাপ করুন:",btn_hist_prompt:"→ প্রম্পট",sec_batch:"ব্যাচ মোড",batch_note:"একাধিক ছবি + একটি আউটপুট ফোল্ডার বেছে নিন — বর্তমান প্রম্পট, চেইন, ক্লিনআপ ও Keep লক প্রতিটি ছবিতে চলবে; ফলাফল *_HNK.png নামে সংরক্ষিত হয়।",btn_batch:"ব্যাচ চালান",btn_batch_stop:"থামান",st_batch:"ব্যাচ",st_batch_done:"ব্যাচ সম্পন্ন",sec_web:"ওয়েব AI — মিনি ব্রাউজার",web_note:"যেকোনো ওয়েব AI এডিটর Photoshop-এর ভেতরেই খুলুন। সেখানে জেনারেট করুন, তারপর ফলাফলটি লেয়ার হিসেবে নিয়ে আসুন:",web_import_note:"ইমপোর্ট: ① ওয়েব অ্যাপে Copy image address ব্যবহার করুন, তারপর 'কপি করা লিংক ইমপোর্ট' চাপুন · ② অথবা ফাইলটি ডাউনলোড করে 'ফাইল ইমপোর্ট' ব্যবহার করুন · ③ HNK ব্রিজযুক্ত পার্টনার ওয়েব অ্যাপ ছবি স্বয়ংক্রিয়ভাবে পাঠায়।",btn_web_go:"যান",btn_web_home:"হোম",btn_web_reload:"রিলোড",btn_web_import_link:"কপি করা লিংক ইমপোর্ট → PS",btn_web_import_file:"ফাইল ইমপোর্ট → PS",st_web_import:"লেয়ার হিসেবে Photoshop-এ ইমপোর্ট হয়েছে ✓",st_web_nourl:"আগে একটি ছবির লিংক কপি করুন (রাইট-ক্লিক → Copy image address)",st_web_fetch:"লিংক থেকে ছবি আনা হচ্ছে",st_web_notallowed:"এই ডোমেইনটি allow-list-এ নেই — ফাঁকা থাকতে পারে। HNK-কে এটি যোগ করতে বলুন।",st_need_doc:"প্রথমে Photoshop-এ একটি ফটো ডকুমেন্ট খুলুন",sec_campro:"ক্যামেরা প্রো ও কোয়ালিটি",autosave_lbl:"প্রতিটি ফলাফল অটো-এক্সপোর্ট (PNG + prompt লগ → ফোল্ডার)",st_folder_ok:"এক্সপোর্ট ফোল্ডার সেট হয়েছে ✓",st_exported:"এক্সপোর্ট হয়েছে ✓",st_export_fail:"এক্সপোর্ট ব্যর্থ — ফোল্ডারটি পরীক্ষা করুন",st_pro_fallback:"Pro মডেল পাওয়া যাচ্ছে না — এই রানের জন্য Flash-এ পরিবর্তন করা হয়েছে",st_img_bad:"ছবির ডেটা ইন্টিগ্রিটি চেক-এ ব্যর্থ — ছবিটি আবার যোগ করুন",st_auto_comp:"অটো কম্পোজিট: IMAGE 1 সাবজেক্ট → রেফারেন্স দৃশ্য",prov_lbl:"AI প্রোভাইডার",oai_key_ph:"sk-... (OpenAI API key)",tab_create:"তৈরি",create_note:"ক্রিয়েট মোড — আপনার prompt থেকে সম্পূর্ণ নতুন ছবি (+ নিজস্ব 4টি রেফ)। পুরোপুরি স্বাধীন: ডকুমেন্ট, প্রিসেট, চেইন বা লক কখনও পড়ে না।",create_ph:"যে ছবিটি তৈরি করতে চান তা বর্ণনা করুন…",btn_create_ps:"⬇ Photoshop-এ পাঠান",btn_to_ref:"↺ Ref 1 হিসেবে ব্যবহার করুন",st_to_ref:"ফলাফল Ref 1-এ লোড হয়েছে ✓",scope_create_note:"Setup-এর Model ও Output থেকে স্বাধীন — এই সেটিংগুলি শুধু Create-এর Generate-এ প্রযোজ্য।",cr_ratio:"অনুপাত",cr_var:"ভ্যারিয়েশন",cr_restyle:"♻ ফলাফল রিস্টাইল করুন",cr_lib:"Prompt লাইব্রেরি — ঢোকাতে ট্যাপ করুন",cr_improve:"উন্নত করুন",cr_describe:"Ref 1 বর্ণনা → Prompt",st_describing:"রেফারেন্স পড়া হচ্ছে…",st_described:"Ref 1 থেকে prompt লেখা হয়েছে ✓",st_need_gem:"একটি Gemini API key যোগ করুন (Setup) — এটি Gemini টেক্সট ব্যবহার করে",st_need_ref1:"প্রথমে Ref 1-এ একটি ছবি যোগ করুন",st_lib_added:"Prompt যোগ হয়েছে ✓",cr_refs:"রেফারেন্স ছবি (সর্বোচ্চ 4টি)",cr_refs_note:"ঐচ্ছিক — Layer / File / Web দিয়ে যোগ করুন। আপনার prompt যা চায়, Create শুধু সেটুকুই নেয়।",cr_results:"ফলাফল",cr_gal_empty:"এখনও কোনো ফলাফল নেই — Generate ট্যাপ করুন।",cr_gal_have:"টি ফলাফল · প্রিভিউ / কাজ করতে থাম্বনেইলে ট্যাপ করুন",cr_save:"⬇ PNG সংরক্ষণ করুন",cr_engine:"ইঞ্জিন",cr_need_result:"প্রথমে একটি ছবি জেনারেট করুন",btn_web_import_url:"⬇ URL ইমপোর্ট করুন",st_clip_help:"ক্লিপবোর্ড ফাঁকা/ব্লক করা — লিংকটি URL বারে পেস্ট করুন, তারপর ⬇ Import URL ট্যাপ করুন",st_web_blob:"এটি একটি অস্থায়ী blob: লিংক — রাইট-ক্লিক → Copy IMAGE Address ব্যবহার করুন, অথবা ফাইলটি সংরক্ষণ করে Import File ব্যবহার করুন",err_key:"API key অবৈধ — Setup ট্যাবে key আবার পরীক্ষা করুন · API key မှားနေ — Setup မှာ ပြန်စစ်ပါ",err_quota:"কোটা / রেট লিমিট — একটু অপেক্ষা করে আবার চেষ্টা করুন · Quota ပြည့်/နှုန်းကန့် — ခဏနေပြန်စမ်းပါ",err_big:"ছবিটি API-এর জন্য খুব বড় — ছোট করে আবার চেষ্টা করুন · ပုံကြီးလွန်း — ချုံ့ပြီးပြန်စမ်းပါ",err_safety:"সেফটি ফিল্টার আটকে দিয়েছে — prompt বা ছবিটি বদলে আবার চেষ্টা করুন · Safety ငြင်း — prompt/ပုံ ပြင်ပြီးပြန်စမ်းပါ",err_net:"নেটওয়ার্ক / সার্ভার সমস্যা — অনুগ্রহ করে আবার চেষ্টা করুন · ကွန်ရက်/ဆာဗာပြစနာ — ပြန်စမ်းပါ",err_timeout:"অনুরোধের সময় শেষ — সার্ভার খুব বেশি সময় নিয়েছে; আবার চেষ্টা করুন · အချိန်ပြည့် — ပြန်စမ်းပါ",err_generic:"অনুরোধটি সম্পন্ন করা যায়নি — অনুগ্রহ করে আবার চেষ্টা করুন",err_img:"কোনো ব্যবহারযোগ্য ছবি তৈরি হয়নি — অনুগ্রহ করে আবার চেষ্টা করুন",err_mode:"এই ডকুমেন্টটি RGB মোডে নেই — প্রথমে রূপান্তর করুন (Image ▸ Mode ▸ RGB Color), তারপর আবার চেষ্টা করুন",cam_master:"ক্যামেরা ব্লক ON — প্রতিটি prompt-এর শেষে যোগ হবে",cam_body:"ক্যামেরা বডি",cam_lens:"প্রাইম লেন্স (mm)",cam_f:"অ্যাপারচার",cam_film:"ফিল্ম লুক",cam_bokeh:"বোকেহ স্টাইল",cam_iso:"ISO",cam_k:"WB কেলভিন",cam_note:"ব্লকটি ON করুন, তারপর যা দরকার শুধু সেটুকু বাছুন — – চিপগুলি নীরব থাকে। সবকিছু চূড়ান্ত prompt-এর শেষে যুক্ত হয়।",ro_h_main:"রেফারেন্স অপস প্রো (Ref1 / Ref2)",ro_note:"Ref1 = IMAGE 2 (নারী) · Ref2 = IMAGE 3 (পুরুষ)। একটি টার্গেট বেছে নিয়ে একটি অপ চালান — মিল না-থাকা ব্যক্তিরা কখনও বদলায় না।",ro_target:"টার্গেট:",ro_solo:"একক",ro_couple:"যুগল",ro_family:"পরিবার",ro_mk:"রেফ-এর মেকআপ কপি করুন",ro_hair:"রেফ-এর হেয়ারস্টাইল নিন",ro_h_face:"ফেস অপস",ro_h_bg:"BG / FG অপস",ro_h_sub:"সাবজেক্ট অপস",ro_h_lc:"আলো ও রং অপস",ro_h_dress:"পোশাক অপস",ro_h_mk:"মেকআপ অপস",ro_h_match:"★ মাস্টার ম্যাচ (এক লুক)",ro_match_note:"IMAGE 1-কে রেফারেন্সের সাথে মেলান, যাতে দুটোই এক সম্পাদনার মতো দেখায় — কী মেলাতে হবে টিক দিন:",m_color:"রং",m_light:"আলো",m_makeup:"মেকআপ",m_skin:"স্কিন রিটাচ",crd_pipe:"⛓ পাইপলাইন বিল্ডার — যেকোনো কিছু চেইন করুন",pipe_note:"যেকোনো ধাপ একটি চেইনে যুক্ত করুন — প্রতিটি ধাপের ফলাফল পরের ধাপে যায়। সর্বোচ্চ 6।",pipe_add:"+ যোগ করুন",pipe_run:"▶ পাইপলাইন চালান",pipe_clear:"মুছুন",pipe_retouch:"রিটাচ প্রয়োগ (বর্তমান স্লাইডার)",pipe_relight:"রিলাইট (বর্তমান লাইট রিগ)",pipe_prompt:"Prompt (বর্তমান EN বক্স)",pipe_empty:"প্রথমে অন্তত একটি ধাপ যোগ করুন",pipe_max:"পাইপলাইন পূর্ণ (সর্বোচ্চ 6 ধাপ)",st_pipe:"পাইপলাইন ধাপ",st_pipe_done:"পাইপলাইন সম্পন্ন",st_pipe_stop:"পাইপলাইন থেমে গেছে (একটি ধাপ ব্যর্থ হয়েছে)",pipe_merge:"⚡ ওয়ান-শট মার্জ — সব ধাপ একটিমাত্র কলে (দ্রুত/সাশ্রয়ী · সেরা ≤ 3 কাজ)",crd_chainsrest:"স্টাইল চেইন + পুরোনো ছবি পুনরুদ্ধার",crd_refops:"রেফারেন্স অপস প্রো (Ref1 / Ref2)",crd_scenes:"🎬 সিন প্রো — সাবজেক্ট লক · দৃশ্য মিলে যায়",scn_note:"আপনার সাবজেক্ট লক করুন (মুখ · ভঙ্গি · পোশাক · ফ্রেম) — পুরো দৃশ্য তাদের সাথে মিলিয়ে নতুন করে তৈরি হয়; আলো, ছায়া, রং, ব্যাকগ্রাউন্ড, ফোরগ্রাউন্ড ও বস্তু সবই আসল ছবির মতো লুকের জন্য স্বয়ংক্রিয়ভাবে মানিয়ে নেয়।",scn_h_style:"দৃশ্যের স্টাইল (ইনডোর / সাংস্কৃতিক)",scn_h_bday:"🎂 জন্মদিন — বয়সের সংখ্যা 1–45",scn_h_cap:"ক্যাপশন / টেক্সট (শিশু · Miss Universe · জন্মদিন)",scn_h_scarf:"আউটডোর / উড়ন্ত স্কার্ফ",scn_grad:"গ্র্যাজুয়েশন ইনডোর",scn_prewed:"প্রি-ওয়েডিং ইনডোর",scn_vietnam:"ভিয়েতনাম",scn_myanmar:"মিয়ানমার",scn_chinese:"চীনা",scn_shan:"শান",scn_newborn:"নবজাতক / শিশু",scn_age:"বয়স",scn_bday_go:"🎂 জন্মদিনের দৃশ্য",scn_cap_on:"ক্যাপশন টেক্সট যোগ করুন",scn_cap_ph:"ক্যাপশন টেক্সট (যেমন Happy 1st Birthday, নাম)…",scn_cap_pos:"অবস্থান",scn_top:"উপরে",scn_bottom:"নিচে",scn_scarf:"✦ উড়ন্ত স্কার্ফ দৃশ্য",scn_dir:"দিক",scn_left:"বাম",scn_right:"ডান",scn_up:"উপর",scn_len:"দৈর্ঘ্য",scn_short:"ছোট",scn_long:"লম্বা",g_cat_scene:"সিন অপ — আপনার সাবজেক্ট লক থাকে (মুখ · ভঙ্গি · পোশাক · ফ্রেম); জেনারেট হওয়া পুরো দৃশ্য (আলো, ছায়া, রং, ব্যাকগ্রাউন্ড, ফোরগ্রাউন্ড, বস্তু, আবহ) আসল ছবির মতো কম্পোজিটের জন্য সাবজেক্টের সাথে স্বয়ংক্রিয়ভাবে মেলানো হয়।",crd_wed:"♥ ওয়েডিং প্রো স্যুট",crd_recipes:"রেসিপি — সংরক্ষণ / শেয়ার",learn_lbl:"🎓 লার্ন মোড — প্রথম ট্যাপ = গাইড (হলুদ), দ্বিতীয় = prompt (নীল), তৃতীয় = রান (সবুজ)",guide_hint:"আবার ট্যাপ করুন: হলুদ → নীল (prompt) → সবুজ (রান) ▶",g_learn_next_prompt:"আবার ট্যাপ করুন → হুবহু PROMPT দেখায় (নীল)।",g_learn_prompt_head:"এই বোতামটি যে PROMPT পাঠাবে (আবার ট্যাপ = রান):",g_learn_next_run:"আরেকবার ট্যাপ করুন → রান (সবুজ) জেনারেট করে।",st_prompt_ready:"Prompt প্রস্তুত — চালাতে আবার ট্যাপ করুন (সবুজ) ✓",g_step_doc:"প্রথমে Photoshop-এ আপনার ফটো ডকুমেন্ট খুলুন।",g_step_ref1:"রেফারেন্স ছবিটি Ref1-এ লোড করুন (এটি IMAGE 2 হয়ে যায়)। দ্বিতীয় ব্যক্তির জন্য Ref2 যোগ করুন।",g_step_target:"টার্গেট বাছুন: একক / যুগল (Ref1 = নারী, Ref2 = পুরুষ) / পরিবার।",g_step_mkhair:"ঐচ্ছিক: ফেস অপস-এর উপরে ‘রেফ-এর মেকআপ কপি করুন’ / ‘রেফ-এর হেয়ারস্টাইল নিন’ টিক দিন।",g_step_petal:"প্রথমে পাপড়ির রং বাছুন (auto = আপনার দৃশ্যের সাথে মেলে)।",g_step_rest:"উপরের ✓ দিয়ে ফুল কালার বা সাদা-কালো বেছে নিন।",g_step_int:"পছন্দমতো ইনটেনসিটি স্লাইডার সেট করুন।",g_step_confirm:"এগোতে আবার ট্যাপ করুন: গাইড (হলুদ) → PROMPT (নীল) → রান (সবুজ জেনারেট করে)।",g_cat_face:"ফেস অপ — রেফারেন্সের মুখ মিল-থাকা ব্যক্তির উপর স্থানান্তর করে; বাকি সবাই অপরিবর্তিত থাকে।",g_cat_sub:"সাবজেক্ট অপ — রেফারেন্সের ব্যক্তিকে আপনার দৃশ্যে আনে/রূপান্তর করে; দৃশ্য ও ফ্রেমিং অপরিবর্তিত থাকে।",g_cat_bgfg:"BG/FG অপ — রেফারেন্স ব্যবহার করে শুধু ব্যাকগ্রাউন্ড / ফোরগ্রাউন্ড বদলায়।",g_cat_lc:"আলো ও রং অপ — রেফারেন্সের লাইটিং ও গ্রেড কপি করে; মানুষজন পিক্সেল-নিখুঁত থাকে।",g_cat_dress:"পোশাক অপ — রেফারেন্স ব্যবহার করে শুধু পোশাক বদলায়।",g_cat_mkop:"মেকআপ অপ — রেফারেন্স ব্যবহার করে শুধু মেকআপ বদলায়।",g_cat_match:"মাস্টার ম্যাচ — আপনার ছবিকে রেফারেন্সের সম্পূর্ণ লুকের সাথে মেলায় (উপরের স্তরগুলিতে টিক দিন)।",g_cat_trail:"ওয়েডিং ট্রেইল — বিলাসবহুল ঘাস + প্রবাহিত ফুলের পথ; মুখ/ভঙ্গি/ফ্রেম সম্পূর্ণ লক থাকে।",g_cat_veil:"উড়ন্ত ভেইল — এই দৈর্ঘ্যে বাতাসে-ওড়া ভেইল যোগ/প্রসারিত করে; মুখ কখনও ঢাকা পড়ে না।",g_cat_gown:"গাউন — বর্তমান গাউনটি পরিষ্কার করে (ডিজাইন অপরিবর্তিত) এবং এই ট্রেন-দৈর্ঘ্য সেট করে।",g_cat_petal:"উড়ন্ত পাপড়ি — এই স্টাইলে বাতাসে পাপড়ি যোগ করে; রং উপরের সোয়াচ থেকে।",g_cat_wedx:"ওয়েডিং এক্সট্রা — আপনার দৃশ্যের সাথে মিলিয়ে এই উপাদান যোগ করে; সাবজেক্ট লক থাকে।",g_cat_canvas:"রিপ্লেস (ক্যানভাস) — আপনার সাবজেক্টকে রেফারেন্সের দৃশ্যে বসায়; রেফ-এর মানুষজন সরিয়ে দেওয়া হয়।",g_cat_restore:"পুরোনো ছবি পুনরুদ্ধার — ক্ষতি মেরামত করে; প্রতিটি মূল মুখ 100% অবিকল থাকে।",g_cat_generic:"প্রিসেট — আপনার ছবিতে এই পেশাদার সম্পাদনা প্রয়োগ করে।",g_gen:"জেনারেট — আপনার ডকুমেন্টে prompt বক্স (+ চেইন, কিপ, ক্যামেরা ব্লক) চালায়।",g_retouchbtn:"রিটাচ প্রয়োগ — আপনার সব স্লাইডার সেটিং এক পেশাদার রিটাচ পাস হিসেবে চালায়।",g_relightbtn:"লাইটিং জেনারেট — আপনার 3D লাইট ডায়াগ্রাম অনুযায়ী ছবিটি হুবহু রিলাইট করে।",g_scene:"সিন জেনারেট — এক্সট্র্যাক্ট করা prompt থেকে দৃশ্য নতুন করে তৈরি করে; সাবজেক্ট অপরিবর্তিত থাকে।",g_rmix:"রিপ্লেস মিক্স — রেফারেন্স থেকে শুধু ✓ টিক দেওয়া অংশগুলি প্রতিস্থাপন করে।",g_pipe:"পাইপলাইন চালান — চেইন করা প্রতিটি ধাপ ক্রমানুসারে চালায়; প্রতিটি ফলাফল পরের ধাপে যায়।",ro_faceRep:"ফেস রিপ্লেস",ro_faceSwap:"ফেস সোয়াপ",ro_bgRep:"BG রিপ্লেস",ro_bgSwap:"BG সোয়াপ",ro_fgRep:"FG রিপ্লেস",ro_bg_note:"Doc = সাবজেক্ট · Ref1 = নতুন দৃশ্য। Target (Solo/Couple/Family) নির্ধারণ করে কাকে রাখা হবে।",ro_bg_frame:"ফ্রেম ও কম্পোজিশন বজায় রাখুন",ro_bg_light:"সাবজেক্টের আলো/রং অক্ষুণ্ণ রাখুন",ro_subSwap:"সাবজেক্ট বদল",ro_lcRef:"L&C রেফারেন্স",ro_lcCopy:"L&C কপি-পেস্ট",ro_dressRef:"পোশাক রেফারেন্স",ro_dressRep:"পোশাক বদল",ro_mkCopy:"মেকআপ কপি",ro_matchBtn:"★ মাস্টার ম্যাচ",grp_retouch:"স্কিন রিটাচ প্রিসেট",lbl_intensity:"তীব্রতা",p_evoto:"Evoto স্টাইল",p_meitu:"Meitu স্টাইল",auto_place:"ফলাফল স্বয়ংক্রিয়ভাবে Photoshop-এ নতুন লেয়ার হিসেবে বসান",sec_retouchpro:"রিটাচ প্রো — স্লাইডার",rt_skin:"ত্বক",rt_faceai:"ফেস AI",rt_hair:"চুল",rt_dress:"পোশাক",rt_bg:"ব্যাকগ্রাউন্ড",rt_smooth:"ত্বক মসৃণ",rt_acne:"ব্রণ দূর",rt_spots:"কালো দাগ",rt_wrinkle:"বলিরেখা",rt_tone:"ফরসা / ট্যান",rt_glow:"গ্লো",rt_reshape:"AI রিশেপ",rt_lash:"চোখের পাপড়ি",rt_brow:"ভ্রু",rt_lipsmooth:"ঠোঁট মসৃণ",rt_lipcolor:"ঠোঁটের রং",rt_lenscolor:"লেন্সের রং",rt_hairstray:"এলোমেলো চুল",rt_hairsmooth:"চুল মসৃণ",rt_hairshine:"চুলের ঝলক (D&B)",rt_dresssmooth:"কাপড় মসৃণ",rt_dressedge:"কিনারা পরিষ্কার",rt_dresswrinkle:"ভাঁজ দূর",rt_dresstexture:"টেক্সচার পুনরুদ্ধার",rt_bgsmooth:"BG পরিষ্কার/মসৃণ",rt_bgcolor:"BG রং",rt_bgrecolor:"BG রং মসৃণ",rt_shape:"রিশেপ প্রো (মুখ + শরীর)",rt_teeth:"দাঁত সাদা",rt_eyewhite:"চোখের সাদা অংশ পরিষ্কার",rt_faceslim:"মুখ চিকন",rt_jaw:"চোয়ালের রেখা",rt_chin:"থুতনি",rt_nosesize:"নাকের আকার",rt_eyesize:"চোখের আকার",rt_lipfull:"ভরাট ঠোঁট",rt_waist:"কোমর চিকন",rt_bodyslim:"শরীর চিকন",rt_shoulder:"কাঁধ",rt_hip:"নিতম্ব চিকন",rt_leglen:"পায়ের দৈর্ঘ্য",rt_armslim:"বাহু চিকন",rt_dressfit:"পোশাক ফিট",rt_dressclean:"পোশাক পরিষ্কার",rt_dresscolorpure:"পোশাকের রং নিখুঁত",rt_bodygrp:"বডি স্কিন প্রো",rt_bodysmooth:"শরীরের ত্বক মসৃণ",rt_bodyblemish:"শরীরের দাগ পরিষ্কার",rt_bodytone:"শরীরের সমান টোন",rt_bodyglow:"বডি গ্লো",rt_bodyhairrm:"শরীরের লোম কমান",rt_hairvolume:"চুলের ভলিউম",rt_hairgloss:"চুলের গ্লস",rt_hairfill:"চুল ভরাট (পাতলা জায়গা)",wp_h_trail:"♥ ওয়েডিং — লাক্সারি ফ্লাওয়ার ট্রেইল",wp_h_veil:"♥ ওয়েডিং — উড়ন্ত ভেইল",wp_h_gown:"♥ ওয়েডিং — গাউন ক্লিন + ট্রেন",wp_h_petal:"♥ ওয়েডিং — উড়ন্ত পাপড়ি",wp_h_extra:"♥ ওয়েডিং — ঘোড়া · পানি · মুড",wp_note:"Face ID / পোজ / ফ্রেম / পোশাকের ডিজাইন সম্পূর্ণ লক থাকে — শুধু নির্দিষ্ট উপাদানটিই বদলায়।",wp_petalcolor:"পাপড়ির রং (auto = দৃশ্যের সাথে মিল)",wp_trail_c:"ফুলের রং",wp_trail_go:"▶ ফ্লাওয়ার ট্রেইল",wp_veil_c:"ভেইলের দৈর্ঘ্য",wp_veil_go:"▶ উড়ন্ত ভেইল",wp_gown_c:"ট্রেনের দৈর্ঘ্য",wp_gown_go:"▶ গাউন ক্লিন + ট্রেন",wp_pet_c:"পাপড়ির স্টাইল",wp_pet_go:"▶ উড়ন্ত পাপড়ি",wp_extra_c:"অতিরিক্ত",wp_extra_go:"▶ অতিরিক্ত যোগ করুন",btn_apply_rt:"রিটাচ প্রয়োগ করুন",btn_reset:"রিসেট",rt_none:"আগে অন্তত একটি রিটাচ স্লাইডার বা রং সেট করুন",tab_setup:"সেটআপ",tab_prompt:"স্টুডিও",tab_presets:"প্রিসেট",recent_lbl:"সাম্প্রতিক prompt…",tab_retouch:"রিটাচ",tab_aitools:"AI টুলস",cap_warn:"Photoshop এই prompt বক্সের সীমা:",cleanup_note:"টিক দেওয়া আইটেমগুলো প্রতিবার জেনারেট / প্রিসেট চালানোর সাথে একসাথে চলে।",btn_generate:"তৈরি করুন",st_ready:"প্রস্তুত",st_capture:"ডকুমেন্ট ক্যাপচার হচ্ছে",st_gen:"জেনারেট হচ্ছে…",st_place:"Photoshop-এ বসানো হচ্ছে…",st_placed_masked:"লেয়ার + মাস্ক গ্রুপ হিসেবে বসানো হয়েছে — মূল ছবি অক্ষত ✓",st_placed_plain:"সাধারণ লেয়ার হিসেবে বসানো হয়েছে (এই হোস্টে মাস্ক/গ্রুপ পাওয়া যায় না)",stage_queued:"সারিতে আছে",stage_uploading:"আপলোড হচ্ছে",stage_generating:"জেনারেট হচ্ছে",stage_downloading:"ডাউনলোড হচ্ছে",stage_placing:"বসানো হচ্ছে",st_done:"হয়ে গেছে ✓",st_err:"ত্রুটি",st_no_doc:"কোনো সক্রিয় ডকুমেন্ট নেই — আগে একটি ছবি খুলুন",st_no_prompt:"Prompt খালি",need_ref:"এই প্রিসেটের জন্য স্লট 1-এ একটি রেফারেন্স ছবি দরকার",st_new_doc:"ফলাফল নতুন ডকুমেন্ট হিসেবে খোলা হয়েছে ✓",sec_preview:"প্রিভিউ — আগে / পরে",before:"আগে",after:"পরে",btn_place:"Photoshop-এ বসান",btn_saveas:"নতুন নামে সেভ করুন…",st_saved:"সেভ হয়েছে ✓",sec_diag:"সিস্টেম চেক",sec_log:"কার্যকলাপ লগ",btn_diag:"চেক চালান",btn_copylog:"লগ কপি করুন",btn_clearlog:"মুছুন",diag_host:"Photoshop হোস্ট",diag_uxp:"UXP সক্ষমতা",diag_gem:"Gemini API key",diag_oai:"OpenAI API key",diag_doc:"সক্রিয় ডকুমেন্ট",diag_set:"সেট করা",diag_unset:"সেট করা নেই",diag_open:"খোলা",diag_none:"কোনোটি খোলা নেই",diag_missing:"অনুপস্থিত",diag_done:"সিস্টেম চেক সম্পন্ন ✓",diag_lib:"রেফারেন্স লাইব্রেরি",diag_lib_open:"ফোল্ডার খোলার সক্ষমতা",sec_reflib:"রেফারেন্স ইমেজ লাইব্রেরি",reflib_note:"আপনার পছন্দের রেফারেন্স ছবির ফোল্ডারটি একবার বেছে নিন — ব্রাউজ সেটি মনে রাখে এবং সব জায়গায় সেটির ভেতরেই খোলে।",btn_browse:"ব্রাউজ",lib_choose:"ফোল্ডার বাছুন",lib_open:"ফোল্ডার খুলুন",lib_change:"ফোল্ডার বদলান",lib_reset:"রিসেট",lib_rescan:"পুনরায় স্ক্যান",lib_current:"বর্তমান ফোল্ডার",lib_found:"পাওয়া ছবি",lib_status:"অবস্থা",lib_lastscan:"শেষ স্ক্যান",lib_images:"ছবি",lib_connected:"সংযুক্ত",lib_not_config:"কনফিগার করা নেই",lib_perm_lost:"অনুমতি হারিয়ে গেছে — আবার নির্বাচন করুন",lib_none:"(কোনো ফোল্ডার নির্বাচিত নয়)",lib_copy_only:"শুধু পাথ কপি",lib_choose_msg:"আপনার HNK রেফারেন্স ইমেজ লাইব্রেরি ফোল্ডারটি বেছে নিন।",lib_scanning:"লাইব্রেরি স্ক্যান হচ্ছে…",lib_scan_done:"পুনরায় স্ক্যান সম্পন্ন ✓",lib_reset_done:"লাইব্রেরি রিসেট হয়েছে ✓",lib_path_copied:"পাথ কপি হয়েছে",lib_unsupported:"অসমর্থিত ছবির ধরন",lib_restore_fail:"রেফারেন্স পুনরুদ্ধার করা যায়নি",on:"চালু",off:"বন্ধ"},
gu:{tab_setup:"સેટઅપ",tab_prompt:"સ્ટુડિયો",tab_presets:"પ્રીસેટ",tab_retouch:"રીટચ",tab_aitools:"AI ટૂલ્સ",tab_create:"બનાવો",btn_generate:"બનાવો",st_ready:"તૈયાર",st_done:"થઈ ગયું ✓",st_need_key:"પહેલા Gemini API key નાખો",btn_show:"બતાવો",btn_hide:"છુપાવો",btn_save:"સાચવો",btn_test:"Key ચકાસો",btn_clear:"કાઢી નાખો",btn_cancel:"રદ કરો",btn_load:"લોડ",btn_paste:"પેસ્ટ",btn_improve:"Prompt સુધારો",lbl_ratio:"ગુણોત્તર",lbl_size:"કદ",lbl_quality:"ગુણવત્તા"},
hi:{app_title:"HNK Photoshop Ai पैनल (छात्रों के लिए)",sec_api:"Gemini API key",btn_show:"दिखाएँ",btn_hide:"छिपाएँ",btn_test:"Key परखें",btn_save:"सहेजें",st_testing:"Key की जाँच हो रही है",st_key_ok:"✓ API key काम कर रही है",st_key_bad:"API key विफल रही",st_key_saved:"API key सेव हो गई ✓",st_need_key:"पहले Gemini API key डालें",sec_model:"मॉडल और आउटपुट",scope_model_note:"नीचे Prompt टैब के Generate बटन में उपयोग होता है — Create और AI Tools की अपनी-अपनी अलग मॉडल सेटिंग्स हैं।",model_auto:"ऑटो (अनुशंसित)",model_flash:"Flash — तेज़ (2.5)",model_pro:"Pro — गुणवत्ता (3.0)",lbl_ratio:"अनुपात",ratio_auto:"ऑटो अनुपात (डॉक्यूमेंट से)",lbl_size:"आकार",lbl_quality:"गुणवत्ता",qual_auto:"ऑटो",qual_low:"कम",qual_med:"मध्यम",qual_high:"उच्च",sec_prompt:"Prompt",hint_prompt:"अपना prompt यहाँ लिखें… (अधिकतम 20,000 अक्षर)",btn_improve:"Prompt सुधारें",btn_clear:"हटाएँ",st_improving:"Prompt बेहतर बनाया जा रहा है",st_improved:"Prompt बेहतर हो गया ✓",sec_refs:"संदर्भ इमेज (2 स्लॉट)",base_note:"बेस इमेज = आपका सक्रिय Photoshop डॉक्यूमेंट (अपने आप कैप्चर होता है)।",btn_ref_layer:"+ लेयर",btn_ref_file:"फ़ाइल",btn_ref_web:"वेब",st_ref_layer_added:"लेयर संदर्भ के रूप में जुड़ गई ✓",st_ref_file_added:"फ़ाइल संदर्भ के रूप में जुड़ गई ✓",st_importing:"फ़ाइल इंपोर्ट हो रही है",url_title:"URL से संदर्भ — Chrome / Pinterest",url_ph:"https://… इमेज का पता या Pinterest पिन लिंक",btn_paste:"पेस्ट",btn_load:"लोड करें",btn_cancel:"रद्द करें",st_url_loading:"वेब इमेज डाउनलोड हो रही है",st_ref_web_added:"वेब इमेज संदर्भ के रूप में जुड़ गई ✓",st_url_bad:"इस URL से इमेज लोड नहीं हो सकी — इमेज का पता कॉपी करके फिर से आज़माएँ",no_layer:"कोई लेयर चयनित नहीं है",sec_presets:"AI प्रीसेट",auto_run:"प्रीसेट क्लिक → ऑटो Generate (OFF = केवल prompt में जोड़ें)",grp_cleanup:"क्लीनअप टूल",p_remove_people:"लोग हटाएँ",p_fix_hands:"अतिरिक्त हाथ ठीक करें",p_fix_legs:"अतिरिक्त पैर ठीक करें",p_full_clean:"पूरा क्लीनअप",grp_moved_note:"संदर्भ टूल अब नीचे Reference Ops Pro कार्ड में हैं (एक ही जगह, Solo/Couple/Family + गाइड के साथ)।",ro_h_detail:"हेयर · एक्सेसरीज़ · पोज़ (← Ref1)",ro_h_comp:"कंपोज़िट · स्टाइल · टेक्स्ट (← Ref1)",p_fgbglc:"FG=Doc · BG=Ref1 · Light=Ref2",p_hair:"हेयरस्टाइल (← Ref1)",p_access:"ज्वेलरी+एक्सेसरीज़ (← Ref1)",p_pose:"पोज़ मिलान (Doc → Ref1)",p_fgprops:"FG प्रॉप्स (← Ref1)",p_textlogo:"टेक्स्ट / लोगो (← Ref1)",p_style:"फ़ोटो स्टाइल (← Ref1)",grp_repsubj:"सब्जेक्ट बदलें (Doc → Ref1 दृश्य)",p_rep_solo:"सोलो बदलें",p_rep_couple:"कपल बदलें",p_rep_family:"परिवार बदलें",grp_rmix:"Replace Mix — टिक करें और Ref1 से लें",rm_bg:"बैकग्राउंड (BG)",rm_fg:"फ़ोरग्राउंड (FG)",rm_light:"लाइटिंग",rm_color:"रंग",rm_object:"ऑब्जेक्ट / प्रॉप्स",btn_rmix:"रिप्लेस जनरेट करें",rm_none:"पहले कम से कम एक पहलू टिक करें",grp_i2p:"इमेज → Prompt (सीन बिल्डर)",i2p_note:"1) Extract: Ref1 का दृश्य → विस्तृत टेक्स्ट prompt (लोग शामिल नहीं)। 2) इसे Prompt पेज पर संपादित करें। 3) 'सीन जनरेट करें' इसे आपके डॉक्यूमेंट के सब्जेक्ट के चारों ओर बनाता है — किसी भी एंगल पर अपने आप फ़िट। फ़ेस/पोज़/फ़्रेम लॉक = मूल बनाए रखें।",i2p_objects:"ऑब्जेक्ट और प्रॉप्स का विवरण",i2p_light:"लाइटिंग का विवरण",i2p_color:"रंग / ग्रेड का विवरण",i2p_bg:"बैकग्राउंड का विवरण",i2p_fg:"फ़ोरग्राउंड का विवरण",btn_i2p:"इमेज → Prompt (सीन निकालें)",i2p_fit:"सीन ऑटो-फ़िट — दृश्य को डॉक्यूमेंट के एंगल / दूरी / लेंस के अनुसार री-प्रोजेक्ट करें",i2p_adapt:"सब्जेक्ट की रोशनी और रंग दृश्य के अनुसार ढालें",btn_scenegen:"सीन जनरेट करें",st_extract:"दृश्य से prompt निकाला जा रहा है",st_extract_done:"सीन prompt तैयार है — Prompt पेज पर देख लें",scene_no_prompt:"Prompt बॉक्स खाली है — पहले इमेज → Prompt चलाएँ",i2p_none:"पहले कम से कम एक विवरण पहलू टिक करें",sec_light:"स्टूडियो लाइटिंग — AI रीलाइट",light_note:"लाइटें ON टिक करें, चुनने के लिए पंक्ति पर टैप करें, स्लाइडर से उन्हें आकार दें — 3D टॉप-व्यू डायग्राम लाइव बदलता है (▴ = ऊँचा, ▾ = नीचा)। 'लाइटिंग जनरेट करें' आपके डॉक्यूमेंट को ठीक इसी सेटअप के अनुसार रीलाइट करता है; फ़ेस / पोज़ / फ़्रेम लॉक रहते हैं।",lbl_my_prompt:"म्यांमार PROMPT",lstage_model:"मॉडल",lstage_cam:"कैमरा",l_key:"की लाइट",l_fill:"फ़िल / फ्रंट",l_butterfly:"बटरफ़्लाई (ऊपर-सामने)",l_side:"साइड लाइट",l_rim:"रिम लाइट",l_back:"बैक लाइट",l_hair:"हेयर लाइट",l_bglight:"बैकग्राउंड लाइट",lt_softbox:"सॉफ्टबॉक्स",lt_octa:"ऑक्टा",lt_strip:"स्ट्रिप",lt_umbrella:"अम्ब्रेला",lt_beauty:"ब्यूटी",lt_hard:"हार्ड",li_int:"तीव्रता",li_angle:"कोण",li_height:"ऊँचाई",li_dist:"दूरी",li_size:"आकार",btn_lightgen:"लाइटिंग जनरेट करें",light_none:"पहले कम से कम एक लाइट ON करें",lg_equip:"फ़ोटो में लाइट उपकरण दिखाएँ (सॉफ्टबॉक्स / स्टैंड दिखें)",grp_chains:"स्टाइल चेन — ✓ स्टाइल मिलाएँ",chains_note:"कोई भी स्टाइल ON करें — वे हर Generate / प्रीसेट / रीटच में एक साथ मिल जाती हैं।",grp_restore:"पुरानी फ़ोटो बहाली",p_restore:"पुरानी फ़ोटो बहाली",rest_color:"पूर्ण रंगीन",rest_bw:"ब्लैक एंड व्हाइट",restore_note:"फटने, पानी / जलने के नुकसान और फीकेपन की मरम्मत करता है — हर मूल चेहरा 100% वैसा ही रहता है।",rt_browstyle:"आइब्रो स्टाइल",rt_lashstyle:"लैश स्टाइल",rt_blush:"ब्लश रंग",rt_contour:"कंटूर स्टाइल",rt_bust:"वक्ष",rt_butt:"नितंब",rt_thigh:"जाँघें",rt_calf:"पिंडलियाँ",rt_neck:"गर्दन",rt_fingers:"उँगलियाँ",hint_prompt_my:"မြန်မာလို ရေးပါ — Generate မှာ English အလိုပြောင်းပေးမယ် (အများဆုံး 20,000)",st_translate:"म्यांमार prompt का अंग्रेज़ी में अनुवाद हो रहा है",live_trans:"लाइव ⇄ ऑटो-अनुवाद (EN ↔ MY, टाइपिंग रुकने के बाद)",st_retry:"फिर से कोशिश की जा रही है",grp_recipes:"रेसिपी — सेटिंग्स सेव / शेयर करें",recipe_note:"सब कुछ (चेन, रीटच, लाइटें, लॉक, prompt) एक ही .json रेसिपी में सेव करें — छात्र बस उसे लोड कर लें।",btn_recipe_save:"रेसिपी सेव करें",btn_recipe_load:"रेसिपी लोड करें",st_recipe_saved:"रेसिपी सेव हो गई ✓",st_recipe_loaded:"रेसिपी लोड हो गई ✓ — सभी कंट्रोल अपडेट हो गए",st_recipe_bad:"यह HNK रेसिपी फ़ाइल नहीं है",sec_final:"अंतिम Prompt (AI को भेजा जाता है)",btn_copy:"कॉपी करें",st_copied:"कॉपी हो गया ✓",hist_note:"इतिहास — पिछले 6 परिणाम, देखने के लिए टैप करें:",btn_hist_prompt:"→ Prompt",sec_batch:"बैच मोड",batch_note:"कई फ़ोटो + एक आउटपुट फ़ोल्डर चुनें — मौजूदा prompt, चेन, क्लीनअप और Keep लॉक हर फ़ोटो पर चलते हैं; परिणाम *_HNK.png के रूप में सेव होते हैं।",btn_batch:"बैच चलाएँ",btn_batch_stop:"रोकें",st_batch:"बैच",st_batch_done:"बैच पूरा हुआ",sec_web:"वेब AI — मिनी ब्राउज़र",web_note:"Photoshop के अंदर कोई भी वेब AI एडिटर खोलें। वहाँ जनरेट करें, फिर परिणाम को लेयर के रूप में लाएँ:",web_import_note:"इंपोर्ट: ① वेब ऐप में 'इमेज का पता कॉपी करें' उपयोग करें, फिर 'कॉपी किया लिंक इंपोर्ट करें' दबाएँ · ② या फ़ाइल डाउनलोड करके 'फ़ाइल इंपोर्ट करें' उपयोग करें · ③ HNK ब्रिज वाले पार्टनर वेब ऐप इमेज अपने आप भेज देते हैं।",btn_web_go:"जाएँ",btn_web_home:"होम",btn_web_reload:"रीलोड करें",btn_web_import_link:"कॉपी किया लिंक इंपोर्ट करें → PS",btn_web_import_file:"फ़ाइल इंपोर्ट करें → PS",st_web_import:"Photoshop में लेयर के रूप में इंपोर्ट हो गया ✓",st_web_nourl:"पहले इमेज लिंक कॉपी करें (राइट-क्लिक → इमेज का पता कॉपी करें)",st_web_fetch:"लिंक से इमेज लाई जा रही है",st_web_notallowed:"यह डोमेन allow-list में नहीं है — यह खाली रह सकता है। इसे जुड़वाने के लिए HNK से कहें।",st_need_doc:"पहले Photoshop में कोई फोटो डॉक्यूमेंट खोलें",sec_campro:"Camera Pro और क्वालिटी",autosave_lbl:"हर परिणाम का ऑटो-एक्सपोर्ट (PNG + prompt लॉग → फ़ोल्डर)",st_folder_ok:"एक्सपोर्ट फ़ोल्डर सेट हो गया ✓",st_exported:"एक्सपोर्ट हो गया ✓",st_export_fail:"एक्सपोर्ट विफल — फ़ोल्डर जाँचें",st_pro_fallback:"Pro मॉडल उपलब्ध नहीं — इस बार Flash पर स्विच किया गया",st_img_bad:"इमेज डेटा इंटीग्रिटी जाँच में विफल रहा — फोटो दोबारा जोड़ें",st_auto_comp:"ऑटो कंपोज़िट: IMAGE 1 सब्जेक्ट → रेफ़रेंस सीन",prov_lbl:"AI प्रोवाइडर",oai_key_ph:"sk-... (OpenAI API key)",tab_create:"बनाएँ",create_note:"क्रिएट मोड — आपके prompt से बिल्कुल नई इमेज (+ इसके अपने 4 रेफ़)। पूरी तरह स्वतंत्र: डॉक्यूमेंट, प्रीसेट, चेन या लॉक कभी नहीं पढ़ता।",create_ph:"जो इमेज बनाना चाहते हैं उसका वर्णन करें…",btn_create_ps:"⬇ Photoshop में भेजें",btn_to_ref:"↺ Ref 1 के रूप में इस्तेमाल करें",st_to_ref:"परिणाम Ref 1 में लोड हो गया ✓",scope_create_note:"Setup के Model और Output से स्वतंत्र — ये सेटिंग्स सिर्फ़ Create के Generate पर लागू होती हैं।",cr_ratio:"अनुपात",cr_var:"वेरिएशन",cr_restyle:"♻ परिणाम को नया स्टाइल दें",cr_lib:"Prompt लाइब्रेरी — डालने के लिए टैप करें",cr_improve:"बेहतर बनाएँ",cr_describe:"Ref 1 का वर्णन → Prompt",st_describing:"रेफ़रेंस पढ़ा जा रहा है…",st_described:"Ref 1 से prompt तैयार हो गया ✓",st_need_gem:"Gemini API key जोड़ें (Setup) — यह Gemini टेक्स्ट इस्तेमाल करता है",st_need_ref1:"पहले Ref 1 में कोई इमेज जोड़ें",st_lib_added:"Prompt जोड़ा गया ✓",cr_refs:"रेफ़रेंस इमेज (अधिकतम 4)",cr_refs_note:"वैकल्पिक — Layer / File / Web से जोड़ें। Create सिर्फ़ वही लेता है जो आपका prompt माँगता है।",cr_results:"परिणाम",cr_gal_empty:"अभी कोई परिणाम नहीं — Generate टैप करें।",cr_gal_have:"परिणाम · प्रीव्यू / कार्रवाई के लिए थंबनेल टैप करें",cr_save:"⬇ PNG सेव करें",cr_engine:"इंजन",cr_need_result:"पहले कोई इमेज जनरेट करें",btn_web_import_url:"⬇ URL इंपोर्ट करें",st_clip_help:"क्लिपबोर्ड खाली/ब्लॉक है — लिंक को URL बार में पेस्ट करें, फिर ⬇ URL इंपोर्ट करें टैप करें",st_web_blob:"यह एक अस्थायी blob: लिंक है — राइट-क्लिक → Copy IMAGE Address इस्तेमाल करें, या फ़ाइल सेव करके Import File इस्तेमाल करें",err_key:"API key अमान्य — Setup टैब पर key दोबारा जाँचें · API key မှားနေ — Setup မှာ ပြန်စစ်ပါ",err_quota:"कोटा / रेट लिमिट — थोड़ा रुककर फिर कोशिश करें · Quota ပြည့်/နှုန်းကန့် — ခဏနေပြန်စမ်းပါ",err_big:"API के लिए इमेज बहुत बड़ी है — छोटा करके फिर कोशिश करें · ပုံကြီးလွန်း — ချုံ့ပြီးပြန်စမ်းပါ",err_safety:"सेफ़्टी फ़िल्टर ने रोका — prompt या फोटो बदलकर देखें · Safety ငြင်း — prompt/ပုံ ပြင်ပြီးပြန်စမ်းပါ",err_net:"नेटवर्क / सर्वर समस्या — कृपया फिर कोशिश करें · ကွန်ရက်/ဆာဗာပြစနာ — ပြန်စမ်းပါ",err_timeout:"अनुरोध का समय समाप्त — सर्वर ने बहुत देर लगाई; कृपया फिर कोशिश करें · အချိန်ပြည့် — ပြန်စမ်းပါ",err_generic:"अनुरोध पूरा नहीं हो सका — कृपया फिर कोशिश करें",err_img:"कोई उपयोगी इमेज नहीं बनी — कृपया फिर कोशिश करें",err_mode:"यह डॉक्यूमेंट RGB मोड में नहीं है — पहले कन्वर्ट करें (Image ▸ Mode ▸ RGB Color), फिर दोबारा कोशिश करें",cam_master:"कैमरा ब्लॉक ON — हर prompt के अंत में जोड़ा जाएगा",cam_body:"कैमरा बॉडी",cam_lens:"प्राइम लेंस (mm)",cam_f:"अपर्चर",cam_film:"फ़िल्म लुक",cam_bokeh:"बोकेह स्टाइल",cam_iso:"ISO",cam_k:"WB केल्विन",cam_note:"ब्लॉक ON करें, फिर सिर्फ़ ज़रूरी चीज़ें चुनें — – चिप्स चुप रहती हैं। सब कुछ अंतिम prompt के अंत में जुड़ता है।",ro_h_main:"रेफ़रेंस ऑप्स प्रो (Ref1 / Ref2)",ro_note:"Ref1 = IMAGE 2 (महिला) · Ref2 = IMAGE 3 (पुरुष)। टारगेट चुनें, फिर कोई ऑप चलाएँ — जिनसे मेल नहीं है वे लोग कभी नहीं बदलते।",ro_target:"टारगेट:",ro_solo:"सोलो",ro_couple:"कपल",ro_family:"परिवार",ro_mk:"रेफ़ का मेकअप कॉपी करें",ro_hair:"रेफ़ का हेयरस्टाइल लें",ro_h_face:"फेस ऑप्स",ro_h_bg:"BG / FG ऑप्स",ro_h_sub:"सब्जेक्ट ऑप्स",ro_h_lc:"लाइट और कलर ऑप्स",ro_h_dress:"ड्रेस ऑप्स",ro_h_mk:"मेकअप ऑप्स",ro_h_match:"★ मास्टर मैच (एक जैसा लुक)",ro_match_note:"IMAGE 1 को रेफ़रेंस से मिलाएँ ताकि दोनों एक ही एडिट जैसे दिखें — जो मैच करना है उसे टिक करें:",m_color:"कलर",m_light:"लाइट",m_makeup:"मेकअप",m_skin:"स्किन रीटच",crd_pipe:"⛓ पाइपलाइन बिल्डर — कुछ भी चेन करें",pipe_note:"किन्हीं भी स्टेप्स को एक चेन में जोड़ें — हर स्टेप का परिणाम अगले स्टेप में जाता है। अधिकतम 6।",pipe_add:"+ जोड़ें",pipe_run:"▶ पाइपलाइन चलाएँ",pipe_clear:"साफ़ करें",pipe_retouch:"रीटच अप्लाई (मौजूदा स्लाइडर)",pipe_relight:"रीलाइट (मौजूदा लाइट रिग)",pipe_prompt:"Prompt (मौजूदा EN बॉक्स)",pipe_empty:"पहले कम से कम एक स्टेप जोड़ें",pipe_max:"पाइपलाइन भर गई है (अधिकतम 6 स्टेप)",st_pipe:"पाइपलाइन स्टेप",st_pipe_done:"पाइपलाइन पूरी हुई",st_pipe_stop:"पाइपलाइन रुक गई (एक स्टेप विफल हुआ)",pipe_merge:"⚡ वन-शॉट मर्ज — सारे स्टेप एक ही कॉल में (तेज़/सस्ता · ≤ 3 कामों के लिए सर्वोत्तम)",crd_chainsrest:"स्टाइल चेन + पुरानी फोटो रिस्टोर",crd_refops:"रेफ़रेंस ऑप्स प्रो (Ref1 / Ref2)",crd_scenes:"🎬 सीन प्रो — लॉक्ड सब्जेक्ट · मैचिंग सीन",scn_note:"अपने सब्जेक्ट को लॉक करें (चेहरा · पोज़ · ड्रेस · फ्रेम) और पूरा सीन उनके अनुसार दोबारा बनाएँ — लाइट, शैडो, कलर, बैकग्राउंड, फ़ोरग्राउंड और ऑब्जेक्ट सब अपने आप ढलकर असली फोटो जैसा लुक देते हैं।",scn_h_style:"सीन स्टाइल (इनडोर / सांस्कृतिक)",scn_h_bday:"🎂 जन्मदिन — उम्र का अंक 1–45",scn_h_cap:"कैप्शन / टेक्स्ट (बच्चा · Miss Universe · जन्मदिन)",scn_h_scarf:"आउटडोर / फ्लाइंग स्कार्फ़",scn_grad:"ग्रेजुएशन इनडोर",scn_prewed:"प्रीवेडिंग इनडोर",scn_vietnam:"वियतनाम",scn_myanmar:"म्यांमार",scn_chinese:"चीनी",scn_shan:"शान",scn_newborn:"नवजात / शिशु",scn_age:"उम्र",scn_bday_go:"🎂 जन्मदिन सीन",scn_cap_on:"कैप्शन टेक्स्ट जोड़ें",scn_cap_ph:"कैप्शन टेक्स्ट (जैसे Happy 1st Birthday, नाम)…",scn_cap_pos:"पोज़िशन",scn_top:"ऊपर",scn_bottom:"नीचे",scn_scarf:"✦ फ्लाइंग स्कार्फ़ सीन",scn_dir:"दिशा",scn_left:"बाएँ",scn_right:"दाएँ",scn_up:"ऊपर",scn_len:"लंबाई",scn_short:"छोटा",scn_long:"लंबा",g_cat_scene:"सीन ऑप — आपका सब्जेक्ट लॉक है (चेहरा · पोज़ · ड्रेस · फ्रेम); पूरा जनरेट किया गया सीन (लाइट, शैडो, कलर, बैकग्राउंड, फ़ोरग्राउंड, ऑब्जेक्ट, माहौल) असली फोटो जैसे कंपोज़िट के लिए सब्जेक्ट से अपने आप मैच किया जाता है।",crd_wed:"♥ वेडिंग प्रो सूट",crd_recipes:"रेसिपी — सेव / शेयर करें",learn_lbl:"🎓 लर्न मोड — पहला टैप = गाइड (पीला), दूसरा = prompt (नीला), तीसरा = रन (हरा)",guide_hint:"फिर टैप करें: पीला → नीला (prompt) → हरा (रन) ▶",g_learn_next_prompt:"फिर टैप करें → सटीक PROMPT दिखेगा (नीला)।",g_learn_prompt_head:"यह बटन जो PROMPT भेजेगा (फिर टैप = रन):",g_learn_next_run:"एक बार और टैप करें → रन (हरा) जनरेट करता है।",st_prompt_ready:"Prompt तैयार — चलाने के लिए फिर टैप करें (हरा) ✓",g_step_doc:"पहले Photoshop में अपना फोटो डॉक्यूमेंट खोलें।",g_step_ref1:"रेफ़रेंस इमेज को Ref1 में लोड करें (वह IMAGE 2 बन जाती है)। दूसरे व्यक्ति के लिए Ref2 जोड़ें।",g_step_target:"टारगेट चुनें: सोलो / कपल (Ref1 = महिला, Ref2 = पुरुष) / परिवार।",g_step_mkhair:"वैकल्पिक: फेस ऑप्स के ऊपर ‘रेफ़ का मेकअप कॉपी करें’ / ‘रेफ़ का हेयरस्टाइल लें’ टिक करें।",g_step_petal:"पहले पंखुड़ी का रंग चुनें (auto = आपके सीन से मैच)।",g_step_rest:"ऊपर दिए ✓ से फुल कलर या B&W चुनें।",g_step_int:"इंटेंसिटी स्लाइडर अपनी पसंद से सेट करें।",g_step_confirm:"आगे बढ़ने के लिए फिर टैप करें: गाइड (पीला) → PROMPT (नीला) → रन (हरा जनरेट करता है)।",g_cat_face:"फेस ऑप — रेफ़रेंस चेहरा मिलते-जुलते व्यक्ति पर ट्रांसफ़र करता है; बाकी सब जस के तस रहते हैं।",g_cat_sub:"सब्जेक्ट ऑप — रेफ़रेंस व्यक्ति को आपके सीन में लाता/ढालता है; सीन और फ्रेमिंग वही रहती है।",g_cat_bgfg:"BG/FG ऑप — रेफ़रेंस के आधार पर सिर्फ़ बैकग्राउंड / फ़ोरग्राउंड बदलता है।",g_cat_lc:"लाइट और कलर ऑप — रेफ़रेंस की लाइटिंग और ग्रेड कॉपी करता है; लोग पिक्सेल-दर-पिक्सेल वैसे ही रहते हैं।",g_cat_dress:"ड्रेस ऑप — रेफ़रेंस के आधार पर सिर्फ़ पोशाक बदलता है।",g_cat_mkop:"मेकअप ऑप — रेफ़रेंस के आधार पर सिर्फ़ मेकअप बदलता है।",g_cat_match:"मास्टर मैच — आपकी फोटो को रेफ़रेंस के पूरे लुक से मैच करता है (ऊपर की परतें टिक करें)।",g_cat_trail:"वेडिंग ट्रेल — लक्ज़री घास + बहती फूलों की राह; चेहरे/पोज़/फ्रेम पूरी तरह लॉक रहते हैं।",g_cat_veil:"फ्लाइंग वेल — इस लंबाई का हवा में उड़ता वेल जोड़ता/बढ़ाता है; चेहरा कभी नहीं ढकता।",g_cat_gown:"गाउन — मौजूदा गाउन साफ़ करता है (डिज़ाइन वही रहता है) और ट्रेन की यह लंबाई सेट करता है।",g_cat_petal:"फ्लाइंग पेटल्स — इस स्टाइल में हवा में पंखुड़ियाँ जोड़ता है; रंग ऊपर के स्वैच से।",g_cat_wedx:"वेडिंग एक्स्ट्रा — आपके सीन से मैच करता यह एलिमेंट जोड़ता है; सब्जेक्ट लॉक रहता है।",g_cat_canvas:"रिप्लेस (कैनवस) — आपके सब्जेक्ट को रेफ़रेंस के सीन में रखता है; रेफ़ के लोग हटा दिए जाते हैं।",g_cat_restore:"पुरानी फोटो रिस्टोर — नुक़सान की मरम्मत करता है; हर मूल चेहरा 100% वैसा ही रहता है।",g_cat_generic:"प्रीसेट — आपकी फोटो पर यह प्रोफ़ेशनल एडिट लागू करता है।",g_gen:"जनरेट — prompt बॉक्स (+ चेन, कीप्स, कैमरा ब्लॉक) आपके डॉक्यूमेंट पर चलाता है।",g_retouchbtn:"रीटच अप्लाई — आपकी सभी स्लाइडर सेटिंग्स को एक प्रोफ़ेशनल रीटच पास के रूप में चलाता है।",g_relightbtn:"लाइटिंग जनरेट — आपके 3D लाइट डायग्राम के हिसाब से फोटो को हूबहू रीलाइट करता है।",g_scene:"सीन जनरेट — निकाले गए prompt से सीन दोबारा बनाता है; सब्जेक्ट वही रहता है।",g_rmix:"रिप्लेस मिक्स — रेफ़रेंस से सिर्फ़ ✓ टिक किए गए हिस्से बदलता है।",g_pipe:"रन पाइपलाइन — हर चेन किया गया स्टेप क्रम से चलाता है; हर परिणाम अगले में जाता है।",ro_faceRep:"फेस रिप्लेस",ro_faceSwap:"फेस स्वैप",ro_bgRep:"BG रिप्लेस",ro_bgSwap:"BG स्वैप",ro_fgRep:"FG रिप्लेस",ro_bg_note:"Doc = सब्जेक्ट · Ref1 = नया सीन। Target (Solo/Couple/Family) तय करता है कि किसे रखा जाए।",ro_bg_frame:"फ़्रेम और कंपोज़िशन बनाए रखें",ro_bg_light:"सब्जेक्ट की रोशनी/रंग सुरक्षित रखें",ro_subSwap:"सब्जेक्ट स्वैप",ro_lcRef:"L&C रेफ़रेंस",ro_lcCopy:"L&C कॉपी-पेस्ट",ro_dressRef:"ड्रेस रेफ़रेंस",ro_dressRep:"ड्रेस रिप्लेस",ro_mkCopy:"मेकअप कॉपी",ro_matchBtn:"★ मास्टर मैच",grp_retouch:"स्किन रीटच प्रीसेट",lbl_intensity:"तीव्रता",p_evoto:"Evoto स्टाइल",p_meitu:"Meitu स्टाइल",auto_place:"परिणाम को नई लेयर के रूप में Photoshop में अपने-आप रखें",sec_retouchpro:"रीटच प्रो — स्लाइडर",rt_skin:"स्किन",rt_faceai:"फ़ेस AI",rt_hair:"बाल",rt_dress:"ड्रेस",rt_bg:"बैकग्राउंड",rt_smooth:"स्किन स्मूद",rt_acne:"मुँहासे हटाएँ",rt_spots:"काले धब्बे",rt_wrinkle:"झुर्रियाँ",rt_tone:"गोरापन / टैन",rt_glow:"ग्लो",rt_reshape:"AI रीशेप",rt_lash:"पलकें",rt_brow:"भौंहें",rt_lipsmooth:"होंठ स्मूद",rt_lipcolor:"होंठों का रंग",rt_lenscolor:"लेंस का रंग",rt_hairstray:"बिखरे बाल",rt_hairsmooth:"बाल स्मूद",rt_hairshine:"बालों की चमक (D&B)",rt_dresssmooth:"कपड़ा स्मूद",rt_dressedge:"किनारों की सफ़ाई",rt_dresswrinkle:"सिलवटें हटाएँ",rt_dresstexture:"टेक्सचर वापस लाएँ",rt_bgsmooth:"BG साफ़/स्मूद",rt_bgcolor:"BG रंग",rt_bgrecolor:"BG रंग स्मूद",rt_shape:"रीशेप प्रो (चेहरा + शरीर)",rt_teeth:"दाँत सफ़ेद करें",rt_eyewhite:"आँखों की सफ़ेदी साफ़",rt_faceslim:"चेहरा स्लिम",rt_jaw:"जॉलाइन",rt_chin:"ठोड़ी",rt_nosesize:"नाक का आकार",rt_eyesize:"आँखों का आकार",rt_lipfull:"भरे होंठ",rt_waist:"कमर स्लिम",rt_bodyslim:"बॉडी स्लिम",rt_shoulder:"कंधे",rt_hip:"हिप स्लिम",rt_leglen:"टाँगों की लंबाई",rt_armslim:"बाँह स्लिम",rt_dressfit:"ड्रेस फ़िट",rt_dressclean:"ड्रेस साफ़",rt_dresscolorpure:"ड्रेस का शुद्ध रंग",rt_bodygrp:"बॉडी स्किन प्रो",rt_bodysmooth:"बॉडी स्किन स्मूद",rt_bodyblemish:"बॉडी दाग़-धब्बे साफ़",rt_bodytone:"बॉडी एक-सा टोन",rt_bodyglow:"बॉडी ग्लो",rt_bodyhairrm:"शरीर के बाल कम करें",rt_hairvolume:"बालों का वॉल्यूम",rt_hairgloss:"हेयर ग्लॉस",rt_hairfill:"हेयर फ़िल (पतले हिस्से)",wp_h_trail:"♥ वेडिंग — लक्ज़री फ्लावर ट्रेल",wp_h_veil:"♥ वेडिंग — उड़ता वेल",wp_h_gown:"♥ वेडिंग — गाउन क्लीन + ट्रेन",wp_h_petal:"♥ वेडिंग — उड़ती पंखुड़ियाँ",wp_h_extra:"♥ वेडिंग — घोड़ा · पानी · मूड",wp_note:"फ़ेस ID / पोज़ / फ़्रेम / ड्रेस डिज़ाइन पूरी तरह लॉक हैं — केवल चुना गया तत्व ही बदलता है।",wp_petalcolor:"पंखुड़ी का रंग (auto = सीन से मेल)",wp_trail_c:"फूल का रंग",wp_trail_go:"▶ फ्लावर ट्रेल",wp_veil_c:"वेल की लंबाई",wp_veil_go:"▶ उड़ता वेल",wp_gown_c:"ट्रेन की लंबाई",wp_gown_go:"▶ गाउन क्लीन + ट्रेन",wp_pet_c:"पंखुड़ी की शैली",wp_pet_go:"▶ उड़ती पंखुड़ियाँ",wp_extra_c:"अतिरिक्त",wp_extra_go:"▶ अतिरिक्त जोड़ें",btn_apply_rt:"रीटच लागू करें",btn_reset:"रीसेट",rt_none:"पहले कम से कम एक रीटच स्लाइडर या रंग सेट करें",tab_setup:"सेटअप",tab_prompt:"स्टूडियो",tab_presets:"प्रीसेट",recent_lbl:"हाल के prompts…",tab_retouch:"रीटच",tab_aitools:"AI टूल्स",cap_warn:"Photoshop इस prompt बॉक्स की सीमा रखता है:",cleanup_note:"टिक किए गए आइटम हर जनरेट / प्रीसेट के साथ चलते हैं।",btn_generate:"बनाएँ",st_ready:"तैयार",st_capture:"दस्तावेज़ कैप्चर हो रहा है",st_gen:"जनरेट हो रहा है…",st_place:"Photoshop में रखा जा रहा है…",st_placed_masked:"लेयर + मास्क ग्रुप के रूप में रखा गया — मूल छवि ज्यों की त्यों ✓",st_placed_plain:"सादी लेयर के रूप में रखा गया (इस होस्ट पर मास्क/ग्रुप उपलब्ध नहीं)",stage_queued:"कतार में",stage_uploading:"अपलोड हो रहा है",stage_generating:"जनरेट हो रहा है",stage_downloading:"डाउनलोड हो रहा है",stage_placing:"रखा जा रहा है",st_done:"हो गया ✓",st_err:"त्रुटि",st_no_doc:"कोई सक्रिय दस्तावेज़ नहीं — पहले कोई फ़ोटो खोलें",st_no_prompt:"Prompt खाली है",need_ref:"इस प्रीसेट के लिए स्लॉट 1 में रेफ़रेंस इमेज चाहिए",st_new_doc:"परिणाम नए दस्तावेज़ के रूप में खुल गया ✓",sec_preview:"पूर्वावलोकन — पहले / बाद",before:"पहले",after:"बाद",btn_place:"Photoshop में रखें",btn_saveas:"इस रूप में सहेजें…",st_saved:"सहेजा गया ✓",sec_diag:"सिस्टम जाँच",sec_log:"गतिविधि लॉग",btn_diag:"जाँच चलाएँ",btn_copylog:"लॉग कॉपी करें",btn_clearlog:"साफ़ करें",diag_host:"Photoshop होस्ट",diag_uxp:"UXP क्षमताएँ",diag_gem:"Gemini API key",diag_oai:"OpenAI API key",diag_doc:"सक्रिय दस्तावेज़",diag_set:"सेट है",diag_unset:"सेट नहीं",diag_open:"खुला है",diag_none:"कोई खुला नहीं",diag_missing:"अनुपलब्ध",diag_done:"सिस्टम जाँच पूरी ✓",diag_lib:"रेफ़रेंस लाइब्रेरी",diag_lib_open:"फ़ोल्डर खोलने की क्षमता",sec_reflib:"रेफ़रेंस इमेज लाइब्रेरी",reflib_note:"अपनी पसंदीदा रेफ़रेंस इमेज का फ़ोल्डर एक बार चुनें — ब्राउज़ इसे याद रखता है और हर जगह इसी में खुलता है।",btn_browse:"ब्राउज़ करें",lib_choose:"फ़ोल्डर चुनें",lib_open:"फ़ोल्डर खोलें",lib_change:"फ़ोल्डर बदलें",lib_reset:"रीसेट",lib_rescan:"फिर स्कैन करें",lib_current:"वर्तमान फ़ोल्डर",lib_found:"इमेज मिलीं",lib_status:"स्थिति",lib_lastscan:"अंतिम स्कैन",lib_images:"इमेज",lib_connected:"कनेक्टेड",lib_not_config:"कॉन्फ़िगर नहीं",lib_perm_lost:"अनुमति खो गई — फिर से चुनें",lib_none:"(कोई फ़ोल्डर चयनित नहीं)",lib_copy_only:"केवल पथ कॉपी करें",lib_choose_msg:"अपना HNK रेफ़रेंस इमेज लाइब्रेरी फ़ोल्डर चुनें।",lib_scanning:"लाइब्रेरी स्कैन हो रही है…",lib_scan_done:"री-स्कैन पूरा ✓",lib_reset_done:"लाइब्रेरी रीसेट हो गई ✓",lib_path_copied:"पथ कॉपी हुआ",lib_unsupported:"असमर्थित इमेज प्रकार",lib_restore_fail:"रेफ़रेंस पुनर्स्थापित नहीं हो सका",on:"चालू",off:"बंद"},
ja:{tab_setup:"設定",tab_prompt:"スタジオ",tab_presets:"プリセット",tab_retouch:"レタッチ",tab_aitools:"AIツール",tab_create:"作成",btn_generate:"生成",st_ready:"準備完了",st_done:"完了 ✓",st_need_key:"先に Gemini API key を入力してください",btn_show:"表示",btn_hide:"隠す",btn_save:"保存",btn_test:"キーをテスト",btn_clear:"クリア",btn_cancel:"キャンセル",btn_load:"読み込み",btn_paste:"貼り付け",btn_improve:"プロンプト改善",lbl_ratio:"比率",lbl_size:"サイズ",lbl_quality:"品質"},
km:{tab_setup:"រៀបចំ",tab_prompt:"ស្ទូឌីយោ",tab_presets:"ព្រីសេត",tab_retouch:"រីតាច់",tab_aitools:"ឧបករណ៍ AI",tab_create:"បង្កើត",btn_generate:"បង្កើត",st_ready:"រួចរាល់",st_done:"រួចរាល់ហើយ ✓",st_need_key:"សូមបញ្ចូល Gemini API key ជាមុន",btn_show:"បង្ហាញ",btn_hide:"លាក់",btn_save:"រក្សាទុក",btn_test:"សាកល្បង Key",btn_clear:"លុប",btn_cancel:"បោះបង់",btn_load:"ផ្ទុក",btn_paste:"បិទភ្ជាប់",btn_improve:"កែលម្អ Prompt",lbl_ratio:"សមាមាត្រ",lbl_size:"ទំហំ",lbl_quality:"គុណភាព"},
kn:{tab_setup:"ಸೆಟಪ್",tab_prompt:"ಸ್ಟುಡಿಯೋ",tab_presets:"ಪ್ರೀಸೆಟ್",tab_retouch:"ರೀಟಚ್",tab_aitools:"AI ಟೂಲ್ಸ್",tab_create:"ರಚಿಸಿ",btn_generate:"ರಚಿಸಿ",st_ready:"ಸಿದ್ಧ",st_done:"ಮುಗಿದಿದೆ ✓",st_need_key:"ಮೊದಲು Gemini API key ಹಾಕಿ",btn_show:"ತೋರಿಸಿ",btn_hide:"ಮರೆಮಾಡಿ",btn_save:"ಉಳಿಸಿ",btn_test:"Key ಪರೀಕ್ಷಿಸಿ",btn_clear:"ಅಳಿಸಿ",btn_cancel:"ರದ್ದು",btn_load:"ಲೋಡ್",btn_paste:"ಪೇಸ್ಟ್",btn_improve:"Prompt ಸುಧಾರಿಸಿ",lbl_ratio:"ಅನುಪಾತ",lbl_size:"ಗಾತ್ರ",lbl_quality:"ಗುಣಮಟ್ಟ"},
ko:{tab_setup:"설정",tab_prompt:"스튜디오",tab_presets:"프리셋",tab_retouch:"리터치",tab_aitools:"AI 도구",tab_create:"만들기",btn_generate:"생성",st_ready:"준비 완료",st_done:"완료 ✓",st_need_key:"먼저 Gemini API key를 입력하세요",btn_show:"보기",btn_hide:"숨기기",btn_save:"저장",btn_test:"키 테스트",btn_clear:"지우기",btn_cancel:"취소",btn_load:"불러오기",btn_paste:"붙여넣기",btn_improve:"프롬프트 개선",lbl_ratio:"비율",lbl_size:"크기",lbl_quality:"품질"},
lo:{tab_setup:"ຕັ້ງຄ່າ",tab_prompt:"ສະຕູດິໂອ",tab_presets:"ພຣີເຊັດ",tab_retouch:"ຣີທັດ",tab_aitools:"ເຄື່ອງມື AI",tab_create:"ສ້າງ",btn_generate:"ສ້າງພາບ",st_ready:"ພ້ອມ",st_done:"ສຳເລັດ ✓",st_need_key:"ກະລຸນາໃສ່ Gemini API key ກ່ອນ",btn_show:"ສະແດງ",btn_hide:"ເຊື່ອງ",btn_save:"ບັນທຶກ",btn_test:"ທົດສອບ Key",btn_clear:"ລຶບ",btn_cancel:"ຍົກເລີກ",btn_load:"ໂຫຼດ",btn_paste:"ວາງ",btn_improve:"ປັບປຸງ Prompt",lbl_ratio:"ອັດຕາສ່ວນ",lbl_size:"ຂະໜາດ",lbl_quality:"ຄຸນນະພາບ"},
ml:{tab_setup:"സെറ്റപ്പ്",tab_prompt:"സ്റ്റുഡിയോ",tab_presets:"പ്രീസെറ്റ്",tab_retouch:"റീടച്ച്",tab_aitools:"AI ടൂളുകൾ",tab_create:"സൃഷ്ടിക്കുക",btn_generate:"സൃഷ്ടിക്കുക",st_ready:"തയ്യാർ",st_done:"കഴിഞ്ഞു ✓",st_need_key:"ആദ്യം Gemini API key ചേർക്കുക",btn_show:"കാണിക്കുക",btn_hide:"മറയ്ക്കുക",btn_save:"സേവ്",btn_test:"Key പരിശോധിക്കുക",btn_clear:"മായ്ക്കുക",btn_cancel:"റദ്ദാക്കുക",btn_load:"ലോഡ്",btn_paste:"പേസ്റ്റ്",btn_improve:"Prompt മെച്ചപ്പെടുത്തുക",lbl_ratio:"അനുപാതം",lbl_size:"വലുപ്പം",lbl_quality:"നിലവാരം"},
mr:{tab_setup:"सेटअप",tab_prompt:"स्टुडिओ",tab_presets:"प्रीसेट",tab_retouch:"रीटच",tab_aitools:"AI साधने",tab_create:"तयार करा",btn_generate:"तयार करा",st_ready:"तयार",st_done:"झाले ✓",st_need_key:"आधी Gemini API key टाका",btn_show:"दाखवा",btn_hide:"लपवा",btn_save:"जतन करा",btn_test:"Key तपासा",btn_clear:"काढा",btn_cancel:"रद्द",btn_load:"लोड",btn_paste:"पेस्ट",btn_improve:"Prompt सुधारा",lbl_ratio:"गुणोत्तर",lbl_size:"आकार",lbl_quality:"गुणवत्ता"},
ne:{tab_setup:"सेटअप",tab_prompt:"स्टुडियो",tab_presets:"प्रिसेट",tab_retouch:"रिटच",tab_aitools:"AI उपकरण",tab_create:"बनाउनुहोस्",btn_generate:"बनाउनुहोस्",st_ready:"तयार",st_done:"भयो ✓",st_need_key:"पहिले Gemini API key राख्नुहोस्",btn_show:"देखाउनुहोस्",btn_hide:"लुकाउनुहोस्",btn_save:"सेभ",btn_test:"Key जाँच",btn_clear:"हटाउनुहोस्",btn_cancel:"रद्द",btn_load:"लोड",btn_paste:"पेस्ट",btn_improve:"Prompt सुधार्नुहोस्",lbl_ratio:"अनुपात",lbl_size:"आकार",lbl_quality:"गुणस्तर"},
pa:{tab_setup:"ਸੈੱਟਅੱਪ",tab_prompt:"ਸਟੂਡੀਓ",tab_presets:"ਪ੍ਰੀਸੈੱਟ",tab_retouch:"ਰੀਟੱਚ",tab_aitools:"AI ਟੂਲ",tab_create:"ਬਣਾਓ",btn_generate:"ਬਣਾਓ",st_ready:"ਤਿਆਰ",st_done:"ਹੋ ਗਿਆ ✓",st_need_key:"ਪਹਿਲਾਂ Gemini API key ਪਾਓ",btn_show:"ਦਿਖਾਓ",btn_hide:"ਲੁਕਾਓ",btn_save:"ਸੰਭਾਲੋ",btn_test:"Key ਪਰਖੋ",btn_clear:"ਹਟਾਓ",btn_cancel:"ਰੱਦ ਕਰੋ",btn_load:"ਲੋਡ",btn_paste:"ਪੇਸਟ",btn_improve:"Prompt ਸੁਧਾਰੋ",lbl_ratio:"ਅਨੁਪਾਤ",lbl_size:"ਆਕਾਰ",lbl_quality:"ਗੁਣਵੱਤਾ"},
ta:{app_title:"HNK Photoshop Ai பேனல் (மாணவர்கள்)",sec_api:"Gemini API Key",btn_show:"காட்டு",btn_hide:"மறை",btn_test:"Key சோதி",btn_save:"சேமி",st_testing:"Key சோதிக்கப்படுகிறது",st_key_ok:"✓ API key வேலை செய்கிறது",st_key_bad:"API key செயல்படவில்லை",st_key_saved:"API key சேமிக்கப்பட்டது ✓",st_need_key:"முதலில் Gemini API key சேர்க்கவும்",sec_model:"மாடல் & வெளியீடு",scope_model_note:"கீழே உள்ள Prompt தாவலின் Generate பொத்தானுக்கு மட்டுமே இது பயன்படும் — Create மற்றும் AI Tools ஒவ்வொன்றுக்கும் தனித்தனி மாடல் அமைப்புகள் உள்ளன.",model_auto:"ஆட்டோ (பரிந்துரைக்கப்படுகிறது)",model_flash:"Flash — வேகமானது (2.5)",model_pro:"Pro — தரமானது (3.0)",lbl_ratio:"விகிதம்",ratio_auto:"ஆட்டோ விகிதம் (ஆவணத்திலிருந்து)",lbl_size:"அளவு",lbl_quality:"தரம்",qual_auto:"ஆட்டோ",qual_low:"குறைவு",qual_med:"நடுத்தரம்",qual_high:"உயர்",sec_prompt:"Prompt",hint_prompt:"உங்கள் prompt-ஐ இங்கே தட்டச்சு செய்யவும்… (அதிகபட்சம் 20,000 எழுத்துகள்)",btn_improve:"Prompt மேம்படுத்து",btn_clear:"அழி",st_improving:"Prompt மேம்படுத்தப்படுகிறது",st_improved:"Prompt மேம்படுத்தப்பட்டது ✓",sec_refs:"ரெஃபரன்ஸ் படங்கள் (2 இடங்கள்)",base_note:"அடிப்படைப் படம் = செயலில் உள்ள உங்கள் Photoshop ஆவணம் (தானாகவே எடுக்கப்படும்).",btn_ref_layer:"+ லேயர்",btn_ref_file:"கோப்பு",btn_ref_web:"வெப்",st_ref_layer_added:"லேயர் ரெஃபரன்ஸாகச் சேர்க்கப்பட்டது ✓",st_ref_file_added:"கோப்பு ரெஃபரன்ஸாகச் சேர்க்கப்பட்டது ✓",st_importing:"கோப்பு இறக்குமதியாகிறது",url_title:"URL-இலிருந்து ரெஃபரன்ஸ் — Chrome / Pinterest",url_ph:"https://… படத்தின் முகவரி அல்லது Pinterest pin இணைப்பு",btn_paste:"ஒட்டு",btn_load:"ஏற்று",btn_cancel:"ரத்து",st_url_loading:"வெப் படம் பதிவிறக்கப்படுகிறது",st_ref_web_added:"வெப் படம் ரெஃபரன்ஸாகச் சேர்க்கப்பட்டது ✓",st_url_bad:"இந்த URL-இலிருந்து படத்தை ஏற்ற முடியவில்லை — படத்தின் முகவரியை நகலெடுத்து மீண்டும் முயற்சிக்கவும்",no_layer:"லேயர் எதுவும் தேர்ந்தெடுக்கப்படவில்லை",sec_presets:"AI ப்ரீசெட்கள்",auto_run:"ப்ரீசெட் கிளிக் → தானாக Generate (OFF = prompt-இல் மட்டும் சேர்க்கும்)",grp_cleanup:"சுத்தம் செய்யும் கருவிகள்",p_remove_people:"நபர்களை நீக்கு",p_fix_hands:"கூடுதல் கைகளைச் சரிசெய்",p_fix_legs:"கூடுதல் கால்களைச் சரிசெய்",p_full_clean:"முழு சுத்தம்",grp_moved_note:"ரெஃபரன்ஸ் கருவிகள் இப்போது கீழே உள்ள Reference Ops Pro கார்டில் உள்ளன (ஒரே இடத்தில் — தனிநபர்/ஜோடி/குடும்பம் + வழிகாட்டிகளுடன்).",ro_h_detail:"முடி · அணிகலன்கள் · போஸ் (← Ref1)",ro_h_comp:"காம்போசிட் · ஸ்டைல் · உரை (← Ref1)",p_fgbglc:"FG=Doc · BG=Ref1 · Light=Ref2",p_hair:"ஹேர்ஸ்டைல் (← Ref1)",p_access:"நகைகள்+அணிகலன்கள் (← Ref1)",p_pose:"போஸ் பொருத்தம் (Doc → Ref1)",p_fgprops:"FG ப்ராப்ஸ் (← Ref1)",p_textlogo:"உரை / லோகோ (← Ref1)",p_style:"புகைப்பட ஸ்டைல் (← Ref1)",grp_repsubj:"சப்ஜெக்ட்டை மாற்று (Doc → Ref1 காட்சி)",p_rep_solo:"தனிநபரை மாற்று",p_rep_couple:"ஜோடியை மாற்று",p_rep_family:"குடும்பத்தை மாற்று",grp_rmix:"Replace Mix — டிக் செய்து Ref1-இலிருந்து எடு",rm_bg:"பின்னணி (BG)",rm_fg:"முன்னணி (FG)",rm_light:"ஒளியமைப்பு",rm_color:"நிறம்",rm_object:"பொருட்கள் / ப்ராப்ஸ்",btn_rmix:"REPLACE GENERATE",rm_none:"முதலில் குறைந்தது ஒரு அம்சத்தையாவது டிக் செய்யவும்",grp_i2p:"படம் → Prompt (காட்சி உருவாக்கி)",i2p_note:"1) Extract: Ref1 காட்சி → விரிவான உரை prompt (நபர்கள் நீங்கலாக). 2) அதை Prompt பக்கத்தில் திருத்தவும். 3) SCENE GENERATE அதை உங்கள் ஆவணத்தின் சப்ஜெக்ட்டைச் சுற்றி உருவாக்கும் — எந்தக் கோணத்திற்கும் தானாகப் பொருந்தும். முகம்/போஸ்/ஃப்ரேம் பூட்டுகள் = அசல் அப்படியே.",i2p_objects:"பொருட்கள் & ப்ராப்ஸ் விவரம்",i2p_light:"ஒளியமைப்பு விவரம்",i2p_color:"நிறம் / கிரேடு விவரம்",i2p_bg:"பின்னணி விவரம்",i2p_fg:"முன்னணி விவரம்",btn_i2p:"படம் → Prompt (காட்சியைப் பிரித்தெடு)",i2p_fit:"காட்சி ஆட்டோ-பொருத்தம் — ஆவணத்தின் கோணம் / தூரம் / லென்ஸுக்கு ஏற்பக் காட்சியை மறு-அமைக்கும்",i2p_adapt:"சப்ஜெக்ட்டின் ஒளி & நிறத்தைக் காட்சிக்கு ஏற்ப மாற்று",btn_scenegen:"SCENE GENERATE",st_extract:"காட்சி prompt-ஆகப் பிரித்தெடுக்கப்படுகிறது",st_extract_done:"காட்சி prompt தயார் — Prompt பக்கத்தில் சரிபார்க்கவும்",scene_no_prompt:"Prompt பெட்டி காலியாக உள்ளது — முதலில் படம் → Prompt-ஐ இயக்கவும்",i2p_none:"முதலில் குறைந்தது ஒரு விவர அம்சத்தையாவது டிக் செய்யவும்",sec_light:"ஸ்டுடியோ லைட்டிங் — AI Relight",light_note:"விளக்குகளை ON செய்யவும், ஒரு வரிசையைத் தட்டித் தேர்வு செய்யவும், ஸ்லைடர்களால் வடிவமைக்கவும் — 3D மேல்-பார்வை வரைபடம் நேரடியாக மாறும் (▴ = உயரம், ▾ = தாழ்வு). LIGHTING GENERATE உங்கள் ஆவணத்தை இந்த அமைப்புக்கு ஏற்பத் துல்லியமாக மறு-ஒளியூட்டும்; முகம் / போஸ் / ஃப்ரேம் பூட்டப்பட்டே இருக்கும்.",lbl_my_prompt:"மியான்மர் PROMPT",lstage_model:"மாடல்",lstage_cam:"கேம்",l_key:"கீ லைட்",l_fill:"ஃபில் / முன்",l_butterfly:"பட்டர்ஃபிளை (மேல்-முன்)",l_side:"சைட் லைட்",l_rim:"ரிம் லைட்",l_back:"பேக் லைட்",l_hair:"ஹேர் லைட்",l_bglight:"பின்னணி லைட்",lt_softbox:"சாஃப்ட்பாக்ஸ்",lt_octa:"ஆக்டா",lt_strip:"ஸ்ட்ரிப்",lt_umbrella:"அம்ப்ரெல்லா",lt_beauty:"பியூட்டி",lt_hard:"ஹார்ட்",li_int:"தீவிரம்",li_angle:"கோணம்",li_height:"உயரம்",li_dist:"தூரம்",li_size:"அளவு",btn_lightgen:"LIGHTING GENERATE",light_none:"முதலில் குறைந்தது ஒரு விளக்கையாவது ON செய்யவும்",lg_equip:"புகைப்படத்தில் லைட் உபகரணங்களைக் காட்டு (சாஃப்ட்பாக்ஸ் / ஸ்டாண்டுகள் தெரியும்)",grp_chains:"ஸ்டைல் செயின்கள் — ✓ ஸ்டைல்களை இணை",chains_note:"எந்த ஸ்டைல்களையும் ON செய்யலாம் — அவை ஒவ்வொரு Generate / ப்ரீசெட் / ரீடச்சிலும் ஒன்றாகக் கலந்து சேரும்.",grp_restore:"பழைய புகைப்பட மீட்டெடுப்பு",p_restore:"பழைய புகைப்பட மீட்டெடுப்பு",rest_color:"முழு வண்ணம்",rest_bw:"கருப்பு & வெள்ளை",restore_note:"கிழிசல்கள், நீர் / தீக்காயச் சேதம், மங்கல் ஆகியவற்றைச் சரிசெய்யும் — ஒவ்வொரு அசல் முகத்தையும் 100% அப்படியே வைத்திருக்கும்.",rt_browstyle:"புருவ ஸ்டைல்",rt_lashstyle:"இமை ஸ்டைல்",rt_blush:"ப்ளஷ் நிறம்",rt_contour:"கான்டூர் ஸ்டைல்",rt_bust:"மார்பு",rt_butt:"பிட்டம்",rt_thigh:"தொடைகள்",rt_calf:"கெண்டைக்கால்கள்",rt_neck:"கழுத்து",rt_fingers:"விரல்கள்",hint_prompt_my:"မြန်မာလို ရေးပါ — Generate မှာ English အလိုပြောင်းပေးမယ် (အများဆုံး 20,000)",st_translate:"மியான்மர் prompt ஆங்கிலத்தில் மொழிபெயர்க்கப்படுகிறது",live_trans:"Live ⇄ தானியங்கு மொழிபெயர்ப்பு (EN ↔ MY, தட்டச்சை நிறுத்திய பிறகு)",st_retry:"மீண்டும் முயற்சிக்கப்படுகிறது",grp_recipes:"ரெசிபிகள் — அமைப்புகளைச் சேமி / பகிர்",recipe_note:"எல்லாவற்றையும் (செயின்கள், ரீடச், லைட்கள், Keep பூட்டுகள், prompt-கள்) ஒரே .json ரெசிபியாகச் சேமிக்கவும் — மாணவர்கள் அதை Load செய்தால் போதும்.",btn_recipe_save:"ரெசிபியைச் சேமி",btn_recipe_load:"ரெசிபியை ஏற்று",st_recipe_saved:"ரெசிபி சேமிக்கப்பட்டது ✓",st_recipe_loaded:"ரெசிபி ஏற்றப்பட்டது ✓ — எல்லா கட்டுப்பாடுகளும் புதுப்பிக்கப்பட்டன",st_recipe_bad:"இது HNK ரெசிபி கோப்பு அல்ல",sec_final:"இறுதி Prompt (AI-க்கு அனுப்பப்படுவது)",btn_copy:"நகலெடு",st_copied:"நகலெடுக்கப்பட்டது ✓",hist_note:"வரலாறு — கடைசி 6 முடிவுகள், பார்க்கத் தட்டவும்:",btn_hist_prompt:"→ Prompt",sec_batch:"பேட்ச் பயன்முறை",batch_note:"பல புகைப்படங்களையும் + ஒரு அவுட்புட் கோப்புறையையும் தேர்வு செய்யவும் — தற்போதைய prompt, செயின்கள், சுத்தம் மற்றும் Keep பூட்டுகள் ஒவ்வொரு புகைப்படத்திலும் இயங்கும்; முடிவுகள் *_HNK.png ஆகச் சேமிக்கப்படும்.",btn_batch:"பேட்ச்சை இயக்கு",btn_batch_stop:"நிறுத்து",st_batch:"பேட்ச்",st_batch_done:"பேட்ச் முடிந்தது",sec_web:"வெப் AI — மினி பிரவுசர்",web_note:"எந்த வெப் AI எடிட்டரையும் Photoshop-க்குள்ளேயே திறக்கலாம். அங்கே உருவாக்கிய பிறகு, முடிவை லேயராகக் கொண்டு வரலாம்:",web_import_note:"இறக்குமதி: ① வெப் ஆப்பில் Copy image address (படத்தின் முகவரியை நகலெடு) பயன்படுத்தி, பிறகு 'நகலெடுத்த இணைப்பை இறக்குமதி' · ② அல்லது கோப்பைப் பதிவிறக்கி 'கோப்பை இறக்குமதி' பயன்படுத்தவும் · ③ HNK bridge உள்ள கூட்டாளர் வெப் ஆப்கள் படங்களைத் தானாகவே அனுப்பும்.",btn_web_go:"செல்",btn_web_home:"முகப்பு",btn_web_reload:"மீண்டும் ஏற்று",btn_web_import_link:"நகலெடுத்த இணைப்பை இறக்குமதி → PS",btn_web_import_file:"கோப்பை இறக்குமதி → PS",st_web_import:"Photoshop-இல் லேயராக இறக்குமதி செய்யப்பட்டது ✓",st_web_nourl:"முதலில் படத்தின் இணைப்பை நகலெடுக்கவும் (வலது-கிளிக் → Copy image address)",st_web_fetch:"இணைப்பிலிருந்து படத்தைப் பெறுகிறது",st_web_notallowed:"இந்த டொமைன் அனுமதிப் பட்டியலில் இல்லை — வெறுமையாக இருக்கலாம். இதைச் சேர்க்க HNK-ஐக் கேளுங்கள்.",st_need_doc:"முதலில் Photoshop-இல் ஒரு புகைப்பட ஆவணத்தைத் திறக்கவும்",sec_campro:"கேமரா Pro & தரம்",autosave_lbl:"ஒவ்வொரு முடிவையும் தானாக ஏற்றுமதி செய் (PNG + prompt பதிவு → கோப்புறை)",st_folder_ok:"ஏற்றுமதி கோப்புறை அமைக்கப்பட்டது ✓",st_exported:"ஏற்றுமதி செய்யப்பட்டது ✓",st_export_fail:"ஏற்றுமதி தோல்வி — கோப்புறையைச் சரிபார்க்கவும்",st_pro_fallback:"Pro மாடல் கிடைக்கவில்லை — இந்த முறைக்கு Flash-க்கு மாற்றப்பட்டது",st_img_bad:"படத் தரவு ஒருமைப்பாடு சரிபார்ப்பில் தோல்வி — புகைப்படத்தை மீண்டும் சேர்க்கவும்",st_auto_comp:"தானியங்கு காம்போசிட்: IMAGE 1 சப்ஜெக்ட் → ரெஃபரன்ஸ் காட்சி",prov_lbl:"AI வழங்குநர்",oai_key_ph:"sk-... (OpenAI API key)",tab_create:"உருவாக்கு",create_note:"CREATE பயன்முறை — உங்கள் prompt-இலிருந்து முற்றிலும் புதிய படம் (+ அதற்கென 4 ரெஃப்கள்). முழுவதும் தனித்தியங்கும்: ஆவணம், ப்ரீசெட்கள், செயின்கள் அல்லது லாக்குகள் எதையும் படிக்காது.",create_ph:"உருவாக்க விரும்பும் படத்தை விவரிக்கவும்…",btn_create_ps:"⬇ Photoshop-க்கு அனுப்பு",btn_to_ref:"↺ Ref 1 ஆகப் பயன்படுத்து",st_to_ref:"முடிவு Ref 1-இல் ஏற்றப்பட்டது ✓",scope_create_note:"Setup-இன் Model & Output அமைப்புகளிலிருந்து தனித்தது — இவை Create-இன் Generate-க்கு மட்டுமே பொருந்தும்.",cr_ratio:"விகிதம்",cr_var:"மாறுபாடுகள்",cr_restyle:"♻ முடிவை மறுஸ்டைல் செய்",cr_lib:"Prompt நூலகம் — சேர்க்கத் தட்டவும்",cr_improve:"மேம்படுத்து",cr_describe:"Ref 1-ஐ விவரி → Prompt",st_describing:"ரெஃபரன்ஸைப் படிக்கிறது…",st_described:"Ref 1-இலிருந்து prompt எழுதப்பட்டது ✓",st_need_gem:"Gemini API key சேர்க்கவும் (Setup) — இது Gemini உரையைப் பயன்படுத்துகிறது",st_need_ref1:"முதலில் Ref 1-இல் ஒரு படத்தைச் சேர்க்கவும்",st_lib_added:"Prompt சேர்க்கப்பட்டது ✓",cr_refs:"ரெஃபரன்ஸ் படங்கள் (அதிகபட்சம் 4)",cr_refs_note:"விருப்பத்தேர்வு — Layer / File / Web மூலம் சேர்க்கவும். உங்கள் prompt கேட்பதை மட்டுமே Create எடுத்துக்கொள்ளும்.",cr_results:"முடிவுகள்",cr_gal_empty:"இன்னும் முடிவுகள் இல்லை — Generate-ஐத் தட்டவும்.",cr_gal_have:"முடிவு(கள்) · முன்னோட்டம் காண / செயல்படுத்த ஒரு சிறுபடத்தைத் தட்டவும்",cr_save:"⬇ PNG சேமி",cr_engine:"எஞ்சின்",cr_need_result:"முதலில் ஒரு படத்தை உருவாக்கவும்",btn_web_import_url:"⬇ URL இறக்குமதி",st_clip_help:"கிளிப்போர்டு காலி/தடுக்கப்பட்டது — இணைப்பை URL பட்டியில் ஒட்டி, பிறகு ⬇ URL இறக்குமதி-ஐத் தட்டவும்",st_web_blob:"அது தற்காலிக blob: இணைப்பு — வலது-கிளிக் → Copy IMAGE Address பயன்படுத்தவும், அல்லது கோப்பைச் சேமித்து Import File மூலம் சேர்க்கவும்",err_key:"API key தவறானது — Setup தாவலில் key-ஐ மீண்டும் சரிபார்க்கவும் · API key မှားနေ — Setup မှာ ပြန်စစ်ပါ",err_quota:"கோட்டா / வேக வரம்பு — சிறிது நேரம் காத்திருந்து மீண்டும் முயற்சிக்கவும் · Quota ပြည့်/နှုန်းကန့် — ခဏနေပြန်စမ်းပါ",err_big:"API-க்கு படம் மிகப் பெரியது — அளவைக் குறைத்து மீண்டும் முயற்சிக்கவும் · ပုံကြီးလွန်း — ချုံ့ပြီးပြန်စမ်းပါ",err_safety:"பாதுகாப்பு வடிப்பானால் தடுக்கப்பட்டது — prompt அல்லது புகைப்படத்தை மாற்றவும் · Safety ငြင်း — prompt/ပုံ ပြင်ပြီးပြန်စမ်းပါ",err_net:"நெட்வொர்க் / சர்வர் சிக்கல் — மீண்டும் முயற்சிக்கவும் · ကွန်ရက်/ဆာဗာပြစနာ — ပြန်စမ်းပါ",err_timeout:"கோரிக்கை நேரம் முடிந்தது — சர்வர் அதிக நேரம் எடுத்தது; மீண்டும் முயற்சிக்கவும் · အချိန်ပြည့် — ပြန်စမ်းပါ",err_generic:"கோரிக்கையை நிறைவேற்ற முடியவில்லை — மீண்டும் முயற்சிக்கவும்",err_img:"பயன்படுத்தக்கூடிய படம் உருவாகவில்லை — மீண்டும் முயற்சிக்கவும்",err_mode:"இந்த ஆவணம் RGB பயன்முறையில் இல்லை — முதலில் மாற்றவும் (Image ▸ Mode ▸ RGB Color), பிறகு மீண்டும் முயற்சிக்கவும்",cam_master:"கேமரா தொகுதி ON — ஒவ்வொரு prompt-இன் இறுதியிலும் சேர்க்கப்படும்",cam_body:"கேமரா பாடி",cam_lens:"ப்ரைம் லென்ஸ் (mm)",cam_f:"அபெர்ச்சர்",cam_film:"ஃபிலிம் லுக்",cam_bokeh:"போகே ஸ்டைல்",cam_iso:"ISO",cam_k:"WB கெல்வின்",cam_note:"தொகுதியை ON செய்து, தேவையானதை மட்டும் தேர்வு செய்யவும் — – சிப்கள் எதுவும் சேர்க்காது. அனைத்தும் இறுதி prompt-இன் கடைசியில் சேரும்.",ro_h_main:"ரெஃபரன்ஸ் ஆப்ஸ் PRO (Ref1 / Ref2)",ro_note:"Ref1 = IMAGE 2 (பெண்) · Ref2 = IMAGE 3 (ஆண்). ஒரு இலக்கைத் தேர்ந்தெடுத்து, பிறகு ஒரு செயல்பாட்டை இயக்கவும் — பொருந்தாத நபர்கள் ஒருபோதும் மாற மாட்டார்கள்.",ro_target:"இலக்கு:",ro_solo:"தனி",ro_couple:"ஜோடி",ro_family:"குடும்பம்",ro_mk:"ரெஃப் மேக்கப்பை நகலெடு",ro_hair:"ரெஃப் ஹேர்ஸ்டைலை எடு",ro_h_face:"முக ஆப்ஸ்",ro_h_bg:"BG / FG ஆப்ஸ்",ro_h_sub:"சப்ஜெக்ட் ஆப்ஸ்",ro_h_lc:"ஒளி & வண்ண ஆப்ஸ்",ro_h_dress:"உடை ஆப்ஸ்",ro_h_mk:"மேக்கப் ஆப்ஸ்",ro_h_match:"★ மாஸ்டர் மேட்ச் (ஒரே லுக்)",ro_match_note:"IMAGE 1-ஐ ரெஃபரன்ஸுடன் பொருத்தி இரண்டும் ஒரே எடிட் போலத் தோன்றச் செய்யும் — எதைப் பொருத்த வேண்டுமோ அதைத் டிக் செய்யவும்:",m_color:"வண்ணம்",m_light:"ஒளி",m_makeup:"மேக்கப்",m_skin:"சரும ரீடச்",crd_pipe:"⛓ பைப்லைன் பில்டர் — எதையும் சங்கிலியாக இணைக்கலாம்",pipe_note:"எந்தப் படிகளையும் ஒரே சங்கிலியாக இணைக்கவும் — ஒவ்வொரு படியின் முடிவும் அடுத்த படிக்குச் செல்லும். அதிகபட்சம் 6.",pipe_add:"+ சேர்",pipe_run:"▶ பைப்லைனை இயக்கு",pipe_clear:"அழி",pipe_retouch:"ரீடச் அப்ளை (தற்போதைய ஸ்லைடர்கள்)",pipe_relight:"ரீலைட் (தற்போதைய ஒளி அமைப்பு)",pipe_prompt:"Prompt (தற்போதைய EN பெட்டி)",pipe_empty:"முதலில் குறைந்தது ஒரு படியைச் சேர்க்கவும்",pipe_max:"பைப்லைன் நிரம்பியது (அதிகபட்சம் 6 படிகள்)",st_pipe:"பைப்லைன் படி",st_pipe_done:"பைப்லைன் முடிந்தது",st_pipe_stop:"பைப்லைன் நிறுத்தப்பட்டது (ஒரு படி தோல்வியடைந்தது)",pipe_merge:"⚡ ஒன்-ஷாட் இணைப்பு — எல்லாப் படிகளும் ஒரே அழைப்பில் (வேகம்/சிக்கனம் · ≤ 3 பணிகளுக்குச் சிறந்தது)",crd_chainsrest:"ஸ்டைல் செயின்கள் + பழைய புகைப்பட மீட்டமைப்பு",crd_refops:"ரெஃபரன்ஸ் ஆப்ஸ் ப்ரோ (Ref1 / Ref2)",crd_scenes:"🎬 சீன்ஸ் ப்ரோ — லாக் செய்த சப்ஜெக்ட் · பொருந்தும் காட்சி",scn_note:"உங்கள் சப்ஜெக்டை லாக் செய்து (முகம் · போஸ் · உடை · ஃப்ரேம்) முழுக் காட்சியையும் அவர்களுக்குப் பொருந்த மறு-உருவாக்கும் — ஒளி, நிழல், வண்ணம், பின்னணி, முன்னணி, பொருள்கள் அனைத்தும் உண்மையான புகைப்படத் தோற்றத்திற்குத் தானாகவே பொருந்திக்கொள்ளும்.",scn_h_style:"காட்சி ஸ்டைல் (உட்புறம் / கலாச்சாரம்)",scn_h_bday:"🎂 பிறந்தநாள் — வயது எண் 1–45",scn_h_cap:"தலைப்பு / உரை (குழந்தை · Miss Universe · பிறந்தநாள்)",scn_h_scarf:"வெளிப்புறம் / பறக்கும் ஸ்கார்ஃப்",scn_grad:"பட்டமளிப்பு உட்புறம்",scn_prewed:"ப்ரீவெடிங் உட்புறம்",scn_vietnam:"வியட்நாம்",scn_myanmar:"மியான்மர்",scn_chinese:"சீன",scn_shan:"ஷான்",scn_newborn:"பச்சிளம் குழந்தை / பேபி",scn_age:"வயது",scn_bday_go:"🎂 பிறந்தநாள் காட்சி",scn_cap_on:"தலைப்பு உரையைச் சேர்",scn_cap_ph:"தலைப்பு உரை (எ.கா. Happy 1st Birthday, பெயர்)…",scn_cap_pos:"இடம்",scn_top:"மேலே",scn_bottom:"கீழே",scn_scarf:"✦ பறக்கும் ஸ்கார்ஃப் காட்சி",scn_dir:"திசை",scn_left:"இடது",scn_right:"வலது",scn_up:"மேல்",scn_len:"நீளம்",scn_short:"குட்டை",scn_long:"நீண்டது",g_cat_scene:"காட்சி OP — உங்கள் சப்ஜெக்ட் லாக் செய்யப்பட்டுள்ளது (முகம் · போஸ் · உடை · ஃப்ரேம்); உருவாக்கப்படும் முழுக் காட்சியும் (ஒளி, நிழல், வண்ணம், பின்னணி, முன்னணி, பொருள்கள், சூழல்) உண்மையான புகைப்படக் காம்போசிட்டுக்காக சப்ஜெக்டுடன் தானாகப் பொருத்தப்படும்.",crd_wed:"♥ திருமண ப்ரோ தொகுப்பு",crd_recipes:"ரெசிபிகள் — சேமி / பகிர்",learn_lbl:"🎓 கற்றல் பயன்முறை — 1-ஆம் தட்டு = வழிகாட்டி (மஞ்சள்), 2-ஆம் = prompt (நீலம்), 3-ஆம் = இயக்கு (பச்சை)",guide_hint:"மீண்டும் தட்டவும்: மஞ்சள் → நீலம் (prompt) → பச்சை (இயக்கு) ▶",g_learn_next_prompt:"மீண்டும் தட்டவும் → சரியான PROMPT-ஐக் காட்டும் (நீலம்).",g_learn_prompt_head:"இந்தப் பொத்தான் அனுப்பும் PROMPT (மீண்டும் தட்டினால் = இயக்கம்):",g_learn_next_run:"இன்னொரு முறை தட்டவும் → இயக்கு (பச்சை) உருவாக்கும்.",st_prompt_ready:"Prompt தயார் — இயக்க மீண்டும் தட்டவும் (பச்சை) ✓",g_step_doc:"முதலில் உங்கள் புகைப்பட ஆவணத்தை Photoshop-இல் திறக்கவும்.",g_step_ref1:"ரெஃபரன்ஸ் படத்தை Ref1-இல் ஏற்றவும் (அது IMAGE 2 ஆகும்). இரண்டாவது நபருக்கு Ref2 சேர்க்கவும்.",g_step_target:"இலக்கைத் தேர்ந்தெடுக்கவும்: தனி / ஜோடி (Ref1 = பெண், Ref2 = ஆண்) / குடும்பம்.",g_step_mkhair:"விருப்பம்: முக ஆப்ஸுக்கு மேலே உள்ள ‘ரெஃப் மேக்கப்பை நகலெடு’ / ‘ரெஃப் ஹேர்ஸ்டைலை எடு’ என்பதைத் டிக் செய்யவும்.",g_step_petal:"முதலில் இதழ் வண்ணத்தைத் தேர்ந்தெடுக்கவும் (auto = உங்கள் காட்சிக்குப் பொருந்தும்).",g_step_rest:"மேலே உள்ள ✓ மூலம் முழு வண்ணம் அல்லது B&W தேர்வு செய்யவும்.",g_step_int:"தீவிரம் ஸ்லைடரை விருப்பப்படி அமைக்கவும்.",g_step_confirm:"முன்னேற மீண்டும் தட்டவும்: வழிகாட்டி (மஞ்சள்) → PROMPT (நீலம்) → இயக்கு (பச்சை உருவாக்கும்).",g_cat_face:"முக OP — ரெஃபரன்ஸ் முகத்தைப் பொருந்தும் நபருக்கு மாற்றும்; மற்ற அனைவரும் மாறாமல் இருப்பார்கள்.",g_cat_sub:"சப்ஜெக்ட் OP — ரெஃபரன்ஸ் நபரை உங்கள் காட்சிக்குள் கொண்டுவரும்/உருமாற்றும்; காட்சியும் ஃப்ரேமிங்கும் அப்படியே இருக்கும்.",g_cat_bgfg:"BG/FG OP — ரெஃபரன்ஸைப் பயன்படுத்தி பின்னணி / முன்னணியை மட்டும் மாற்றும்.",g_cat_lc:"ஒளி & வண்ண OP — ரெஃபரன்ஸின் ஒளியமைப்பையும் கலர் கிரேடையும் நகலெடுக்கும்; நபர்கள் பிக்சல் அளவில் மாறாமல் இருப்பார்கள்.",g_cat_dress:"உடை OP — ரெஃபரன்ஸைப் பயன்படுத்தி உடையை மட்டும் மாற்றும்.",g_cat_mkop:"மேக்கப் OP — ரெஃபரன்ஸைப் பயன்படுத்தி மேக்கப்பை மட்டும் மாற்றும்.",g_cat_match:"மாஸ்டர் மேட்ச் — உங்கள் புகைப்படத்தை ரெஃபரன்ஸின் முழு லுக்குடன் பொருத்தும் (மேலே உள்ள அடுக்குகளைத் டிக் செய்யவும்).",g_cat_trail:"வெடிங் ட்ரெயில் — ஆடம்பரப் புல் + பாயும் மலர்ப் பாதை; முகங்கள்/போஸ்/ஃப்ரேம் முழுமையாக லாக் செய்யப்படும்.",g_cat_veil:"பறக்கும் முக்காடு — இந்த நீளத்தில் காற்றில் பறக்கும் முக்காட்டைச் சேர்க்கும்/நீட்டிக்கும்; முகம் ஒருபோதும் மறைக்கப்படாது.",g_cat_gown:"கவுன் — தற்போதைய கவுனைச் சுத்தப்படுத்தி (வடிவமைப்பு மாறாது) இந்த டிரெயின் நீளத்தை அமைக்கும்.",g_cat_petal:"பறக்கும் இதழ்கள் — இந்த ஸ்டைலில் காற்றில் இதழ்களைச் சேர்க்கும்; வண்ணம் மேலே உள்ள ஸ்வாட்சிலிருந்து.",g_cat_wedx:"வெடிங் எக்ஸ்ட்ரா — உங்கள் காட்சிக்குப் பொருந்தும் வகையில் இந்த உறுப்பைச் சேர்க்கும்; சப்ஜெக்ட் லாக்கிலேயே இருக்கும்.",g_cat_canvas:"மாற்று (கேன்வாஸ்) — உங்கள் சப்ஜெக்டை ரெஃபரன்ஸின் காட்சிக்குள் வைக்கும்; ரெஃப் நபர்கள் நீக்கப்படுவர்.",g_cat_restore:"பழைய புகைப்பட மீட்டமைப்பு — சேதங்களைச் சரிசெய்யும்; ஒவ்வொரு அசல் முகமும் 100% அப்படியே இருக்கும்.",g_cat_generic:"ப்ரீசெட் — இந்த ப்ரொஃபஷனல் எடிட்டை உங்கள் புகைப்படத்தில் பயன்படுத்தும்.",g_gen:"GENERATE — உங்கள் ஆவணத்தில் prompt பெட்டியை (+ செயின்கள், கீப்கள், கேமரா தொகுதி) இயக்கும்.",g_retouchbtn:"ரீடச் அப்ளை — உங்கள் எல்லா ஸ்லைடர் அமைப்புகளையும் ஒரே ப்ரொஃபஷனல் ரீடச் பாஸாக இயக்கும்.",g_relightbtn:"ஒளியமைப்பு GENERATE — உங்கள் 3D ஒளி வரைபடத்தின்படி புகைப்படத்தைத் துல்லியமாக மறு-ஒளியமைக்கும்.",g_scene:"காட்சி GENERATE — பிரித்தெடுத்த prompt-இலிருந்து காட்சியை மறு-உருவாக்கும்; சப்ஜெக்ட் அப்படியே இருக்கும்.",g_rmix:"REPLACE MIX — ரெஃபரன்ஸிலிருந்து ✓ டிக் செய்த பகுதிகளை மட்டும் மாற்றும்.",g_pipe:"பைப்லைனை இயக்கு — சங்கிலியிலுள்ள ஒவ்வொரு படியையும் வரிசையாக இயக்கும்; ஒவ்வொரு முடிவும் அடுத்ததற்குச் செல்லும்.",ro_faceRep:"முக மாற்றீடு",ro_faceSwap:"முக ஸ்வாப்",ro_bgRep:"BG மாற்றீடு",ro_bgSwap:"BG ஸ்வாப்",ro_fgRep:"FG மாற்றீடு",ro_bg_note:"Doc = சப்ஜெக்ட் · Ref1 = புதிய காட்சி. Target (Solo/Couple/Family) யாரை வைத்திருப்பது என்பதைத் தேர்வுசெய்கிறது.",ro_bg_frame:"ஃபிரேம் & காட்சியமைப்பைத் தக்கவை",ro_bg_light:"சப்ஜெக்ட்டின் ஒளி/நிறத்தைப் பாதுகாக்கவும்",ro_subSwap:"நபர் மாற்றம்",ro_lcRef:"L&C ரெஃபரன்ஸ்",ro_lcCopy:"L&C காப்பி-பேஸ்ட்",ro_dressRef:"உடை ரெஃபரன்ஸ்",ro_dressRep:"உடை மாற்றம்",ro_mkCopy:"மேக்கப் காப்பி",ro_matchBtn:"★ மாஸ்டர் மேட்ச்",grp_retouch:"சரும ரீடச் ப்ரீசெட்கள்",lbl_intensity:"தீவிரம்",p_evoto:"Evoto ஸ்டைல்",p_meitu:"Meitu ஸ்டைல்",auto_place:"முடிவை Photoshop-இல் புதிய லேயராகத் தானாக வைக்கவும்",sec_retouchpro:"ரீடச் ப்ரோ — ஸ்லைடர்கள்",rt_skin:"சருமம்",rt_faceai:"முக AI",rt_hair:"முடி",rt_dress:"உடை",rt_bg:"பின்னணி",rt_smooth:"சரும மென்மை",rt_acne:"பரு நீக்கம்",rt_spots:"கரும்புள்ளிகள்",rt_wrinkle:"சுருக்கங்கள்",rt_tone:"வெளுப்பு / டேன்",rt_glow:"பொலிவு",rt_reshape:"AI ரீஷேப்",rt_lash:"இமை முடி",rt_brow:"புருவங்கள்",rt_lipsmooth:"உதடு மென்மை",rt_lipcolor:"உதடு நிறம்",rt_lenscolor:"லென்ஸ் நிறம்",rt_hairstray:"சிதறிய முடி",rt_hairsmooth:"முடி மென்மை",rt_hairshine:"முடி பளபளப்பு (D&B)",rt_dresssmooth:"துணி மென்மை",rt_dressedge:"விளிம்பு சுத்தம்",rt_dresswrinkle:"சுருக்கம் நீக்கம்",rt_dresstexture:"டெக்ஸ்சர் மீட்பு",rt_bgsmooth:"பின்னணி சுத்தம்/மென்மை",rt_bgcolor:"பின்னணி நிறம்",rt_bgrecolor:"பின்னணி நிற மென்மை",rt_shape:"ரீஷேப் ப்ரோ (முகம் + உடல்)",rt_teeth:"பல் வெண்மை",rt_eyewhite:"கண் வெள்ளைப் பகுதி சுத்தம்",rt_faceslim:"முக மெலிவு",rt_jaw:"தாடைக் கோடு",rt_chin:"மோவாய்",rt_nosesize:"மூக்கு அளவு",rt_eyesize:"கண் அளவு",rt_lipfull:"உதடு திரட்சி",rt_waist:"இடை மெலிவு",rt_bodyslim:"உடல் மெலிவு",rt_shoulder:"தோள்கள்",rt_hip:"இடுப்பு மெலிவு",rt_leglen:"கால் நீளம்",rt_armslim:"கை மெலிவு",rt_dressfit:"உடை பொருத்தம்",rt_dressclean:"உடை சுத்தம்",rt_dresscolorpure:"உடை நிறத் தூய்மை",rt_bodygrp:"உடல் சருமம் ப்ரோ",rt_bodysmooth:"உடல் சரும மென்மை",rt_bodyblemish:"உடல் கறை சுத்தம்",rt_bodytone:"உடல் சீரான நிறம்",rt_bodyglow:"உடல் பொலிவு",rt_bodyhairrm:"உடல் முடி குறைப்பு",rt_hairvolume:"முடி அடர்த்தி",rt_hairgloss:"முடி மினுமினுப்பு",rt_hairfill:"முடி நிரப்பல் (மெலிந்த பகுதிகள்)",wp_h_trail:"♥ திருமணம் — சொகுசு மலர்ப் பாதை",wp_h_veil:"♥ திருமணம் — பறக்கும் முக்காடு",wp_h_gown:"♥ திருமணம் — கவுன் சுத்தம் + ட்ரெயின்",wp_h_petal:"♥ திருமணம் — பறக்கும் மலர் இதழ்கள்",wp_h_extra:"♥ திருமணம் — குதிரை · நீர் · மூட்",wp_note:"முக அடையாளம் / போஸ் / ஃபிரேம் / உடை டிசைன் உறுதியாகப் பூட்டப்பட்டுள்ளன — குறிப்பிடப்பட்ட உறுப்பு மட்டுமே மாறும்.",wp_petalcolor:"இதழ் நிறம் (auto = காட்சிப் பொருத்தம்)",wp_trail_c:"மலர் நிறம்",wp_trail_go:"▶ மலர்ப் பாதை",wp_veil_c:"முக்காடு நீளம்",wp_veil_go:"▶ பறக்கும் முக்காடு",wp_gown_c:"ட்ரெயின் நீளம்",wp_gown_go:"▶ கவுன் சுத்தம் + ட்ரெயின்",wp_pet_c:"இதழ் ஸ்டைல்",wp_pet_go:"▶ பறக்கும் இதழ்கள்",wp_extra_c:"கூடுதல்",wp_extra_go:"▶ கூடுதல் சேர்",btn_apply_rt:"ரீடச்சைப் பயன்படுத்து",btn_reset:"மீட்டமை",rt_none:"முதலில் ஏதேனும் ஒரு ரீடச் ஸ்லைடரையோ நிறத்தையோ அமைக்கவும்",tab_setup:"அமைப்பு",tab_prompt:"ஸ்டுடியோ",tab_presets:"ப்ரீசெட்",recent_lbl:"சமீபத்திய prompt-கள்…",tab_retouch:"ரீடச்",tab_aitools:"AI கருவிகள்",cap_warn:"இந்த prompt பெட்டிக்கான Photoshop வரம்பு:",cleanup_note:"டிக் செய்யப்பட்டவை ஒவ்வொரு 'உருவாக்கு' / ப்ரீசெட்டுடனும் சேர்ந்து இயங்கும்.",btn_generate:"உருவாக்கு",st_ready:"தயார்",st_capture:"ஆவணம் எடுக்கப்படுகிறது",st_gen:"உருவாக்கப்படுகிறது…",st_place:"Photoshop-இல் வைக்கப்படுகிறது…",st_placed_masked:"லேயர் + மாஸ்க் குழுவாக வைக்கப்பட்டது — அசல் அப்படியே உள்ளது ✓",st_placed_plain:"சாதாரண லேயராக வைக்கப்பட்டது (இந்த ஹோஸ்டில் மாஸ்க்/குழு கிடைக்கவில்லை)",stage_queued:"வரிசையில்",stage_uploading:"பதிவேற்றம்",stage_generating:"உருவாக்கம்",stage_downloading:"பதிவிறக்கம்",stage_placing:"வைத்தல்",st_done:"முடிந்தது ✓",st_err:"பிழை",st_no_doc:"செயலில் உள்ள ஆவணம் இல்லை — முதலில் ஒரு புகைப்படத்தைத் திறக்கவும்",st_no_prompt:"Prompt காலியாக உள்ளது",need_ref:"இந்த ப்ரீசெட்டுக்கு ஸ்லாட் 1-இல் ஒரு ரெஃபரன்ஸ் படம் தேவை",st_new_doc:"முடிவு புதிய ஆவணமாகத் திறக்கப்பட்டது ✓",sec_preview:"முன்னோட்டம் — முன் / பின்",before:"முன்",after:"பின்",btn_place:"Photoshop-இல் வை",btn_saveas:"இவ்வாறு சேமி…",st_saved:"சேமிக்கப்பட்டது ✓",sec_diag:"சிஸ்டம் சரிபார்ப்பு",sec_log:"செயல்பாட்டுப் பதிவு",btn_diag:"சரிபார்ப்பை இயக்கு",btn_copylog:"பதிவை நகலெடு",btn_clearlog:"அழி",diag_host:"Photoshop ஹோஸ்ட்",diag_uxp:"UXP திறன்கள்",diag_gem:"Gemini API key",diag_oai:"OpenAI API key",diag_doc:"செயலில் உள்ள ஆவணம்",diag_set:"அமைக்கப்பட்டது",diag_unset:"அமைக்கப்படவில்லை",diag_open:"திறந்துள்ளது",diag_none:"எதுவும் திறக்கவில்லை",diag_missing:"காணவில்லை",diag_done:"சிஸ்டம் சரிபார்ப்பு முடிந்தது ✓",diag_lib:"ரெஃபரன்ஸ் லைப்ரரி",diag_lib_open:"கோப்புறை திறக்கும் திறன்",sec_reflib:"ரெஃபரன்ஸ் பட லைப்ரரி",reflib_note:"உங்களுக்குப் பிடித்த ரெஃபரன்ஸ் படங்களின் கோப்புறையை ஒருமுறை தேர்வுசெய்யுங்கள் — 'உலாவு' அதை நினைவில் வைத்து எங்கும் அதற்குள்ளேயே திறக்கும்.",btn_browse:"உலாவு",lib_choose:"கோப்புறையைத் தேர்வுசெய்",lib_open:"கோப்புறையைத் திற",lib_change:"கோப்புறையை மாற்று",lib_reset:"மீட்டமை",lib_rescan:"மீண்டும் ஸ்கேன்",lib_current:"தற்போதைய கோப்புறை",lib_found:"கண்டறிந்த படங்கள்",lib_status:"நிலை",lib_lastscan:"கடைசி ஸ்கேன்",lib_images:"படங்கள்",lib_connected:"இணைக்கப்பட்டது",lib_not_config:"கட்டமைக்கப்படவில்லை",lib_perm_lost:"அனுமதி இழக்கப்பட்டது — மீண்டும் தேர்வுசெய்யவும்",lib_none:"(கோப்புறை தேர்வு செய்யப்படவில்லை)",lib_copy_only:"பாதையை மட்டும் நகலெடு",lib_choose_msg:"உங்கள் HNK ரெஃபரன்ஸ் பட லைப்ரரி கோப்புறையைத் தேர்வுசெய்யவும்.",lib_scanning:"லைப்ரரி ஸ்கேன் செய்யப்படுகிறது…",lib_scan_done:"மீண்டும் ஸ்கேன் முடிந்தது ✓",lib_reset_done:"லைப்ரரி மீட்டமைக்கப்பட்டது ✓",lib_path_copied:"பாதை நகலெடுக்கப்பட்டது",lib_unsupported:"ஆதரிக்கப்படாத பட வகை",lib_restore_fail:"ரெஃபரன்ஸை மீட்டெடுக்க முடியவில்லை",on:"ஆன்",off:"ஆஃப்"},
te:{app_title:"HNK Photoshop Ai ప్యానెల్ (విద్యార్థులు)",sec_api:"Gemini API Key",btn_show:"చూపించు",btn_hide:"దాచు",btn_test:"Key పరీక్ష",btn_save:"సేవ్",st_testing:"కీని పరీక్షిస్తోంది",st_key_ok:"✓ API key పని చేస్తోంది",st_key_bad:"API key విఫలమైంది",st_key_saved:"API key సేవ్ అయింది ✓",st_need_key:"ముందుగా Gemini API key ఇవ్వండి",sec_model:"మోడల్ & అవుట్‌పుట్",scope_model_note:"ఇది కింద ఉన్న Prompt ట్యాబ్‌లోని జనరేట్ బటన్‌కు మాత్రమే వర్తిస్తుంది — Create, AI Tools లకు వేటికవే ప్రత్యేక మోడల్ సెట్టింగ్‌లు ఉంటాయి.",model_auto:"ఆటో (సిఫార్సు చేయబడింది)",model_flash:"Flash — వేగం (2.5)",model_pro:"Pro — నాణ్యత (3.0)",lbl_ratio:"నిష్పత్తి",ratio_auto:"ఆటో నిష్పత్తి (డాక్యుమెంట్ నుండి)",lbl_size:"పరిమాణం",lbl_quality:"నాణ్యత",qual_auto:"ఆటో",qual_low:"తక్కువ",qual_med:"మధ్యస్థం",qual_high:"అధికం",sec_prompt:"Prompt",hint_prompt:"మీ prompt ఇక్కడ టైప్ చేయండి… (గరిష్ఠంగా 20,000 అక్షరాలు)",btn_improve:"Prompt మెరుగుపరచు",btn_clear:"తొలగించు",st_improving:"Prompt మెరుగుపరుస్తోంది",st_improved:"Prompt మెరుగుపడింది ✓",sec_refs:"రిఫరెన్స్ చిత్రాలు (2 స్లాట్‌లు)",base_note:"బేస్ చిత్రం = మీ యాక్టివ్ Photoshop డాక్యుమెంట్ (ఆటోమేటిక్‌గా తీసుకోబడుతుంది).",btn_ref_layer:"+ లేయర్",btn_ref_file:"ఫైల్",btn_ref_web:"వెబ్",st_ref_layer_added:"లేయర్ రిఫరెన్స్‌గా జోడించబడింది ✓",st_ref_file_added:"ఫైల్ రిఫరెన్స్‌గా జోడించబడింది ✓",st_importing:"ఫైల్ దిగుమతి అవుతోంది",url_title:"URL నుండి రిఫరెన్స్ — Chrome / Pinterest",url_ph:"https://… చిత్ర చిరునామా లేదా Pinterest పిన్ లింక్",btn_paste:"పేస్ట్",btn_load:"లోడ్",btn_cancel:"రద్దు",st_url_loading:"వెబ్ చిత్రం డౌన్‌లోడ్ అవుతోంది",st_ref_web_added:"వెబ్ చిత్రం రిఫరెన్స్‌గా జోడించబడింది ✓",st_url_bad:"ఈ URL నుండి చిత్రం లోడ్ కాలేదు — చిత్ర చిరునామాను కాపీ చేసి మళ్లీ ప్రయత్నించండి",no_layer:"ఏ లేయర్ ఎంపిక కాలేదు",sec_presets:"AI ప్రీసెట్‌లు",auto_run:"ప్రీసెట్ క్లిక్ → ఆటో జనరేట్ (OFF = promptలో మాత్రమే చేరుస్తుంది)",grp_cleanup:"క్లీనప్ టూల్స్",p_remove_people:"వ్యక్తులను తొలగించు",p_fix_hands:"అదనపు చేతులు సరిచేయి",p_fix_legs:"అదనపు కాళ్లు సరిచేయి",p_full_clean:"పూర్తి క్లీనప్",grp_moved_note:"రిఫరెన్స్ టూల్స్ ఇప్పుడు కింద ఉన్న Reference Ops Pro కార్డ్‌లో ఉన్నాయి (అన్నీ ఒకే చోట — సోలో/జంట/కుటుంబం + గైడ్‌లతో).",ro_h_detail:"జుట్టు · యాక్సెసరీలు · భంగిమ (← Ref1)",ro_h_comp:"కాంపోజిట్ · స్టైల్ · టెక్స్ట్ (← Ref1)",p_fgbglc:"FG=Doc · BG=Ref1 · Light=Ref2",p_hair:"హెయిర్‌స్టైల్ (← Ref1)",p_access:"నగలు+యాక్సెసరీలు (← Ref1)",p_pose:"భంగిమ మ్యాచ్ (Doc → Ref1)",p_fgprops:"FG ప్రాప్స్ (← Ref1)",p_textlogo:"టెక్స్ట్ / లోగో (← Ref1)",p_style:"ఫోటో స్టైల్ (← Ref1)",grp_repsubj:"సబ్జెక్ట్ రీప్లేస్ (Doc → Ref1 సన్నివేశం)",p_rep_solo:"సోలో రీప్లేస్",p_rep_couple:"జంట రీప్లేస్",p_rep_family:"కుటుంబం రీప్లేస్",grp_rmix:"రీప్లేస్ మిక్స్ — టిక్ చేసి Ref1 నుండి తీసుకోండి",rm_bg:"నేపథ్యం (BG)",rm_fg:"ముందుభాగం (FG)",rm_light:"లైటింగ్",rm_color:"రంగు",rm_object:"వస్తువులు / ప్రాప్స్",btn_rmix:"రీప్లేస్ జనరేట్",rm_none:"ముందుగా కనీసం ఒక అంశాన్ని టిక్ చేయండి",grp_i2p:"చిత్రం → Prompt (సీన్ బిల్డర్)",i2p_note:"1) ఎక్స్‌ట్రాక్ట్: Ref1 సన్నివేశం → వివరమైన టెక్స్ట్ prompt (వ్యక్తులు ఉండరు). 2) దాన్ని Prompt పేజీలో సవరించండి. 3) సీన్ జనరేట్ దాన్ని మీ డాక్యుమెంట్ సబ్జెక్ట్ చుట్టూ నిర్మిస్తుంది — ఏ కోణానికైనా ఆటోగా సరిపోతుంది. ముఖం/భంగిమ/ఫ్రేమ్ లాక్‌లు = ఒరిజినల్ అలాగే ఉంటాయి.",i2p_objects:"వస్తువులు & ప్రాప్స్ వివరాలు",i2p_light:"లైటింగ్ వివరాలు",i2p_color:"రంగు / గ్రేడ్ వివరాలు",i2p_bg:"నేపథ్యం వివరాలు",i2p_fg:"ముందుభాగం వివరాలు",btn_i2p:"చిత్రం → Prompt (సీన్ ఎక్స్‌ట్రాక్ట్)",i2p_fit:"సీన్ ఆటో-ఫిట్ — సన్నివేశాన్ని డాక్యుమెంట్ కోణం / దూరం / లెన్స్‌కు తగినట్లు మళ్లీ అమర్చుతుంది",i2p_adapt:"సబ్జెక్ట్ లైట్ & రంగును సన్నివేశానికి సర్దుబాటు చేయి",btn_scenegen:"సీన్ జనరేట్",st_extract:"సన్నివేశాన్ని promptగా మారుస్తోంది",st_extract_done:"సీన్ prompt సిద్ధం — Prompt పేజీలో సమీక్షించండి",scene_no_prompt:"Prompt బాక్స్ ఖాళీగా ఉంది — ముందుగా చిత్రం → Prompt రన్ చేయండి",i2p_none:"ముందుగా కనీసం ఒక వివరాల అంశాన్ని టిక్ చేయండి",sec_light:"స్టూడియో లైటింగ్ — AI రీలైట్",light_note:"లైట్‌లను ON చేయండి, వరుసను ఎంచుకోవడానికి దానిపై ట్యాప్ చేయండి, స్లయిడర్‌లతో మలచండి — 3D టాప్-వ్యూ డయాగ్రామ్ లైవ్‌గా మారుతూ ఉంటుంది (▴ = ఎత్తుగా, ▾ = కిందుగా). లైటింగ్ జనరేట్ మీ డాక్యుమెంట్‌ను సరిగ్గా ఈ సెటప్ ప్రకారం రీలైట్ చేస్తుంది; ముఖం / భంగిమ / ఫ్రేమ్ లాక్ అయ్యే ఉంటాయి.",lbl_my_prompt:"మయన్మార్ PROMPT",lstage_model:"మోడల్",lstage_cam:"కెమెరా",l_key:"కీ లైట్",l_fill:"ఫిల్ / ఫ్రంట్",l_butterfly:"బటర్‌ఫ్లై (పైన-ముందు)",l_side:"సైడ్ లైట్",l_rim:"రిమ్ లైట్",l_back:"బ్యాక్ లైట్",l_hair:"హెయిర్ లైట్",l_bglight:"బ్యాక్‌గ్రౌండ్ లైట్",lt_softbox:"సాఫ్ట్‌బాక్స్",lt_octa:"ఆక్టా",lt_strip:"స్ట్రిప్",lt_umbrella:"అంబ్రెల్లా",lt_beauty:"బ్యూటీ",lt_hard:"హార్డ్",li_int:"తీవ్రత",li_angle:"కోణం",li_height:"ఎత్తు",li_dist:"దూరం",li_size:"పరిమాణం",btn_lightgen:"లైటింగ్ జనరేట్",light_none:"ముందుగా కనీసం ఒక లైట్‌ను ON చేయండి",lg_equip:"ఫోటోలో లైట్ పరికరాలు చూపించు (సాఫ్ట్‌బాక్స్ / స్టాండ్‌లు కనిపిస్తాయి)",grp_chains:"స్టైల్ చెయిన్స్ — ✓ స్టైల్స్ కలపండి",chains_note:"ఏ స్టైల్స్ అయినా ON చేయండి — అవి ప్రతి జనరేట్ / ప్రీసెట్ / రీటచ్‌లోనూ కలిసి మిళితమవుతాయి.",grp_restore:"పాత ఫోటో పునరుద్ధరణ",p_restore:"పాత ఫోటో పునరుద్ధరణ",rest_color:"పూర్తి రంగు",rest_bw:"నలుపు & తెలుపు",restore_note:"చిరుగులు, నీరు / కాలిన నష్టం, రంగు వెలిసిపోవడం సరిచేస్తుంది — ప్రతి ఒరిజినల్ ముఖాన్ని 100% అలాగే ఉంచుతుంది.",rt_browstyle:"కనుబొమల స్టైల్",rt_lashstyle:"ఐల్యాష్ స్టైల్",rt_blush:"బ్లష్ రంగు",rt_contour:"కాంటూర్ స్టైల్",rt_bust:"వక్షం",rt_butt:"పిరుదులు",rt_thigh:"తొడలు",rt_calf:"పిక్కలు",rt_neck:"మెడ",rt_fingers:"వేళ్లు",hint_prompt_my:"မြန်မာလို ရေးပါ — Generate မှာ English အလိုပြောင်းပေးမယ် (အများဆုံး 20,000)",st_translate:"మయన్మార్ promptను ఇంగ్లీషులోకి అనువదిస్తోంది",live_trans:"లైవ్ ⇄ ఆటో-అనువాదం (EN ↔ MY, టైపింగ్ ఆపిన తర్వాత)",st_retry:"మళ్లీ ప్రయత్నిస్తోంది",grp_recipes:"రెసిపీలు — సెట్టింగ్‌లను సేవ్ / షేర్ చేయండి",recipe_note:"అన్నింటినీ (చెయిన్స్, రీటచ్, లైట్లు, కీప్ లాక్‌లు, prompts) ఒకే .json రెసిపీగా సేవ్ చేయండి — విద్యార్థులు దాన్ని లోడ్ చేస్తే చాలు.",btn_recipe_save:"రెసిపీ సేవ్ చేయండి",btn_recipe_load:"రెసిపీ లోడ్ చేయండి",st_recipe_saved:"రెసిపీ సేవ్ అయింది ✓",st_recipe_loaded:"రెసిపీ లోడ్ అయింది ✓ — అన్ని కంట్రోల్స్ అప్‌డేట్ అయ్యాయి",st_recipe_bad:"ఇది HNK రెసిపీ ఫైల్ కాదు",sec_final:"తుది Prompt (AIకి పంపబడేది)",btn_copy:"కాపీ",st_copied:"కాపీ అయింది ✓",hist_note:"చరిత్ర — చివరి 6 ఫలితాలు, చూడటానికి ట్యాప్ చేయండి:",btn_hist_prompt:"→ Prompt",sec_batch:"బ్యాచ్ మోడ్",batch_note:"అనేక ఫోటోలు + అవుట్‌పుట్ ఫోల్డర్ ఎంచుకోండి — ప్రస్తుత prompt, చెయిన్స్, క్లీనప్, Keep లాక్‌లు ప్రతి ఫోటోపైనా అమలవుతాయి; ఫలితాలు *_HNK.png గా సేవ్ అవుతాయి.",btn_batch:"బ్యాచ్ రన్ చేయండి",btn_batch_stop:"ఆపు",st_batch:"బ్యాచ్",st_batch_done:"బ్యాచ్ పూర్తయింది",sec_web:"వెబ్ AI — మినీ బ్రౌజర్",web_note:"ఏ వెబ్ AI ఎడిటర్‌నైనా Photoshop లోపలే తెరవండి. అక్కడ జనరేట్ చేసి, ఫలితాన్ని లేయర్‌గా తీసుకురండి:",web_import_note:"దిగుమతి: ① వెబ్ యాప్‌లో Copy image address ఉపయోగించి, ఆపై 'కాపీ చేసిన లింక్ దిగుమతి' నొక్కండి · ② లేదా ఫైల్‌ను డౌన్‌లోడ్ చేసి 'ఫైల్ దిగుమతి' ఉపయోగించండి · ③ HNK బ్రిడ్జ్ ఉన్న భాగస్వామ్య వెబ్ యాప్‌లు చిత్రాలను ఆటోమేటిక్‌గా పంపుతాయి.",btn_web_go:"వెళ్లు",btn_web_home:"హోమ్",btn_web_reload:"రీలోడ్",btn_web_import_link:"కాపీ చేసిన లింక్ దిగుమతి → PS",btn_web_import_file:"ఫైల్ దిగుమతి → PS",st_web_import:"Photoshopలోకి లేయర్‌గా దిగుమతి అయింది ✓",st_web_nourl:"ముందుగా చిత్రం లింక్ కాపీ చేయండి (రైట్-క్లిక్ → Copy image address)",st_web_fetch:"లింక్ నుండి చిత్రాన్ని తెస్తోంది",st_web_notallowed:"ఈ డొమైన్ అనుమతి జాబితాలో లేదు — ఖాళీగా ఉండిపోవచ్చు. దీన్ని చేర్చమని HNK ని అడగండి.",st_need_doc:"ముందుగా Photoshop లో ఒక ఫోటో డాక్యుమెంట్ తెరవండి",sec_campro:"కెమెరా ప్రో & నాణ్యత",autosave_lbl:"ప్రతి ఫలితాన్ని ఆటో-ఎక్స్‌పోర్ట్ చేయి (PNG + prompt లాగ్ → ఫోల్డర్)",st_folder_ok:"ఎక్స్‌పోర్ట్ ఫోల్డర్ సెట్ అయింది ✓",st_exported:"ఎక్స్‌పోర్ట్ అయింది ✓",st_export_fail:"ఎక్స్‌పోర్ట్ విఫలమైంది — ఫోల్డర్‌ను తనిఖీ చేయండి",st_pro_fallback:"Pro మోడల్ అందుబాటులో లేదు — ఈ రన్ కోసం Flash కు మార్చబడింది",st_img_bad:"చిత్ర డేటా సమగ్రత తనిఖీలో విఫలమైంది — ఫోటోను మళ్లీ జోడించండి",st_auto_comp:"ఆటో కాంపోజిట్: IMAGE 1 సబ్జెక్ట్ → రిఫరెన్స్ సీన్",prov_lbl:"AI ప్రొవైడర్",oai_key_ph:"sk-... (OpenAI API key)",tab_create:"సృష్టించు",create_note:"క్రియేట్ మోడ్ — మీ prompt నుండి పూర్తిగా కొత్త చిత్రం (+ దీని సొంత 4 రిఫరెన్స్‌లు). పూర్తిగా స్వతంత్రం: డాక్యుమెంట్, ప్రీసెట్లు, చైన్‌లు లేదా లాక్‌లను ఎప్పుడూ చదవదు.",create_ph:"మీరు సృష్టించాలనుకునే చిత్రాన్ని వివరించండి…",btn_create_ps:"⬇ Photoshop కు పంపు",btn_to_ref:"↺ Ref 1 గా వాడు",st_to_ref:"ఫలితం Ref 1 లోకి లోడ్ అయింది ✓",scope_create_note:"Setup లోని Model & Output నుండి స్వతంత్రం — ఈ సెట్టింగ్‌లు క్రియేట్‌లోని Generate కు మాత్రమే వర్తిస్తాయి.",cr_ratio:"నిష్పత్తి",cr_var:"వేరియేషన్లు",cr_restyle:"♻ ఫలితాన్ని రీస్టైల్ చేయి",cr_lib:"Prompt లైబ్రరీ — చొప్పించడానికి నొక్కండి",cr_improve:"మెరుగుపరచు",cr_describe:"Ref 1 ను వివరించు → Prompt",st_describing:"రిఫరెన్స్‌ను చదువుతోంది…",st_described:"Ref 1 నుండి prompt రాయబడింది ✓",st_need_gem:"Gemini API key జోడించండి (Setup) — ఇది Gemini టెక్స్ట్‌ను ఉపయోగిస్తుంది",st_need_ref1:"ముందుగా Ref 1 కు ఒక చిత్రాన్ని జోడించండి",st_lib_added:"Prompt జోడించబడింది ✓",cr_refs:"రిఫరెన్స్ చిత్రాలు (గరిష్ఠంగా 4)",cr_refs_note:"ఐచ్ఛికం — Layer / File / Web ద్వారా జోడించండి. మీ prompt అడిగినవి మాత్రమే క్రియేట్ తీసుకుంటుంది.",cr_results:"ఫలితాలు",cr_gal_empty:"ఇంకా ఫలితాలు లేవు — Generate నొక్కండి.",cr_gal_have:"ఫలితం(లు) · ప్రివ్యూ / చర్య కోసం థంబ్‌నెయిల్ నొక్కండి",cr_save:"⬇ PNG సేవ్ చేయి",cr_engine:"ఇంజిన్",cr_need_result:"ముందుగా ఒక చిత్రాన్ని జనరేట్ చేయండి",btn_web_import_url:"⬇ URL ఇంపోర్ట్",st_clip_help:"క్లిప్‌బోర్డ్ ఖాళీ/బ్లాక్ అయింది — లింక్‌ను URL బార్‌లో పేస్ట్ చేసి, ఆపై ⬇ URL ఇంపోర్ట్ నొక్కండి",st_web_blob:"అది తాత్కాలిక blob: లింక్ — రైట్-క్లిక్ → Copy IMAGE Address వాడండి, లేదా ఫైల్‌ను సేవ్ చేసి Import File వాడండి",err_key:"API key చెల్లదు — Setup ట్యాబ్‌లో key ను మళ్లీ తనిఖీ చేయండి · API key မှားနေ — Setup မှာ ပြန်စစ်ပါ",err_quota:"కోటా / రేట్ పరిమితి — కాసేపు ఆగి, మళ్లీ ప్రయత్నించండి · Quota ပြည့်/နှုန်းကန့် — ခဏနေပြန်စမ်းပါ",err_big:"API కి చిత్రం చాలా పెద్దది — పరిమాణం తగ్గించి, మళ్లీ ప్రయత్నించండి · ပုံကြီးလွန်း — ချုံ့ပြီးပြန်စမ်းပါ",err_safety:"సేఫ్టీ ఫిల్టర్ బ్లాక్ చేసింది — prompt లేదా ఫోటోను సవరించండి · Safety ငြင်း — prompt/ပုံ ပြင်ပြီးပြန်စမ်းပါ",err_net:"నెట్‌వర్క్ / సర్వర్ సమస్య — దయచేసి మళ్లీ ప్రయత్నించండి · ကွန်ရက်/ဆာဗာပြစနာ — ပြန်စမ်းပါ",err_timeout:"అభ్యర్థన సమయం మించిపోయింది — సర్వర్ చాలా ఆలస్యం చేసింది; దయచేసి మళ్లీ ప్రయత్నించండి · အချိန်ပြည့် — ပြန်စမ်းပါ",err_generic:"అభ్యర్థన పూర్తి కాలేదు — దయచేసి మళ్లీ ప్రయత్నించండి",err_img:"వాడదగిన చిత్రం ఏదీ రాలేదు — దయచేసి మళ్లీ ప్రయత్నించండి",err_mode:"ఈ డాక్యుమెంట్ RGB మోడ్‌లో లేదు — ముందుగా మార్చండి (Image ▸ Mode ▸ RGB Color), ఆపై మళ్లీ ప్రయత్నించండి",cam_master:"కెమెరా బ్లాక్ ON — ప్రతి prompt చివరన జోడించబడుతుంది",cam_body:"కెమెరా బాడీ",cam_lens:"ప్రైమ్ లెన్స్ (mm)",cam_f:"అపెర్చర్",cam_film:"ఫిల్మ్ లుక్",cam_bokeh:"బొకే స్టైల్",cam_iso:"ISO",cam_k:"WB కెల్విన్",cam_note:"బ్లాక్‌ను ON చేసి, మీకు కావాల్సినవి మాత్రమే ఎంచుకోండి — – చిప్‌లు ఏమీ జోడించవు. అన్నీ తుది prompt చివరన చేరతాయి.",ro_h_main:"రిఫరెన్స్ ఆప్స్ ప్రో (Ref1 / Ref2)",ro_note:"Ref1 = IMAGE 2 (మహిళ) · Ref2 = IMAGE 3 (పురుషుడు). టార్గెట్ ఎంచుకుని, ఒక ఆప్ నడపండి — సరిపోలని వ్యక్తులు ఎప్పుడూ మారరు.",ro_target:"టార్గెట్:",ro_solo:"సోలో",ro_couple:"జంట",ro_family:"కుటుంబం",ro_mk:"రిఫ్ మేకప్ కాపీ చేయి",ro_hair:"రిఫ్ హెయిర్‌స్టైల్ తీసుకో",ro_h_face:"ఫేస్ ఆప్స్",ro_h_bg:"BG / FG ఆప్స్",ro_h_sub:"సబ్జెక్ట్ ఆప్స్",ro_h_lc:"లైట్ & కలర్ ఆప్స్",ro_h_dress:"డ్రెస్ ఆప్స్",ro_h_mk:"మేకప్ ఆప్స్",ro_h_match:"★ మాస్టర్ మ్యాచ్ (ఒకే లుక్)",ro_match_note:"రెండూ ఒకే ఎడిట్‌లా కనిపించేలా IMAGE 1 ను రిఫరెన్స్‌తో మ్యాచ్ చేయండి — దేన్ని మ్యాచ్ చేయాలో టిక్ చేయండి:",m_color:"కలర్",m_light:"లైట్",m_makeup:"మేకప్",m_skin:"స్కిన్ రీటచ్",crd_pipe:"⛓ పైప్‌లైన్ బిల్డర్ — దేనినైనా చైన్ చేయండి",pipe_note:"ఏ స్టెప్‌లనైనా ఒకే చైన్‌గా లింక్ చేయండి — ప్రతి స్టెప్ ఫలితం తర్వాతి స్టెప్‌కు వెళ్తుంది. గరిష్ఠం 6.",pipe_add:"+ జోడించు",pipe_run:"▶ పైప్‌లైన్ రన్ చేయి",pipe_clear:"క్లియర్",pipe_retouch:"రీటచ్ అప్లై (ప్రస్తుత స్లయిడర్లు)",pipe_relight:"రీలైట్ (ప్రస్తుత లైట్ రిగ్)",pipe_prompt:"Prompt (ప్రస్తుత EN బాక్స్)",pipe_empty:"ముందుగా కనీసం ఒక స్టెప్ జోడించండి",pipe_max:"పైప్‌లైన్ నిండింది (గరిష్ఠం 6 స్టెప్‌లు)",st_pipe:"పైప్‌లైన్ స్టెప్",st_pipe_done:"పైప్‌లైన్ పూర్తయింది",st_pipe_stop:"పైప్‌లైన్ ఆగింది (ఒక స్టెప్ విఫలమైంది)",pipe_merge:"⚡ వన్-షాట్ మెర్జ్ — అన్ని స్టెప్‌లు ఒకే కాల్‌లో (వేగం/చవక · ≤ 3 టాస్క్‌లకు ఉత్తమం)",crd_chainsrest:"స్టైల్ చైన్స్ + పాత ఫోటో పునరుద్ధరణ",crd_refops:"రిఫరెన్స్ ఆప్స్ ప్రో (Ref1 / Ref2)",crd_scenes:"🎬 సీన్స్ ప్రో — లాక్ చేసిన సబ్జెక్ట్ · సీన్ మ్యాచ్ అవుతుంది",scn_note:"మీ సబ్జెక్ట్‌ను లాక్ చేసి (ముఖం · పోజ్ · డ్రెస్ · ఫ్రేమ్), వారికి సరిపోయేలా మొత్తం సీన్‌ను మళ్లీ నిర్మిస్తుంది — లైట్, నీడ, రంగు, బ్యాక్‌గ్రౌండ్, ఫోర్‌గ్రౌండ్, వస్తువులు అన్నీ రియల్-ఫోటో లుక్ కోసం ఆటోమేటిక్‌గా సర్దుబాటవుతాయి.",scn_h_style:"సీన్ స్టైల్ (ఇండోర్ / సాంస్కృతిక)",scn_h_bday:"🎂 పుట్టినరోజు — వయసు సంఖ్య 1–45",scn_h_cap:"క్యాప్షన్ / టెక్స్ట్ (పిల్లలు · Miss Universe · పుట్టినరోజు)",scn_h_scarf:"అవుట్‌డోర్ / ఎగిరే స్కార్ఫ్",scn_grad:"గ్రాడ్యుయేషన్ ఇండోర్",scn_prewed:"ప్రీవెడ్డింగ్ ఇండోర్",scn_vietnam:"వియత్నాం",scn_myanmar:"మయన్మార్",scn_chinese:"చైనీస్",scn_shan:"షాన్",scn_newborn:"నవజాత శిశువు / బేబీ",scn_age:"వయసు",scn_bday_go:"🎂 పుట్టినరోజు సీన్",scn_cap_on:"క్యాప్షన్ టెక్స్ట్ జోడించు",scn_cap_ph:"క్యాప్షన్ టెక్స్ట్ (ఉదా. Happy 1st Birthday, పేరు)…",scn_cap_pos:"స్థానం",scn_top:"పైన",scn_bottom:"కింద",scn_scarf:"✦ ఎగిరే స్కార్ఫ్ సీన్",scn_dir:"దిశ",scn_left:"ఎడమ",scn_right:"కుడి",scn_up:"పైకి",scn_len:"పొడవు",scn_short:"పొట్టి",scn_long:"పొడవైనది",g_cat_scene:"సీన్ ఆప్ — మీ సబ్జెక్ట్ లాక్ అయి ఉంటుంది (ముఖం · పోజ్ · డ్రెస్ · ఫ్రేమ్); జనరేట్ అయిన మొత్తం సీన్ (లైట్, నీడ, రంగు, బ్యాక్‌గ్రౌండ్, ఫోర్‌గ్రౌండ్, వస్తువులు, వాతావరణం) రియల్-ఫోటో కాంపోజిట్ కోసం సబ్జెక్ట్‌కు ఆటో-మ్యాచ్ అవుతుంది.",crd_wed:"♥ వెడ్డింగ్ ప్రో స్యూట్",crd_recipes:"రెసిపీలు — సేవ్ / షేర్",learn_lbl:"🎓 లెర్న్ మోడ్ — 1వ ట్యాప్ = గైడ్ (పసుపు), 2వ = prompt (నీలం), 3వ = రన్ (ఆకుపచ్చ)",guide_hint:"మళ్లీ నొక్కండి: పసుపు → నీలం (prompt) → ఆకుపచ్చ (రన్) ▶",g_learn_next_prompt:"మళ్లీ నొక్కండి → ఖచ్చితమైన PROMPT చూపుతుంది (నీలం).",g_learn_prompt_head:"ఈ బటన్ పంపే PROMPT (మళ్లీ నొక్కితే = రన్):",g_learn_next_run:"మరోసారి నొక్కండి → రన్ (ఆకుపచ్చ) జనరేట్ చేస్తుంది.",st_prompt_ready:"Prompt సిద్ధం — నడపడానికి మళ్లీ నొక్కండి (ఆకుపచ్చ) ✓",g_step_doc:"ముందుగా మీ ఫోటో డాక్యుమెంట్‌ను Photoshop లో తెరవండి.",g_step_ref1:"రిఫరెన్స్ చిత్రాన్ని Ref1 లోకి లోడ్ చేయండి (అది IMAGE 2 అవుతుంది). రెండో వ్యక్తి కోసం Ref2 జోడించండి.",g_step_target:"టార్గెట్ ఎంచుకోండి: సోలో / జంట (Ref1 = మహిళ, Ref2 = పురుషుడు) / కుటుంబం.",g_step_mkhair:"ఐచ్ఛికం: ఫేస్ ఆప్స్ పైన ఉన్న ‘రిఫ్ మేకప్ కాపీ చేయి’ / ‘రిఫ్ హెయిర్‌స్టైల్ తీసుకో’ టిక్ చేయండి.",g_step_petal:"ముందుగా పూరేకుల రంగు ఎంచుకోండి (auto = మీ సీన్‌కు సరిపోతుంది).",g_step_rest:"పైన ఉన్న ✓ తో ఫుల్ కలర్ లేదా B&W ఎంచుకోండి.",g_step_int:"ఇంటెన్సిటీ స్లయిడర్‌ను మీకు నచ్చినట్టు సెట్ చేయండి.",g_step_confirm:"ముందుకు వెళ్లడానికి మళ్లీ నొక్కండి: గైడ్ (పసుపు) → PROMPT (నీలం) → రన్ (ఆకుపచ్చ జనరేట్ చేస్తుంది).",g_cat_face:"ఫేస్ ఆప్ — రిఫరెన్స్ ముఖాన్ని సరిపోలే వ్యక్తిపైకి బదిలీ చేస్తుంది; మిగతా వారందరూ మారకుండా ఉంటారు.",g_cat_sub:"సబ్జెక్ట్ ఆప్ — రిఫరెన్స్ వ్యక్తిని మీ సీన్‌లోకి తెస్తుంది/మార్ఫ్ చేస్తుంది; సీన్, ఫ్రేమింగ్ అలాగే ఉంటాయి.",g_cat_bgfg:"BG/FG ఆప్ — రిఫరెన్స్ ఉపయోగించి బ్యాక్‌గ్రౌండ్ / ఫోర్‌గ్రౌండ్ మాత్రమే మారుస్తుంది.",g_cat_lc:"లైట్ & కలర్ ఆప్ — రిఫరెన్స్ లైటింగ్, కలర్ గ్రేడ్‌ను కాపీ చేస్తుంది; వ్యక్తులు పిక్సెల్-స్థాయిలో యథాతథంగా ఉంటారు.",g_cat_dress:"డ్రెస్ ఆప్ — రిఫరెన్స్ ఉపయోగించి దుస్తులు మాత్రమే మారుస్తుంది.",g_cat_mkop:"మేకప్ ఆప్ — రిఫరెన్స్ ఉపయోగించి మేకప్ మాత్రమే మారుస్తుంది.",g_cat_match:"మాస్టర్ మ్యాచ్ — మీ ఫోటోను రిఫరెన్స్ మొత్తం లుక్‌కు సరిపోయేలా చేస్తుంది (పైన లేయర్‌లను టిక్ చేయండి).",g_cat_trail:"వెడ్డింగ్ ట్రైల్ — లగ్జరీ గడ్డి + ప్రవహించే పూల దారి; ముఖాలు/పోజ్/ఫ్రేమ్ పూర్తిగా లాక్ అవుతాయి.",g_cat_veil:"ఎగిరే వెయిల్ — ఈ పొడవులో గాలికి ఎగిరే వెయిల్‌ను జోడిస్తుంది/పొడిగిస్తుంది; ముఖం ఎప్పుడూ కప్పబడదు.",g_cat_gown:"గౌన్ — ఉన్న గౌన్‌ను శుభ్రం చేస్తుంది (డిజైన్ మారదు), ఈ ట్రైన్ పొడవును సెట్ చేస్తుంది.",g_cat_petal:"ఎగిరే పూరేకులు — ఈ స్టైల్‌లో గాలిలో పూరేకులను జోడిస్తుంది; రంగు పైన ఉన్న స్వాచ్ నుండి.",g_cat_wedx:"వెడ్డింగ్ ఎక్స్‌ట్రా — మీ సీన్‌కు సరిపోయేలా ఈ ఎలిమెంట్‌ను జోడిస్తుంది; సబ్జెక్ట్ లాక్ అయి ఉంటుంది.",g_cat_canvas:"రీప్లేస్ (కాన్వాస్) — మీ సబ్జెక్ట్‌ను రిఫరెన్స్ సీన్‌లో ఉంచుతుంది; రిఫ్‌లోని వ్యక్తులు తీసివేయబడతారు.",g_cat_restore:"పాత ఫోటో పునరుద్ధరణ — పాడైన భాగాలను బాగు చేస్తుంది; ప్రతి అసలు ముఖం 100% అలాగే ఉంటుంది.",g_cat_generic:"ప్రీసెట్ — ఈ ప్రొఫెషనల్ ఎడిట్‌ను మీ ఫోటోకు వర్తింపజేస్తుంది.",g_gen:"జనరేట్ — మీ డాక్యుమెంట్‌పై prompt బాక్స్‌ను (+ చైన్‌లు, కీప్‌లు, కెమెరా బ్లాక్) నడుపుతుంది.",g_retouchbtn:"రీటచ్ అప్లై — మీ అన్ని స్లయిడర్ సెట్టింగ్‌లను ఒకే ప్రొఫెషనల్ రీటచ్ పాస్‌గా నడుపుతుంది.",g_relightbtn:"లైటింగ్ జనరేట్ — మీ 3D లైట్ డయాగ్రామ్‌కు సరిగ్గా అనుగుణంగా ఫోటోను రీలైట్ చేస్తుంది.",g_scene:"సీన్ జనరేట్ — సేకరించిన prompt నుండి సీన్‌ను మళ్లీ నిర్మిస్తుంది; సబ్జెక్ట్ అలాగే ఉంటుంది.",g_rmix:"రీప్లేస్ మిక్స్ — రిఫరెన్స్ నుండి ✓ టిక్ చేసిన భాగాలను మాత్రమే రీప్లేస్ చేస్తుంది.",g_pipe:"పైప్‌లైన్ రన్ — చైన్ చేసిన ప్రతి స్టెప్‌ను వరుసగా నడుపుతుంది; ప్రతి ఫలితం తర్వాతిదానికి వెళ్తుంది.",ro_faceRep:"ఫేస్ రీప్లేస్",ro_faceSwap:"ఫేస్ స్వాప్",ro_bgRep:"BG రీప్లేస్",ro_bgSwap:"BG స్వాప్",ro_fgRep:"FG రీప్లేస్",ro_bg_note:"Doc = సబ్జెక్ట్ · Ref1 = కొత్త సీన్. టార్గెట్ (సోలో/జంట/కుటుంబం) ఎవరిని ఉంచాలో నిర్ణయిస్తుంది.",ro_bg_frame:"ఫ్రేమ్ & కంపోజిషన్‌ను అలాగే ఉంచు",ro_bg_light:"సబ్జెక్ట్ లైట్/రంగును అలాగే ఉంచు",ro_subSwap:"సబ్జెక్ట్ స్వాప్",ro_lcRef:"L&C రిఫరెన్స్",ro_lcCopy:"L&C కాపీ-పేస్ట్",ro_dressRef:"డ్రెస్ రిఫరెన్స్",ro_dressRep:"డ్రెస్ రీప్లేస్",ro_mkCopy:"మేకప్ కాపీ",ro_matchBtn:"★ మాస్టర్ మ్యాచ్",grp_retouch:"స్కిన్ రీటచ్ ప్రీసెట్‌లు",lbl_intensity:"తీవ్రత",p_evoto:"Evoto స్టైల్",p_meitu:"Meitu స్టైల్",auto_place:"ఫలితాన్ని Photoshopలో కొత్త లేయర్‌గా ఆటోమేటిక్‌గా ప్లేస్ చేయి",sec_retouchpro:"రీటచ్ ప్రో — స్లయిడర్లు",rt_skin:"స్కిన్",rt_faceai:"ఫేస్ AI",rt_hair:"జుట్టు",rt_dress:"డ్రెస్",rt_bg:"బ్యాక్‌గ్రౌండ్",rt_smooth:"స్కిన్ స్మూత్",rt_acne:"మొటిమల తొలగింపు",rt_spots:"నల్ల మచ్చలు",rt_wrinkle:"ముడతలు",rt_tone:"వైటెన్ / టాన్",rt_glow:"గ్లో",rt_reshape:"AI రీషేప్",rt_lash:"ఐలాషెస్",rt_brow:"కనుబొమ్మలు",rt_lipsmooth:"లిప్ స్మూత్",rt_lipcolor:"లిప్ కలర్",rt_lenscolor:"లెన్స్ కలర్",rt_hairstray:"చెదిరిన వెంట్రుకలు",rt_hairsmooth:"హెయిర్ స్మూత్",rt_hairshine:"హెయిర్ షైన్ (D&B)",rt_dresssmooth:"ఫ్యాబ్రిక్ స్మూత్",rt_dressedge:"అంచుల క్లీనప్",rt_dresswrinkle:"ముడతల తొలగింపు",rt_dresstexture:"టెక్స్చర్ రికవరీ",rt_bgsmooth:"BG క్లీన్/స్మూత్",rt_bgcolor:"BG కలర్",rt_bgrecolor:"BG కలర్ స్మూత్",rt_shape:"రీషేప్ ప్రో (ముఖం + శరీరం)",rt_teeth:"పళ్ల వైటెనింగ్",rt_eyewhite:"కంటి తెల్లభాగం క్లీన్",rt_faceslim:"ఫేస్ స్లిమ్",rt_jaw:"జాలైన్",rt_chin:"గడ్డం",rt_nosesize:"ముక్కు పరిమాణం",rt_eyesize:"కళ్ల పరిమాణం",rt_lipfull:"నిండైన పెదవులు",rt_waist:"నడుము స్లిమ్",rt_bodyslim:"బాడీ స్లిమ్",rt_shoulder:"భుజాలు",rt_hip:"హిప్ స్లిమ్",rt_leglen:"కాళ్ల పొడవు",rt_armslim:"చేతుల స్లిమ్",rt_dressfit:"డ్రెస్ ఫిట్",rt_dressclean:"డ్రెస్ క్లీన్",rt_dresscolorpure:"డ్రెస్ కలర్ ప్యూర్",rt_bodygrp:"బాడీ స్కిన్ ప్రో",rt_bodysmooth:"బాడీ స్కిన్ స్మూత్",rt_bodyblemish:"బాడీ మచ్చల క్లీన్",rt_bodytone:"బాడీ ఈవెన్ టోన్",rt_bodyglow:"బాడీ గ్లో",rt_bodyhairrm:"బాడీ హెయిర్ తగ్గింపు",rt_hairvolume:"హెయిర్ వాల్యూమ్",rt_hairgloss:"హెయిర్ గ్లోస్",rt_hairfill:"హెయిర్ ఫిల్ (పలుచని చోట్లు)",wp_h_trail:"♥ వెడ్డింగ్ — లగ్జరీ ఫ్లవర్ ట్రెయిల్",wp_h_veil:"♥ వెడ్డింగ్ — ఎగిరే వెయిల్",wp_h_gown:"♥ వెడ్డింగ్ — గౌన్ క్లీన్ + ట్రెయిన్",wp_h_petal:"♥ వెడ్డింగ్ — ఎగిరే పూల రేకులు",wp_h_extra:"♥ వెడ్డింగ్ — గుర్రం · నీరు · మూడ్",wp_note:"ఫేస్ ID / పోజ్ / ఫ్రేమ్ / డ్రెస్ డిజైన్ పూర్తిగా లాక్ అయి ఉంటాయి — పేర్కొన్న అంశం మాత్రమే మారుతుంది.",wp_petalcolor:"పూల రేకుల రంగు (ఆటో = సీన్ మ్యాచ్)",wp_trail_c:"పూల రంగు",wp_trail_go:"▶ ఫ్లవర్ ట్రెయిల్",wp_veil_c:"వెయిల్ పొడవు",wp_veil_go:"▶ ఎగిరే వెయిల్",wp_gown_c:"ట్రెయిన్ పొడవు",wp_gown_go:"▶ గౌన్ క్లీన్ + ట్రెయిన్",wp_pet_c:"పూల రేకుల స్టైల్",wp_pet_go:"▶ ఎగిరే పూల రేకులు",wp_extra_c:"ఎక్స్‌ట్రా",wp_extra_go:"▶ ఎక్స్‌ట్రా జోడించండి",btn_apply_rt:"రీటచ్ వర్తింపజేయండి",btn_reset:"రీసెట్",rt_none:"ముందుగా కనీసం ఒక రీటచ్ స్లయిడర్ లేదా రంగు సెట్ చేయండి",tab_setup:"సెటప్",tab_prompt:"స్టూడియో",tab_presets:"ప్రీసెట్",recent_lbl:"ఇటీవలి prompts…",tab_retouch:"రీటచ్",tab_aitools:"AI టూల్స్",cap_warn:"Photoshop ఈ prompt బాక్స్ పరిమితి:",cleanup_note:"టిక్ చేసిన అంశాలు ప్రతి జనరేట్ / ప్రీసెట్‌తో కలిసి అమలవుతాయి.",btn_generate:"సృష్టించు",st_ready:"సిద్ధం",st_capture:"డాక్యుమెంట్ క్యాప్చర్ అవుతోంది",st_gen:"జనరేట్ అవుతోంది…",st_place:"Photoshopలో ప్లేస్ అవుతోంది…",st_placed_masked:"లేయర్ + మాస్క్ గ్రూప్‌గా ప్లేస్ అయింది — ఒరిజినల్‌కు ఎలాంటి మార్పు లేదు ✓",st_placed_plain:"సాధారణ లేయర్‌గా ప్లేస్ అయింది (ఈ హోస్ట్‌లో మాస్క్/గ్రూప్ అందుబాటులో లేదు)",stage_queued:"క్యూలో ఉంది",stage_uploading:"అప్‌లోడ్ అవుతోంది",stage_generating:"జనరేట్ అవుతోంది",stage_downloading:"డౌన్‌లోడ్ అవుతోంది",stage_placing:"ప్లేస్ అవుతోంది",st_done:"పూర్తయింది ✓",st_err:"లోపం",st_no_doc:"యాక్టివ్ డాక్యుమెంట్ లేదు — ముందుగా ఒక ఫోటో తెరవండి",st_no_prompt:"Prompt ఖాళీగా ఉంది",need_ref:"ఈ ప్రీసెట్‌కు స్లాట్ 1లో రిఫరెన్స్ ఇమేజ్ అవసరం",st_new_doc:"ఫలితం కొత్త డాక్యుమెంట్‌గా తెరుచుకుంది ✓",sec_preview:"ప్రివ్యూ — ముందు / తర్వాత",before:"ముందు",after:"తర్వాత",btn_place:"Photoshopలో ప్లేస్ చేయండి",btn_saveas:"ఇలా సేవ్ చేయండి…",st_saved:"సేవ్ అయింది ✓",sec_diag:"సిస్టమ్ చెక్",sec_log:"యాక్టివిటీ లాగ్",btn_diag:"చెక్ రన్ చేయండి",btn_copylog:"లాగ్ కాపీ చేయండి",btn_clearlog:"క్లియర్",diag_host:"Photoshop హోస్ట్",diag_uxp:"UXP సామర్థ్యాలు",diag_gem:"Gemini API key",diag_oai:"OpenAI API key",diag_doc:"యాక్టివ్ డాక్యుమెంట్",diag_set:"సెట్ అయింది",diag_unset:"సెట్ కాలేదు",diag_open:"తెరిచి ఉంది",diag_none:"ఏదీ తెరిచి లేదు",diag_missing:"లేదు",diag_done:"సిస్టమ్ చెక్ పూర్తయింది ✓",diag_lib:"రిఫరెన్స్ లైబ్రరీ",diag_lib_open:"ఫోల్డర్ తెరిచే సామర్థ్యం",sec_reflib:"రిఫరెన్స్ ఇమేజ్ లైబ్రరీ",reflib_note:"మీకు ఇష్టమైన రిఫరెన్స్ ఇమేజ్‌ల ఫోల్డర్‌ను ఒక్కసారి ఎంచుకోండి — బ్రౌజ్ దాన్ని గుర్తుంచుకుని ప్రతిచోటా అందులోనే తెరుస్తుంది.",btn_browse:"బ్రౌజ్",lib_choose:"ఫోల్డర్ ఎంచుకోండి",lib_open:"ఫోల్డర్ తెరవండి",lib_change:"ఫోల్డర్ మార్చండి",lib_reset:"రీసెట్",lib_rescan:"మళ్లీ స్కాన్ చేయండి",lib_current:"ప్రస్తుత ఫోల్డర్",lib_found:"దొరికిన ఇమేజ్‌లు",lib_status:"స్థితి",lib_lastscan:"చివరి స్కాన్",lib_images:"ఇమేజ్‌లు",lib_connected:"కనెక్ట్ అయింది",lib_not_config:"కాన్ఫిగర్ కాలేదు",lib_perm_lost:"అనుమతి పోయింది — మళ్లీ ఎంచుకోండి",lib_none:"(ఫోల్డర్ ఎంపిక కాలేదు)",lib_copy_only:"పాత్ కాపీ మాత్రమే",lib_choose_msg:"మీ HNK రిఫరెన్స్ ఇమేజ్ లైబ్రరీ ఫోల్డర్‌ను ఎంచుకోండి.",lib_scanning:"లైబ్రరీ స్కాన్ అవుతోంది…",lib_scan_done:"మళ్లీ స్కాన్ పూర్తయింది ✓",lib_reset_done:"లైబ్రరీ రీసెట్ అయింది ✓",lib_path_copied:"పాత్ కాపీ అయింది",lib_unsupported:"మద్దతు లేని ఇమేజ్ రకం",lib_restore_fail:"రిఫరెన్స్‌ను పునరుద్ధరించడం సాధ్యపడలేదు",on:"ఆన్",off:"ఆఫ్"},
ur:{tab_setup:"سیٹ اپ",tab_prompt:"اسٹوڈیو",tab_presets:"پری سیٹ",tab_retouch:"ری ٹچ",tab_aitools:"AI ٹولز",tab_create:"بنائیں",btn_generate:"بنائیں",st_ready:"تیار",st_done:"ہو گیا ✓",st_need_key:"پہلے Gemini API key ڈالیں",btn_show:"دکھائیں",btn_hide:"چھپائیں",btn_save:"محفوظ کریں",btn_test:"Key جانچیں",btn_clear:"صاف کریں",btn_cancel:"منسوخ",btn_load:"لوڈ",btn_paste:"پیسٹ",btn_improve:"Prompt بہتر بنائیں",lbl_ratio:"تناسب",lbl_size:"سائز",lbl_quality:"معیار"}
};

function t(k) {
  /* full table first (the nine complete languages), then the native starter
     pack, then the fallback language's full table, then English */
  const L = I18N[state.lang];
  if (L && Object.prototype.hasOwnProperty.call(L, k)) return L[k];
  const nx = I18N_L[state.lang];
  if (nx && Object.prototype.hasOwnProperty.call(nx, k)) return nx[k];
  const fb = LANG_FB[state.lang];
  if (fb && I18N[fb] && Object.prototype.hasOwnProperty.call(I18N[fb], k)) return I18N[fb][k];
  if (Object.prototype.hasOwnProperty.call(I18N.en, k)) return I18N.en[k];
  return k;
}

function applyI18n() {
  const nodes = document.querySelectorAll("[data-i18n]");
  for (let i = 0; i < nodes.length; i++) {
    const el = nodes[i];
    const k = el.getAttribute("data-i18n");
    el.textContent = t(k);
  }
  const phs = document.querySelectorAll("[data-i18n-ph]");
  for (let i = 0; i < phs.length; i++) {
    const el = phs[i];
    el.setAttribute("placeholder", t(el.getAttribute("data-i18n-ph")));
  }
  const sel = $("selLang");
  if (sel && sel.value !== state.lang) sel.value = state.lang;
  for (let i = 0; i < REFRESHERS.length; i++) { try { REFRESHERS[i](); } catch (e) { } }
}

/* ---------------- i18n bridge for the AI Tools sub-app ----------------
   The src/ modules load BEFORE main.js (UXP shared-global <script> order),
   so they cannot capture I18N at definition time. Publishing the lookup on
   globalThis.HNK lets dom.t(key, englishFallback) resolve lazily at render
   time — one dictionary, one active language, two UIs. */
(function publishI18nBridge() {
  try {
    const g = (typeof globalThis !== "undefined") ? globalThis : null;
    if (!g) return;
    g.HNK = g.HNK || {};
    g.HNK.i18n = {
      t: function (k) { return t(k); },
      table: I18N,
      langs: LANGS,
      codes: LANG_CODES,
      lang: function () { return state.lang; }
    };
  } catch (e) { }
})();

/* Re-render the mounted AI Tools sub-app whenever the language changes, so
   its screens repaint in the new language exactly like the classic tabs. */
REFRESHERS.push(function () {
  try {
    const app = globalThis.HNK && globalThis.HNK.aiToolsApp;
    if (app && typeof app.mount === "function") app.mount();
  } catch (e) { }
});

/* ---------------- Theme (dark / light) ---------------- */
function applyTheme() {
  const th = (state.theme === "light") ? "light" : "dark";
  const root = document.getElementById("app") || (document.body || null);
  if (root && root.setAttribute) root.setAttribute("data-theme", th);
  try { if (document.documentElement && document.documentElement.setAttribute) document.documentElement.setAttribute("data-theme", th); } catch (e) { }
  const bt = $("btnTheme");
  if (bt) bt.textContent = (th === "light") ? "☽" : "☀"; /* light→moon, dark→sun (tap to switch) */
}

/* ---------------- Diagnostics: installation + dependency checker ----------------
   Confirms the host app, the UXP capabilities the panel depends on, and the API
   keys — so a student can verify a correct install before generating. Passive and
   offline: it never sends a network request, it only inspects local readiness. */
function hostVersion() {
  try { if (uxp && uxp.host && uxp.host.version) return String(uxp.host.version); } catch (e) { }
  try { if (app && app.version) return String(app.version); } catch (e) { }
  return "";
}
function hostName() {
  try { if (uxp && uxp.host && uxp.host.name) return String(uxp.host.name); } catch (e) { }
  return "Photoshop";
}
function verGte(v, min) {
  const a = String(v || "").split(".").map(function (x) { return parseInt(x, 10) || 0; });
  const b = String(min || "").split(".").map(function (x) { return parseInt(x, 10) || 0; });
  const n = Math.max(a.length, b.length);
  for (let i = 0; i < n; i++) {
    const ai = a[i] || 0, bi = b[i] || 0;
    if (ai > bi) return true;
    if (ai < bi) return false;
  }
  return true;
}
function collectDiag() {
  const rows = [];
  const hv = hostVersion();
  if (!hv) rows.push({ key: "diag_host", level: "warn", detail: hostName() });
  else if (verGte(hv, "24.2.0")) rows.push({ key: "diag_host", level: "ok", detail: hostName() + " " + hv });
  else rows.push({ key: "diag_host", level: "err", detail: hostName() + " " + hv + " < 24.2" });

  const caps = !!((typeof imaging !== "undefined" && imaging) && (typeof batchPlay === "function") && (typeof fsp !== "undefined" && fsp));
  rows.push({ key: "diag_uxp", level: caps ? "ok" : "err", detail: caps ? "imaging · batchPlay · fs" : t("diag_missing") });

  const isOai = state.provider === "openai";
  const pk = isOai ? state.oaiKey : state.apiKey;
  rows.push({ key: isOai ? "diag_oai" : "diag_gem", level: pk ? "ok" : "warn", detail: pk ? t("diag_set") : t("diag_unset") });

  const hasDoc = (function () { try { return !!(app && app.activeDocument); } catch (e) { return false; } })();
  rows.push({ key: "diag_doc", level: hasDoc ? "ok" : "pend", detail: hasDoc ? t("diag_open") : t("diag_none") });

  /* Reference Image Library */
  const libOn = refLibConfigured();
  rows.push({
    key: "diag_lib",
    level: libOn ? "ok" : "pend",
    detail: libOn ? (state.libImgCount + " " + t("lib_images")) : t("lib_not_config")
  });
  const canOpen = !!(shell && shell.openPath);
  rows.push({ key: "diag_lib_open", level: canOpen ? "ok" : "pend", detail: canOpen ? t("diag_set") : t("lib_copy_only") });
  return rows;
}
const DIAG_ICON = { ok: "✓", warn: "!", err: "×", pend: "•" };
function renderDiag() {
  const box = $("diagList");
  if (!box) return;
  const rows = collectDiag();
  while (box.firstChild) box.removeChild(box.firstChild);
  for (let i = 0; i < rows.length; i++) {
    const r = rows[i];
    const row = document.createElement("div"); row.className = "diagrow";
    const ic = document.createElement("div"); ic.className = "diag-ic " + r.level; ic.textContent = DIAG_ICON[r.level] || "•";
    const nm = document.createElement("div"); nm.className = "diag-nm"; nm.textContent = t(r.key);
    const st = document.createElement("div"); st.className = "diag-st"; st.textContent = r.detail || "";
    row.appendChild(ic); row.appendChild(nm); row.appendChild(st);
    box.appendChild(row);
  }
}
function renderLog() {
  const box = $("logBox");
  if (!box) return;
  box.value = logText();
  try { box.scrollTop = box.scrollHeight; } catch (e) { }
}
async function copyLog() {
  const txt = logText();
  try {
    if (navigator.clipboard && navigator.clipboard.writeText) await navigator.clipboard.writeText(txt);
    else if (navigator.clipboard && navigator.clipboard.setContent) await navigator.clipboard.setContent({ "text/plain": txt });
    setStatus(t("st_copied"), "ok");
  } catch (e) { setStatus(t("st_err") + ": " + (e && e.message ? e.message : e), "err"); }
}
function bindDiag() {
  const rc = $("btnDiag");
  if (rc) rc.addEventListener("click", function () { renderDiag(); hlog("diagnostics run"); setStatus(t("diag_done"), "ok"); });
  const cl = $("btnCopyLog");
  if (cl) cl.addEventListener("click", copyLog);
  const clr = $("btnClearLog");
  if (clr) clr.addEventListener("click", function () { HNK_LOG.length = 0; renderLog(); });
  renderDiag();
  renderLog();
  REFRESHERS.push(function () { try { renderDiag(); } catch (e) { } });
}

/* ============================================================
   Reference Image Library — one user-selected folder, remembered
   via a persistent token, feeding a universal Browse button on every
   reference slot. UXP-safe: user picks the folder once (getFolder),
   we keep a persistent token (never a hard-coded path, never the
   read-only plugin package), and reopen the native picker inside it.
   ============================================================ */
const REF_LIB_TYPES = ["jpg", "jpeg", "png", "webp", "tif", "tiff", "psd"];
const REF_LIB_DIRECT = { png: "image/png", jpg: "image/jpeg", jpeg: "image/jpeg", webp: "image/webp" };
const REF_SCAN_MAX = 5000;   /* safety cap so a huge library never hangs the panel */
const REF_SCAN_DEPTH = 4;    /* recurse a few subfolder levels (Backgrounds/Faces/…) */

/* Every physical reference slot, with a stable id, a nominal role, its Browse
   button id, and how a chosen image is assigned — so one controller serves them
   all and an image can never land in the wrong slot. */
const REF_SLOTS = [
  { id: "subject-reference", role: "subject", btn: "refLib0", assign: function (cap) { state.refs[0] = cap; renderRefs(); } },
  { id: "reference-2", role: "reference", btn: "refLib1", assign: function (cap) { state.refs[1] = cap; renderRefs(); } },
  { id: "create-reference-1", role: "create", btn: "cRefLib0", assign: function (cap) { state.cRefs[0] = cap; paintCreateRefs(); } },
  { id: "create-reference-2", role: "create", btn: "cRefLib1", assign: function (cap) { state.cRefs[1] = cap; paintCreateRefs(); } },
  { id: "create-reference-3", role: "create", btn: "cRefLib2", assign: function (cap) { state.cRefs[2] = cap; paintCreateRefs(); } },
  { id: "create-reference-4", role: "create", btn: "cRefLib3", assign: function (cap) { state.cRefs[3] = cap; paintCreateRefs(); } }
];
function refSlotById(id) {
  for (let i = 0; i < REF_SLOTS.length; i++) if (REF_SLOTS[i].id === id) return REF_SLOTS[i];
  return null;
}
function refExtOf(name) {
  const nm = String(name || "");
  return (nm.indexOf(".") >= 0 ? nm.split(".").pop() : "").toLowerCase();
}
function refIsDirect(ext) { return !!REF_LIB_DIRECT[ext]; }
function refNativePath(folder) {
  try { if (fsp && fsp.getNativePath && folder) { const p = fsp.getNativePath(folder); if (p) return String(p); } } catch (e) { }
  return (folder && folder.nativePath) ? String(folder.nativePath) : "";
}
function refLibConfigured() { return !!state.libToken; }

/* Read a chosen file entry into the pipeline's {b64,mime,label} — direct-decode
   jpg/png/webp, route tif/psd through Photoshop. Rejects unsupported types. */
async function refCaptureEntry(f) {
  const name = (f && f.name) ? f.name : "file";
  const ext = refExtOf(name);
  if (REF_LIB_TYPES.indexOf(ext) < 0) throw new Error("HNKERR:err_unsupported:" + ext);
  if (REF_LIB_DIRECT[ext]) {
    const buf = await f.read({ format: formats.binary });
    if (buf && buf.byteLength === 0) throw new Error("HNKERR:err_img:empty file");
    return { b64: bufToB64(buf), mime: REF_LIB_DIRECT[ext], label: name };
  }
  return captureFileViaPS(f, name, 1536);
}

/* ---- Compact Visual Library → reference slot bridge ----
   js/hnk_library_compact_cards.js calls HNK.onLibraryPresetSelect(item) when a
   card's primary button is tapped. The item's full tier ships inside the plugin
   (assets/user_library/…), so it is read from the plugin folder and assigned to
   the reference-2 slot like any other reference capture. */
async function userLibraryCapture(relPath) {
  let entry = await fsp.getPluginFolder();
  const parts = String(relPath || "").split("/");
  for (let i = 0; i < parts.length; i++) {
    if (parts[i]) entry = await entry.getEntry(parts[i]);
  }
  const buf = await entry.read({ format: formats.binary });
  if (!buf || buf.byteLength === 0) throw new Error("HNKERR:err_img:empty file");
  return { b64: bufToB64(buf), mime: "image/jpeg", label: entry.name };
}
(function wireUserLibrarySelect() {
  const g = (typeof globalThis !== "undefined") ? globalThis : window;
  g.HNK = g.HNK || {};
  g.HNK.onLibraryPresetSelect = function (item) {
    if (!item || !item.paths || !item.paths.full) return;
    /* remember the pick so Smart Workflow inputs can pull it too */
    g.HNK.lastLibraryPick = { path: item.paths.full, title: item.title || "" };
    userLibraryCapture(item.paths.full).then(function (cap) {
      cap.label = item.title || cap.label;
      const slot = refSlotById("reference-2");
      if (slot) slot.assign(cap);
      setStatus((item.title || "Library") + " → Reference 2", "ok");
    }).catch(function (e) { hwarn("userlib select:", e); });
  };
  /* Library → Smart Workflow bridge: hands the last-picked library image to
     the AI Tools workflow inputs as a data URL (null when nothing picked). */
  g.HNK.getLibraryPickDataUrl = async function () {
    const pick = g.HNK.lastLibraryPick;
    if (!pick || !pick.path) return null;
    const cap = await userLibraryCapture(pick.path);
    return { dataUrl: "data:" + cap.mime + ";base64," + cap.b64, title: pick.title };
  };
})();

async function refLibChooseFolder() {
  let folder = null;
  try { folder = await fsp.getFolder(); } catch (e) { hwarn("lib getFolder:", e); }
  if (!folder) return null;
  try { state.libToken = await fsp.createPersistentToken(folder); }
  catch (e) { hwarn("lib token:", e); state.libToken = ""; }
  state.libFolderName = folder.name || "";
  state.libNativePath = refNativePath(folder);
  hlog("lib folder selected:", state.libFolderName);
  await refLibScan(folder);
  saveSettings();
  renderRefLib();
  return folder;
}

async function refLibGetFolder() {
  if (!state.libToken) return null;
  try {
    const folder = await fsp.getEntryForPersistentToken(state.libToken);
    return folder || null;
  } catch (e) {
    hwarn("lib token restore failed:", e);
    refLibHandleExpired();
    return null;
  }
}

function refLibHandleExpired() {
  state.libToken = ""; state.libImgCount = 0;
  hwarn("lib folder access lost — reselect required");
  saveSettings();
  renderRefLib();
}

async function refLibOpenFolder() {
  const folder = await refLibGetFolder();
  const np = (folder ? refNativePath(folder) : "") || state.libNativePath;
  if (!np) { setStatus(t("lib_not_config"), "err"); return; }
  if (shell && shell.openPath) {
    try { await shell.openPath(np, "Open the HNK Reference Image Library folder."); hlog("lib folder opened"); return; }
    catch (e) { hwarn("lib openPath failed:", e); }
  }
  /* fallback: no shell / denied — show + copy the path so the user can open it */
  state.libNativePath = np; renderRefLib();
  try {
    if (navigator.clipboard && navigator.clipboard.writeText) await navigator.clipboard.writeText(np);
    else if (navigator.clipboard && navigator.clipboard.setContent) await navigator.clipboard.setContent({ "text/plain": np });
    setStatus(t("lib_path_copied") + ": " + np, "ok"); hlog("lib path copied (no shell)");
  } catch (e2) { setStatus(np, "ok"); }
}

function refLibReset() {
  state.libToken = ""; state.libFolderName = ""; state.libNativePath = "";
  state.libImgCount = 0; state.libLastScan = 0; state.refTokens = {};
  hlog("lib reset");
  saveSettings();
  renderRefLib();
  setStatus(t("lib_reset_done"), "ok");
}

/* Count supported images recursively, yielding often so a large library never
   freezes Photoshop, and stopping at a hard cap. */
async function refLibCountImages(folder, depth, acc) {
  if (depth > REF_SCAN_DEPTH || acc.count >= REF_SCAN_MAX) return;
  let entries = [];
  try { entries = await folder.getEntries(); } catch (e) { hwarn("lib scan entries:", e); return; }
  for (let i = 0; i < entries.length; i++) {
    if (acc.count >= REF_SCAN_MAX) { acc.capped = true; return; }
    const en = entries[i];
    if (en && (en.isFolder || en.isDirectory)) {
      await refLibCountImages(en, depth + 1, acc);
    } else if (en) {
      if (REF_LIB_TYPES.indexOf(refExtOf(en.name)) >= 0) acc.count++;
    }
    if ((i & 63) === 0) await sleep(0);
  }
}
async function refLibScan(folder) {
  const acc = { count: 0, capped: false };
  hlog("lib scan started");
  try { await refLibCountImages(folder, 0, acc); } catch (e) { hwarn("lib scan:", e); }
  state.libImgCount = acc.count;
  state.libLastScan = Date.now();
  hlog("lib scan finished:", acc.count, acc.capped ? "(capped)" : "");
  return acc;
}
async function refLibRescan() {
  const folder = await refLibGetFolder();
  if (!folder) { setStatus(t("lib_not_config"), "err"); return; }
  setStatus(t("lib_scanning"));
  await refLibScan(folder);
  saveSettings();
  renderRefLib();
  setStatus(t("lib_scan_done") + " (" + state.libImgCount + ")", "ok");
}

/* THE universal Browse: first use asks for the library folder then continues
   automatically; afterwards the picker opens inside the saved folder. A chosen
   image is assigned only to the requesting slot; a cancel leaves the slot as-is. */
async function refLibBrowseInto(slotId) {
  if (state.busy) return;
  const slot = refSlotById(slotId);
  if (!slot) { hwarn("lib unknown slot:", slotId); return; }
  try {
    let folder = await refLibGetFolder();
    if (!folder) {
      setStatus(t("lib_choose_msg"));
      folder = await refLibChooseFolder();
      if (!folder) { setStatus(t("st_ready")); return; }
    }
    setStatus(t("st_importing"));
    let file = null;
    try {
      file = await fsp.getFileForOpening({ initialLocation: folder, allowMultiple: false, types: REF_LIB_TYPES });
    } catch (e) {
      hwarn("lib picker initialLocation:", e);
      file = await fsp.getFileForOpening({ allowMultiple: false, types: REF_LIB_TYPES });
    }
    if (!file) { setStatus(t("st_ready")); return; } /* cancelled → keep existing image */
    hlog("lib browse opened:", slotId);
    const cap = await refCaptureEntry(file);
    if (!imgMagicOk(cap.b64)) { setStatus(t("st_img_bad") + " (Ref)", "err"); return; }
    slot.assign(cap);
    /* persist a per-slot token for restore (direct formats only — PSD/TIFF would
       need Photoshop reopened at startup, so those are re-picked each session) */
    const ext = refExtOf(file.name);
    if (refIsDirect(ext)) {
      try { const tok = await fsp.createPersistentToken(file); if (tok) { state.refTokens[slotId] = tok; saveSettings(); } }
      catch (e) { hwarn("lib slot token:", e); }
    } else if (state.refTokens[slotId]) { delete state.refTokens[slotId]; saveSettings(); }
    hlog("lib image selected:", slotId, cap.label);
    setStatus(t("st_ref_file_added"), "ok");
  } catch (e) {
    const msg = (e && e.message ? e.message : String(e));
    if (/err_unsupported/.test(msg)) { herr("lib unsupported:", msg); setStatus(t("lib_unsupported"), "err"); return; }
    herr("lib browse:", msg);
    setStatus(friendlyErr(e), "err");
  }
}

function refLibForgetSlot(slotId) {
  if (state.refTokens && state.refTokens[slotId]) { delete state.refTokens[slotId]; saveSettings(); hlog("lib slot cleared:", slotId); }
}

/* Restore direct-format slot images after a reload/restart. Fire-and-forget so it
   never blocks init; a moved/deleted/renamed file just clears its own slot token. */
async function refLibRestoreSlots() {
  const ids = Object.keys(state.refTokens || {});
  for (let i = 0; i < ids.length; i++) {
    const slotId = ids[i], slot = refSlotById(slotId), tok = state.refTokens[slotId];
    if (!slot || !tok) continue;
    try {
      const file = await fsp.getEntryForPersistentToken(tok);
      if (!file) throw new Error("missing");
      if (!refIsDirect(refExtOf(file.name))) continue; /* skip PS-capture formats at startup */
      const cap = await refCaptureEntry(file);
      if (!imgMagicOk(cap.b64)) throw new Error("bad image");
      slot.assign(cap);
      hlog("lib slot restored:", slotId);
    } catch (e) {
      hwarn("lib slot restore failed:", slotId, e);
      delete state.refTokens[slotId]; saveSettings();
      setStatus(t("lib_restore_fail"), "err"); /* non-blocking: only this slot is cleared */
    }
  }
}

function refFmtTime(ms) {
  try {
    const d = new Date(ms); const p = function (n) { return (n < 10 ? "0" : "") + n; };
    return d.getFullYear() + "-" + p(d.getMonth() + 1) + "-" + p(d.getDate()) + " " + p(d.getHours()) + ":" + p(d.getMinutes());
  } catch (e) { return ""; }
}
function renderRefLib() {
  const path = $("libPathTxt"); if (path) path.textContent = state.libNativePath || state.libFolderName || t("lib_none");
  const cnt = $("libCountTxt"); if (cnt) cnt.textContent = String(state.libImgCount || 0);
  const st = $("libStatusTxt");
  if (st) st.textContent = state.libToken ? t("lib_connected") : (state.libNativePath ? t("lib_perm_lost") : t("lib_not_config"));
  const ls = $("libScanTxt"); if (ls) ls.textContent = state.libLastScan ? refFmtTime(state.libLastScan) : "—";
}
function bindRefLib() {
  const b1 = $("btnLibChoose"); if (b1) b1.addEventListener("click", function () { refLibChooseFolder().then(function (f) { if (f) setStatus(t("lib_connected"), "ok"); }); });
  const b2 = $("btnLibOpen"); if (b2) b2.addEventListener("click", refLibOpenFolder);
  const b3 = $("btnLibChange"); if (b3) b3.addEventListener("click", function () { refLibChooseFolder(); });
  const b4 = $("btnLibReset"); if (b4) b4.addEventListener("click", refLibReset);
  const b5 = $("btnLibRescan"); if (b5) b5.addEventListener("click", refLibRescan);
  /* universal Browse on every reference slot — one controller, no per-slot copy-paste */
  for (let i = 0; i < REF_SLOTS.length; i++) {
    (function (slot) { const btn = $(slot.btn); if (btn) btn.addEventListener("click", function () { refLibBrowseInto(slot.id); }); })(REF_SLOTS[i]);
  }
  renderRefLib();
  REFRESHERS.push(function () { try { renderRefLib(); } catch (e) { } });
}

/* ---------------- Select options (JS-built: UXP cannot localize <option> via data-i18n) ---------------- */
const MODEL_OPTIONS = [
  { v: "auto", k: "model_auto" },
  { v: "flash", k: "model_flash" },
  { v: "pro", k: "model_pro" }
];
const RATIO_OPTIONS = ["auto"].concat(RATIOS.map(function (r) { return r.id; }));

function fillSelect(sel, items) {
  while (sel.firstChild) sel.removeChild(sel.firstChild);
  for (let i = 0; i < items.length; i++) {
    const o = document.createElement("option");
    o.value = items[i].v;
    o.text = items[i].label;
    o.textContent = items[i].label;
    sel.appendChild(o);
  }
}

function populateSelects() {
  const sl = $("selLang");
  if (sl && !sl.firstChild) {
    for (let i = 0; i < LANGS.length; i++) {
      const o = document.createElement("option");
      o.value = LANGS[i].code;
      o.text = LANGS[i].native;
      o.textContent = LANGS[i].native;
      sl.appendChild(o);
    }
  }
  if (sl) sl.value = state.lang;
  const sm = $("selModel");
  if (sm) {
    if (state.provider === "openai") {
      fillSelect(sm, OAI_MODEL_OPTIONS);
      sm.value = oaiModel();
    } else {
      fillSelect(sm, MODEL_OPTIONS.map(function (m) { return { v: m.v, label: t(m.k) }; }));
      sm.value = state.model;
    }
  }
  const sz = $("szRow");
  if (sz) sz.style.display = (state.provider === "openai") ? "none" : "flex";
  const qr = $("qualRow");
  if (qr) qr.style.display = (state.provider === "openai") ? "flex" : "none";
  try { paintQualSeg(); } catch (e) { }
  const sr = $("selRatio");
  if (sr) {
    fillSelect(sr, RATIO_OPTIONS.map(function (id) {
      return { v: id, label: (id === "auto") ? t("ratio_auto") : id };
    }));
    sr.value = state.ratio;
  }
  try { updateCreateEngineTag(); } catch (e) { }
}
REFRESHERS.push(function () { try { populateSelects(); } catch (e) { hwarn("selects:", e); } });

/* ---------------- Small helpers ---------------- */
function $(id) { return document.getElementById(id); }

const B64T = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

function sleep(ms) { return new Promise(function (r) { setTimeout(r, ms); }); }

function imgDimsFromB64(b64, mime) {
  try {
    const u = new Uint8Array(b64ToBuf(b64));
    if (u.length > 24 && u[0] === 0x89 && u[1] === 0x50 && u[2] === 0x4E && u[3] === 0x47) {
      const w = (u[16] << 24) | (u[17] << 16) | (u[18] << 8) | u[19];
      const h = (u[20] << 24) | (u[21] << 16) | (u[22] << 8) | u[23];
      if (w > 0 && h > 0) return { w: w, h: h };
    }
    if (u.length > 4 && u[0] === 0xFF && u[1] === 0xD8) {
      let i = 2;
      while (i + 9 < u.length) {
        if (u[i] !== 0xFF) { i++; continue; }
        const tp = u[i + 1];
        if (tp === 0xC0 || tp === 0xC1 || tp === 0xC2) {
          const h = (u[i + 5] << 8) | u[i + 6];
          const w = (u[i + 7] << 8) | u[i + 8];
          if (w > 0 && h > 0) return { w: w, h: h };
          return null;
        }
        if (tp === 0xD8 || (tp >= 0xD0 && tp <= 0xD7) || tp === 0x01) { i += 2; continue; }
        const seg = (u[i + 2] << 8) | u[i + 3];
        if (seg < 2) return null;
        i += 2 + seg;
      }
    }
  } catch (e) { }
  return null;
}

function buildBatchLog(okC, failC, lines) {
  return "HNK Batch Log - " + new Date().toISOString() + "\n" +
    "OK: " + okC + "  FAIL: " + failC + "\n" +
    "----------------------------------------\n" +
    lines.join("\n") + "\n";
}

function bufToB64(buf) {
  const b = new Uint8Array(buf);
  let out = "";
  for (let i = 0; i < b.length; i += 3) {
    const a = b[i];
    const c = i + 1 < b.length ? b[i + 1] : 0;
    const d = i + 2 < b.length ? b[i + 2] : 0;
    out += B64T[a >> 2];
    out += B64T[((a & 3) << 4) | (c >> 4)];
    out += (i + 1 < b.length) ? B64T[((c & 15) << 2) | (d >> 6)] : "=";
    out += (i + 2 < b.length) ? B64T[d & 63] : "=";
  }
  return out;
}

var _B64MAP = null;
function b64ToBuf(b64) {
  if (!_B64MAP) { _B64MAP = {}; for (let i = 0; i < 64; i++) _B64MAP[B64T[i]] = i; }
  const map = _B64MAP;
  const s = String(b64).replace(/[^A-Za-z0-9+/]/g, "");
  const len = s.length;
  const rem = len % 4;
  const outLen = (len >> 2) * 3 + (rem === 2 ? 1 : (rem === 3 ? 2 : 0));
  const out = new Uint8Array(outLen);
  let o = 0;
  let i = 0;
  while (i + 3 < len) {
    const n = (map[s[i]] << 18) | (map[s[i + 1]] << 12) | (map[s[i + 2]] << 6) | map[s[i + 3]];
    out[o++] = (n >> 16) & 255; out[o++] = (n >> 8) & 255; out[o++] = n & 255;
    i += 4;
  }
  if (rem === 2) {
    const n = (map[s[i]] << 18) | (map[s[i + 1]] << 12);
    out[o++] = (n >> 16) & 255;
  } else if (rem === 3) {
    const n = (map[s[i]] << 18) | (map[s[i + 1]] << 12) | (map[s[i + 2]] << 6);
    out[o++] = (n >> 16) & 255; out[o++] = (n >> 8) & 255;
  }
  return out.buffer;
}

/* ---------------- Status / loading ---------------- */
let dotsTimer = null;
function setStatus(msg, kind) {
  const s = $("status");
  if (!s) return;
  s.textContent = msg || "";
  s.className = "status" + (kind ? " " + kind : "");
}
function stopDots() { if (dotsTimer) { clearInterval(dotsTimer); dotsTimer = null; } }
function setBusyBtn(el) { state.pendingBtn = el || null; }

/* ---------------- v6.9.0 staged progress strip (blueprint §5 "Results are
   real"): queued → uploading → generating → downloading → placing. Rendered
   above the status bar; localized (Burmese-first), no emoji. Hidden when no
   generation is running. ---------------- */
const STAGE_STEPS = ["queued", "uploading", "generating", "downloading", "placing"];
/* literal i18n keys (kept literal so the [32]/[47] i18n integrity audits see them) */
const STAGE_KEYS = {
  queued: "stage_queued", uploading: "stage_uploading", generating: "stage_generating",
  downloading: "stage_downloading", placing: "stage_placing"
};
function setStage(step) {
  const el = $("hnkStrip");
  if (!el) return;
  const idx = STAGE_STEPS.indexOf(step);
  if (!step || idx < 0) { el.className = "hstrip"; el.innerHTML = ""; return; }
  el.innerHTML = "";
  for (let i = 0; i < STAGE_STEPS.length; i++) {
    const s = document.createElement("span");
    s.className = "hstep" + (i < idx ? " done" : (i === idx ? " on" : ""));
    s.textContent = t(STAGE_KEYS[STAGE_STEPS[i]]);
    el.appendChild(s);
  }
  el.className = "hstrip on";
}
/* busy-key → strip step, so every classic generate path gets staged feedback
   without touching each call site. Keys not in the map hide the strip. */
const BUSY_STAGE = { st_capture: "queued", st_gen: "generating", st_place: "placing", st_web_fetch: "downloading" };

/* Production fetch: hard timeout so a stalled request never hangs the panel,
   plus a single retry with backoff on a network drop or 5xx. */
async function hnkFetch(url, opts, timeoutMs) {
  const tmo = timeoutMs || 90000;
  const attempt = async function () {
    let ctrl = null, timer = null;
    try {
      if (typeof AbortController !== "undefined") {
        ctrl = new AbortController();
        timer = setTimeout(function () { try { ctrl.abort(); } catch (e) { } }, tmo);
      }
      const o = Object.assign({}, opts || {});
      if (ctrl) o.signal = ctrl.signal;
      const res = await fetch(url, o);
      if (timer) clearTimeout(timer);
      return res;
    } catch (e) {
      if (timer) clearTimeout(timer);
      const msg = (e && e.message ? e.message : String(e));
      if (/abort/i.test(msg)) throw new Error("HNKERR:err_timeout:request timed out");
      throw new Error("HNKERR:err_net:" + msg);
    }
  };
  try {
    const r = await attempt();
    if (r && r.status >= 500 && r.status < 600) {
      await sleep(1200);
      return await attempt();
    }
    return r;
  } catch (e) {
    const msg = (e && e.message ? e.message : String(e));
    if (/err_net:/.test(msg)) { await sleep(1200); return await attempt(); }
    throw e;
  }
}

function startBusy(msgKey) {
  state.busy = true;
  if (state.pendingBtn && !state.busyBtnEl) {
    state.busyBtnEl = state.pendingBtn;
    state.busyBtnTxt = state.busyBtnEl.textContent;
  }
  const g = $("btnGenerate"); if (g) g.disabled = true;
  stopDots();
  let n = 0;
  try { setStage(BUSY_STAGE[msgKey] || null); } catch (e) { }
  setStatus(t(msgKey));
  dotsTimer = setInterval(function () {
    n = (n + 1) % 4;
    const s = $("status");
    if (s) s.textContent = t(msgKey) + " " + new Array(n + 1).join(".");
    if (state.busyBtnEl) {
      let bt = "";
      for (let bi = 0; bi < 1 + (n % 3); bi++) bt += "\u2022 ";
      state.busyBtnEl.textContent = bt.trim();
    }
  }, 350);
}
function endBusy() {
  state.busy = false;
  if (state.busyBtnEl) {
    state.busyBtnEl.textContent = state.busyBtnTxt || "";
  }
  state.busyBtnEl = null;
  state.busyBtnTxt = null;
  state.pendingBtn = null;
  const g = $("btnGenerate"); if (g) g.disabled = false;
  stopDots();
  try { setStage(null); } catch (e) { }
}

/* ---------------- Settings persistence (file-backed JSON) ---------------- */
async function saveSettings() {
  try {
    const folder = await fsp.getDataFolder();
    const f = await folder.createFile(SETTINGS_FILE, { overwrite: true });
    /* v4.16: de-duplicated — every persisted field appears exactly once. */
    const o = {
      apiKey: state.apiKey, lang: state.lang, theme: state.theme, model: state.model,
      size: state.size, ratio: state.ratio,
      autoRun: state.autoRun, autoPlace: state.autoPlace, intensity: state.intensity,
      rt: state.rt, sections: state.sections, page: state.page,
      clean: state.clean,
      keep: state.keep, rmix: state.rmix, i2p: state.i2p, lights: state.lights,
      lightEquip: state.lightEquip, chains: state.chains, restMode: state.restMode,
      provider: state.provider, oaiKey: state.oaiKey, oaiModel: state.oaiModel, oaiQuality: state.oaiQuality,
      cRatio: state.cRatio, cVariations: state.cVariations,
      recentPrompts: state.recentPrompts,
      webUrl: state.webUrl, liveTrans: state.liveTrans,
      refTarget: state.refTarget, refMkOn: state.refMkOn, refHairOn: state.refHairOn,
      bgKeepFrame: state.bgKeepFrame, bgKeepSubLight: state.bgKeepSubLight, match: state.match,
      bdayAge: state.bdayAge, capOn: state.capOn, capText: state.capText, capPos: state.capPos, scarfDir: state.scarfDir, scarfLen: state.scarfLen,
      pipeline: state.pipeline, pipeMerge: state.pipeMerge,
      wedTrail: state.wedTrail, wedVeil: state.wedVeil, wedGown: state.wedGown, wedPetal: state.wedPetal, wedExtra: state.wedExtra,
      camOn: state.camOn, camBody: state.camBody, camMm: state.camMm, camF: state.camF,
      camFilm: state.camFilm, camBokeh: state.camBokeh,
      camIso: state.camIso, camIsoOn: state.camIsoOn, camK: state.camK, camKOn: state.camKOn,
      learnMode: state.learnMode, autoSave: state.autoSave,
      libToken: state.libToken, libFolderName: state.libFolderName, libNativePath: state.libNativePath,
      libImgCount: state.libImgCount, libLastScan: state.libLastScan, refTokens: state.refTokens,
      accRefresh: state.accRefresh, accUid: state.accUid, accEmail: state.accEmail,
      accProfile: state.accProfile, accSeenAt: state.accSeenAt, accDevId: state.accDevId
    };
    await f.write(JSON.stringify(o), { format: formats.utf8 });
  } catch (e) { hwarn("saveSettings:", e); }
}

async function loadSettings() {
  try {
    const folder = await fsp.getDataFolder();
    const f = await folder.getEntry(SETTINGS_FILE);
    if (!f) return;
    const txt = await f.read({ format: formats.utf8 });
    const o = JSON.parse(txt);
    if (o && typeof o === "object") {
      if (typeof o.apiKey === "string") state.apiKey = o.apiKey;
      if (typeof o.accRefresh === "string") state.accRefresh = o.accRefresh;
      if (typeof o.accUid === "string") state.accUid = o.accUid;
      if (typeof o.accEmail === "string") state.accEmail = o.accEmail;
      if (o.accProfile && typeof o.accProfile === "object") state.accProfile = o.accProfile;
      if (typeof o.accSeenAt === "number" && isFinite(o.accSeenAt)) state.accSeenAt = o.accSeenAt;
      if (typeof o.accDevId === "string") state.accDevId = o.accDevId;
      if (typeof o.lang === "string" && LANG_CODES.indexOf(o.lang) >= 0) state.lang = o.lang;
      if (o.theme === "dark" || o.theme === "light") state.theme = o.theme;
      if (o.model === "auto" || o.model === "flash" || o.model === "pro") state.model = o.model;
      if (o.size === "1K" || o.size === "2K" || o.size === "4K") state.size = o.size;
      if (typeof o.ratio === "string") state.ratio = o.ratio;
      if (typeof o.autoRun === "boolean") state.autoRun = o.autoRun;
      if (typeof o.autoPlace === "boolean") state.autoPlace = o.autoPlace;
      if (typeof o.intensity === "number") state.intensity = Math.round(o.intensity);
      if (o.sections && typeof o.sections === "object") state.sections = o.sections;
      if (typeof o.page === "string") state.page = o.page;
      if (o.clean && typeof o.clean === "object") {
        for (const ck in state.clean) { if (typeof o.clean[ck] === "boolean") state.clean[ck] = o.clean[ck]; }
      }
      if (o.keep && typeof o.keep === "object") {
        for (const kk in state.keep) { if (typeof o.keep[kk] === "boolean") state.keep[kk] = o.keep[kk]; }
      } else {
        /* migrate legacy toggles */
        if (typeof o.faceLock === "boolean") { state.keep.face = o.faceLock; state.keep.pose = o.faceLock; }
        if (typeof o.frameLock === "boolean") state.keep.frame = o.frameLock;
      }
      if (o.rmix && typeof o.rmix === "object") {
        for (const rk in state.rmix) { if (typeof o.rmix[rk] === "boolean") state.rmix[rk] = o.rmix[rk]; }
      }
      if (o.i2p && typeof o.i2p === "object") {
        for (const ik in state.i2p) { if (typeof o.i2p[ik] === "boolean") state.i2p[ik] = o.i2p[ik]; }
      }
      if (typeof o.lightEquip === "boolean") state.lightEquip = o.lightEquip;
      if (o.provider === "gemini" || o.provider === "openai") state.provider = o.provider;
      if (typeof o.oaiKey === "string") state.oaiKey = o.oaiKey;
      if (o.oaiModel === MODEL_OAI_IMG2) state.oaiModel = o.oaiModel;
      else if (o.oaiModel === MODEL_OAI_IMG) state.oaiModel = MODEL_OAI_IMG2; /* migrate: gpt-image-1 API retired 2026-10-23 */
      if (typeof o.oaiQuality === "string" && OAI_QUALITIES.indexOf(o.oaiQuality) >= 0) state.oaiQuality = o.oaiQuality;
      if (Array.isArray(o.recentPrompts)) state.recentPrompts = o.recentPrompts.filter(function (r) { return r && typeof r.t === "string"; }).slice(0, 20);
      if (typeof o.cRatio === "string") state.cRatio = o.cRatio;
      if (typeof o.cVariations === "number") state.cVariations = Math.max(1, Math.min(4, o.cVariations));
      if (typeof o.webUrl === "string") state.webUrl = o.webUrl;
      if (typeof o.liveTrans === "boolean") state.liveTrans = o.liveTrans;
      sanitizeCam(o);
      if (o.refTarget === "solo" || o.refTarget === "couple" || o.refTarget === "family") state.refTarget = o.refTarget;
      if (typeof o.refMkOn === "boolean") state.refMkOn = o.refMkOn;
      if (typeof o.refHairOn === "boolean") state.refHairOn = o.refHairOn;
      if (typeof o.bgKeepFrame === "boolean") state.bgKeepFrame = o.bgKeepFrame;
      if (typeof o.bgKeepSubLight === "boolean") state.bgKeepSubLight = o.bgKeepSubLight;
      if (typeof o.bdayAge === "number") state.bdayAge = Math.max(1, Math.min(45, Math.round(o.bdayAge)));
      if (typeof o.capOn === "boolean") state.capOn = o.capOn;
      if (typeof o.capText === "string") state.capText = o.capText.slice(0, 200);
      if (o.capPos === "top" || o.capPos === "bottom") state.capPos = o.capPos;
      if (o.scarfDir === "left" || o.scarfDir === "right" || o.scarfDir === "up") state.scarfDir = o.scarfDir;
      if (o.scarfLen === "short" || o.scarfLen === "long") state.scarfLen = o.scarfLen;
      if (o.match && typeof o.match === "object") {
        for (const mk3 in state.match) { if (typeof o.match[mk3] === "boolean") state.match[mk3] = o.match[mk3]; }
      }
      sanitizePipeline(o.pipeline);
      if (typeof o.learnMode === "boolean") state.learnMode = o.learnMode;
      if (typeof o.libToken === "string") state.libToken = o.libToken;
      if (typeof o.libFolderName === "string") state.libFolderName = o.libFolderName;
      if (typeof o.libNativePath === "string") state.libNativePath = o.libNativePath;
      if (typeof o.libImgCount === "number" && o.libImgCount >= 0) state.libImgCount = o.libImgCount;
      if (typeof o.libLastScan === "number" && o.libLastScan >= 0) state.libLastScan = o.libLastScan;
      if (o.refTokens && typeof o.refTokens === "object") {
        state.refTokens = {};
        for (const rk in o.refTokens) { if (typeof o.refTokens[rk] === "string") state.refTokens[rk] = o.refTokens[rk]; }
      }
      if (typeof o.pipeMerge === "boolean") state.pipeMerge = o.pipeMerge;
      sanitizeWed(o);
      if (typeof o.autoSave === "boolean") state.autoSave = o.autoSave;
      if (typeof o.restMode === "string" && (o.restMode === "color" || o.restMode === "bw")) state.restMode = o.restMode;
      if (o.chains && typeof o.chains === "object") {
        for (const ck2 in state.chains) { if (typeof o.chains[ck2] === "boolean") state.chains[ck2] = o.chains[ck2]; }
      }
      if (Array.isArray(o.lights)) {
        for (let li = 0; li < state.lights.length && li < o.lights.length; li++) {
          const ol = o.lights[li];
          if (!ol || typeof ol !== "object") continue;
          if (typeof ol.on === "boolean") state.lights[li].on = ol.on;
          if (typeof ol.type === "string" && LIGHT_TYPES.indexOf(ol.type) >= 0) state.lights[li].type = ol.type;
          ["int", "angle", "height", "dist", "size"].forEach(function (nk) {
            if (typeof ol[nk] === "number") state.lights[li][nk] = Math.round(ol[nk]);
          });
        }
      }
      if (o.rt && typeof o.rt === "object") {
        for (const k in RT_DEFAULT) {
          if (typeof RT_DEFAULT[k] === "number" && typeof o.rt[k] === "number") state.rt[k] = Math.round(o.rt[k]);
          if (RT_DEFAULT[k] === null && (typeof o.rt[k] === "string" || o.rt[k] === null)) state.rt[k] = o.rt[k];
        }
      }
    }
  } catch (e) { /* first run: file not there yet */ }
}

/* ---------------- Photoshop capture ---------------- */
/* AUDIT-FIX #5: encodeImageData only accepts RGB. getPixels returns the document's
   NATIVE mode, so a Grayscale / CMYK / Lab document used to throw a raw UXP error and
   dead-end Generate. Expand grayscale to RGB (like the selection-mask path) and fail
   fast with a localized "convert to RGB" message for CMYK/Lab. The caller's finally
   still disposes the source imageData; this only disposes its own temp buffer. */
async function encodeCaptureB64(imageData) {
  const cs = imageData.colorSpace;
  const comp = imageData.components || 0;
  /* Fast path: already RGB / RGBA. */
  if (cs === "RGB" || (!cs && comp >= 3)) {
    return await imaging.encodeImageData({ imageData: imageData, base64: true });
  }
  /* Grayscale (1-2 channels): expand to interleaved RGB. */
  if (cs === "Grayscale" || comp < 3) {
    const raw = await imageData.getData();
    const g = (raw instanceof Uint8Array) ? raw : new Uint8Array(raw);
    const w = imageData.width, h = imageData.height;
    const step = comp > 1 ? comp : 1; /* skip the alpha channel of grayscale+alpha */
    const rgb = new Uint8Array(w * h * 3);
    for (let i = 0, j = 0; j + 2 < rgb.length && i < g.length; i += step, j += 3) {
      const v = g[i]; rgb[j] = v; rgb[j + 1] = v; rgb[j + 2] = v;
    }
    let rgbId = null;
    try {
      rgbId = await imaging.createImageDataFromBuffer(rgb, {
        width: w, height: h, components: 3, colorSpace: "RGB", componentSize: 8, chunky: true
      });
      return await imaging.encodeImageData({ imageData: rgbId, base64: true });
    } finally {
      try { if (rgbId && rgbId.dispose) rgbId.dispose(); } catch (de) { }
    }
  }
  /* CMYK / Lab / Duotone / Multichannel — encodeImageData cannot handle these. */
  throw new Error("HNKERR:err_mode:" + (cs || "non-RGB"));
}

async function captureDocumentB64(maxSide) {
  let out = null;
  await psCore.executeAsModal(async function () {
    const doc = app.activeDocument;
    if (!doc) throw new Error(t("st_no_doc"));
    const dw = Number(doc.width), dh = Number(doc.height);
    const cap = maxSide || 2048;
    const sc = Math.min(1, cap / Math.max(dw, dh));
    const req = { documentID: doc.id, componentSize: 8, applyAlpha: true };
    if (sc < 1) req.targetSize = { width: Math.max(1, Math.round(dw * sc)) };
    const px = await imaging.getPixels(req);
    try {
      const w = px.imageData.width, h = px.imageData.height;
      const b64 = await encodeCaptureB64(px.imageData);
      out = { b64: b64, mime: "image/jpeg", label: "Document", w: w, h: h };
    } finally {
      /* always release native pixel memory, even if encoding throws (no leak) */
      if (px && px.imageData && px.imageData.dispose) px.imageData.dispose();
    }
  }, { commandName: "HNK Capture Document" });
  return out;
}

async function captureLayerB64(maxSide) {
  let out = null;
  await psCore.executeAsModal(async function () {
    const doc = app.activeDocument;
    if (!doc) throw new Error(t("st_no_doc"));
    const ls = doc.activeLayers;
    if (!ls || !ls.length) throw new Error(t("no_layer"));
    const lyr = ls[0];
    const b = lyr.bounds;
    const lw = Math.max(1, Number(b.right) - Number(b.left));
    const lh = Math.max(1, Number(b.bottom) - Number(b.top));
    const cap = maxSide || 1536;
    const sc = Math.min(1, cap / Math.max(lw, lh));
    const req = { documentID: doc.id, layerID: lyr.id, componentSize: 8, applyAlpha: true };
    if (sc < 1) req.targetSize = { width: Math.max(1, Math.round(lw * sc)) };
    const px = await imaging.getPixels(req);
    try {
      const w = px.imageData.width, h = px.imageData.height;
      const b64 = await encodeCaptureB64(px.imageData);
      out = { b64: b64, mime: "image/jpeg", label: "Layer: " + lyr.name, w: w, h: h };
    } finally {
      if (px && px.imageData && px.imageData.dispose) px.imageData.dispose();
    }
  }, { commandName: "HNK Capture Layer" });
  return out;
}

/* Open any Photoshop-readable file entry, capture composite, close. */
async function captureFileViaPS(entry, label, maxSide) {
  let cap = null;
  await psCore.executeAsModal(async function () {
    const doc = await app.open(entry);
    /* try/finally: the temporary doc must ALWAYS be closed and pixel memory
       released, even if getPixels/encodeImageData throws — otherwise every
       failed import leaks an invisible open document and native memory. */
    let px = null;
    try {
      const dw = Number(doc.width), dh = Number(doc.height);
      const capSide = maxSide || 1536;
      const sc = Math.min(1, capSide / Math.max(dw, dh));
      const req = { documentID: doc.id, componentSize: 8, applyAlpha: true };
      if (sc < 1) req.targetSize = { width: Math.max(1, Math.round(dw * sc)) };
      px = await imaging.getPixels(req);
      const b64 = await encodeCaptureB64(px.imageData);
      cap = { b64: b64, mime: "image/jpeg", label: label };
    } finally {
      try { if (px && px.imageData && px.imageData.dispose) px.imageData.dispose(); } catch (de) { }
      try { await doc.closeWithoutSaving(); } catch (ce) { }
    }
  }, { commandName: "HNK Import Reference" });
  return cap;
}

/* Choose any file. Direct-read common formats; everything else
   (PSD/TIFF/HEIC/RAW/...) is opened in Photoshop, captured, then closed. */
async function pickAnyFile() {
  try {
    return await fsp.getFileForOpening({ allowMultiple: false });
  } catch (e) {
    return await fsp.getFileForOpening({
      allowMultiple: false,
      types: ["png", "jpg", "jpeg", "webp", "gif", "bmp", "tif", "tiff", "psd", "psb",
        "heic", "heif", "avif", "dng", "cr2", "cr3", "nef", "arw", "raf", "orf", "rw2"]
    });
  }
}

async function pickReferenceFile() {
  const f = await pickAnyFile();
  if (!f) return null;
  const name = f.name || "file";
  const ext = (name.indexOf(".") >= 0 ? name.split(".").pop() : "").toLowerCase();
  /* AUDIT-FIX #8: only the MIME types Gemini accepts inline may be read directly.
     gif/bmp are NOT in GEMINI_DIRECT_MIME, so they must fall through to
     captureFileViaPS (which re-encodes to JPEG) instead of poisoning the next
     Generate with an unsupported-MIME 400 / a misleading "corrupt image" error. */
  const direct = {
    png: "image/png", jpg: "image/jpeg", jpeg: "image/jpeg",
    webp: "image/webp"
  };
  if (direct[ext]) {
    const buf = await f.read({ format: formats.binary });
    return { b64: bufToB64(buf), mime: direct[ext], label: name };
  }
  return captureFileViaPS(f, name, 1536);
}

/* ---------------- Web / URL references (Chrome, Pinterest) ---------------- */
const GEMINI_DIRECT_MIME = { "image/jpeg": 1, "image/png": 1, "image/webp": 1 };
const EXT_BY_MIME = {
  "image/jpeg": "jpg", "image/png": "png", "image/webp": "webp",
  "image/gif": "gif", "image/bmp": "bmp", "image/avif": "avif",
  "image/heic": "heic", "image/heif": "heif", "image/tiff": "tif"
};

function normalizeUrl(u) {
  let s = String(u || "").trim();
  if (!s) return "";
  if (/^\/\//.test(s)) s = "https:" + s;
  if (!/^https?:\/\//i.test(s)) s = "https://" + s;
  return s;
}

function decodeHtmlAmp(s) {
  return String(s).replace(/&amp;/g, "&").replace(/&#38;/g, "&").replace(/&quot;/g, '"');
}

function extractImageUrl(html) {
  const pats = [
    /<meta[^>]+property=["']og:image(?::secure_url)?["'][^>]+content=["']([^"']+)["']/i,
    /<meta[^>]+content=["']([^"']+)["'][^>]+property=["']og:image(?::secure_url)?["']/i,
    /<meta[^>]+name=["']twitter:image(?::src)?["'][^>]+content=["']([^"']+)["']/i,
    /<link[^>]+rel=["']image_src["'][^>]+href=["']([^"']+)["']/i,
    /https:\/\/i\.pinimg\.com\/[A-Za-z0-9_\-\/.]+\.(?:jpg|jpeg|png|webp)/i
  ];
  for (let i = 0; i < pats.length; i++) {
    const m = html.match(pats[i]);
    if (m) {
      let u = decodeHtmlAmp(m[1] || m[0]);
      if (/^\/\//.test(u)) u = "https:" + u;
      if (/^https?:\/\//i.test(u)) return u;
    }
  }
  return null;
}

function extFromUrl(u) {
  const m = String(u).toLowerCase().match(/\.(jpe?g|png|webp|gif|bmp|avif|heic|heif|tiff?)(\?|#|$)/);
  if (!m) return null;
  if (m[1] === "jpeg") return "jpg";
  if (m[1] === "tiff") return "tif";
  return m[1];
}

async function fetchWebImage(url, depth) {
  if (/^blob:/i.test(url)) throw new Error("HNKERR:st_web_blob:blob url");
  const dm = /^data:(image\/[a-z0-9.+-]+);base64,(.+)$/i.exec(url);
  if (dm) {
    return { buf: b64ToBuf(dm[2]), mime: dm[1].toLowerCase() };
  }
  const res = await hnkFetch(url, {
    method: "GET",
    headers: { "Accept": "image/jpeg,image/png,image/webp,image/*;q=0.9,*/*;q=0.8" }
  }, 60000);
  if (!res.ok) throw new Error("HTTP " + res.status);
  const ct = String((res.headers && res.headers.get) ? (res.headers.get("content-type") || "") : "").toLowerCase();
  if (ct.indexOf("text/html") >= 0) {
    if ((depth || 0) >= 2) throw new Error(t("st_url_bad"));
    const html = await res.text();
    const img = extractImageUrl(html);
    if (!img) throw new Error(t("st_url_bad"));
    return fetchWebImage(img, (depth || 0) + 1);
  }
  const buf = await res.arrayBuffer();
  if (!buf || !buf.byteLength) throw new Error(t("st_url_bad"));
  if (buf.byteLength > 40 * 1024 * 1024) throw new Error("File too large");
  let mime = ct.split(";")[0].trim();
  if (!mime || mime === "application/octet-stream" || mime === "binary/octet-stream") {
    const e = extFromUrl(url);
    if (e) {
      for (const k in EXT_BY_MIME) { if (EXT_BY_MIME[k] === e) { mime = k; break; } }
    }
  }
  return { buf: buf, mime: mime, url: url };
}

function urlLabel(u) {
  try {
    const clean = String(u).split("#")[0].split("?")[0];
    const seg = clean.split("/").pop();
    return "Web: " + (seg && seg.length ? seg.slice(0, 40) : "image");
  } catch (e) { return "Web: image"; }
}

/* Shared web-URL → reference loader. Both the Studio (state.refs) and Create
   (state.cRefs) slots run the identical fetch/convert/verify pipeline — only
   the temp-file prefix and the assign/repaint/close hooks differ. */
async function loadUrlIntoAnySlot(rawUrl, cfg) {
  const url = normalizeUrl(rawUrl);
  if (!url) { setStatus(t("st_url_bad"), "err"); return; }
  startBusy("st_url_loading");
  try {
    const got = await fetchWebImage(url, 0);
    let ref = null;
    const small = got.buf.byteLength <= 6 * 1024 * 1024;
    if (GEMINI_DIRECT_MIME[got.mime] && small) {
      ref = { b64: bufToB64(got.buf), mime: got.mime, label: urlLabel(got.url) };
    } else {
      /* convert / downscale through Photoshop (avif, heic, gif, bmp, tif, oversized) */
      const ext = EXT_BY_MIME[got.mime] || extFromUrl(got.url);
      if (!ext) throw new Error(t("st_url_bad"));
      const folder = await fsp.getDataFolder();
      const tmp = await folder.createFile(cfg.tmpPrefix + Date.now() + "." + ext, { overwrite: true });
      await tmp.write(got.buf, { format: formats.binary });
      ref = await captureFileViaPS(tmp, urlLabel(got.url), 1536);
    }
    if (!imgMagicOk(ref.b64)) { endBusy(); setStatus(t("st_img_bad") + " (Ref)", "err"); return; } /* AUDIT-FIX #4: endBusy before return so the panel never sticks busy */
    cfg.assign(ref); /* check 1/3: ref verified */
    cfg.repaint();
    cfg.close();
    endBusy();
    setStatus(t("st_ref_web_added"), "ok");
  } catch (e) {
    endBusy();
    setStatus(t("st_err") + ": " + (e && e.message ? e.message : e), "err");
  }
}

async function loadUrlIntoSlot(idx, rawUrl) {
  return loadUrlIntoAnySlot(rawUrl, {
    tmpPrefix: "hnk_web_",
    assign: function (ref) { state.refs[idx] = ref; },
    repaint: renderRefs,
    close: closeUrlBar
  });
}

async function readClipboardText() {
  try {
    if (typeof navigator !== "undefined" && navigator.clipboard) {
      if (navigator.clipboard.readText) {
        const s = await navigator.clipboard.readText();
        if (s) return s;
      }
      if (navigator.clipboard.getContent) {
        const c = await navigator.clipboard.getContent();
        if (c && c["text/plain"]) return c["text/plain"];
      }
    }
  } catch (e) { hwarn("clipboard:", e); }
  return "";
}

function openUrlBar(idx) {
  state.urlSlot = idx;
  $("urlBar").style.display = "block";
  $("urlSlotTag").textContent = "\u2192 Slot " + (idx + 1);
  $("urlInput").value = "";
  try { $("urlInput").focus(); } catch (e) { }
}

function closeUrlBar() {
  state.urlSlot = -1;
  $("urlBar").style.display = "none";
}

/* ---------------- Reference slots ---------------- */
function renderRefs() {
  for (let i = 0; i < 2; i++) {
    const r = state.refs[i];
    const img = $("refImg" + i), ph = $("refPh" + i);
    const lb = $("refLb" + i), x = $("refClear" + i);
    if (r) {
      img.style.backgroundImage = 'url("data:' + r.mime + ";base64," + r.b64 + '")';
      img.style.display = "block";
      ph.style.display = "none";
      lb.textContent = r.label || "";
      x.style.display = "flex";
    } else {
      img.style.backgroundImage = "";
      img.style.display = "none";
      ph.style.display = "flex";
      lb.textContent = "";
      x.style.display = "none";
    }
  }
}

async function addLayerRef(idx) {
  if (state.busy) return;
  try {
    const cap = await captureLayerB64(1536);
    if (!imgMagicOk(cap.b64)) { setStatus(t("st_img_bad") + " (Ref)", "err"); return; }
    state.refs[idx] = cap; /* check 1/3 */
    renderRefs();
    setStatus(t("st_ref_layer_added"), "ok");
  } catch (e) {
    /* AUDIT-FIX: was building a raw, untranslated status message directly
       from e.message instead of routing through friendlyErr() like every
       other catch block in the file — route it consistently so an
       HNKERR-tagged failure shows its translated text, not the raw tag. */
    const friendlyMsg = friendlyErr(e);
    const lb = $("refLb" + idx); if (lb) lb.textContent = "! " + friendlyMsg.slice(0, 48);
    setStatus(friendlyMsg, "err");
  }
}

async function addFileRef(idx) {
  if (state.busy) return;
  try {
    setStatus(t("st_importing"));
    const cap = await pickReferenceFile();
    if (!cap) { setStatus(t("st_ready")); return; }
    if (!imgMagicOk(cap.b64)) { setStatus(t("st_img_bad") + " (Ref)", "err"); return; }
    state.refs[idx] = cap; /* check 1/3 */
    renderRefs();
    setStatus(t("st_ref_file_added"), "ok");
  } catch (e) {
    const friendlyMsg = friendlyErr(e);
    const lb = $("refLb" + idx); if (lb) lb.textContent = "! " + friendlyMsg.slice(0, 48);
    setStatus(friendlyMsg, "err");
  }
}

/* ---------------- Prompt box (native textarea, capacity self-tested) ---------------- */
function getPromptText() {
  const el = $("promptBox");
  return (el && typeof el.value === "string") ? el.value : "";
}

function getMyPromptText() {
  const el = $("promptBoxMy");
  return (el && typeof el.value === "string") ? el.value : "";
}

async function translateMyPrompt(txt) {
  if (state.myCache && state.myCache.src === txt) return state.myCache.out;
  const out = await callGeminiText(
    "Translate this Myanmar (Burmese) photo-editing prompt into precise, professional English for an AI image model. Keep the words IMAGE 1, IMAGE 2, IMAGE 3 unchanged. Output ONLY the English translation, nothing else.\n\n" + txt
  );
  state.myCache = { src: txt, out: out };
  return out;
}

async function translateEnToMy(txt) {
  if (state.enCache && state.enCache.src === txt) return state.enCache.out;
  const out = await callGeminiText(
    "Translate this English photo-editing prompt into natural Myanmar (Burmese) that a photographer would write. Keep the words IMAGE 1, IMAGE 2, IMAGE 3 and common technical terms (softbox, 8K, HDR, bokeh) in English. Output ONLY the Burmese translation, nothing else.\n\n" + txt
  );
  state.enCache = { src: txt, out: out };
  return out;
}

function setTransInfo(txt) {
  const el = $("transInfo");
  if (el) el.textContent = txt || "";
}

function scheduleLiveTrans(dir) {
  if (!state.liveTrans || !state.apiKey) return;
  if (state.transTimer) { try { clearTimeout(state.transTimer); } catch (e) { } }
  state.transTimer = setTimeout(function () { doLiveTrans(dir); }, 900);
}

async function doLiveTrans(dir) {
  if (!state.liveTrans || !state.apiKey || state.busy) return;
  const pb = $("promptBox");
  const pm = $("promptBoxMy");
  if (!pb || !pm) return;
  try {
    if (dir === "en2my") {
      const src = (pb.value || "").trim();
      if (!src) {
        state.fillingMy = true; pm.value = ""; state.fillingMy = false;
        refreshPromptMeta(); setTransInfo(""); return;
      }
      setTransInfo("\u21C4 \u2026");
      const out = await translateEnToMy(src);
      if ((pb.value || "").trim() !== src) return;
      state.fillingMy = true;
      pm.value = out.slice(0, promptCap());
      state.fillingMy = false;
      refreshPromptMeta();
      setTransInfo("\u21C4 \u2713");
    } else {
      const src = (pm.value || "").trim();
      if (!src) {
        state.fillingEn = true; pb.value = ""; state.fillingEn = false;
        refreshPromptMeta(); setTransInfo(""); return;
      }
      setTransInfo("\u21C4 \u2026");
      const out = await translateMyPrompt(src);
      if ((pm.value || "").trim() !== src) return;
      state.fillingEn = true;
      pb.value = out.slice(0, promptCap());
      state.fillingEn = false;
      refreshPromptMeta();
      setTransInfo("\u21C4 \u2713");
    }
  } catch (e) {
    setTransInfo("\u21C4 \u2717");
  }
}

function promptCap() { return state.promptCap || MAX_PROMPT; }

/* Force the textarea look via inline styles — immune to UXP selector gaps. */
function stylePromptBox(el) {
  try {
    const st = el.style;
    st.width = "100%";
    st.height = "140px";
    st.minHeight = "140px";
    st.maxHeight = "260px";
    st.backgroundColor = "#26262f";
    st.border = "1px solid #3a3a46";
    st.borderRadius = "8px";
    st.color = "#e9e6df";
    st.padding = "8px 9px";
    st.fontSize = "12px";
    st.lineHeight = "1.55";
    st.fontFamily = '"Segoe UI","Noto Sans Myanmar","Myanmar Text",sans-serif';
    st.overflowY = "auto";
    st.resize = "none";
  } catch (e) { hwarn("stylePromptBox:", e); }
}

/* Measure the REAL textarea capacity on this machine (guards any UXP cap). */
function detectPromptCap(el) {
  try {
    const probe = new Array(MAX_PROMPT + 1).join("x");
    el.value = probe;
    const got = (el.value || "").length;
    el.value = "";
    state.promptCap = (got >= MAX_PROMPT) ? MAX_PROMPT : Math.max(1, got);
    if (state.promptCap < MAX_PROMPT) {
      setStatus(t("cap_warn") + " " + state.promptCap, "err");
    }
  } catch (e) { state.promptCap = MAX_PROMPT; }
}

function setPromptText(txt) {
  const el = $("promptBox");
  if (el) el.value = (txt || "").slice(0, promptCap());
  refreshPromptMeta();
}

function refreshPromptMeta() {
  const txt = getPromptText();
  const cap = promptCap();
  const c = $("charCount");
  if (c) {
    c.textContent = txt.length + " / " + cap;
    c.className = "cnt" + (txt.length >= cap ? " max" : (txt.length > cap - 2000 ? " warn" : ""));
  }
  const my = getMyPromptText();
  const cm = $("charCountMy");
  if (cm) cm.textContent = my.length + " / " + cap;
}

function onPromptInput() {
  const el = $("promptBox");
  const cap = promptCap();
  if (el && el.value.length > cap) el.value = el.value.slice(0, cap);
  refreshPromptMeta();
  if (!state.fillingEn) scheduleLiveTrans("en2my");
}

function appendPrompt(txt) {
  const cur = getPromptText();
  /* idempotent: never stack the same block twice (tapping a preset repeatedly
     must not duplicate its prompt) */
  if (txt && cur.indexOf(txt.trim()) >= 0) return;
  const merged = (cur ? cur + "\n" : "") + txt;
  setPromptText(merged.slice(0, promptCap()));
}

/* ---------------- Presets ---------------- */
/* ---------------- Style Chains (multi-on, combine with everything) ---------------- */
const CHAINS = {
  prewedding: ["Prewedding", "Prewedding editorial style: romantic airy mood, gentle warm backlight glow, creamy pastel grade, dreamy soft contrast."],
  pageant: ["Miss Pageant", "Beauty-pageant glam: flawless stage makeup, sculpted contour, radiant highlighted skin, glossy lips, confident polished finish."],
  model: ["Model Editorial", "High-fashion editorial: crisp defined features, sharp catchlights, refined neutral-cool grade, magazine cover polish."],
  glass: ["Glass Skin", "Korean glass-skin: translucent ultra-clear hydrated skin, inner glow, minimal matte, luminous even tone."],
  commercial: ["Commercial", "Commercial advertising look: bright clean high-key lighting feel, true-to-life colors, friendly approachable polish, crisp product-grade clarity."],
  korea: ["Korea Makeup", "Korean makeup style: straight soft brows, aegyo-sal under-eye brightness, gradient lips, dewy nude base."],
  vietnam: ["Vietnam Bridal", "Vietnamese bridal makeup: sharp defined brows, bold winged liner and lashes, matte airbrushed base, deep rose lips."],
  chinese: ["Chinese Classic", "Chinese classical makeup: elegant porcelain base, refined arched brows, subtle red accents, graceful hanfu-portrait mood."]
};

function chainText() {
  const L = [];
  for (const k in CHAINS) { if (state.chains[k]) L.push("- " + CHAINS[k][0] + ": " + CHAINS[k][1]); }
  if (!L.length) return "";
  return "ACTIVE STYLE CHAINS (blend all of these styles together):\n" + L.join("\n");
}

function paintChains() {
  for (const k in CHAINS) {
    const b = $("chn_" + k);
    if (b) b.className = "sw ltchip chn" + (state.chains[k] ? " on" : "");
  }
}

function paintRoTarget() {
  const map = [["roTgSolo", "solo"], ["roTgCouple", "couple"], ["roTgFamily", "family"]];
  for (let i = 0; i < map.length; i++) {
    const b = $(map[i][0]);
    if (b) b.className = "segb" + (state.refTarget === map[i][1] ? " on" : "");
  }
}

function bindRefOps() {
  const map = [["roTgSolo", "solo"], ["roTgCouple", "couple"], ["roTgFamily", "family"]];
  for (let i = 0; i < map.length; i++) {
    (function (id, val) {
      const b = $(id);
      if (b) b.addEventListener("click", function () { state.refTarget = val; paintRoTarget(); saveSettings(); });
    })(map[i][0], map[i][1]);
  }
  paintRoTarget();
  bindChecks([["ckRefMk", "refMkOn"], ["ckRefHair", "refHairOn"]], state);
  bindChecks([["ckBgFrame", "bgKeepFrame"], ["ckBgLight", "bgKeepSubLight"]], state);
  bindChecks(MATCH_CK, state.match);
  bindGroup("roFaceH", "roFaceB", false);
  bindGroup("roBgH", "roBgB", false);
  bindGroup("roSubH", "roSubB", false);
  bindGroup("roLcH", "roLcB", false);
  bindGroup("roDressH", "roDressB", false);
  bindGroup("roMkH", "roMkB", false);
  bindGroup("roMatchH", "roMatchB", false);
  bindGroup("roDetailH", "roDetailB", false);
  bindGroup("roCompH", "roCompB", false);
}

function bindChains() {
  for (const k in CHAINS) {
    (function (key) {
      const b = $("chn_" + key);
      if (b) {
        b.textContent = CHAINS[key][0];
        b.addEventListener("click", function () {
          state.chains[key] = !state.chains[key];
          paintChains();
          saveSettings();
        });
      }
    })(k);
  }
  paintChains();
}

function paintRest() {
  const c = $("ckRestColor"), b = $("ckRestBw");
  if (c) { c.className = "ckb" + (state.restMode === "color" ? " on" : ""); c.textContent = state.restMode === "color" ? "\u2713" : ""; }
  if (b) { b.className = "ckb" + (state.restMode === "bw" ? " on" : ""); b.textContent = state.restMode === "bw" ? "\u2713" : ""; }
}
function bindRest() {
  const c = $("ckRestColor"), b = $("ckRestBw");
  if (c) c.addEventListener("click", function () { state.restMode = "color"; paintRest(); saveSettings(); });
  if (b) b.addEventListener("click", function () { state.restMode = "bw"; paintRest(); saveSettings(); });
  paintRest();
}

/* ---------------- KEEP ORIGINAL locks (user checkboxes, per-generation) ---------------- */
const KEEP_LOCKS = {
  frame: "Keep the exact original framing and composition of IMAGE 1 - same crop, camera angle, perspective, subject position and scale. Do not zoom, re-crop or rotate.",
  pose: "Keep the exact original body pose, gesture and hand positions of the IMAGE 1 subject.",
  face: "Keep the exact original face identity of the IMAGE 1 subject - same eyes, nose, mouth, eyebrows and face shape. No face swap; the person must remain 100% the same person.",
  expr: "Keep the original facial expression unchanged.",
  hair: "Keep the original hairstyle, hair length and hair color.",
  dress: "Keep the original dress / outfit exactly as it is.",
  skin: "Keep the original skin tone and natural skin texture.",
  light: "Keep the original lighting: direction, mood and intensity.",
  color: "Keep the original color grade and white balance.",
  bg: "Keep the original background completely unchanged.",
  subject: "Keep the ENTIRE IMAGE 1 subject untouched - face, body, pose, outfit and hair."
};
const KEEP_ORDER = ["subject", "face", "expr", "pose", "frame", "hair", "dress", "skin", "light", "color", "bg"];
const KEEP_CK = KEEP_ORDER.map(function (k) { return ["kp" + k.charAt(0).toUpperCase() + k.slice(1), k]; });

function keepText(suppress) {
  const sup = suppress || [];
  const L = [];
  for (let i = 0; i < KEEP_ORDER.length; i++) {
    const k = KEEP_ORDER[i];
    if (state.keep[k] && sup.indexOf(k) < 0) L.push("- " + KEEP_LOCKS[k]);
  }
  if (!L.length) return "";
  return "KEEP ORIGINAL (locked by the user):\n" + L.join("\n");
}

function bindChecks(map, stateObj, extra) {
  for (let i = 0; i < map.length; i++) {
    (function (id, key) {
      const b = $(id);
      if (b) b.addEventListener("click", function () {
        stateObj[key] = !stateObj[key];
        paintChecks(map, stateObj);
        saveSettings();
        if (extra) extra();
      });
    })(map[i][0], map[i][1]);
  }
  paintChecks(map, stateObj);
}

function paintChecks(map, stateObj) {
  for (let i = 0; i < map.length; i++) {
    const b = $(map[i][0]);
    if (b) {
      const on = !!stateObj[map[i][1]];
      b.className = "ckb" + (on ? " on" : "");
      b.textContent = on ? "\u2713" : "";
    }
  }
}

/* ---------------- Cleanup checkboxes (combine with every Generate) ---------------- */
const CLEANUPS = {
  people: "Remove every unwanted background person and bystander from IMAGE 1 while keeping only the main subject(s). Rebuild the background naturally and seamlessly where people were removed, matching perspective, texture, grain and lighting. Do not change the main subject at all.",
  hands: "Correct hand anatomy in IMAGE 1: remove any extra, duplicated, merged or deformed hands and fingers. Every visible hand must have exactly five natural, well-proportioned fingers with realistic skin texture. Keep pose, clothing and everything else unchanged.",
  legs: "Correct leg and foot anatomy in IMAGE 1: remove any extra, duplicated or deformed legs and feet. Legs must look natural and correctly proportioned with the body pose. Rebuild the ground and background naturally where fixes are made. Keep everything else unchanged.",
  full: "Full cleanup of IMAGE 1: remove all background people and bystanders, remove distracting objects and trash, fix any extra or deformed hands, fingers, legs and feet so all anatomy is natural, and rebuild the background seamlessly. Keep the main subject's identity, pose and clothing exactly the same."
};

function cleanupText() {
  if (state.clean.full) return CLEANUPS.full;
  const L = [];
  if (state.clean.people) L.push(CLEANUPS.people);
  if (state.clean.hands) L.push(CLEANUPS.hands);
  if (state.clean.legs) L.push(CLEANUPS.legs);
  return L.join("\n");
}

const CK_MAP = [["ckPeople", "people"], ["ckHands", "hands"], ["ckLegs", "legs"], ["ckFull", "full"]];

function paintClean() {
  for (let i = 0; i < CK_MAP.length; i++) {
    const b = $(CK_MAP[i][0]);
    if (b) {
      const on = !!state.clean[CK_MAP[i][1]];
      b.className = "ckb" + (on ? " on" : "");
      b.textContent = on ? "\u2713" : "";
    }
  }
}

function bindClean() {
  for (let i = 0; i < CK_MAP.length; i++) {
    (function (id, key) {
      const b = $(id);
      if (b) b.addEventListener("click", function () {
        state.clean[key] = !state.clean[key];
        paintClean();
        saveSettings();
      });
    })(CK_MAP[i][0], CK_MAP[i][1]);
  }
  paintClean();
}

/* NOTE (v4.19): the old "Reference AI Tools / Styling" grid duplicated the
   Reference Ops Pro card. The duplicate presets (refBG->roBgRep, scene->roBgSwap,
   skinMakeup/fullMakeup->roMkCopy, lightColor->roLcCopy, dress->roDressRep) were
   removed; the unique ones (fgProps, textLogo, style, fgbglc, hair, access, pose)
   were moved into Reference Ops Pro. Reference Ops Pro is now the one system. */
const PRESETS = {
  fgProps: {
    btn: "pFgProps", needRef: 1, unkeep: [],
    roles: { ref1: "FOREGROUND PROPS SOURCE (decorative elements to layer in front)", ref2: "additional props reference (optional)" },
    prompt: "Copy the foreground decorative elements from IMAGE 2 - props, flowers, petals, leaves, frames, fabric or bokeh foreground - and layer them realistically IN FRONT of the IMAGE 1 subject with natural depth-of-field blur and matching light."
  },
  textLogo: {
    btn: "pTextLogo", needRef: 1, unkeep: [], addsText: true,
    roles: { ref1: "TEXT / LOGO DESIGN SOURCE (graphic to overlay)", ref2: "additional design reference (optional)" },
    prompt: "Take the text, logo or graphic design element from IMAGE 2 and composite it onto IMAGE 1 as a clean professional overlay: reproduce its lettering, shapes, font style and colors accurately and keep it fully legible. Place it tastefully at a balanced size in a corner or title area that does not cover the subject's face."
  },
  style: {
    btn: "pStyle", needRef: 1, unkeep: ["light", "color"],
    roles: { ref1: "PHOTOGRAPHIC STYLE SOURCE (mood / film look only)", ref2: "additional style reference (optional)" },
    prompt: "Transfer the overall photographic style of IMAGE 2 onto IMAGE 1: editorial or film mood, tonal curve, contrast character, grain, sharpness feel, color palette and finishing. Style only."
  },
  fgbglc: {
    btn: "pFgBgLc", needRef: 1, unkeep: ["bg", "light", "color"],
    roles: { ref1: "BACKGROUND SOURCE (environment only)", ref2: "LIGHTING + COLOR GRADE SOURCE" },
    prompt: "Studio composite: the ONLY person in the final image is the subject (foreground) from IMAGE 1, the active Photoshop document. Use IMAGE 2 strictly as the new background environment. If IMAGE 3 is provided, copy only its lighting mood and color grading; otherwise take lighting and color from IMAGE 2."
  },
  hair: {
    btn: "pHair", needRef: 1, guard: "style", unkeep: ["hair", "subject"],
    roles: { ref1: "HAIRSTYLE SOURCE (cut, color and styling to copy)", ref2: "additional hair detail reference (optional)" },
    prompt: "Give the IMAGE 1 subject the hairstyle from IMAGE 2: the same cut, length, volume, color, texture and styling, adapted naturally to the subject's own head shape, hairline and face."
  },
  access: {
    btn: "pAccess", needRef: 1, guard: "style", unkeep: ["subject"],
    roles: { ref1: "JEWELRY / ACCESSORIES SOURCE (items to wear)", ref2: "additional accessory reference (optional)" },
    prompt: "Copy the jewelry and accessories from IMAGE 2 - earrings, necklace, crown or headpiece, hair pins, glasses, watch or bracelets - onto the IMAGE 1 subject with realistic scale, placement, materials, reflections and lighting."
  },
  pose: {
    btn: "pPose", needRef: 1, guard: "style", unkeep: ["pose", "frame", "subject"],
    roles: { ref1: "POSE SOURCE (body pose and gesture to match)", ref2: "additional pose reference (optional)" },
    prompt: "Re-pose the IMAGE 1 subject to match the body pose, gesture and hand positions of the person in IMAGE 2, with anatomically correct and natural results - only the pose changes."
  },
  restore: {
    btn: "pRestore", needRef: 0, needDoc: true, restore: true, unkeep: ["light", "color", "skin"],
    prompt: "OLD PHOTO RESTORATION (archival museum quality): Fully restore IMAGE 1 - repair every tear, crease, fold, scratch, missing or torn corner, dust, mold, water stain and water damage, burn and scorch marks, fading, discoloration and red/yellow color shift. Reconstruct all damaged and missing areas seamlessly and invisibly. PRESERVE WITH ABSOLUTE FIDELITY: every original face exactly (each facial detail identical - never beautify, never change identity), expressions, poses, hairstyles, clothing colors, patterns and fabric details, objects, background and the entire scene, restoring natural skin texture and material detail everywhere. {MODE} Sharp, clean, high resolution, no artifacts, no invented content."
  },
  repSolo: {
    btn: "pRepSolo", needRef: 1, guard: "canvas", unkeep: ["frame", "bg", "light", "color"],
    roles: { ref1: "TARGET SCENE / CANVAS (its people get replaced by the IMAGE 1 subject)", ref2: "additional scene detail reference (optional)" },
    prompt: "SUBJECT REPLACE (SOLO): Rebuild the IMAGE 2 scene with the single main subject from IMAGE 1 standing exactly where IMAGE 2's person was - same position and scale in the composition."
  },
  repCouple: {
    btn: "pRepCouple", needRef: 1, guard: "canvas", unkeep: ["frame", "bg", "light", "color"],
    roles: { ref1: "TARGET SCENE / CANVAS (its people get replaced by the IMAGE 1 couple)", ref2: "additional scene detail reference (optional)" },
    prompt: "SUBJECT REPLACE (COUPLE): Rebuild the IMAGE 2 scene with the couple (both people) from IMAGE 1 placed naturally where IMAGE 2's people were, or side by side in the composition's focal area."
  },
  repFamily: {
    btn: "pRepFamily", needRef: 1, guard: "canvas", unkeep: ["frame", "bg", "light", "color"],
    roles: { ref1: "TARGET SCENE / CANVAS (its people get replaced by the IMAGE 1 family/group)", ref2: "additional scene detail reference (optional)" },
    prompt: "SUBJECT REPLACE (FAMILY / GROUP): Rebuild the IMAGE 2 scene with ALL the people (the family or group) from IMAGE 1 arranged naturally in the composition's focal area where IMAGE 2's people were. Same number of people as IMAGE 1 - nobody added or removed."
  },
  evoto: {
    btn: "pEvoto", needRef: 0, intensity: true, unkeep: ["skin", "subject"],
    prompt: "Professional Evoto-style AI skin retouch on IMAGE 1 at {INT}% strength: high-end frequency-separation quality smoothing, remove blemishes, acne, stray hairs and under-eye darkness, even out skin tone, gentle dodge and burn for dimension, subtle eye and teeth brightening."
  },
  meitu: {
    btn: "pMeitu", needRef: 0, intensity: true, unkeep: ["skin", "subject"],
    prompt: "Meitu-style beauty retouch on IMAGE 1 at {INT}% strength: silky smooth luminous skin with a soft healthy glow, brightened even complexion, clean under-eye area, subtle skin brightening and glossy finish popular in Asian beauty apps. Keep results tasteful and photographic."
  }
};

function roleMap(def) {
  const L = ["ROLE MAP:"];
  L.push("- IMAGE 1 = MAIN SUBJECT: the active Photoshop document layer. This person/subject is the hero of the final image. Apply all edits to this image and keep this subject.");
  if (def.roles && def.roles.ref1) L.push("- IMAGE 2 = " + def.roles.ref1 + ". Use it ONLY for this purpose.");
  if (def.roles && def.roles.ref2) L.push("- IMAGE 3 = " + def.roles.ref2 + " (only if provided). Use it ONLY for this purpose.");
  return L.join("\n");
}

function paintPresetSel() {
  for (const k in PRESETS) {
    const d = PRESETS[k];
    const b = $(d.btn);
    if (b) b.className = "pbtn" + (state.lastPreset === k ? " sel" : "");
  }
}

const REF_GUARD_CANVAS = "CANVAS RULE: IMAGE 2's scene becomes the stage - remove every person originally in it; the IMAGE 1 subject(s) stand in that scene, integrated with its perspective, scale, lighting and color. Never invent people.";

const REF_GUARD_STYLE = "STYLE SOURCE RULE: copy ONLY the attributes this tool names from the reference person, adapted onto the IMAGE 1 subject. Never copy the reference person's face, identity or body, never add them as a person, and never return the reference image itself.";

const REF_GUARD_FACE = "FACE SOURCE RULE: the reference supplies ONLY the facial identity (plus makeup or hairstyle when this tool says so) for the matching IMAGE 1 person. Never add the reference person as an extra person.";

const REF_GUARD_SUBJECT = "SUBJECT SOURCE RULE: the reference supplies the PERSON to place into IMAGE 1's unchanged scene, replacing only the matching person at the same position, scale and pose slot, relit to the scene.";

const REF_GUARD = "STRICT REFERENCE RULE: references supply only what the TASK names. If a reference contains people, ignore and exclude them completely. The result contains exactly the IMAGE 1 subject(s) - same faces, same count - and is built on IMAGE 1; never return or recreate a reference image.";

/* ---------------- CAMERA PRO & QUALITY ENGINE (v2.9) ---------------- */
const CAM_BODIES = [["off", null], ["Flagship", "a flagship full-frame mirrorless camera"], ["Canon R5 II", "a Canon EOS R5 Mark II"], ["Nikon Z9", "a Nikon Z9"], ["Sony A1 II", "a Sony A1 II"], ["Fuji GFX100", "a Fujifilm GFX100 II medium format camera"], ["Hasselblad", "a Hasselblad X2D 100C medium format camera"]];
const CAM_MM = [["off", null], ["8", 8], ["14", 14], ["24", 24], ["35", 35], ["50", 50], ["85", 85], ["105", 105], ["135", 135], ["200", 200]];
const CAM_MM_TXT = { 8: "extreme ultra-wide, corrected fisheye perspective", 14: "dramatic ultra-wide perspective", 24: "environmental wide angle", 35: "natural documentary field of view", 50: "standard natural perspective", 85: "classic portrait compression", 105: "tight portrait compression", 135: "strong telephoto compression with dreamy separation", 200: "extreme telephoto compression, stacked background" };
const CAM_F = [["off", null], ["F1.2", 1.2], ["F1.4", 1.4], ["F1.8", 1.8], ["F2.8", 2.8], ["F4", 4], ["F5.6", 5.6], ["F8", 8], ["F11", 11], ["F16", 16]];
const CAM_FILMS = [["off", null], ["Portra 400", "graded like Kodak Portra 400 film - soft warm skin tones, gentle contrast"], ["Fuji 400H", "graded like Fujifilm Pro 400H - airy pastel greens and clean highlights"], ["Kodak Gold", "graded like Kodak Gold 200 - warm golden nostalgic tones"], ["Cinestill 800T", "graded like Cinestill 800T - cinematic tungsten teal shadows and halated highlights"], ["Ilford B&W", "rendered as Ilford HP5 black-and-white film - rich grain and deep tonal range"], ["Kodachrome", "graded like Kodachrome 64 - punchy saturated reds and timeless contrast"]];
const CAM_BOKEHS = [["off", null], ["Creamy", "smooth creamy melted bokeh"], ["Swirly", "vintage swirly bokeh (Helios style)"], ["Bubble", "soap-bubble bokeh (Meyer Trioplan style)"], ["Anamorphic", "oval anamorphic bokeh with subtle horizontal flares"]];

function camFTxt(f) {
  if (f <= 1.4) return "razor-thin creamy depth of field, subject isolated";
  if (f <= 2.8) return "shallow depth of field with soft background";
  if (f <= 5.6) return "moderate depth of field, gently soft background";
  if (f <= 8) return "balanced depth, most of the scene in focus";
  return "deep sharp focus front to back";
}
function camIsoTxt(v) {
  if (v <= 100) return "ultra clean, completely noise-free";
  if (v <= 400) return "clean with imperceptible grain";
  if (v <= 800) return "subtle fine film grain";
  return "visible organic film grain character";
}
function camKTxt(v) {
  if (v <= 4600) return "warm golden tungsten-leaning tone";
  if (v <= 5300) return "gently warm tone";
  if (v <= 5800) return "neutral daylight balance";
  if (v <= 6800) return "cool overcast daylight tone";
  return "cold blue-leaning tone";
}

function sanitizeCam(o) {
  if (!o || typeof o !== "object") return;
  if (typeof o.camOn === "boolean") state.camOn = o.camOn;
  if (o.camBody === null || CAM_BODIES.some(function (x) { return x[1] === o.camBody; })) { if (o.camBody !== undefined) state.camBody = o.camBody; }
  if (o.camMm === null || CAM_MM.some(function (x) { return x[1] === o.camMm; })) { if (o.camMm !== undefined) state.camMm = o.camMm; }
  if (o.camF === null || CAM_F.some(function (x) { return x[1] === o.camF; })) { if (o.camF !== undefined) state.camF = o.camF; }
  if (o.camFilm === null || CAM_FILMS.some(function (x) { return x[1] === o.camFilm; })) { if (o.camFilm !== undefined) state.camFilm = o.camFilm; }
  if (o.camBokeh === null || CAM_BOKEHS.some(function (x) { return x[1] === o.camBokeh; })) { if (o.camBokeh !== undefined) state.camBokeh = o.camBokeh; }
  if (typeof o.camIso === "number") state.camIso = Math.min(1000, Math.max(50, Math.round(o.camIso / 50) * 50));
  if (typeof o.camIsoOn === "boolean") state.camIsoOn = o.camIsoOn;
  if (typeof o.camK === "number") state.camK = Math.min(8000, Math.max(4000, Math.round(o.camK / 100) * 100));
  if (typeof o.camKOn === "boolean") state.camKOn = o.camKOn;
}

function buildCameraPrompt() {
  if (!state.camOn) return "";
  const L = [];
  if (state.camBody) L.push("shot on " + state.camBody);
  if (state.camMm) L.push(state.camMm + "mm prime lens (" + CAM_MM_TXT[state.camMm] + ")");
  if (state.camF) L.push("aperture f/" + state.camF + " (" + camFTxt(state.camF) + (state.camBokeh ? ", " + state.camBokeh : "") + ")");
  else if (state.camBokeh) L.push(state.camBokeh);
  if (state.camIsoOn) L.push("ISO " + state.camIso + " (" + camIsoTxt(state.camIso) + ")");
  if (state.camKOn) L.push("white balance " + state.camK + "K (" + camKTxt(state.camK) + ")");
  if (state.camFilm) L.push(state.camFilm);
  if (!L.length) return "";
  return "CAMERA & OPTICS: " + L.join(", ") + ". Render authentic optical behavior: correct perspective for the focal length, physically accurate depth of field and bokeh for the aperture.";
}

const HNK_CORE = "GUARD (HNK edit rule): change ONLY what the TASK asks - every other pixel of IMAGE 1 stays identical: same face identity, eyes, teeth, expression, pose, body shape, hair, clothing, framing, background content, lighting and color, unless the TASK explicitly changes them. Anything added or changed must integrate physically into the photo: correct light direction with grounded contact shadows, clean strand-level edges with no halo or cutout look, matched white balance and color, correct perspective, true real-world scale and depth of field, real skin pores and fabric texture with no plastic smoothing. Never produce extra or deformed fingers, limbs or faces, warped anatomy, crossed or dead eyes, melted hair or color banding. The final image must read as one untouched professional photograph in 8K ultra-realistic HD.";

/* AUDIT-FIX #3: scope the ban to UNREQUESTED text only, so it no longer contradicts
   features that legitimately add text (Text/Logo overlay, Birthday hero number,
   Caption). Text-adding operations additionally drop it entirely via buildGuard's
   allowText bypass below. */
const HNK_TEXT_BAN = "Do not add watermarks, signatures, or any text that was not part of the request.";

const REAL_DIR = {
  auto: "Integrate every change in whichever direction preserves the subject best.",
  scene: "The subject's original lighting, exposure and color are the master - never alter them; adapt any new or changed background/foreground to match the subject.",
  subject: "The scene's lighting and color are the master - relight and regrade the subject to sit naturally in it; only light and color on the subject may change, never identity, features, expression or pose.",
  edit: "This TASK intentionally changes lighting, color or finish - apply that change as ONE consistent new exposure across the whole frame, never as a pasted-on local effect."
};

/* If the user's typed prompt contains pasted system layers (a copied Final Prompt,
   guards, locks, KEEP block, ROLE MAP, old suffix), strip them so nothing rides twice. */
function sanitizeExternal(p) {
  if (!p) return p || "";
  let t = String(p);
  const exact = [HNK_CORE, HNK_TEXT_BAN,
    REAL_DIR.auto, REAL_DIR.scene, REAL_DIR.subject, REAL_DIR.edit,
    WED_LOCK, WED_QUALITY, RELIGHT_GUARD, SCENE_GUARD, SCENE_FIT, SCENE_ADAPT_ON, SCENE_ADAPT_OFF,
    REF_GUARD, REF_GUARD_STYLE, REF_GUARD_FACE, REF_GUARD_SUBJECT, REF_GUARD_CANVAS,
    "8K Ultra Realistic HD Resolution photo"];
  for (let i = 0; i < exact.length; i++) {
    const x = exact[i];
    if (x && t.indexOf(x) >= 0) t = t.split(x).join(" ");
  }
  t = t.replace(/---\s*IMAGE ROLES\s*---[\s\S]*?(\n\s*\n|$)/g, "\n");
  t = t.replace(/^\s*GUARD \(HNK edit rule\):?/gm, "");
  t = t.replace(/^TASK:\s*/gm, "");
  t = t.replace(/KEEP ORIGINAL \(locked by the user\):[^\n]*(?:\n- [^\n]*)*/g, "");
  t = t.replace(/[ \t]+\n/g, "\n").replace(/\n{3,}/g, "\n\n");
  return t.trim();
}

/* v4.6: empty Generate + reference(s) = automatic subject-into-scene composite.
   Scene = the LAST filled ref; any other ref is auto-ignored by the strict reference rule. */
function autoCompositeText() {
  const sceneNo = state.refs[1] ? (state.refs[0] ? 3 : 2) : (state.refs[0] ? 2 : 0);
  if (!sceneNo) return "";
  return "AUTO COMPOSITE: place the IMAGE 1 subject into the scene from IMAGE " + sceneNo + ". " +
    "Use the subject exactly as in IMAGE 1 - same face identity (eyes, nose, mouth), hair, body and face pose, dress and true scale. " +
    "Use IMAGE " + sceneNo + " only as the environment - remove every person originally in it - and build the composition naturally around the subject.";
}

function buildGuard(dir, allowText) {
  /* AUDIT-FIX #3: a text-adding operation (allowText) fully drops the no-text clause
     so the model is never told "add the logo" and "never add text" at once. */
  const ban = (state.banText && !allowText) ? " " + HNK_TEXT_BAN : "";
  return HNK_CORE + ban + " " + (REAL_DIR[dir || state.realDir] || REAL_DIR.auto);
}

function effRealDir(opDir) {
  if (opDir === "edit") return "edit";
  if (state.realDir === "auto" && opDir) return opDir;
  return state.realDir;
}



function buildObjChips(containerId, options, key, after) {
  const c = $(containerId);
  if (!c) return;
  while (c.firstChild) c.removeChild(c.firstChild);
  for (let i = 0; i < options.length; i++) {
    (function (label, val) {
      const b = document.createElement("button");
      b.className = "sw ltchip" + ((state[key] === val) ? " on" : "");
      b.textContent = label === "off" ? "\u2013" : label;
      b.addEventListener("click", function () {
        state[key] = val;
        buildObjChips(containerId, options, key, after);
        if (after) { try { after(); } catch (e) { } }
        saveSettings();
      });
      c.appendChild(b);
    })(options[i][0], options[i][1]);
  }
}

function paintCamChips() {
  buildObjChips("swCamBody", CAM_BODIES, "camBody");
  buildObjChips("swCamMm", CAM_MM, "camMm");
  buildObjChips("swCamF", CAM_F, "camF");
  buildObjChips("swCamFilm", CAM_FILMS, "camFilm");
  buildObjChips("swCamBokeh", CAM_BOKEHS, "camBokeh");
}


function bindCamPro() {
  /* v4.5: direction UI removed - Auto smart routing always on */
  bindToggle("tglCam", "camOn");
  paintCamChips();
  bindChecks([["ckIsoOn", "camIsoOn"], ["ckKOn", "camKOn"]], state);
  const si = $("camIso");
  if (si) {
    si.value = String(state.camIso);
    const vi = $("camIsoV"); if (vi) vi.textContent = String(state.camIso);
    si.addEventListener("input", function () {
      state.camIso = Math.round(Number(si.value) / 50) * 50;
      if (vi) vi.textContent = String(state.camIso);
    });
    si.addEventListener("change", function () { saveSettings(); });
  }
  const sk = $("camK");
  if (sk) {
    sk.value = String(state.camK);
    const vk = $("camKV"); if (vk) vk.textContent = String(state.camK);
    sk.addEventListener("input", function () {
      state.camK = Math.round(Number(sk.value) / 100) * 100;
      if (vk) vk.textContent = String(state.camK);
    });
    sk.addEventListener("change", function () { saveSettings(); });
  }
  /* AUDIT-FIX #9: Camera Pro chips + ISO/K sliders + on-toggles paint from defaults at
     bind time; repaint them from restored state after settings load (via REFRESHERS). */
  REFRESHERS.push(function () {
    try {
      paintCamChips();
      const si2 = $("camIso"), vi2 = $("camIsoV");
      if (si2) si2.value = String(state.camIso);
      if (vi2) vi2.textContent = String(state.camIso);
      const sk2 = $("camK"), vk2 = $("camKV");
      if (sk2) sk2.value = String(state.camK);
      if (vk2) vk2.textContent = String(state.camK);
      paintChecks([["ckIsoOn", "camIsoOn"], ["ckKOn", "camKOn"]], state);
    } catch (e) { }
  });
}

/* ---------------- WEDDING PRO SUITE (v2.6) ---------------- */
const WED_LOCK = "WEDDING LOCK: while cleaning, extending or adding, the gown's DESIGN - cut, lace, patterns, details - stays exactly as shot.";

const WED_QUALITY = "Luxury editorial wedding finish, 85mm lens look.";

function wedTrailPrompt(flowerList, toneWord) {
  return WED_LOCK +
    " Only modify the grass, flowers and ground environment. Replace the existing ground with an ultra-luxury premium emerald green velvet grass landscape: perfectly even, freshly trimmed golf-course-quality grass with extremely fine blades, natural density, soft texture, realistic depth, subtle color variation, gentle highlights, realistic mowing lines, slight wind movement, natural shadows, soft volumetric depth and highly detailed botanical realism." +
    " Create a luxurious flowing " + toneWord + " flower trail beginning naturally beneath the couple and extending elegantly toward the distant background in an organic winding S-shaped curve with natural irregular edges (never perfect symmetry). The path contains thousands of premium flowers scattered with realistic density variation: " + flowerList + "." +
    " Foreground flowers are large, highly detailed, layered, overlapping and volumetric; middle distance medium density; far distance gradually smaller while keeping the continuous elegant pathway (realistic depth perspective). Blend flowers into the grass with realistic contact shadows, subtle indentation, ambient occlusion and soft sunlight interaction. No pattern repetition, no duplicated flowers, no floating flowers, no visible tiling, no unrealistic symmetry. The result must resemble a luxury outdoor wedding garden designed by a professional landscape artist. " + WED_QUALITY;
}

const WED_VEIL_LEN = [
  "an elegant elbow-length sheer veil, softly lifted by the wind",
  "a fingertip-length flowing veil, gracefully floating on the breeze",
  "a chapel-length veil (about 2 meters), streaming beautifully in the wind behind her",
  "a cathedral-length veil (3-4 meters), sweeping dramatically through the air",
  "a royal cathedral veil (6-8 meters), billowing like silk high on the wind across the frame",
  "an EXTREMELY, impossibly long infinity veil (15+ meters), flowing like an endless silk river through the air across the entire scene"
];

function wedVeilPrompt(len) {
  return WED_LOCK + " Only add or extend the bride's wedding veil: give her " + len +
    ". Ultra-fine translucent white tulle with a delicate lace edge, natural wind physics with soft folds and lift, gentle backlight glow through the fabric, never covering or shadowing the faces, attached naturally to her existing hairstyle. Photorealistic fabric transparency and motion. " + WED_QUALITY;
}

const WED_GOWN_LEN = [
  "keep its current length, lying perfectly neat",
  "a floor-length hem arranged cleanly around her feet",
  "a sweep train spreading softly on the ground behind her",
  "a chapel train (about 1.5 meters) fanned out elegantly on the ground",
  "a cathedral train (3 meters) spread in a beautiful sweeping arc across the ground",
  "an EXTREMELY long royal train (6+ meters) flowing like a white silk river across the entire foreground"
];

function wedGownPrompt(train) {
  return WED_LOCK + " Only perfect the bride's EXISTING gown: remove every stain, dirt mark, dust, wrinkle and crease; make the fabric crisp, luminous bridal white, perfectly pressed, tailored and neatly arranged with clean elegant folds - the gown DESIGN stays exactly the same. Extend and arrange its train to " + train +
    ", with realistic fabric weight, contact shadows on the ground and photorealistic silk / lace texture. " + WED_QUALITY;
}

function petalColorText() {
  if (!state.rt.petalName) return "petals in colors that perfectly match and complement the existing scene palette";
  return state.rt.petalName.toLowerCase() + " (" + state.rt.petalColor + ") toned petals";
}

const WED_PETAL_STYLES = {
  petGentle: "a gentle sparse drift - a few petals floating slowly and dreamily",
  petSwirl: "a romantic swirl - petals dancing in a soft circular breeze around the couple",
  petCherry: "cherry-blossom rain - countless small petals falling softly like snow in spring",
  petRose: "a rose petal storm - rich large petals streaming across the frame on a strong breeze",
  petSnow: "a snowfall of tiny white petals drifting straight down, calm and magical",
  petGold: "golden-hour sparkle petals - petals catching warm rim light as they float",
  petSpiral: "a wind spiral - petals rising in an elegant upward spiral behind the couple",
  petFg: "large soft-focus foreground petals with creamy bokeh and motion blur framing the couple",
  petBg: "fine distant background petals, small and soft, adding gentle depth",
  petStorm: "a FULL-SCENE petal storm - dense layered petals in foreground, midground and background"
};

function wedPetalPrompt(style) {
  return WED_LOCK + " Only add flying flower petals to the air: {PETAL}, as " + style +
    ". Include many sizes from large whole petals to tiny fragments and half-petals, in both foreground (larger, softly out of focus, slight motion blur) and background (smaller, subtle), with natural wind physics, correct scene lighting, soft shadows and believable depth. No pattern repetition, no duplicates, no fake floating look. " + WED_QUALITY;
}

const WED_EXTRA = {
  horse1: "Only add ONE majestic white horse standing calmly beside the couple (not overlapping them), with a flowing mane and tail, groomed glossy white coat, matching the scene's lighting, perspective and ground with realistic contact shadows.",
  horse2: "Only add a beautiful white horse in the soft-focus background behind the couple, naturally placed in the scene with matching light, scale and gentle bokeh.",
  horse3: "Only add TWO elegant white horses in the background, standing gracefully together, matched to the scene's perspective, lighting and depth of field.",
  water1: "Only transform all visible water in the scene into CRYSTAL CLEAR pristine water: perfect transparency, gentle natural reflections, realistic ripples, clean bright bed visible through the water.",
  water2: "Only transform all visible water into crystal-clear tropical TURQUOISE water with luminous aqua tones, soft reflections and realistic clarity.",
  water3: "Only transform all visible water into clear luxurious EMERALD-teal water with jewel-like depth, gentle reflections and realistic transparency.",
  water4: "Only transform all visible water into clear soft SKY-BLUE water mirroring the sky, with delicate ripples and photoreal reflections.",
  atmos1: "Only add soft volumetric GOD RAYS - warm sunbeams breaking through toward the couple, with gentle atmospheric haze and realistic light scattering.",
  atmos2: "Only shift the scene lighting to rich GOLDEN HOUR warmth - low warm sun glow, soft long shadows, honey-toned highlights on skin and fabric.",
  atmos3: "Only add a delicate soft MIST layer low in the background for dreamy depth, keeping the couple perfectly sharp and clear."
};

const WED_TRAIL_DEFS = {
  trailBlush: ["soft blush and ivory", "soft blush roses, white garden roses, pink peonies, cherry blossom petals, hydrangea petals, ranunculus, English roses, baby's breath, white daisies, small wild flowers, luxury wedding petals, soft ivory blossoms, pale pink blossoms, fresh floral leaves and tiny scattered petals"],
  trailWhite: ["pure white", "white garden roses, white peonies, calla lilies, gardenias, white hydrangea, white ranunculus, baby's breath, white daisies, jasmine, white orchid petals, ivory blossoms, fresh green leaves and tiny white petals"],
  trailRed: ["romantic deep red", "deep red roses, burgundy peonies, red ranunculus, crimson dahlias, red camellias, scattered rose petals, dark cherry blossoms, red tulip petals, wine-toned wildflowers, fresh deep-green leaves and tiny red petals"],
  trailLav: ["lavender purple", "lavender sprigs, purple hydrangea, lilac blossoms, wisteria petals, violet ranunculus, purple sweet peas, lavender roses, soft mauve peonies, baby's breath, fresh leaves and tiny lilac petals"],
  trailPeach: ["peach champagne", "peach garden roses, champagne peonies, apricot ranunculus, cream dahlias, coral sweet peas, blush-peach carnations, warm ivory blossoms, baby's breath, golden-green leaves and tiny peach petals"],
  trailBlue: ["dusty blue and white", "dusty blue hydrangea, delphinium, blue thistle, white garden roses, forget-me-nots, pale blue sweet peas, silver-blue eucalyptus, baby's breath, white daisies and tiny blue petals"],
  trailSunset: ["sunset mixed", "orange garden roses, coral peonies, golden ranunculus, marigold blossoms, blush dahlias, warm pink cherry blossoms, amber wildflowers, cream blossoms, fresh leaves and tiny warm-toned petals"]
};
const WED_TRAIL_OPTS = [["Blush", "trailBlush"], ["White", "trailWhite"], ["Red", "trailRed"], ["Lavender", "trailLav"], ["Peach", "trailPeach"], ["Blue", "trailBlue"], ["Sunset", "trailSunset"]];
const WED_VEIL_OPTS = [["Elbow", 0], ["Fingertip", 1], ["Chapel 2m", 2], ["Cathedral 4m", 3], ["Royal 8m", 4], ["Infinity 15m+", 5]];
const WED_GOWN_OPTS = [["Current", 0], ["Floor", 1], ["Sweep", 2], ["Chapel 1.5m", 3], ["Cathedral 3m", 4], ["Royal 6m+", 5]];
const WED_PET_OPTS = [["Gentle", "petGentle"], ["Swirl", "petSwirl"], ["Cherry Rain", "petCherry"], ["Rose Storm", "petRose"], ["Snowfall", "petSnow"], ["Golden", "petGold"], ["Spiral", "petSpiral"], ["FG Bokeh", "petFg"], ["BG Fine", "petBg"], ["Full Storm", "petStorm"]];
const WED_EXTRA_OPTS = [["Horse Side", "horse1"], ["Horse BG", "horse2"], ["2 Horses", "horse3"], ["Crystal Water", "water1"], ["Turquoise", "water2"], ["Emerald", "water3"], ["Sky Blue", "water4"], ["God Rays", "atmos1"], ["Golden Hour", "atmos2"], ["Soft Mist", "atmos3"]];

(function registerWeddingPresets() {
  PRESETS.trail = {
    btn: "wpTrailGo", needRef: 0, needDoc: true, unkeep: ["bg"],
    promptFn: function () { const d = WED_TRAIL_DEFS[state.wedTrail] || WED_TRAIL_DEFS.trailBlush; return wedTrailPrompt(d[1], d[0]); }
  };
  PRESETS.veil = {
    btn: "wpVeilGo", needRef: 0, needDoc: true, unkeep: ["dress"],
    promptFn: function () { return wedVeilPrompt(WED_VEIL_LEN[state.wedVeil] || WED_VEIL_LEN[0]); }
  };
  PRESETS.gown = {
    btn: "wpGownGo", needRef: 0, needDoc: true, unkeep: ["dress"],
    promptFn: function () { return wedGownPrompt(WED_GOWN_LEN[state.wedGown] || WED_GOWN_LEN[0]); }
  };
  PRESETS.petal = {
    btn: "wpPetalGo", needRef: 0, needDoc: true, unkeep: ["bg"], petal: true,
    promptFn: function () { return wedPetalPrompt(WED_PETAL_STYLES[state.wedPetal] || WED_PETAL_STYLES.petGentle); }
  };
  PRESETS.wedExtra = {
    btn: "wpExtraGo", needRef: 0, needDoc: true, unkeep: ["bg"],
    unkeepFn: function () {
      const k = state.wedExtra || "horse1";
      return k.indexOf("atmos") === 0 ? ["light", "color"] : (k.indexOf("water") === 0 ? ["bg", "color"] : ["bg"]);
    },
    promptFn: function () {
      const k = state.wedExtra || "horse1";
      return WED_LOCK + " " + (WED_EXTRA[k] || WED_EXTRA.horse1) + " Everything else stays pixel-accurate. " + WED_QUALITY;
    }
  };
})();

function sanitizeWed(o) {
  if (!o || typeof o !== "object") return;
  if (typeof o.wedTrail === "string" && WED_TRAIL_DEFS[o.wedTrail]) state.wedTrail = o.wedTrail;
  if (typeof o.wedVeil === "number" && o.wedVeil >= 0 && o.wedVeil <= 5) state.wedVeil = Math.round(o.wedVeil);
  if (typeof o.wedGown === "number" && o.wedGown >= 0 && o.wedGown <= 5) state.wedGown = Math.round(o.wedGown);
  if (typeof o.wedPetal === "string" && WED_PETAL_STYLES[o.wedPetal]) state.wedPetal = o.wedPetal;
  if (typeof o.wedExtra === "string" && WED_EXTRA[o.wedExtra]) state.wedExtra = o.wedExtra;
}

function bindWedChips() {
  buildObjChips("swWedTrail", WED_TRAIL_OPTS, "wedTrail");
  buildObjChips("swWedVeil", WED_VEIL_OPTS, "wedVeil");
  buildObjChips("swWedGown", WED_GOWN_OPTS, "wedGown");
  buildObjChips("swWedPet", WED_PET_OPTS, "wedPetal");
  buildObjChips("swWedExtra", WED_EXTRA_OPTS, "wedExtra");
}

/* ---------------- PIPELINE CHAIN BUILDER (v3.0) ---------------- */
const PIPE_MAX = 6;
const PIPE_SPECIALS = ["__retouch", "__relight", "__prompt"];

function sanitizePipeline(arr) {
  if (!Array.isArray(arr)) return;
  const out = [];
  for (let i = 0; i < arr.length && out.length < PIPE_MAX; i++) {
    const st = arr[i];
    if (!st || typeof st !== "object") continue;
    if (st.t === "preset" && typeof st.k === "string" && PRESETS[st.k]) out.push({ t: "preset", k: st.k });
    else if (st.t === "retouch" || st.t === "relight" || st.t === "prompt") out.push({ t: st.t });
  }
  state.pipeline = out;
}

function pipeStepLabel(st) {
  if (st.t === "retouch") return t("pipe_retouch");
  if (st.t === "relight") return t("pipe_relight");
  if (st.t === "prompt") return t("pipe_prompt");
  const def = PRESETS[st.k];
  const b = def ? $(def.btn) : null;
  return (b && b.textContent) ? b.textContent : st.k;
}

function addPipeStep(st) {
  if (state.pipeline.length >= PIPE_MAX) { setStatus(t("pipe_max"), "err"); return false; }
  state.pipeline.push(st);
  paintPipeline();
  saveSettings();
  return true;
}

function removePipeStep(idx) {
  state.pipeline.splice(idx, 1);
  paintPipeline();
  saveSettings();
}

function movePipeStep(idx) {
  if (idx <= 0) return;
  const a = state.pipeline[idx - 1];
  state.pipeline[idx - 1] = state.pipeline[idx];
  state.pipeline[idx] = a;
  paintPipeline();
  saveSettings();
}

function paintPipeline() {
  const box = $("pipeList");
  if (!box) return;
  while (box.firstChild) box.removeChild(box.firstChild);
  for (let i = 0; i < state.pipeline.length; i++) {
    (function (idx) {
      const st = state.pipeline[idx];
      const row = document.createElement("div");
      row.className = "lrow";
      const num = document.createElement("div");
      num.className = "lsum";
      num.textContent = (idx + 1) + ".";
      const nm = document.createElement("div");
      nm.className = "lname";
      nm.textContent = pipeStepLabel(st);
      const up = document.createElement("button");
      up.className = "btn btn-xs";
      up.textContent = "\u2191";
      up.addEventListener("click", function () { movePipeStep(idx); });
      const rm = document.createElement("button");
      rm.className = "btn btn-xs";
      rm.textContent = "\u2715";
      rm.addEventListener("click", function () { removePipeStep(idx); });
      row.appendChild(num); row.appendChild(nm); row.appendChild(up); row.appendChild(rm);
      box.appendChild(row);
    })(i);
  }
  const inf = $("pipeInfo");
  if (inf) inf.textContent = state.pipeline.length + " / " + PIPE_MAX;
}

function populatePipeSel() {
  const sel = $("pipeSel");
  if (!sel) return;
  while (sel.firstChild) sel.removeChild(sel.firstChild);
  const mkOpt = function (val, label) {
    const o = document.createElement("option");
    o.value = val;
    o.textContent = label;
    sel.appendChild(o);
  };
  mkOpt("__retouch", "\u2726 " + t("pipe_retouch"));
  mkOpt("__relight", "\u2726 " + t("pipe_relight"));
  mkOpt("__prompt", "\u2726 " + t("pipe_prompt"));
  const keys = Object.keys(PRESETS);
  for (let i = 0; i < keys.length; i++) {
    const def = PRESETS[keys[i]];
    const b = def ? $(def.btn) : null;
    mkOpt(keys[i], (b && b.textContent) ? b.textContent : keys[i]);
  }
}

function buildMergedPipeline() {
  const parts = [];
  const unk = [];
  let skipClean = false;
  let needRef = 0;
  let needDoc = false;
  let n = 0;
  const addU = function (arr) {
    for (let i = 0; i < arr.length; i++) { if (unk.indexOf(arr[i]) < 0) unk.push(arr[i]); }
  };
  for (let i = 0; i < state.pipeline.length; i++) {
    const st = state.pipeline[i];
    let txt = "";
    if (st.t === "retouch") {
      txt = buildRetouchPrompt();
      if (txt) addU(["skin", "subject"]);
    } else if (st.t === "relight") {
      txt = buildLightingPrompt();
      if (txt) { txt += "\n" + RELIGHT_GUARD; addU(["light", "color"]); }
    } else if (st.t === "prompt") {
      /* the EN prompt box always rides along in runGenerate - no extra TASK needed */
      txt = "";
    } else {
      const def = PRESETS[st.k];
      if (def) {
        txt = presetText(def);
        let u = ((def.unkeepFn ? def.unkeepFn() : def.unkeep) || []).slice();
        if (def.faceOp && state.refHairOn && u.indexOf("hair") < 0) u.push("hair");
        addU(u);
        if (def.guard === "style" || def.guard === "face" || def.guard === "subject") skipClean = true;
        if (def.needRef && def.needRef > needRef) needRef = def.needRef;
        if (def.needDoc) needDoc = true;
      }
    }
    if (txt) { n++; parts.push("TASK " + n + ":\n" + txt); }
  }
  if (!n) return { tasks: 0 };
  let mdir = null;
  for (let i = 0; i < state.pipeline.length; i++) {
    const st = state.pipeline[i];
    let d = null;
    if (st.t === "retouch" || st.t === "relight") d = "edit";
    else if (st.t === "preset" && PRESETS[st.k]) {
      const df = PRESETS[st.k];
      d = df.realDirFn ? df.realDirFn() : (df.realDir || null);
    }
    if (d === "edit") { mdir = "edit"; break; }
    if (d === "subject") mdir = "subject";
    else if (d === "scene" && mdir !== "subject") mdir = "scene";
  }
  const head = "MULTI-TASK EDIT - perform ALL of the following " + n + " tasks together in ONE final image, respecting every task's rules; where tasks touch the same area, later tasks refine earlier ones:";
  return { tasks: n, prompt: head + "\n\n" + parts.join("\n\n"), unkeep: unk, skipClean: skipClean, needRef: needRef, needDoc: needDoc, realDir: mdir };
}

async function runPipelineMerged() {
  const m = buildMergedPipeline();
  if (!m.tasks) { setStatus(t("pipe_empty"), "err"); return; }
  if (m.needDoc && !app.activeDocument) { setStatus(t("st_need_doc"), "err"); return; }
  const refCount = (state.refs[0] ? 1 : 0) + (state.refs[1] ? 1 : 0);
  if (m.needRef && refCount < m.needRef) { setStatus(t("need_ref"), "err"); return; }
  state.pipeRunning = true;
  try {
    await runGenerate(m.prompt, m.skipClean, m.unkeep, false, { action: "PipeMerge \u00D7" + m.tasks, realDir: m.realDir });
  } finally {
    state.pipeRunning = false;
  }
}

async function runPipeline() {
  if (state.busy || state.pipeRunning) return;
  if (!state.pipeline.length) { setStatus(t("pipe_empty"), "err"); return; }
  if (state.pipeMerge) { await runPipelineMerged(); return; }
  const first = state.pipeline[0];
  if (first.t === "preset" && PRESETS[first.k] && PRESETS[first.k].needDoc && !app.activeDocument) {
    setStatus(t("st_need_doc"), "err");
    return;
  }
  state.pipeRunning = true;
  state.batch = true; /* suppress page jumps for intermediate steps */
  let failed = false;
  for (let i = 0; i < state.pipeline.length; i++) {
    const st = state.pipeline[i];
    const last = i === state.pipeline.length - 1;
    setStatus(t("st_pipe") + " " + (i + 1) + "/" + state.pipeline.length + " \u00B7 " + pipeStepLabel(st));
    const base = i === 0 ? null : (state.resultB64 ? { b64: state.resultB64, mime: state.resultMime } : null);
    const op = { noPlace: !last, action: "Pipe" + (i + 1) };
    if (base) op.base = base;
    try {
      if (st.t === "retouch") {
        const p = buildRetouchPrompt();
        op.realDir = "edit";
        if (p) await runGenerate(p, true, ["skin", "subject"], false, op);
      } else if (st.t === "relight") {
        const p = buildLightingPrompt();
        op.realDir = "edit";
        if (p) await runGenerate(p + "\n" + RELIGHT_GUARD, true, ["light", "color"], true, op);
      } else if (st.t === "prompt") {
        await runGenerate(null, false, [], false, op);
      } else {
        const def = PRESETS[st.k];
        if (!def) continue;
        const refCount = (state.refs[0] ? 1 : 0) + (state.refs[1] ? 1 : 0);
        if (def.needRef && refCount < def.needRef) { setStatus(t("need_ref"), "err"); failed = true; break; }
        state.lastPreset = st.k;
        let unk = ((def.unkeepFn ? def.unkeepFn() : def.unkeep) || []).slice();
        if (def.faceOp && state.refHairOn && unk.indexOf("hair") < 0) unk.push("hair");
        op.action = "Pipe:" + st.k;
        op.realDir = def.realDirFn ? def.realDirFn() : (def.realDir || null);
        op.allowText = !!def.addsText;
        await runGenerate(presetText(def), def.guard === "style" || def.guard === "face" || def.guard === "subject", unk, false, op);
      }
      if (!state.resultB64) { failed = true; break; }
    } catch (pe) {
      failed = true;
      break;
    }
    if (failed) break;
  }
  state.batch = false;
  state.pipeRunning = false;
  if (failed) setStatus(t("st_pipe_stop"), "err");
  else {
    refreshCompare();
    try { switchPage("prompt"); } catch (e) { }
    setStatus(t("st_pipe_done") + " \u2713 " + state.pipeline.length, "ok");
  }
}

function bindPipeline() {
  populatePipeSel();
  paintPipeline();
  const ad = $("btnPipeAdd");
  if (ad) ad.addEventListener("click", function () {
    const sel = $("pipeSel");
    if (!sel || !sel.value) return;
    populatePipeSel();
    const v = sel.value;
    if (v === "__retouch") addPipeStep({ t: "retouch" });
    else if (v === "__relight") addPipeStep({ t: "relight" });
    else if (v === "__prompt") addPipeStep({ t: "prompt" });
    else if (PRESETS[v]) addPipeStep({ t: "preset", k: v });
  });
  bindToggle("tglPipeMerge", "pipeMerge");
  const cl = $("btnPipeClear");
  if (cl) cl.addEventListener("click", function () { state.pipeline = []; paintPipeline(); saveSettings(); });
  const rn = $("btnPipeRun");
  if (rn) rn.addEventListener("click", function () { armGate("__pipe", rn, function () { setBusyBtn(rn); runPipeline(); }); });
}

/* ---------------- REFERENCE OPS PRO (v2.10) ---------------- */
function targetText() {
  if (state.refTarget === "couple") return "TARGET = COUPLE. IMAGE 2 is the WOMAN reference - apply it ONLY to the woman in IMAGE 1. IMAGE 3 is the MAN reference - apply it ONLY to the man in IMAGE 1. Match strictly by gender. If only IMAGE 2 exists, change only its matching person and leave everyone else 100% untouched.";
  if (state.refTarget === "family") return "TARGET = FAMILY / GROUP. Apply each reference image to the ONE most similar person in IMAGE 1 (match by gender and age). Every person without a matching reference stays 100% unchanged - identical face, body and clothing.";
  return "TARGET = SOLO. Apply the reference to the single main person in IMAGE 1.";
}

/* Who is kept when only the SCENE changes (solo / couple / family). */
function bgSubjectWho() {
  if (state.refTarget === "couple") return "both people (the couple)";
  if (state.refTarget === "family") return "every person (the whole group)";
  return "the main subject";
}

/* Full professional BACKGROUND REPLACE workflow, driven by the two toggles
   (keep frame & composition; preserve original subject light/colour) and the
   solo/couple/family target. IMAGE 1 = active doc = subject; IMAGE 2 = Ref1 =
   scene. */
function bgReplacePrompt() {
  const who = bgSubjectWho();
  const keepFrame = state.bgKeepFrame;
  const keepLight = state.bgKeepSubLight;
  const L = [];
  L.push("BACKGROUND REPLACE. IMAGE 1 (active document) = the SUBJECT. IMAGE 2 (Reference 1) = the SCENE / environment.");
  L.push("Goal: keep " + who + " from IMAGE 1 exactly as-is and rebuild ONLY the environment around them using IMAGE 2 as the new background.");
  L.push("Use ONLY the environment from IMAGE 2 - REMOVE every person, model or human figure that appears in it, and never invent new people. The final photo contains exactly " + who + " from IMAGE 1: same faces, same number of people.");
  L.push("Keep 100% unchanged for " + who + ": face identity (eyes, nose, mouth, bone structure), facial expression and gaze, head pose, hair and hairstyle, body shape, pose, the dress/outfit and its exact design and colour, and true scale and proportions.");
  if (keepFrame) L.push("Keep the ORIGINAL composition, framing and crop and the original camera angle: the subject stays at the SAME position and size - only what is behind and around them changes.");
  else L.push("You MAY re-compose, re-frame and re-position the subject so they sit naturally in the new scene's perspective, while keeping their identity, pose, dress and scale believable.");
  if (keepLight) L.push("PRESERVE the subject's ORIGINAL lighting and colour - do NOT relight or re-grade the person themselves; only blend their edges so they merge cleanly into the scene.");
  else L.push("Relight and colour-match the subject to IMAGE 2's scene - match the ambient light direction and softness, colour temperature, white balance and overall grade so the person looks genuinely photographed there (without changing identity or dress design).");
  L.push("Blend photorealistically: correct PERSPECTIVE match, believable GROUND CONTACT with natural cast SHADOWS, matched DEPTH of field and focus falloff, correct foreground/background depth layering, ambient light spill and colour bounce from the scene, and seamless edge and hair blending. Final result must read as ONE real photograph - fully photorealistic.");
  return L.join("\n");
}

/* Target-aware SUBJECT-INTO-SCENE (BG Swap): the subject travels into the
   reference's wider world instead of keeping the doc frame. */
function bgSwapPrompt() {
  const who = bgSubjectWho();
  const keepLight = state.bgKeepSubLight;
  const L = [];
  L.push("BACKGROUND SWAP (place the subject INTO the reference world). IMAGE 1 = subject; IMAGE 2 = the full environment to place them in.");
  L.push("Discard IMAGE 1's background entirely and place " + who + " from IMAGE 1 into IMAGE 2's wider scene, choosing a natural spot, scale and framing for them.");
  L.push("Use ONLY the environment from IMAGE 2 - remove every person in it, never invent people; the final photo shows exactly " + who + " from IMAGE 1 with identical faces, hair, dress and body.");
  L.push("Keep identity, expression, hairstyle, dress design/colour and body proportions unchanged.");
  if (keepLight) L.push("Preserve the subject's original lighting and colour; only blend edges to seat them in the scene.");
  else L.push("Relight and colour-grade the subject to match the scene's light direction, colour temperature and mood.");
  L.push("Integrate photorealistically: perspective, ground contact, natural cast shadows, depth of field, ambient light spill and clean hair/edge blending. One real photograph, photorealistic.");
  return L.join("\n");
}

function mkText() {
  return state.refMkOn
    ? "Also transfer the reference's makeup style (base, eyes, lips), naturally adapted to the scene lighting."
    : "Do NOT copy the reference's makeup - keep the IMAGE 1 person's original makeup untouched.";
}

function hairText() {
  return state.refHairOn
    ? "Also take the reference's hairstyle, blended seamlessly and invisibly at the hairline."
    : "Keep the IMAGE 1 person's ORIGINAL hairstyle completely unchanged.";
}

function matchListText() {
  const L = [];
  if (state.match.color) L.push("the exact color grade (tones, saturation, contrast curve, split-toning)");
  if (state.match.light) L.push("the lighting character (direction, softness, contrast ratio, mood)");
  if (state.match.makeup) L.push("the makeup style");
  if (state.match.skin) L.push("the skin retouch style (texture level, smoothness, tone evenness)");
  return L.length ? L.join("; ") : "the overall visual style";
}

const MATCH_CK = [["mColor", "color"], ["mLight", "light"], ["mMakeup", "makeup"], ["mSkin", "skin"]];

/* smart harmonize routing: subject-enters-scene ops vs scene-adapts ops vs light-edit ops */
function applyRealDirRouting() {
  const map = {
    repSolo: "subject", repCouple: "subject", repFamily: "subject",
    roBgSwap: "subject", roSubSwap: "subject",
    roBgRep: "scene", roFgRep: "scene",
    trail: "scene", veil: "scene", gown: "scene", petal: "scene",
    roDressRef: "scene", roDressRep: "scene",
    roLcRef: "edit", roLcCopy: "edit", roMatch: "edit", roMkCopy: "edit"
  };
  for (const k in map) { if (PRESETS[k]) PRESETS[k].realDir = map[k]; }
  if (PRESETS.wedExtra) {
    PRESETS.wedExtra.realDirFn = function () {
      const k = state.wedExtra || "horse1";
      return k.indexOf("atmos") === 0 ? "edit" : "scene";
    };
  }
}

(function registerRefOps() {
  const mk2 = function (key, guard, unkeep, prompt, faceOp) {
    PRESETS[key] = {
      btn: "ro" + key.charAt(2).toUpperCase() + key.slice(3),
      needRef: 1, needDoc: true, refop: true, faceOp: !!faceOp,
      guard: guard, unkeep: unkeep, prompt: prompt
    };
  };
  /* FACE */
  mk2("roFaceRep", "face", ["face"],
    "{TARGET}\nFACE REPLACE (identity transplant): replace the target person's facial identity in IMAGE 1 with the reference person's face - same eyes, eyebrows, nose, lips, bone structure, skin tone and unique features - while PRESERVING the IMAGE 1 person's original head angle, gaze direction and EXPRESSION, and relighting the new face to match the IMAGE 1 scene perfectly. Seamless invisible blending at hairline, jaw and neck. {MK} {HAIR}", true);
  mk2("roFaceSwap", "face", ["face"],
    "{TARGET}\nFACE SWAP (full transplant): bring the reference person's face EXACTLY as it appears in the reference - identity AND expression - onto the target person, adapting only head angle, perspective, scale, lighting and color to IMAGE 1's scene. Seamless invisible blend. {MK} {HAIR}", true);
  /* BG / FG */
  mk2("roBgRep", null, ["bg"], "BG REPLACE: replace the IMAGE 1 background with the reference image's background/environment as faithfully as possible - matching perspective, horizon, scale, light direction and color so the subject sits naturally in it; clean edge blending including hair.");
  mk2("roBgSwap", null, ["bg"], "BG SWAP: discard the IMAGE 1 background entirely and place the IMAGE 1 subject(s) INTO the reference's full environment (its wider scene), keeping the subject's exact pose, framing distance and face; integrate shadows and reflections realistically.");
  mk2("roFgRep", null, ["bg"], "FG REPLACE: replace IMAGE 1's existing foreground elements with the reference's foreground elements, with matched depth of field and lighting, never covering any face.");
  /* SUBJECT */
  mk2("roSubSwap", "subject", ["subject", "face", "pose", "dress", "hair", "skin"],
    "{TARGET}\nSUBJECT SWAP (bring the reference person IN): remove the matching IMAGE 1 person and place the reference person there instead - their real face, hair, outfit and natural body - fitted to the same spot with matched perspective, scale, contact shadows and scene lighting.");
  /* LIGHT & COLOR */
  mk2("roLcRef", "style", ["light", "color"], "LIGHT & COLOR REFERENCE: relight and regrade IMAGE 1 INSPIRED by the reference's lighting mood and color palette.");
  mk2("roLcCopy", "style", ["light", "color"], "LIGHT & COLOR COPY-PASTE: measure the reference's complete lighting setup (key direction and height, softness, fill ratio, rim/back light, white balance) and its full color grade, then paste them onto IMAGE 1 precisely - as if both photos were lit and graded in the same session.");
  /* DRESS */
  mk2("roDressRef", "style", ["dress"], "{TARGET}\nDRESS REFERENCE: design a NEW outfit for the target person INSPIRED by the reference outfit's style, era and mood (not an exact copy), tailored naturally to their body and pose.");
  mk2("roDressRep", "style", ["dress"], "{TARGET}\nDRESS REPLACE: put the reference's EXACT outfit onto the target person - same garment design, fabric, colors, patterns and details - refitted to their body and pose with natural folds.");
  /* MAKEUP */
  mk2("roMkCopy", "style", ["skin"], "{TARGET}\nMAKEUP COPY: copy the reference's EXACT makeup - base tone and finish, brow shape, eyeliner and lash style, eyeshadow palette, blush color and placement, lip color and finish - faithfully adapted to the target person's face shape.");
  /* MASTER MATCH */
  mk2("roMatch", "style", ["light", "color", "skin"],
    "MASTER MATCH: analyze the reference image and transfer {MATCH} onto IMAGE 1, so both images look like ONE photographer's single consistent edit from the same session - only the transferred style layers change.");
})();

applyRealDirRouting();

/* BG Replace / BG Swap are driven by the two toggles + solo/couple/family, so
   they use dynamic prompt/unkeep/harmonize builders instead of a fixed string. */
(function configureBgOps() {
  if (PRESETS.roBgRep) {
    PRESETS.roBgRep.promptFn = bgReplacePrompt;
    PRESETS.roBgRep.unkeepFn = function () {
      const u = ["bg"];
      if (!state.bgKeepFrame) u.push("frame");
      if (!state.bgKeepSubLight) { u.push("light"); u.push("color"); }
      return u;
    };
    PRESETS.roBgRep.realDirFn = function () { return state.bgKeepSubLight ? "scene" : "subject"; };
  }
  if (PRESETS.roBgSwap) {
    PRESETS.roBgSwap.promptFn = bgSwapPrompt;
    PRESETS.roBgSwap.unkeepFn = function () {
      const u = ["bg"];
      if (!state.bgKeepSubLight) { u.push("light"); u.push("color"); }
      return u;
    };
    PRESETS.roBgSwap.realDirFn = function () { return state.bgKeepSubLight ? "scene" : "subject"; };
  }
})();

/* ---------------- Scenes Pro (v4.20): locked subject + full scene-match ----------------
   The subject (active document) is hard-locked; the whole scene is generated and
   automatically adapted TO the subject across every lighting / camera / grade
   attribute so the result reads as one real photograph. */
const SCENE_LOCK = "LOCK the IMAGE 1 subject(s) 100% and change NOTHING about them: exact face identity (eyes, nose, mouth, eyebrows, bone structure), facial expression and gaze, head pose, hairstyle and hair, body shape, body pose and hands, the dress / outfit design and its exact colours, and their true scale, framing, composition and crop.";
const SCENE_MATCH = "Rebuild ONLY the environment around them and AUTOMATICALLY adapt the WHOLE scene TO the subject so it reads as one real photograph actually taken there. Match to the subject — lighting: key light, fill light, rim light, ambient light, shadow direction and softness, reflected light, contact shadows, global illumination, and skin / hair / clothing highlights; camera: perspective, camera angle, lens perspective, focal length, depth of field and bokeh; scene: a coherent background, foreground, props and objects, environment, architecture, landscape, sky, weather, reflections and atmosphere; grade: white balance, exposure, HDR, dynamic range, contrast, saturation, vibrance, colour grading, temperature, tint, black levels, highlight roll-off and cinematic tones. Never add or invent extra people. Ultra-realistic, true-to-life photograph — not a cut-out, no compositing seams.";
function sceneGuardFull() { return SCENE_LOCK + "\n" + SCENE_MATCH; }
function sceneTargetLine() {
  if (state.refTarget === "couple") return "Keep BOTH people (the couple) from IMAGE 1.";
  if (state.refTarget === "family") return "Keep EVERY person (the whole group) from IMAGE 1.";
  return "Keep the main subject from IMAGE 1.";
}

/* Optional stylish caption overlay (for kid / Miss-Universe / birthday text looks). */
function captionText() {
  if (!state.capOn) return "";
  const txt = (state.capText || "").trim();
  if (!txt) return "";
  const pos = state.capPos === "top" ? "top" : "bottom";
  return "\nADD CAPTION TEXT: place a stylish, well-designed caption reading \"" + txt.slice(0, 120) + "\" cleanly in the " + pos + " area — tastefully sized, high-contrast, perfectly legible and matching the scene's mood; never cover the subject's face or body.";
}

function sceneBirthdayCore() {
  const age = Math.max(1, Math.min(45, Math.round(state.bdayAge || 1)));
  return "HAPPY BIRTHDAY BACKGROUND for age " + age + ": build a premium party set behind the subject with a large glowing hero number \"" + age + "\" as a light installation (marquee bulbs / neon / bokeh light-letters), a tasteful 'Happy Birthday' theme with balloons, flowers, cake, ribbons, gifts and warm party bokeh lights suited to age " + age + " (playful for a child, elegant for an adult). " + sceneTargetLine();
}
function sceneScarfCore() {
  const dir = state.scarfDir === "left" ? "to the left" : state.scarfDir === "up" ? "upward" : "to the right";
  const len = state.scarfLen === "short" ? "short" : "long flowing";
  return "OUTDOOR / INDOOR FLYING SCARF: a scene where the subject's " + len + " scarf, veil or dress fabric billows dramatically " + dir + " in the wind, against a natural sky, landscape or seaside (or an elegant indoor set) with cinematic directional light. " + sceneTargetLine();
}

const SCENES = {
  scnGrad: ["scnGrad", function () { return "GRADUATION INDOOR (international / luxury): an elegant foreign-style indoor graduation setting — grand university library, marble hall or lecture atrium with warm architectural light, tasteful foreground props (books, diploma, ribbon, flowers) and premium decorative accents in harmonious colours, editorial mood. " + sceneTargetLine(); }],
  scnPrewed: ["scnPrewed", function () { return "PREWEDDING INDOOR (luxury): a grand indoor prewedding set — sweeping staircase, drapes, floral arch, chairs, tables and assorted premium bouquets in harmonious colours, soft window light, romantic warm palette. " + sceneTargetLine(); }],
  scnVietnam: ["scnVietnam", function () { return "VIETNAM STUDIO INDOOR: a soft airy pastel Vietnamese prewedding set — delicate florals, gentle glow, dreamy tones and elegant props. " + sceneTargetLine(); }],
  scnMyanmar: ["scnMyanmar", function () { return "MYANMAR TRADITIONAL INDOOR: an elegant Myanmar-themed set — traditional architecture, teak and gold accents, cultural decor and warm ceremonial mood. " + sceneTargetLine(); }],
  scnChinese: ["scnChinese", function () { return "CHINESE CLASSIC INDOOR: a refined Chinese classical set — red and gold accents, lanterns, silk and an elegant classical-portrait mood. " + sceneTargetLine(); }],
  scnShan: ["scnShan", function () { return "SHAN TRADITIONAL INDOOR: a Shan cultural set with traditional textiles, decor, lanterns and a warm ceremonial mood. " + sceneTargetLine(); }],
  scnNewborn: ["scnNewborn", function () { return "NEWBORN / BABY SET: a soft, safe newborn studio setup — plush wraps, gentle baskets and props, pastel tones and very soft light, with clean space for an age / day caption. " + sceneTargetLine(); }],
  scnBday: ["scnBday", sceneBirthdayCore],
  scnScarf: ["scnScarf", sceneScarfCore]
};

(function registerScenes() {
  for (const key in SCENES) {
    (function (k, btn, core) {
      PRESETS[k] = {
        btn: btn, needDoc: true, needRef: 0, scene: true,
        /* AUDIT-FIX #3: the birthday scene renders a giant hero age-number (text),
           so it must bypass the no-text guard. */
        addsText: (k === "scnBday"),
        unkeep: ["bg", "light", "color"], realDir: "scene",
        promptFn: function () { return core() + "\n" + sceneGuardFull() + captionText(); }
      };
    })(key, SCENES[key][0], SCENES[key][1]);
  }
})();

function presetText(def) {
  let txt = def.promptFn ? def.promptFn() : def.prompt;
  if (def.intensity) txt = txt.split("{INT}").join(String(state.intensity));
  if (def.petal) txt = txt.split("{PETAL}").join(petalColorText());
  if (def.refop) {
    txt = txt.split("{TARGET}").join(targetText());
    txt = txt.split("{MK}").join(mkText());
    txt = txt.split("{HAIR}").join(hairText());
    txt = txt.split("{MATCH}").join(matchListText());
  }
  if (def.restore) txt = txt.split("{MODE}").join(state.restMode === "bw"
    ? "Output as clean black-and-white with a rich, well-separated tonal range."
    : "Output in full natural color with professional, faithful color grading.");
  if (def.needRef) {
    const g = (def.guard === "style") ? REF_GUARD_STYLE : (def.guard === "canvas" ? REF_GUARD_CANVAS : (def.guard === "face" ? REF_GUARD_FACE : (def.guard === "subject" ? REF_GUARD_SUBJECT : REF_GUARD)));
    txt = roleMap(def) + "\n\n" + txt + "\n" + g;
  }
  return txt;
}

/* ---------------- LEARN MODE: two-tap + Student Guide (v3.1) ---------------- */
function dualT(key) {
  const e = (I18N.en[key] || key);
  /* Bilingual guide = English + the active language; when English is active,
     fall back to Burmese (the plugin's second home language) so the guide
     stays two-up rather than English-only. */
  const other = (state.lang !== "en") ? state.lang : "my";
  /* v6.11: extended codes have no full table — the guide's second column
     shows their fallback language (kyu -> Burmese, lo -> Thai, hi -> none) */
  const L = I18N[other] || I18N[LANG_FB[other]] || {};
  const loc = L[key] || "";
  return e + (loc && loc !== e ? "\n" + loc : "");
}

/* One accurate line of "what this button actually does", derived from its own
   prompt so the guide is always truthful (even after a prompt is edited). */
function presetSummary(key) {
  const def = PRESETS[key];
  if (!def) return "";
  let p = "";
  try { p = def.promptFn ? def.promptFn() : (def.prompt || ""); } catch (e) { p = def.prompt || ""; }
  p = String(p).replace(/\{[A-Z]+\}/g, " ").replace(/\s+/g, " ").trim();
  if (!p) return "";
  const dot = p.indexOf(". ");
  let end = (dot > 24) ? dot : 170;
  if (end > 200) end = 200;
  return p.slice(0, end).trim();
}

function guideFor(key) {
  const def = PRESETS[key];
  const L = [];
  let cat = "g_cat_generic";
  if (key.indexOf("roFace") === 0) cat = "g_cat_face";
  else if (key.indexOf("roSub") === 0) cat = "g_cat_sub";
  else if (key.indexOf("roBg") === 0 || key.indexOf("roFg") === 0) cat = "g_cat_bgfg";
  else if (key.indexOf("roLc") === 0) cat = "g_cat_lc";
  else if (key.indexOf("roDress") === 0) cat = "g_cat_dress";
  else if (key.indexOf("roMk") === 0) cat = "g_cat_mkop";
  else if (key === "roMatch") cat = "g_cat_match";
  else if (key.indexOf("trail") === 0) cat = "g_cat_trail";
  else if (key.indexOf("veil") === 0) cat = "g_cat_veil";
  else if (key.indexOf("gown") === 0) cat = "g_cat_gown";
  else if (key.indexOf("pet") === 0) cat = "g_cat_petal";
  else if (key === "wedExtra") cat = "g_cat_wedx";
  else if (key.indexOf("rep") === 0) cat = "g_cat_canvas";
  else if (key === "restore") cat = "g_cat_restore";
  else if (key.indexOf("scn") === 0) cat = "g_cat_scene";
  L.push(dualT(cat));
  const sum = presetSummary(key);
  if (sum) L.push("▸ " + sum);
  let n = 1;
  if (def && def.needDoc) { L.push(n + ". " + dualT("g_step_doc")); n++; }
  if (def && def.needRef >= 1) {
    L.push(n + ". " + dualT("g_step_ref1")); n++;
    if (def.refop) { L.push(n + ". " + dualT("g_step_target")); n++; }
  }
  if (def && def.faceOp) { L.push(n + ". " + dualT("g_step_mkhair")); n++; }
  if (def && def.petal) { L.push(n + ". " + dualT("g_step_petal")); n++; }
  if (def && def.restore) { L.push(n + ". " + dualT("g_step_rest")); n++; }
  if (def && def.intensity) { L.push(n + ". " + dualT("g_step_int")); n++; }
  L.push(n + ". " + dualT("g_step_confirm"));
  return L.join("\n\n");
}

const GEN_GUIDES = {
  __gen: "g_gen", __retouch: "g_retouchbtn", __relight: "g_relightbtn",
  __scene: "g_scene", __rmix: "g_rmix", __pipe: "g_pipe"
};

/* strip every learn-state class off a button so we can repaint one cleanly */
function clearArmClass(el) {
  if (!el) return;
  el.className = el.className.replace(" armed", "").replace(" armp", "").replace(" go", "");
}
function setArmClass(el, cls) {
  if (!el) return;
  clearArmClass(el);
  if (cls) el.className = el.className + " " + cls;
}
function resetArmTimer() {
  if (state.armTimer) { try { clearTimeout(state.armTimer); } catch (e) { } }
  state.armTimer = setTimeout(function () { disarm(); }, 8000);
}

function disarm() {
  if (state.armTimer) { try { clearTimeout(state.armTimer); } catch (e) { } state.armTimer = null; }
  if (state.armedEl) clearArmClass(state.armedEl);
  state.armedKey = null;
  state.armedEl = null;
  state.armStage = 0;
  const gb = $("guideBox");
  if (gb) gb.style.display = "none";
}

function greenFlash(el) {
  if (!el) return;
  setArmClass(el, "go");
  setTimeout(function () { try { el.className = el.className.replace(" go", ""); } catch (e) { } }, 700);
}

/* Stage 1 = the teaching guide (what it does + what it needs). */
function showGuide(key, titleTxt) {
  const gb = $("guideBox");
  if (!gb) return;
  const tt = $("guideTitle");
  const bd = $("guideBody");
  const isGen = !!GEN_GUIDES[key];
  if (tt) tt.textContent = "\uD83C\uDF93 " + (titleTxt || key);
  if (bd) bd.textContent = (isGen ? dualT(GEN_GUIDES[key]) : guideFor(key)) + "\n\n" + dualT("g_learn_next_prompt");
  gb.style.display = "block";
}

/* Stage 2 = show the EXACT prompt this button will send (blue), and (for a real
   preset) drop it into the prompt box so it can be read/edited before running. */
function showPromptStage(key, titleTxt) {
  const gb = $("guideBox");
  const bd = $("guideBody");
  const tt = $("guideTitle");
  let promptTxt = "";
  try {
    if (PRESETS[key]) promptTxt = presetText(PRESETS[key]);
    else { const fpb = $("finalPromptBox"); promptTxt = (fpb && fpb.value) ? fpb.value : dualT(GEN_GUIDES[key] || "g_step_confirm"); }
  } catch (e) { promptTxt = ""; }
  if (PRESETS[key]) { try { appendPrompt(promptTxt); } catch (e) { } }
  if (tt) tt.textContent = "\uD83D\uDCDD " + (titleTxt || key);
  if (bd) bd.textContent = dualT("g_learn_prompt_head") + "\n\n" + promptTxt + "\n\n" + dualT("g_learn_next_run");
  if (gb) gb.style.display = "block";
  setStatus(t("st_prompt_ready"), "ok");
}

/* Three-tap Learn cycle: 1st = guide (yellow), 2nd = prompt (blue), 3rd = RUN
   (green). Learn Mode OFF = single tap runs. Returns true when the tap was
   consumed by the cycle (i.e. did not run). */
function armGate(key, el, fire) {
  if (state.busy || state.pipeRunning) return false; /* never arm or fire mid-run */
  if (!state.learnMode) { fire(); return false; }
  if (state.armedKey === key) {
    if (state.armStage === 1) {
      state.armStage = 2;
      setArmClass(el || state.armedEl, "armp"); /* blue */
      showPromptStage(key, el ? el.textContent : key);
      resetArmTimer();
      return true;
    }
    /* stage 2 -> RUN */
    const ae = state.armedEl;
    disarm();
    fire();
    greenFlash(ae || el); /* after fire: paintPresetSel repaints classes, flash must land last */
    return false;
  }
  disarm();
  state.armedKey = key;
  state.armedEl = el || null;
  state.armStage = 1;
  setArmClass(el, "armed"); /* yellow */
  showGuide(key, el ? el.textContent : key);
  /* teaching preview in the Final Prompt card */
  try {
    if (PRESETS[key]) {
      const fpb = $("finalPromptBox");
      if (fpb) fpb.value = "(PREVIEW - not sent yet)\n" + presetText(PRESETS[key]);
    }
  } catch (e) { }
  resetArmTimer();
  return true;
}

function onPreset(key) {
  if (state.busy || state.pipeRunning) return;
  const el0 = $(PRESETS[key].btn);
  if (state.learnMode) {
    /* 3-tap cycle: guide -> prompt -> RUN. The green (3rd) tap always runs. */
    armGate(key, el0, function () { onPresetRun(key); });
    return;
  }
  /* Learn Mode OFF: one tap, honouring Auto-Run (run now, or insert prompt). */
  onPresetFire(key);
}

/* Actually generate for this preset (guards + build + runGenerate). */
function onPresetRun(key) {
  if (state.busy) return;
  state.lastPreset = key;
  paintPresetSel();
  setBusyBtn($(PRESETS[key].btn));
  const def = PRESETS[key];
  if (def.needDoc && !app.activeDocument) {
    state.pendingBtn = null;
    setStatus(t("st_need_doc"), "err");
    return;
  }
  const refCount = (state.refs[0] ? 1 : 0) + (state.refs[1] ? 1 : 0);
  if (def.needRef && refCount < def.needRef) {
    state.pendingBtn = null;
    setStatus(t("need_ref"), "err");
    return;
  }
  const txt = presetText(def);
  let unk = ((def.unkeepFn ? def.unkeepFn() : def.unkeep) || []).slice();
  if (def.faceOp && state.refHairOn && unk.indexOf("hair") < 0) unk.push("hair");
  const skipClean = def.guard === "style" || def.guard === "face" || def.guard === "subject";
  runGenerate(txt, skipClean, unk, false, { action: key, realDir: def.realDirFn ? def.realDirFn() : (def.realDir || null), allowText: !!def.addsText });
}

/* Learn-OFF one-tap: Auto-Run ON -> run; OFF -> insert prompt into the box. */
function onPresetFire(key) {
  if (state.busy) return;
  if (state.autoRun) { onPresetRun(key); return; }
  const def = PRESETS[key];
  state.lastPreset = key;
  paintPresetSel();
  if (def.needDoc && !app.activeDocument) { setStatus(t("st_need_doc"), "err"); return; }
  const refCount = (state.refs[0] ? 1 : 0) + (state.refs[1] ? 1 : 0);
  if (def.needRef && refCount < def.needRef) { setStatus(t("need_ref"), "err"); return; }
  appendPrompt(presetText(def));
  setStatus(t("st_ready"));
}

/* ---------------- Final prompt builder ---------------- */

function buildFinalPrompt(userText, meta, suppress) {
  let p = (userText || "").trim();
  if (p && p.indexOf("GUARD (HNK edit rule)") !== 0) p = "TASK:\n" + p;
  const head = [];
  if (meta.length) {
    head.push("--- IMAGE ROLES ---");
    for (let i = 0; i < meta.length; i++) {
      const m = meta[i];
      if (m.role === "base") {
        head.push("IMAGE " + (i + 1) + " = MAIN SUBJECT: the base photo from the active Photoshop document layer. This is the hero subject. Apply all edits to this image and keep this person.");
      } else {
        head.push("IMAGE " + (i + 1) + " = REFERENCE (" + (m.label || "reference") + ") - use it only for this role.");
      }
    }
    head.push("");
  }
  const lines = [];
  let hasBase = false;
  for (let i = 0; i < meta.length; i++) { if (meta[i].role === "base") hasBase = true; }
  if (hasBase) {
    const kt = keepText(suppress);
    if (kt) { lines.push(""); lines.push(kt); }
  }
  return (head.length ? head.join("\n") + "\n" : "") + p + lines.join("\n");
}

/* ---------------- Ratio / model resolution ---------------- */
function nearestRatio(v) {
  let best = RATIOS[0], bd = Infinity;
  for (let i = 0; i < RATIOS.length; i++) {
    const d = Math.abs(Math.log(RATIOS[i].v / v));
    if (d < bd) { bd = d; best = RATIOS[i]; }
  }
  return best.id;
}

function resolveRatio(base) {
  if (state.ratio !== "auto") return state.ratio;
  if (base && base.w && base.h) return nearestRatio(base.w / base.h);
  return "1:1";
}

const OAI_BASE = "https://api.openai.com/v1";
/* Legacy id — OpenAI retires gpt-image-1's API on 2026-10-23. Kept ONLY so
   old saved settings can be migrated; never offered, never sent. */
const MODEL_OAI_IMG = "gpt-image-1";
const MODEL_OAI_IMG2 = "gpt-image-2";
/* The one OpenAI image model the panel offers. gpt-image-2 keeps the same
   /images/generations + /images/edits shape gpt-image-1 used (model/prompt/
   size + optional quality low|medium|high, multipart image[] for edits,
   b64_json response) per the current OpenAI Images API reference
   (gpt-image-2 additionally accepts arbitrary WIDTHxHEIGHT sizes — the
   fixed sizes this panel sends remain valid). */
const OAI_MODEL_OPTIONS = [
  { v: MODEL_OAI_IMG2, label: "gpt-image-2 (OpenAI)" }
];
function oaiModel() {
  /* Any saved value — including a legacy "gpt-image-1" from an older
     install — resolves to gpt-image-2 (the old model's API dies 2026-10-23). */
  return MODEL_OAI_IMG2;
}

function resolveModel() {
  if (state.provider === "openai") return oaiModel();
  if (state.model === "flash") return MODEL_FLASH_IMG;
  if (state.model === "pro") return MODEL_PRO_IMG;
  return (state.size === "1K") ? MODEL_FLASH_IMG : MODEL_PRO_IMG;
}

/* size mapping for OpenAI (nearest of the 3 supported) */
function oaiSizeForRatio(r) {
  if (!r || r === "1:1") return "1024x1024";
  const p = r.split(":");
  const v = Number(p[0]) / Number(p[1]);
  if (v > 1.05) return "1536x1024";
  if (v < 0.95) return "1024x1536";
  return "1024x1024";
}

/* parts (Gemini shape) -> OpenAI: joined prompt + image list */
function oaiFromParts(parts) {
  const texts = [];
  const imgs = [];
  for (let i = 0; i < parts.length; i++) {
    if (parts[i].text) texts.push(parts[i].text);
    else if (parts[i].inlineData) imgs.push(parts[i].inlineData);
  }
  return { prompt: texts.join("\n"), images: imgs };
}

async function callOpenAIImage(model, parts, imageConfig) {
  if (!state.oaiKey) throw new Error("HNKERR:err_key:OpenAI key missing");
  const m = oaiFromParts(parts);
  const size = oaiSizeForRatio(imageConfig && imageConfig.aspectRatio);
  let res;
  if (m.images.length) {
    if (typeof FormData === "undefined" || typeof Blob === "undefined") {
      throw new Error("HNKERR:err_generic:This Photoshop version cannot send reference images to OpenAI - use Gemini for reference edits");
    }
    const fd = new FormData();
    fd.append("model", model);
    fd.append("prompt", m.prompt.slice(0, 30000));
    fd.append("size", size);
    if (state.oaiQuality && state.oaiQuality !== "auto") fd.append("quality", state.oaiQuality);
    for (let i = 0; i < Math.min(m.images.length, 10); i++) {
      fd.append("image[]", new Blob([b64ToBuf(m.images[i].data)], { type: m.images[i].mimeType || "image/png" }), "ref" + (i + 1) + ".png");
    }
    res = await hnkFetch(OAI_BASE + "/images/edits", {
      method: "POST",
      headers: { "Authorization": "Bearer " + state.oaiKey },
      body: fd
    }, 120000);
  } else {
    const genBody = { model: model, prompt: m.prompt.slice(0, 30000), size: size, n: 1 };
    if (state.oaiQuality && state.oaiQuality !== "auto") genBody.quality = state.oaiQuality;
    res = await hnkFetch(OAI_BASE + "/images/generations", {
      method: "POST",
      headers: { "Authorization": "Bearer " + state.oaiKey, "Content-Type": "application/json" },
      body: JSON.stringify(genBody)
    });
  }
  /* AUDIT-FIX #12: guard the parse like the Gemini path — a 5xx HTML
     gateway page must classify as err_net, not throw a cryptic SyntaxError. */
  const j = await res.json().catch(function () { return null; });
  if (!res.ok) {
    const msg = (j && j.error && j.error.message) ? j.error.message : ("HTTP " + res.status);
    const ck = classifyGemError(res.status, msg, "");
    throw new Error(ck ? "HNKERR:" + ck + ":" + msg : msg);
  }
  const d = j && j.data && j.data[0];
  if (!d || !d.b64_json) throw new Error("HNKERR:err_generic:OpenAI returned no image");
  return { b64: d.b64_json, mime: "image/png" };
}

/* single choke point: every image call routes by provider */
async function callImageAPI(model, parts, imageConfig) {
  if (state.provider === "openai") return callOpenAIImage(oaiModel(), parts, imageConfig);
  return callGeminiImage(model, parts, imageConfig);
}

/* ---------------- Gemini API ---------------- */
function classifyGemError(status, msg, block) {
  const m = (msg || "") + " " + (block || "");
  if (status === 401 || status === 403 || /API key|API_KEY|key not valid|PERMISSION_DENIED/i.test(m)) return "err_key";
  if (status === 429 || /quota|RESOURCE_EXHAUSTED|rate limit/i.test(m)) return "err_quota";
  if (status === 413 || /payload|too large|exceeds the maximum/i.test(m)) return "err_big";
  if (/SAFETY|PROHIBITED|IMAGE_SAFETY|blocked/i.test(m)) return "err_safety";
  if ((status && status >= 500) || /network|fetch|timed? ?out/i.test(m)) return "err_net";
  return "";
}

function friendlyErr(e) {
  const m = e && e.message ? e.message : String(e);
  const hm = /^HNKERR:([a-z_]+):/.exec(m);
  if (hm && I18N.en[hm[1]]) return t(hm[1]);
  /* AUDIT-FIX #10: strip any internal HNKERR:code: prefix from the fallback so a
     raw token (e.g. err_generic / err_img) never leaks into the status bar. */
  return t("st_err") + ": " + m.replace(/^HNKERR:[a-z_]+:/, "");
}

async function callGeminiImage(model, parts, imageConfig) {
  const url = API_BASE + "/models/" + model + ":generateContent?key=" + encodeURIComponent(state.apiKey);
  const modalitySets = [["IMAGE"], ["TEXT", "IMAGE"]];
  let lastErr = null;
  for (let i = 0; i < modalitySets.length; i++) {
    const body = {
      contents: [{ role: "user", parts: parts }],
      generationConfig: { responseModalities: modalitySets[i] }
    };
    if (imageConfig) body.generationConfig.imageConfig = imageConfig;
    let res, j;
    let attempt = 0;
    while (true) {
      attempt++;
      try {
        res = await hnkFetch(url, {
          method: "POST",
          headers: { "Content-Type": "application/json" },
          body: JSON.stringify(body)
        }, 120000);
        j = await res.json();
      } catch (e) {
        if (attempt < 3) {
          setStatus(t("st_retry") + " " + attempt + "/3 \u2026");
          await sleep(1500 * attempt);
          continue;
        }
        throw new Error("HNKERR:err_net:" + (e && e.message ? e.message : e));
      }
      if (!res.ok && [429, 500, 502, 503, 504].indexOf(res.status) >= 0 && attempt < 3) {
        setStatus(t("st_retry") + " " + attempt + "/3 (HTTP " + res.status + ")");
        await sleep(1500 * attempt);
        continue;
      }
      break;
    }
    if (res.ok) {
      const cand = j.candidates && j.candidates[0];
      const cparts = (cand && cand.content && cand.content.parts) ? cand.content.parts : [];
      for (let k = 0; k < cparts.length; k++) {
        const d = cparts[k].inlineData || cparts[k].inline_data;
        if (d && d.data) {
          return { b64: d.data, mime: d.mimeType || d.mime_type || "image/png" };
        }
      }
      const txts = [];
      for (let k = 0; k < cparts.length; k++) { if (cparts[k].text) txts.push(cparts[k].text); }
      const block = (j.promptFeedback && j.promptFeedback.blockReason) || (cand && cand.finishReason) || "";
      const ck0 = classifyGemError(0, txts.join(" "), block);
      const base0 = (txts.join(" ").slice(0, 200) || "No image returned") + (block ? " [" + block + "]" : "");
      lastErr = new Error(ck0 ? "HNKERR:" + ck0 + ":" + base0 : base0);
      break;
    } else {
      const msg = (j && j.error && j.error.message) ? j.error.message : ("HTTP " + res.status);
      if (/modalit|response_modalities/i.test(msg) && i < modalitySets.length - 1) {
        lastErr = new Error(msg);
        continue;
      }
      if (model === MODEL_PRO_IMG && !state._proFellBack &&
        (res.status === 404 || /not found|does not exist|not supported/i.test(msg))) {
        state._proFellBack = true;
        setStatus(t("st_pro_fallback"));
        return await callGeminiImage(MODEL_FLASH_IMG, parts, imageConfig);
      }
      const ck = classifyGemError(res.status, msg, "");
      throw new Error(ck ? "HNKERR:" + ck + ":" + msg : msg);
    }
  }
  throw lastErr || new Error("Unknown error");
}

async function callGeminiText(prompt) {
  const url = API_BASE + "/models/" + MODEL_TEXT + ":generateContent?key=" + encodeURIComponent(state.apiKey);
  const parts = Array.isArray(prompt) ? prompt : [{ text: prompt }];
  const body = { contents: [{ role: "user", parts: parts }] };
  let res, j;
  for (let at = 1; ; at++) {
    try {
      res = await hnkFetch(url, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(body)
      }, 90000);
      j = await res.json();
    } catch (e) {
      if (at < 2) { await sleep(1200); continue; }
      throw new Error("Network: " + (e && e.message ? e.message : e));
    }
    if (!res.ok && [429, 500, 502, 503, 504].indexOf(res.status) >= 0 && at < 2) { await sleep(1200); continue; }
    break;
  }
  if (!res.ok) throw new Error((j && j.error && j.error.message) ? j.error.message : ("HTTP " + res.status));
  const cand = j.candidates && j.candidates[0];
  const cparts = (cand && cand.content && cand.content.parts) ? cand.content.parts : [];
  const txts = [];
  for (let k = 0; k < cparts.length; k++) { if (cparts[k].text) txts.push(cparts[k].text); }
  return txts.join("\n").trim();
}

/* ---------------- Studio Lighting AI (3D diagram + relight) ---------------- */
const LIGHT_TYPES = ["softbox", "octa", "strip", "umbrella", "beauty", "hard"];
const LIGHT_TYPE_TXT = {
  softbox: "softbox", octa: "octabox", strip: "strip softbox",
  umbrella: "umbrella", beauty: "beauty dish", hard: "bare hard light"
};
const LIGHT_DEFS = [
  { key: "key", row: "lrKey", nameKey: "l_key", def: { on: false, type: "octa", int: 80, angle: -45, height: 15, dist: 45, size: 70 } },
  { key: "fill", row: "lrFill", nameKey: "l_fill", def: { on: false, type: "softbox", int: 40, angle: 35, height: 0, dist: 55, size: 60 } },
  { key: "butterfly", row: "lrButterfly", nameKey: "l_butterfly", def: { on: false, type: "beauty", int: 70, angle: 0, height: 40, dist: 40, size: 50 } },
  { key: "side", row: "lrSide", nameKey: "l_side", def: { on: false, type: "strip", int: 60, angle: -90, height: 0, dist: 45, size: 45 } },
  { key: "rim", row: "lrRim", nameKey: "l_rim", def: { on: false, type: "strip", int: 65, angle: 135, height: 15, dist: 50, size: 35 } },
  { key: "back", row: "lrBack", nameKey: "l_back", def: { on: false, type: "hard", int: 55, angle: 180, height: 20, dist: 60, size: 30 } },
  { key: "hair", row: "lrHair", nameKey: "l_hair", def: { on: false, type: "hard", int: 50, angle: 160, height: 45, dist: 50, size: 22 } },
  { key: "bglight", row: "lrBglight", nameKey: "l_bglight", def: { on: false, type: "umbrella", int: 45, angle: -160, height: 0, dist: 75, size: 50 } }
];
state.lights = LIGHT_DEFS.map(function (d) { return JSON.parse(JSON.stringify(d.def)); });


const LIGHT_SLIDERS = [
  ["liInt", "int", 0, 100], ["liAngle", "angle", -180, 180],
  ["liHeight", "height", -50, 50], ["liDist", "dist", 10, 100], ["liSize", "size", 10, 100]
];

function lightDirTxt(a) {
  const abs = Math.abs(a);
  const sidew = a < 0 ? "camera-left" : "camera-right";
  if (abs <= 15) return "directly in front (on the camera axis)";
  if (abs <= 60) return abs + "\u00B0 " + sidew + " (front-" + (a < 0 ? "left" : "right") + ")";
  if (abs <= 115) return "at the " + (a < 0 ? "left" : "right") + " side (about 90\u00B0)";
  if (abs <= 160) return "behind the subject, " + sidew + " (rim position)";
  return "directly behind the subject";
}
function lightHeightTxt(h) {
  if (h > 30) return "high above, angled down (top position)";
  if (h > 8) return "slightly above eye level";
  if (h >= -8) return "at eye level";
  if (h >= -30) return "below eye level, angled up";
  return "very low, strong up-angle";
}
function lightDistTxt(d) {
  if (d <= 30) return "very close";
  if (d <= 55) return "close-to-medium distance";
  if (d <= 80) return "medium-to-far distance";
  return "far away";
}
function lightSizeTxt(sz) {
  if (sz <= 30) return "small";
  if (sz <= 60) return "medium";
  if (sz <= 85) return "large";
  return "extra-large";
}

function buildLightingPrompt() {
  const L = [];
  for (let i = 0; i < LIGHT_DEFS.length; i++) {
    const lg = state.lights[i];
    if (!lg.on) continue;
    const nm = t(LIGHT_DEFS[i].nameKey).toUpperCase();
    L.push("- " + nm + ": " + lightSizeTxt(lg.size) + " " + LIGHT_TYPE_TXT[lg.type] +
      ", positioned " + lightDirTxt(lg.angle) + ", " + lightHeightTxt(lg.height) +
      ", " + lightDistTxt(lg.dist) + ", intensity " + lg.int + "%" +
      (LIGHT_DEFS[i].key === "bglight" ? ", aimed at the background (not the subject)" : "") + ".");
  }
  if (!L.length) return "";
  return "PROFESSIONAL STUDIO RELIGHT - rebuild the lighting of IMAGE 1 to match EXACTLY this studio setup (" + L.length + " light" + (L.length > 1 ? "s" : "") + "), like the photo was shot with it in a real studio:\n" +
    L.join("\n") +
    "\nRender physically accurate light falloff, soft or hard shadows per modifier, realistic catchlights in the eyes matching the key light, and natural skin response." +
    (state.lightEquip
      ? "\nYou MAY show the actual studio light equipment (softboxes, stands, umbrellas) naturally inside the frame."
      : "\nDo NOT show any studio equipment in the image - no softboxes, light stands, umbrellas, reflectors or lamps visible anywhere; only their light effect on the subject and scene.");
}

const RELIGHT_GUARD = "RELIGHT RULE: Change ONLY the lighting, shadows, highlights and the resulting color response - follow the light diagram exactly.";

function lightingGenerate() {
  if (state.busy) return;
  const p = buildLightingPrompt();
  if (!p) { setStatus(t("light_none"), "err"); return; }
  state.lastPreset = null;
  paintPresetSel();
  runGenerate(p + "\n" + RELIGHT_GUARD, true, ["light", "color"], true, { action: "Relight", realDir: "edit" });
}

/* ---- 3D diagram (top view, div-based: UXP-safe) ---- */
function renderLightStage() {
  const st = $("lightStage");
  if (!st) return;
  const W = st.clientWidth || 300;
  const H = 210;
  const cx = W / 2, cy = H / 2 + 6;
  for (let i = 0; i < LIGHT_DEFS.length; i++) {
    const dot = $("ld" + i);
    if (!dot) continue;
    const lg = state.lights[i];
    const R = 26 + (lg.dist * (Math.min(W, H) / 2 - 44)) / 100;
    const rad = lg.angle * Math.PI / 180;
    const x = cx + R * Math.sin(rad);
    const y = cy + R * Math.cos(rad) * 0.82;
    const dsz = Math.round(12 + lg.size * 0.16);
    dot.style.display = lg.on ? "flex" : "none";
    dot.style.left = Math.round(x - dsz / 2) + "px";
    dot.style.top = Math.round(y - dsz / 2) + "px";
    dot.style.width = dsz + "px";
    dot.style.height = dsz + "px";
    dot.style.opacity = String(0.45 + lg.int * 0.0055);
    dot.className = "ldot" + (state.lightSel === i ? " sel" : "");
    dot.textContent = lg.height > 8 ? "\u25B4" : (lg.height < -8 ? "\u25BE" : "\u00B7");
  }
}

function lightSummary(i) {
  const lg = state.lights[i];
  return LIGHT_TYPE_TXT[lg.type] + " \u00B7 " + lg.int + "% \u00B7 " + lg.angle + "\u00B0";
}

function paintLightRows() {
  for (let i = 0; i < LIGHT_DEFS.length; i++) {
    const row = $(LIGHT_DEFS[i].row);
    if (!row) continue;
    row.className = "lrow" + (state.lightSel === i ? " sel" : "");
    const ck = $(LIGHT_DEFS[i].row + "Ck");
    if (ck) {
      ck.className = "ckb" + (state.lights[i].on ? " on" : "");
      ck.textContent = state.lights[i].on ? "\u2713" : "";
    }
    const sm = $(LIGHT_DEFS[i].row + "Sum");
    if (sm) sm.textContent = lightSummary(i);
  }
}

function paintLightCtl() {
  const lg = state.lights[state.lightSel];
  for (let i = 0; i < LIGHT_SLIDERS.length; i++) {
    const el = $(LIGHT_SLIDERS[i][0]), vl = $(LIGHT_SLIDERS[i][0] + "V");
    if (el) el.value = String(lg[LIGHT_SLIDERS[i][1]]);
    if (vl) vl.textContent = String(lg[LIGHT_SLIDERS[i][1]]);
  }
  for (let j = 0; j < LIGHT_TYPES.length; j++) {
    const b = $("lt" + LIGHT_TYPES[j]);
    if (b) b.className = "sw ltchip" + (lg.type === LIGHT_TYPES[j] ? " on" : "");
  }
  const nm = $("lightSelName");
  if (nm) nm.textContent = t(LIGHT_DEFS[state.lightSel].nameKey);
}

function bindLighting() {
  for (let i = 0; i < LIGHT_DEFS.length; i++) {
    (function (idx) {
      const row = $(LIGHT_DEFS[idx].row);
      const ck = $(LIGHT_DEFS[idx].row + "Ck");
      if (ck) ck.addEventListener("click", function () {
        state.lights[idx].on = !state.lights[idx].on;
        state.lightSel = idx;
        paintLightRows(); paintLightCtl(); renderLightStage(); saveSettings();
      });
      if (row) row.addEventListener("click", function () {
        state.lightSel = idx;
        paintLightRows(); paintLightCtl(); renderLightStage();
      });
    })(i);
  }
  for (let i = 0; i < LIGHT_SLIDERS.length; i++) {
    (function (id, key) {
      const el = $(id);
      if (!el) return;
      el.addEventListener("input", function () {
        state.lights[state.lightSel][key] = Math.round(Number(el.value));
        const vl = $(id + "V");
        if (vl) vl.textContent = String(state.lights[state.lightSel][key]);
        paintLightRows(); renderLightStage();
      });
      el.addEventListener("change", function () { saveSettings(); });
    })(LIGHT_SLIDERS[i][0], LIGHT_SLIDERS[i][1]);
  }
  for (let j = 0; j < LIGHT_TYPES.length; j++) {
    (function (tp) {
      const b = $("lt" + tp);
      if (b) b.addEventListener("click", function () {
        state.lights[state.lightSel].type = tp;
        paintLightCtl(); paintLightRows(); renderLightStage(); saveSettings();
      });
    })(LIGHT_TYPES[j]);
  }
  bindChecks([["lgEquip", "lightEquip"]], state);
  const g = $("btnLightGen");
  if (g) g.addEventListener("click", function () { armGate("__relight", g, function () { setBusyBtn(g); lightingGenerate(); }); });
  paintLightRows(); paintLightCtl(); renderLightStage();
}

/* ---------------- Image -> Prompt (Scene Builder) ---------------- */
const I2P_CK = [["i2pObjects", "objects"], ["i2pLight", "light"], ["i2pColor", "color"], ["i2pBg", "bg"], ["i2pFg", "fg"]];
const I2P_OPT_CK = [["i2pFit", "fit"], ["i2pAdapt", "adapt"]];
const I2P_SECTIONS = {
  bg: "BACKGROUND: every element of the background - walls, sky, landscape, architecture, textures, depth layers and their exact appearance.",
  fg: "FOREGROUND: any foreground elements - props, plants, fabrics, bokeh objects - their position, distance and blur.",
  objects: "OBJECTS & PROPS: every visible object with its material, color, condition, position and relative scale.",
  light: "LIGHTING: every light source, its direction, quality (hard/soft), intensity, shadows, highlights, time of day and atmosphere.",
  color: "COLOR: the full color palette, grading style, saturation, contrast character and overall mood."
};

function buildExtractPrompt() {
  const secs = [];
  for (const k in I2P_SECTIONS) { if (state.i2p[k]) secs.push("- " + I2P_SECTIONS[k]); }
  if (!secs.length) return "";
  return "Analyze IMAGE 1 and write ONE exhaustive photographic scene description to be used as an AI image-generation prompt.\n" +
    "CRITICAL: EXCLUDE every person, human figure, face and body completely - describe the scene as if it were empty of people.\n" +
    "Describe in rich detail:\n" + secs.join("\n") +
    "\nAlways also state: location type, time of day, atmosphere, and the camera angle / lens feel of the original photo.\n" +
    "Output ONLY the scene description in English as flowing prose (no lists, no headings, no explanations, no quotes). Maximum 2500 characters.";
}

const SCENE_FIT = "SCENE FIT (AUTO): Build the described scene AROUND the IMAGE 1 subject following IMAGE 1's framing, composition, camera distance and camera angle exactly. Whatever the shot type - close-up, half-body, full-body or wide - re-project the scene naturally for that viewpoint: correct perspective and camera-lens proportions, believable depth of field, foreground and background elements placed and scaled to IMAGE 1's viewpoint, lighting direction and color kept consistent across the frame. The result must look photographed in-camera from IMAGE 1's exact camera position.";
const SCENE_ADAPT_ON = "Re-light and color-grade the IMAGE 1 subject so they naturally match the new scene's lighting direction, intensity and color palette.";
const SCENE_ADAPT_OFF = "Keep the IMAGE 1 subject's original lighting and colors untouched; blend the scene around them believably.";
const SCENE_GUARD = "SCENE BUILD RULE: the final image contains only the IMAGE 1 subject(s) - build the described scene around them; never add people.";

async function extractScenePrompt() {
  if (state.busy) return;
  const key = (state.apiKey || "").trim() || $("apiKey").value.trim();
  if (!key) { setStatus(t("st_need_key"), "err"); return; }
  state.apiKey = key;
  const r = state.refs[0];
  if (!r) { setStatus(t("need_ref"), "err"); return; }
  const instr = buildExtractPrompt();
  if (!instr) { setStatus(t("i2p_none"), "err"); return; }
  startBusy("st_extract");
  try {
    const out = await callGeminiText([
      { text: instr },
      { text: "IMAGE 1:" },
      { inlineData: { mimeType: r.mime, data: r.b64 } }
    ]);
    if (!out) throw new Error("empty");
    setPromptText(out.slice(0, promptCap()));
    endBusy();
    setStatus(t("st_extract_done"), "ok");
    switchPage("prompt");
  } catch (e) {
    endBusy();
    setStatus(t("st_err") + ": " + (e && e.message ? e.message : e), "err");
  }
}

function sceneGenerate() {
  if (state.busy) return;
  const boxTxt = getPromptText().trim();
  if (!boxTxt) { setStatus(t("scene_no_prompt"), "err"); return; }
  const L = [];
  if (state.i2p.fit) L.push(SCENE_FIT);
  L.push(state.i2p.adapt ? SCENE_ADAPT_ON : SCENE_ADAPT_OFF);
  L.push(SCENE_GUARD);
  let unkeep = ["bg", "frame"];
  if (state.i2p.adapt) unkeep = unkeep.concat(["light", "color"]);
  state.lastPreset = null;
  paintPresetSel();
  runGenerate(L.join("\n"), true, unkeep, true, { action: "Scene", realDir: "scene" });
}

/* ---------------- Replace Mix: tick which aspects to take from Ref1 ---------------- */
const RMIX_CK = [["rmBg", "bg"], ["rmFg", "fg"], ["rmLight", "light"], ["rmColor", "color"], ["rmObject", "object"]];
const RMIX_LINES = {
  bg: "Replace the BACKGROUND of IMAGE 1 with the background environment from IMAGE 2 (people in it excluded), matching perspective and light.",
  fg: "Bring the FOREGROUND elements/props of IMAGE 2 in front of the IMAGE 1 subject with realistic depth-of-field.",
  light: "Apply the LIGHTING mood, direction and quality of IMAGE 2 onto IMAGE 1.",
  color: "Apply the COLOR grade and palette of IMAGE 2 onto IMAGE 1.",
  object: "Copy the key OBJECT(S)/props from IMAGE 2 into the IMAGE 1 scene naturally (never its people)."
};
const RMIX_UNKEEP = { bg: ["bg"], fg: [], light: ["light"], color: ["color"], object: [] };

function mixText() {
  const L = [];
  for (const k in RMIX_LINES) { if (state.rmix[k]) L.push("- " + RMIX_LINES[k]); }
  if (!L.length) return "";
  return "SELECTIVE REPLACE from IMAGE 2 - apply ONLY these ticked aspects:\n" + L.join("\n") +
    "\nEverything that is not ticked stays exactly as it is in IMAGE 1.";
}

function replaceMixRun() {
  if (state.busy) return;
  const refCount = (state.refs[0] ? 1 : 0) + (state.refs[1] ? 1 : 0);
  if (refCount < 1) { setStatus(t("need_ref"), "err"); return; }
  const body = mixText();
  if (!body) { setStatus(t("rm_none"), "err"); return; }
  const def = {
    needRef: 1,
    roles: { ref1: "SELECTIVE ASPECT SOURCE (only the ticked aspects: background / foreground / light / color / objects)" },
    prompt: body
  };
  let unkeep = [];
  for (const k in RMIX_UNKEEP) { if (state.rmix[k]) unkeep = unkeep.concat(RMIX_UNKEEP[k]); }
  state.lastPreset = null;
  paintPresetSel();
  runGenerate(presetText(def), false, unkeep, false, { action: "ReplaceMix" });
}

/* ---------------- Reference auto-clean (remove people from Ref1) ---------------- */
function imgMagicOk(b64) {
  if (!b64 || b64.length < 24) return false;
  return b64.indexOf("iVBOR") === 0 || b64.indexOf("/9j/") === 0 || b64.indexOf("UklGR") === 0 || b64.indexOf("R0lGOD") === 0;
}

/* v4.5: references are READ-ONLY inputs - never regenerated or overwritten.
   People-exclusion is handled purely by the reference guards in the prompt. */

/* ---------------- Web AI Mini Browser (v2.5) ---------------- */
const WEB_HOME = "https://photoeditorai.io/";
const WEB_SITES = [
  /* v6.10: the panel's own 607-look Library and 116 workflows are the most
     useful pages this window can show — they lead the row */
  ["HNK Library", "https://hnk-ai-tools-3-s4nnu.ondigitalocean.app/app/?page=pgLib"],
  ["HNK Workflows", "https://hnk-ai-tools-3-s4nnu.ondigitalocean.app/app/?page=pgWf"],
  ["PhotoEditorAI", "https://photoeditorai.io/"],
  ["Remove.bg", "https://www.remove.bg/"]
];

/* AUDIT-FIX #6: dropped the broad attacker-hostable wildcards googleusercontent.com
   and cloudfront.net from the mini-browser allow-list (anyone can publish a page on
   those multi-tenant namespaces). Import-from-URL uses fetch (network:all), so real
   image CDNs still work — only in-browser NAVIGATION to those hosts is blocked. */
const WEB_ALLOWED = ["hnk-ai-tools-3-s4nnu.ondigitalocean.app", "photoeditorai.io", "photoeditor.ai", "playground.com", "pixlr.com", "fotor.com", "remove.bg", "google.com", "googleapis.com", "gstatic.com", "facebook.com", "cloudflare.com"];

function webAllowed(u) {
  try {
    const host = String(u).replace(/^https?:\/\//i, "").split("/")[0].toLowerCase();
    for (let i = 0; i < WEB_ALLOWED.length; i++) {
      if (host === WEB_ALLOWED[i] || host.endsWith("." + WEB_ALLOWED[i])) return true;
    }
  } catch (e) { }
  return false;
}

/* AUDIT-FIX #6: only these first-party integration origins may push an image
   straight into the user's document via the WebView message bridge. A CDN / hosting
   wildcard must NEVER be trusted here — anyone can host a page on one. */
const BRIDGE_TRUSTED = ["photoeditorai.io", "photoeditor.ai"];

function bridgeOriginOk(origin) {
  try {
    if (!origin) return false; /* no origin => reject (cannot be verified) */
    const host = String(origin).replace(/^https?:\/\//i, "").split("/")[0].toLowerCase();
    for (let i = 0; i < BRIDGE_TRUSTED.length; i++) {
      if (host === BRIDGE_TRUSTED[i] || host.endsWith("." + BRIDGE_TRUSTED[i])) return true;
    }
  } catch (e) { }
  return false;
}

function webGo(url) {
  const w = $("webView");
  let u = (url || "").trim();
  if (!u) return;
  if (!/^https?:\/\//i.test(u)) u = "https://" + u;
  /* AUDIT-FIX #7: the allow-list check must actually block — without this return
     a disallowed origin fell through and was loaded + persisted anyway. */
  if (!webAllowed(u)) { setStatus(t("st_web_notallowed"), "err"); return; }
  if (w) {
    try { if (w.loadURL) w.loadURL(u); else w.src = u; }
    catch (e) { setStatus("WebView: " + (e && e.message ? e.message : e), "err"); }
  }
  const ub = $("webUrl");
  if (ub) ub.value = u;
  state.webUrl = u;
  saveSettings();
}

async function importImageToPS(b64, mime, label) {
  try {
    startBusy("st_place");
    state.resultB64 = b64;
    state.resultMime = mime || "image/png";
    state.lastAction = label || "Web";
    const dm = imgDimsFromB64(b64, state.resultMime);
    if (dm) state.previewRatio = dm.h / dm.w;
    pushHistory({
      after: b64, afterMime: state.resultMime,
      before: state.beforeB64, beforeMime: state.beforeMime,
      userText: "", finalPrompt: "(imported from Web AI)",
      action: state.lastAction, ts: Date.now(), ratio: state.previewRatio
    });
    refreshCompare();
    await placeResultToPS();
    endBusy();
    setStatus(t("st_web_import"), "ok");
  } catch (e) {
    endBusy();
    setStatus(t("st_err") + ": " + (e && e.message ? e.message : e), "err");
  }
}

async function importFromCopiedLink() {
  try {
    const s0 = ((await readClipboardText()) || "").trim();
    if (!s0) { setStatus(t("st_clip_help"), "err"); return; }
    if (/^blob:/i.test(s0)) { setStatus(t("st_web_blob"), "err"); return; }
    if (!/^https?:\/\//i.test(s0) && !/^data:image\//i.test(s0)) { setStatus(t("st_web_nourl") + " \u00B7 " + t("st_clip_help"), "err"); return; }
    startBusy("st_web_fetch");
    const got = await fetchWebImage(s0);
    endBusy();
    await importImageToPS(bufToB64(got.buf), got.mime || "image/png", "WebLink");
  } catch (e) {
    endBusy();
    setStatus(friendlyErr(e), "err");
  }
}

/* guaranteed path: import whatever URL is in the address bar */
async function importFromUrlBar() {
  try {
    const u = (($("webUrl") && $("webUrl").value) || "").trim();
    if (!u || (!/^https?:\/\//i.test(u) && !/^data:image\//i.test(u))) { setStatus(t("st_web_nourl"), "err"); return; }
    startBusy("st_web_fetch");
    const got = await fetchWebImage(u);
    endBusy();
    await importImageToPS(bufToB64(got.buf), got.mime || "image/png", "WebURL");
  } catch (e) {
    endBusy();
    setStatus(friendlyErr(e), "err");
  }
}

async function importFromFile() {
  try {
    const f = await fsp.getFileForOpening({ types: ["jpg", "jpeg", "png", "webp"] });
    if (!f) return;
    const buf = await f.read({ format: formats.binary });
    await importImageToPS(bufToB64(buf), extToMime(f.name), "WebFile");
  } catch (e) {
    setStatus(t("st_err") + ": " + (e && e.message ? e.message : e), "err");
  }
}

function bindWeb() {
  const w = $("webView");
  if (w) {
    try {
      w.style.width = "100%";
      if (!w.style.height) w.style.height = "500px";
    } catch (e) { }
  }
  const ub = $("webUrl");
  if (ub) {
    ub.value = state.webUrl || WEB_HOME;
    ub.addEventListener("keydown", function (e) {
      if (e && e.key === "Enter") webGo(ub.value);
    });
  }
  const g = $("btnWebGo");
  if (g) g.addEventListener("click", function () { webGo(ub ? ub.value : WEB_HOME); });
  const h = $("btnWebHome");
  if (h) h.addEventListener("click", function () { webGo(WEB_HOME); });
  const r = $("btnWebReload");
  if (r) r.addEventListener("click", function () {
    /* UXP HTMLWebViewElement has no reload(); use loadURL() when present, else re-set src */
    try {
      if (w && w.loadURL && w.src) w.loadURL(w.src);
      else if (w && w.reload) w.reload();
      else if (w && w.src) w.src = w.src;
    } catch (e) { }
  });
  const bk = $("btnWebBack");
  if (bk) bk.addEventListener("click", function () {
    try { if (w && w.goBack) w.goBack(); } catch (e) { }
  });
  const sc = $("webSites");
  if (sc) {
    while (sc.firstChild) sc.removeChild(sc.firstChild);
    for (let i = 0; i < WEB_SITES.length; i++) {
      (function (nm, url) {
        const bt = document.createElement("button");
        bt.className = "sw ltchip";
        bt.textContent = nm;
        bt.addEventListener("click", function () { webGo(url); });
        sc.appendChild(bt);
      })(WEB_SITES[i][0], WEB_SITES[i][1]);
    }
  }
  const hs = [["webHS", 360], ["webHM", 500], ["webHL", 680]];
  for (let i = 0; i < hs.length; i++) {
    (function (id, px) {
      const bh = $(id);
      if (bh) bh.addEventListener("click", function () {
        if (w) w.style.height = px + "px";
        for (let j = 0; j < hs.length; j++) {
          const o = $(hs[j][0]);
          if (o) o.className = "segb" + (hs[j][0] === id ? " on" : "");
        }
      });
    })(hs[i][0], hs[i][1]);
  }
  /* message bridge: a web app can push its result straight into Photoshop.
     UXP dispatches WebView -> host messages to the GLOBAL window (not the
     <webview> element), so the listener MUST live on window or it never fires.
     We also register on the element as a harmless fallback for older hosts and
     de-dupe by payload so a double-delivery can never import twice. */
  let _lastBridgeMsg = "";
  const bridgeHandler = function (e) {
    try {
      let raw = e && e.data;
      if (!raw) return;
      const sig = (typeof raw === "string") ? raw : JSON.stringify(raw);
      if (sig === _lastBridgeMsg) return; /* ignore an identical duplicate delivery */
      let d = raw;
      if (typeof d === "string") { try { d = JSON.parse(d); } catch (pe) { return; } }
      if (d && d.type === "hnk-image") {
        /* AUDIT-FIX #6: reject a bridge push from any non first-party origin (incl. a
           missing origin) so untrusted web content can't silently write pixels into
           the user's open document. */
        if (!bridgeOriginOk(e && e.origin)) { hwarn("bridge: ignored image from untrusted origin:", (e && e.origin) || "(none)"); return; }
        _lastBridgeMsg = sig;
        setTimeout(function () { _lastBridgeMsg = ""; }, 2000);
        if (d.dataUrl && /^data:image\//i.test(d.dataUrl)) {
          const m = d.dataUrl.match(/^data:([^;]+);base64,(.+)$/);
          if (m) importImageToPS(m[2], m[1], "WebApp");
        } else if (d.b64) {
          importImageToPS(d.b64, d.mime || "image/png", "WebApp");
        }
      }
    } catch (be) { hwarn("bridge:", be); }
  };
  try { if (typeof window !== "undefined" && window.addEventListener) window.addEventListener("message", bridgeHandler); } catch (we) { }
  if (w && w.addEventListener) { try { w.addEventListener("message", bridgeHandler); } catch (ee) { } }
  const iu = $("btnWebImportUrl");
  if (iu) iu.addEventListener("click", function () { importFromUrlBar(); });
  const il = $("btnWebImportLink");
  if (il) il.addEventListener("click", function () { setBusyBtn(il); importFromCopiedLink(); });
  const iff = $("btnWebImportFile");
  if (iff) iff.addEventListener("click", function () { setBusyBtn(iff); importFromFile(); });
}

/* ---------------- Selection mask capture (v2.4) ---------------- */
async function captureSelectionMask() {
  let out = null;
  await psCore.executeAsModal(async function () {
    let sel = null, rgbId = null;
    try {
      sel = await imaging.getSelection({
        documentID: app.activeDocument.id,
        targetSize: { width: 1024 },
        componentSize: 8
      });
      if (!sel || !sel.imageData) return;
      const id = sel.imageData;
      let encTarget = id;
      /* getSelection returns a SINGLE-channel (grayscale) mask, but
         encodeImageData expects an RGB image — passing the mask straight in
         throws, which is why selection-area edits used to silently no-op.
         Expand the 1-channel mask to interleaved RGB first. */
      if (id.components && id.components < 3) {
        const raw = await id.getData();
        const g = (raw instanceof Uint8Array) ? raw : new Uint8Array(raw);
        const w = id.width, h = id.height;
        const rgb = new Uint8Array(w * h * 3);
        for (let i = 0, j = 0; i < g.length && j + 2 < rgb.length; i++, j += 3) {
          const v = g[i]; rgb[j] = v; rgb[j + 1] = v; rgb[j + 2] = v;
        }
        rgbId = await imaging.createImageDataFromBuffer(rgb, {
          width: w, height: h, components: 3, colorSpace: "RGB", componentSize: 8, chunky: true
        });
        encTarget = rgbId;
      }
      const enc = await imaging.encodeImageData({ imageData: encTarget, base64: true });
      /* RGB (no alpha) encodes to JPEG; only accept a byte-verified image */
      if (enc && imgMagicOk(enc)) out = { b64: enc, mime: (enc.indexOf("iVBOR") === 0 ? "image/png" : "image/jpeg") };
    } finally {
      try { if (rgbId && rgbId.dispose) rgbId.dispose(); } catch (de) { }
      try { if (sel && sel.imageData && sel.imageData.dispose) sel.imageData.dispose(); } catch (se) { }
    }
  }, { commandName: "HNK Selection Mask" });
  return out;
}

/* ---------------- Results History (v2.4) ---------------- */
const HIST_MAX = 30;

function pushHistory(entry) {
  state.history.unshift(entry);
  while (state.history.length > HIST_MAX) state.history.pop();
  state.histSel = 0;
  renderHistory();
  /* keep a lightweight, persisted list of recent prompt texts (survives restarts) */
  try {
    const txt = (entry && entry.userText ? String(entry.userText) : "").trim();
    if (txt && txt.indexOf("Realistic Boost") < 0) {
      state.recentPrompts = (state.recentPrompts || []).filter(function (r) { return r && r.t !== txt; });
      state.recentPrompts.unshift({ t: txt, ts: entry.ts || 0 });
      while (state.recentPrompts.length > 20) state.recentPrompts.pop();
      paintRecentPrompts();
      saveSettings();
    }
  } catch (e) { }
}

/* Recent Prompts dropdown (Studio prompt card): first option is the label,
   each entry restores its full prompt text into the box. */
function paintRecentPrompts() {
  const sel = $("selRecentPrompts");
  if (!sel) return;
  while (sel.firstChild) sel.removeChild(sel.firstChild);
  const head = document.createElement("option");
  head.value = ""; head.textContent = t("recent_lbl");
  sel.appendChild(head);
  const list = state.recentPrompts || [];
  for (let i = 0; i < list.length; i++) {
    const o = document.createElement("option");
    o.value = list[i].t;
    o.textContent = list[i].t.length > 58 ? list[i].t.slice(0, 58) + "…" : list[i].t;
    sel.appendChild(o);
  }
  sel.value = "";
}

function renderHistory() {
  const row = $("histRow");
  if (!row) return;
  while (row.firstChild) row.removeChild(row.firstChild);
  for (let i = 0; i < state.history.length; i++) {
    (function (idx) {
      const e = state.history[idx];
      const d = document.createElement("div");
      d.className = "histTh" + (state.histSel === idx ? " sel" : "");
      d.style.backgroundImage = 'url("data:' + e.afterMime + ";base64," + e.after + '")';
      d.addEventListener("click", function () { selectHistory(idx); });
      row.appendChild(d);
    })(i);
  }
  const info = $("histInfo");
  if (info) {
    const e = state.history[state.histSel];
    info.textContent = e ? ((state.histSel + 1) + "/" + state.history.length + " \u00B7 " + (e.action || "")) : "";
  }
}

function selectHistory(idx) {
  const e = state.history[idx];
  if (!e) return;
  state.histSel = idx;
  if (e.ratio) state.previewRatio = e.ratio;
  state.resultB64 = e.after; state.resultMime = e.afterMime;
  state.beforeB64 = e.before; state.beforeMime = e.beforeMime;
  refreshCompare();
  renderHistory();
}

function histPromptToBox() {
  const e = state.history[state.histSel];
  if (!e) return;
  setPromptText(e.userText || "");
  const fpb = $("finalPromptBox");
  if (fpb) fpb.value = e.finalPrompt || "";
  switchPage("prompt");
  openCard("final");
}

/* ---------------- Recipes: save / load / share (v2.4) ---------------- */
function buildRecipe() {
  return JSON.parse(JSON.stringify({
    hnk_recipe: true, ver: "2.4.0", saved: new Date().toISOString(),
    model: state.model, size: state.size, ratio: state.ratio, intensity: state.intensity,
    chains: state.chains, clean: state.clean, keep: state.keep, rmix: state.rmix,
    i2p: state.i2p, rt: state.rt, lights: state.lights, lightEquip: state.lightEquip,
    restMode: state.restMode,
    refTarget: state.refTarget, refMkOn: state.refMkOn, refHairOn: state.refHairOn, match: state.match,
    pipeline: state.pipeline, pipeMerge: state.pipeMerge,
    wedTrail: state.wedTrail, wedVeil: state.wedVeil, wedGown: state.wedGown, wedPetal: state.wedPetal, wedExtra: state.wedExtra,
    camOn: state.camOn, camBody: state.camBody, camMm: state.camMm, camF: state.camF,
    camFilm: state.camFilm, camBokeh: state.camBokeh,
    camIso: state.camIso, camIsoOn: state.camIsoOn, camK: state.camK, camKOn: state.camKOn,
    promptEn: getPromptText(), promptMy: getMyPromptText()
  }));
}

function applyRecipe(o) {
  if (!o || typeof o !== "object" || !o.hnk_recipe) return false;
  const boolMap = function (dst, src) {
    for (const k in dst) { if (src && typeof src[k] === "boolean") dst[k] = src[k]; }
  };
  if (typeof o.model === "string") state.model = o.model;
  if (typeof o.size === "string") state.size = o.size;
  if (typeof o.ratio === "string") state.ratio = o.ratio;
  if (typeof o.intensity === "number") state.intensity = Math.round(o.intensity);
  boolMap(state.chains, o.chains);
  boolMap(state.clean, o.clean);
  boolMap(state.keep, o.keep);
  boolMap(state.rmix, o.rmix);
  boolMap(state.i2p, o.i2p);
  if (o.rt && typeof o.rt === "object") {
    for (const k in RT_DEFAULT) {
      if (typeof RT_DEFAULT[k] === "number" && typeof o.rt[k] === "number") state.rt[k] = Math.round(o.rt[k]);
      if (RT_DEFAULT[k] === null && (typeof o.rt[k] === "string" || o.rt[k] === null)) state.rt[k] = o.rt[k];
    }
  }
  if (Array.isArray(o.lights)) {
    for (let li = 0; li < state.lights.length && li < o.lights.length; li++) {
      const ol = o.lights[li];
      if (!ol || typeof ol !== "object") continue;
      if (typeof ol.on === "boolean") state.lights[li].on = ol.on;
      if (typeof ol.type === "string" && LIGHT_TYPES.indexOf(ol.type) >= 0) state.lights[li].type = ol.type;
      ["int", "angle", "height", "dist", "size"].forEach(function (nk) {
        if (typeof ol[nk] === "number") state.lights[li][nk] = Math.round(ol[nk]);
      });
    }
  }
  if (typeof o.lightEquip === "boolean") state.lightEquip = o.lightEquip;
  if (typeof o.restMode === "string" && (o.restMode === "color" || o.restMode === "bw")) state.restMode = o.restMode;
  if (o.refTarget === "solo" || o.refTarget === "couple" || o.refTarget === "family") state.refTarget = o.refTarget;
  if (typeof o.refMkOn === "boolean") state.refMkOn = o.refMkOn;
  if (typeof o.refHairOn === "boolean") state.refHairOn = o.refHairOn;
  if (o.match && typeof o.match === "object") {
    for (const mk4 in state.match) { if (typeof o.match[mk4] === "boolean") state.match[mk4] = o.match[mk4]; }
  }
  sanitizePipeline(o.pipeline);
  if (typeof o.pipeMerge === "boolean") state.pipeMerge = o.pipeMerge;
  sanitizeWed(o);
  sanitizeCam(o);
  if (typeof o.promptEn === "string") setPromptText(o.promptEn);
  if (typeof o.promptMy === "string") {
    const pm = $("promptBoxMy");
    if (pm) pm.value = o.promptMy.slice(0, promptCap());
  }
  return true;
}

function repaintFromState() {
  try { const sm = $("selModel"); if (sm) sm.value = (state.provider === "openai") ? oaiModel() : state.model; } catch (e) { }
  try { const sr = $("selRatio"); if (sr) sr.value = state.ratio; } catch (e) { }
  try { paintSizeSeg(); } catch (e) { }
  try { const iv = $("intVal"), is2 = $("intSlider"); if (is2) is2.value = String(state.intensity); if (iv) iv.textContent = state.intensity + "%"; } catch (e) { }
  try { paintRtSliders(); paintSwatchesAll(); } catch (e) { }
  try { paintChains(); paintRest(); paintClean(); } catch (e) { }
  try {
    paintChecks(KEEP_CK, state.keep); paintChecks(RMIX_CK, state.rmix);
    paintChecks(I2P_CK, state.i2p); paintChecks(I2P_OPT_CK, state.i2p);
    paintChecks([["lgEquip", "lightEquip"]], state);
  } catch (e) { }
  try { paintLightRows(); paintLightCtl(); renderLightStage(); } catch (e) { }
  try { paintPipeline(); } catch (e) { }
  try { bindWedChips(); } catch (e) { }
  try { paintRoTarget(); paintChecks([["ckRefMk", "refMkOn"], ["ckRefHair", "refHairOn"]], state); paintChecks(MATCH_CK, state.match); } catch (e) { }
  try { paintCamChips(); const vi = $("camIsoV"); if (vi) vi.textContent = String(state.camIso); const vk = $("camKV"); if (vk) vk.textContent = String(state.camK); const si = $("camIso"); if (si) si.value = String(state.camIso); const sk = $("camK"); if (sk) sk.value = String(state.camK); paintChecks([["ckIsoOn", "camIsoOn"], ["ckKOn", "camKOn"]], state); } catch (e) { }
  try { refreshPromptMeta(); } catch (e) { }
}

async function saveRecipe() {
  try {
    const file = await fsp.getFileForSaving("HNK_Recipe.json", { types: ["json"] });
    if (!file) return;
    await file.write(JSON.stringify(buildRecipe(), null, 2), { format: formats.utf8 });
    setStatus(t("st_recipe_saved"), "ok");
  } catch (e) {
    setStatus(t("st_err") + ": " + (e && e.message ? e.message : e), "err");
  }
}

async function loadRecipe() {
  try {
    const file = await fsp.getFileForOpening({ types: ["json"] });
    if (!file) return;
    const txt = await file.read({ format: formats.utf8 });
    const o = JSON.parse(txt);
    if (!applyRecipe(o)) { setStatus(t("st_recipe_bad"), "err"); return; }
    repaintFromState();
    saveSettings();
    setStatus(t("st_recipe_loaded"), "ok");
  } catch (e) {
    setStatus(t("st_err") + ": " + (e && e.message ? e.message : e), "err");
  }
}

/* ---------------- Batch Mode (v2.4) ---------------- */
function extToMime(n) {
  n = (n || "").toLowerCase();
  if (n.endsWith(".png")) return "image/png";
  if (n.endsWith(".webp")) return "image/webp";
  return "image/jpeg";
}

async function batchRun() {
  if (state.busy || state.batch) return;
  let files = await fsp.getFileForOpening({ allowMultiple: true, types: ["jpg", "jpeg", "png", "webp"] });
  if (!files) return;
  if (!Array.isArray(files)) files = [files];
  if (!files.length) return;
  const outFolder = await fsp.getFolder();
  if (!outFolder) return;
  state.batch = true;
  state.batchStop = false;
  const bs = $("btnBatchStop");
  if (bs) bs.disabled = false;
  let okC = 0, failC = 0;
  const logLines = [];
  for (let i = 0; i < files.length; i++) {
    if (state.batchStop) break;
    setStatus(t("st_batch") + " " + (i + 1) + "/" + files.length + " \u00B7 " + files[i].name);
    try {
      const buf = await files[i].read({ format: formats.binary });
      const b64 = bufToB64(buf);
      await runGenerate(null, false, [], false, {
        base: { b64: b64, mime: extToMime(files[i].name), label: files[i].name },
        noPlace: true, action: "Batch"
      });
      if (state.resultB64) {
        const ext = state.resultMime === "image/jpeg" ? "jpg" : "png";
        const nm = files[i].name.replace(/\.[^.]+$/, "") + "_HNK." + ext;
        const of = await outFolder.createFile(nm, { overwrite: true });
        await of.write(b64ToBuf(state.resultB64), { format: formats.binary });
        okC++;
        logLines.push("OK    " + files[i].name + "  ->  " + nm);
      } else {
        failC++;
        logLines.push("FAIL  " + files[i].name + "  (no result)");
      }
    } catch (be) {
      failC++;
      logLines.push("FAIL  " + files[i].name + "  (" + (be && be.message ? be.message : be) + ")");
      hwarn("batch item failed:", be);
    }
  }
  try {
    const lf = await outFolder.createFile("_HNK_batch_log.txt", { overwrite: true });
    await lf.write(buildBatchLog(okC, failC, logLines), { format: formats.utf8 });
  } catch (le) { hwarn("batch log:", le); }
  state.batch = false;
  if (bs) bs.disabled = true;
  setStatus(t("st_batch_done") + " \u2713 " + okC + (failC ? (" / \u2717 " + failC) : ""), failC ? "err" : "ok");
}

/* ---------------- Copy final prompt ---------------- */
async function copyFinalPrompt() {
  const fpb = $("finalPromptBox");
  const txt = fpb ? fpb.value : (state.lastFinalPrompt || "");
  if (!txt) return;
  try {
    if (navigator.clipboard && navigator.clipboard.writeText) {
      await navigator.clipboard.writeText(txt);
    } else if (navigator.clipboard && navigator.clipboard.setContent) {
      await navigator.clipboard.setContent({ "text/plain": txt });
    }
    setStatus(t("st_copied"), "ok");
  } catch (e) {
    setStatus(t("st_err") + ": " + (e && e.message ? e.message : e), "err");
  }
}

/* ---------------- Generate pipeline ---------------- */
async function runGenerate(extraPresetText, skipRefClean, unkeep, noRefs, opts) {
  const op = opts || {};
  state._proFellBack = false;
  if (op.action) state.lastAction = op.action;
  if (state.busy) return;
  const key = (state.apiKey || "").trim();
  if (!key) { setStatus(t("st_need_key"), "err"); return; }
  /* AUDIT-FIX #1: clear any prior result up front so a failed generation can never
     be mistaken for success. batch/pipeline callers snapshot op.base BEFORE calling
     us, so clearing here is safe and makes state.resultB64 a true per-run signal. */
  state.resultB64 = null;
  state.resultMime = null;

  const boxTxt = getPromptText().trim();
  /* v4.5: a preset IS the task - the typed box only drives plain Generate */
  let userText = extraPresetText ? extraPresetText : sanitizeExternal(boxTxt);
  if (!userText && !noRefs && (state.refs[0] || state.refs[1])) {
    const ac = autoCompositeText();
    if (ac) {
      userText = ac + "\n" + REF_GUARD_CANVAS;
      if (!op.realDir) op.realDir = "subject";
      unkeep = ["bg", "frame", "light", "color"];
      setStatus(t("st_auto_comp"));
    }
  }
  const ct = cleanupText();
  if (ct) userText = (userText ? userText + "\n" : "") + ct;
  const ch = chainText();
  if (ch) userText = (userText ? userText + "\n" : "") + ch;
  const camx = buildCameraPrompt();
  if (camx) userText = (userText ? userText + "\n" : "") + camx;
  /* AUDIT-FIX #3: allow requested text when the preset adds it (op.allowText) or a
     caption is turned on, so the no-text guard doesn't silently defeat the feature. */
  const allowText = !!op.allowText || !!state.capOn;
  if (state.realOn) userText = (userText ? userText + "\n\n" : "") + buildGuard(effRealDir(op.realDir), allowText);
  const myTxt = getMyPromptText().trim();
  const hasRef = !noRefs && !!(state.refs[0] || state.refs[1]);
  if (!userText && !myTxt && !hasRef) { setStatus(t("st_no_prompt"), "err"); return; }
  if (myTxt && !getPromptText().trim()) {
    startBusy("st_translate");
    try {
      const tr = await translateMyPrompt(myTxt);
      userText = (userText ? userText + "\n" : "") + tr;
    } catch (te) {
      userText = (userText ? userText + "\n" : "") + myTxt;
    }
  }

  startBusy("st_capture");
  try {
    /* pre-clean Ref1 so no reference person can ever leak into the result */
    let base = null;
    if (op.base) {
      base = op.base;
      state.beforeB64 = base.b64;
      state.beforeMime = base.mime || "image/jpeg";
      if (base.w && base.h) state.previewRatio = base.h / base.w;
    } else if (app.activeDocument) {
      base = await captureDocumentB64(2048);
      state.beforeB64 = base.b64;
      state.beforeMime = base.mime;
      if (base.w && base.h) state.previewRatio = base.h / base.w;
    } else {
      state.beforeB64 = null;
    }

    /* Selection Area Edit: if a PS selection exists, send it as an edit mask */
    let selMask = null;
    if (base && !op.base) {
      try { selMask = await captureSelectionMask(); } catch (se) { selMask = null; }
    }
    if (selMask) {
      userText = (userText ? userText + "\n" : "") +
        "SELECTION RULE: An EDIT MASK image is attached. Edit ONLY the areas that are WHITE in the mask; every BLACK area must stay pixel-identical to IMAGE 1.";
    }

    const meta = [];
    const parts = [];
    if (base) meta.push({ role: "base" });
    for (let i = 0; i < 2; i++) { if (!noRefs && state.refs[i]) meta.push({ role: "ref", label: state.refs[i].label }); }

    const finalPrompt = buildFinalPrompt(userText, meta, unkeep || []);
    state.lastUserText = userText;
    state.lastFinalPrompt = finalPrompt;
    const fpb = $("finalPromptBox");
    if (fpb) fpb.value = finalPrompt;
    parts.push({ text: finalPrompt });
    let imgNo = 1;
    if (base) {
      parts.push({ text: "IMAGE " + imgNo + " \u2014 MAIN SUBJECT (edit this image):" });
      parts.push({ inlineData: { mimeType: base.mime, data: base.b64 } });
      imgNo++;
    }
    for (let i = 0; i < 2; i++) {
      const r = noRefs ? null : state.refs[i];
      if (r) {
        parts.push({ text: "IMAGE " + imgNo + " \u2014 REFERENCE ONLY (do not output this image or its people):" });
        parts.push({ inlineData: { mimeType: r.mime, data: r.b64 } });
        imgNo++;
      }
    }
    if (selMask) {
      parts.push({ text: "EDIT MASK for IMAGE 1 \u2014 edit only the WHITE areas, keep every BLACK area unchanged:" });
      parts.push({ inlineData: { mimeType: selMask.mime, data: selMask.b64 } });
    }

    const model = resolveModel();
    const imageConfig = {};
    const ratio = resolveRatio(base);
    if (ratio) imageConfig.aspectRatio = ratio;
    if (model === MODEL_PRO_IMG && state.size !== "1K") imageConfig.imageSize = state.size;

    startBusy("st_gen");
    const img = await callImageAPI(model, parts, imageConfig);
    if (!imgMagicOk(img.b64)) throw new Error("HNKERR:st_img_bad:api result"); /* check 2/3 */
    state.resultB64 = img.b64;
    state.resultMime = img.mime || "image/png";
    pushHistory({
      after: img.b64, afterMime: state.resultMime,
      before: state.beforeB64, beforeMime: state.beforeMime,
      userText: userText, finalPrompt: finalPrompt,
      action: state.lastAction, ts: Date.now(), ratio: state.previewRatio
    });
    refreshCompare();

    if (state.autoSave && !state.batch) { saveResultToDisk().catch(function () { }); }

    if (state.autoPlace && !op.noPlace && !state.batch) {
      stopDots();
      try { setStage("placing"); } catch (e0) { }
      setStatus(t("st_place"));
      await placeResultToPS();
    }
    endBusy();
    setStatus(t("st_done") + " \u00B7 " + provTag(), "ok");
  } catch (e) {
    endBusy();
    setStatus(friendlyErr(e), "err");
  }
}

/* ---------------- Auto-Export (v3.9) ---------------- */
function provTag() {
  return state.provider === "openai" ? ("OpenAI \u00B7 " + oaiModel()) : ("Gemini \u00B7 " + (state.model === "pro" ? "Pro" : state.model === "flash" ? "Flash" : "Auto"));
}

function tsStamp() {
  const d = new Date();
  const p = function (n) { return (n < 10 ? "0" : "") + n; };
  return d.getFullYear() + p(d.getMonth() + 1) + p(d.getDate()) + "_" + p(d.getHours()) + p(d.getMinutes()) + p(d.getSeconds());
}

async function pickSaveFolder() {
  let f = null;
  try { f = await fsp.getFolder(); } catch (e) { setStatus(friendlyErr(e), "err"); }
  if (!f) {
    state.autoSave = false;
    const tb = $("tglAutoSave");
    if (tb) { tb.className = "tgl" + (state.autoSave ? " on" : ""); tb.textContent = t(state.autoSave ? "on" : "off"); }
    saveSettings();
    return false;
  }
  state.saveDirH = f;
  setStatus(t("st_folder_ok"), "ok");
  return true;
}

async function saveResultToDisk() {
  if (!state.autoSave || !state.resultB64) return;
  if (!state.saveDirH) {
    const ok2 = await pickSaveFolder();
    if (!ok2) return;
  }
  try {
    const act = String(state.lastAction || "Result").replace(/[^A-Za-z0-9_-]+/g, "_").slice(0, 32);
    const ext = state.resultMime === "image/jpeg" ? "jpg" : "png";
    const nm = "HNK_" + tsStamp() + "_" + act + "." + ext;
    const f = await state.saveDirH.createFile(nm, { overwrite: true });
    await f.write(b64ToBuf(state.resultB64), { format: formats.binary });
    state.sessionLog += "==== " + tsStamp() + " | " + (state.lastAction || "Result") + " | " + provTag() + " | " + nm + " ====\n" +
      (state.lastFinalPrompt || "") + "\n\n";
    const lg = await state.saveDirH.createFile("_HNK_session_log.txt", { overwrite: true });
    await lg.write(state.sessionLog, { format: formats.utf8 });
    setStatus(t("st_exported") + " " + nm, "ok");
  } catch (e) {
    setStatus(t("st_export_fail"), "err");
  }
}

/* ---------------- Place / Save result ---------------- */
async function writeResultTemp() {
  const folder = await fsp.getDataFolder();
  const ext = state.resultMime === "image/jpeg" ? "jpg" : "png";
  /* AUDIT-FIX #11: reuse ONE fixed filename per extension (overwrite) instead of a
     Date.now()-stamped name, so the plugin data folder can't grow unbounded with
     stale hnk_result_* files over the plugin's lifetime. */
  const file = await folder.createFile("hnk_result." + ext, { overwrite: true });
  await file.write(b64ToBuf(state.resultB64), { format: formats.binary });
  return file;
}

/* v6.9.0 non-destructive masked-group standard (blueprint \u00A73.4-note / \u00A75):
   the placed result lands INSIDE a group "HNK \u2014 <feature>" with a white
   reveal-all layer mask; the original stays untouched beneath. Group naming +
   the batchPlay mask/select descriptors come from the ONE shared helper
   (src/photoshop/masked-place-service.js) so this path and the AI Tools host
   path can never drift apart. Feature-detected: if grouping/masking is
   unavailable the layer stays plain and the status says so honestly.
   Returns { placed, masked, grouped } for honest status lines. */
async function placeResultToPS() {
  if (!state.resultB64) return;
  if (!imgMagicOk(state.resultB64)) { setStatus(t("st_img_bad") + " (Place)", "err"); return; } /* check 3/3 */
  const file = await writeResultTemp();
  if (!app.activeDocument) {
    await psCore.executeAsModal(async function () {
      await app.open(file);
    }, { commandName: "HNK Open Result" });
    setStatus(t("st_new_doc"), "ok");
    /* fresh document \u2014 nothing beneath to protect, no group/mask needed */
    return { placed: true, masked: false, grouped: false, newDoc: true };
  }
  const token = fsp.createSessionToken(file);
  const out = { placed: false, masked: false, grouped: false };
  /* shared masked-group helper (loaded before main.js in index.html);
     guarded so a missing module degrades to the plain-layer behavior */
  const mps = (typeof globalThis !== "undefined" && globalThis.HNK && globalThis.HNK.maskedPlaceService)
    ? globalThis.HNK.maskedPlaceService : null;
  await psCore.executeAsModal(async function () {
    await batchPlay([{
      _obj: "placeEvent",
      ID: 1,
      "null": { _path: token, _kind: "local" },
      freeTransformCenterState: { _enum: "quadCenterState", _value: "QCSAverage" },
      _options: { dialogOptions: "dontDisplay" }
    }], {});
    const doc = app.activeDocument;
    const ls = doc.activeLayers;
    const lyr = ls && ls.length ? ls[0] : null;
    if (lyr) {
      out.placed = true;
      try {
        state.genCount++;
        lyr.name = "HNK \u00B7 " + (state.lastAction || "Result") + " \u00B7 " + (state.genCount < 10 ? "0" : "") + state.genCount;
        const dw = Number(doc.width), dh = Number(doc.height);
        let b = lyr.bounds;
        const lw = Number(b.right) - Number(b.left);
        const lh = Number(b.bottom) - Number(b.top);
        if (lw > 0 && lh > 0) {
          const s = Math.max(dw / lw, dh / lh) * 100;
          if (Math.abs(s - 100) > 0.5) {
            await lyr.scale(s, s, constants.AnchorPosition.MIDDLECENTER);
          }
          b = lyr.bounds;
          const cx = (Number(b.left) + Number(b.right)) / 2;
          const cy = (Number(b.top) + Number(b.bottom)) / 2;
          const dx = dw / 2 - cx, dy = dh / 2 - cy;
          if (Math.abs(dx) > 0.5 || Math.abs(dy) > 0.5) await lyr.translate(dx, dy);
        }
      } catch (e) { hwarn("fit:", e); }
      /* ---- masked-group standard (feature-detected, degrade gracefully) ---- */
      if (mps) {
        try {
          const grp = await doc.createLayerGroup({ name: mps.groupNameFor(state.lastAction || "Result") });
          await lyr.move(grp, constants.ElementPlacement.PLACEINSIDE);
          out.grouped = true;
        } catch (eG) { hwarn("place group:", eG); }
        try {
          /* re-select the result layer (the move can leave the group active),
             then add the white reveal-all mask \u2014 shared descriptors */
          await batchPlay([mps.selectLayerDescriptor(lyr.id), mps.maskDescriptor()], {});
          out.masked = true;
        } catch (eM) { hwarn("place mask:", eM); }
      }
    }
  }, { commandName: "HNK Place Result" });
  return out;
}

async function saveResultAs() {
  if (!state.resultB64 || state.busy) return;
  try {
    const ext = state.resultMime === "image/jpeg" ? "jpg" : "png";
    const f = await fsp.getFileForSaving("HNK_Result." + ext, { types: [ext] });
    if (!f) return;
    await f.write(b64ToBuf(state.resultB64), { format: formats.binary });
    setStatus(t("st_saved"), "ok");
  } catch (e) {
    setStatus(t("st_err") + ": " + (e && e.message ? e.message : e), "err");
  }
}

/* ---------------- Before / After compare ---------------- */
function refreshCompare() {
  const hasB = !!state.beforeB64, hasA = !!state.resultB64;
  const iB = $("imgBefore"), iA = $("imgAfter");
  if (hasB) {
    iB.onload = function () { fitCompareBox(); };
    iB.src = "data:" + state.beforeMime + ";base64," + state.beforeB64;
    iB.style.display = "block";
  } else { iB.style.display = "none"; }
  if (hasA) {
    iA.onload = function () {
      if (iA.naturalWidth) state.previewRatio = iA.naturalHeight / iA.naturalWidth;
      fitCompareBox();
    };
    iA.src = "data:" + state.resultMime + ";base64," + state.resultB64;
    iA.style.display = "block";
  } else { iA.style.display = "none"; }

  const slider = $("cmpSlider");
  if (hasB && hasA) {
    slider.disabled = false;
  } else {
    slider.value = hasA ? 0 : 100;
    slider.disabled = true;
  }
  $("btnPlace").disabled = !hasA;
  $("btnSaveAs").disabled = !hasA;
  if (hasA) { try { openCard("prev"); if (!state.batch) switchPage("prompt"); } catch (e) { } }
  fitCompareBox();
}

function fitCompareBox() {
  const box = $("cmpBox");
  if (!box) return;
  const w = box.clientWidth;
  if (!w) return;
  const h = Math.max(80, Math.round(w * (state.previewRatio || 0.75)));
  box.style.height = h + "px";
  const iB = $("imgBefore"), iA = $("imgAfter");
  iB.style.width = w + "px";
  iA.style.width = w + "px";
  updateCmpPos($("cmpSlider").value);
}

function updateCmpPos(v) {
  const box = $("cmpBox");
  const w = box ? box.clientWidth : 0;
  const px = Math.round(w * Number(v) / 100);
  $("cmpTop").style.width = px + "px";
  $("cmpLine").style.left = Math.max(0, px - 1) + "px";
}

/* ================= CREATE MODE (standalone) =================
   Pure prompt(+own refs) -> new image. Never touches the active document,
   presets, chains, cleanup, keeps, camera or the edit Guard. */
const CREATE_FINISH = "Photorealistic professional photograph: correct anatomy and hands, natural skin texture, coherent lighting and shadows, 8K ultra-realistic HD detail, no watermarks or unintended text.";

function getCreateText() {
  const el = $("cPromptBox");
  return (el && typeof el.value === "string") ? el.value : "";
}

function buildCreateParts(p) {
  const parts = [];
  let n = 1;
  for (let i = 0; i < 4; i++) {
    const r = state.cRefs[i];
    if (!r) continue;
    parts.push({ text: "REFERENCE " + n + " (" + (r.label || "reference") + ") - use from it only what the prompt asks:" });
    parts.push({ inlineData: { mimeType: r.mime, data: r.b64 } });
    n++;
  }
  parts.push({ text: "CREATE MODE - generate a brand-new photograph purely from this description (there is no source document):\n" + p + "\n" + CREATE_FINISH });
  return parts;
}

/* Visual reference thumbnails (mirrors the Prompt-tab reference UX so Create
   has the same professional in-flow: Layer / File / Web per slot, with a live
   thumbnail + clear). */
function paintCreateRefs() {
  for (let i = 0; i < 4; i++) {
    const r = state.cRefs[i];
    const img = $("cRefImg" + i), ph = $("cRefPh" + i);
    const lb = $("cRefLb" + i), x = $("cRefX" + i);
    if (!img || !ph) continue;
    if (r) {
      img.style.backgroundImage = 'url("data:' + r.mime + ";base64," + r.b64 + '")';
      img.style.display = "block";
      ph.style.display = "none";
      if (lb) lb.textContent = r.label || "";
      if (x) x.style.display = "flex";
    } else {
      img.style.backgroundImage = "";
      img.style.display = "none";
      ph.style.display = "flex";
      if (lb) lb.textContent = "";
      if (x) x.style.display = "none";
    }
  }
}

async function pickCreateRef(i) {
  if (state.busy) return;
  try {
    setStatus(t("st_importing"));
    const cap = await pickReferenceFile();
    if (!cap) { setStatus(t("st_ready")); return; }
    if (!imgMagicOk(cap.b64)) { setStatus(t("st_img_bad") + " (Ref)", "err"); return; }
    state.cRefs[i] = cap;
    paintCreateRefs();
    setStatus(t("st_ref_file_added"), "ok");
  } catch (e) { setStatus(friendlyErr(e), "err"); }
}

async function addCreateLayerRef(i) {
  if (state.busy) return;
  try {
    const cap = await captureLayerB64(1536);
    if (!imgMagicOk(cap.b64)) { setStatus(t("st_img_bad") + " (Ref)", "err"); return; }
    state.cRefs[i] = cap;
    paintCreateRefs();
    setStatus(t("st_ref_layer_added"), "ok");
  } catch (e) {
    const friendlyMsg = friendlyErr(e);
    const lb = $("cRefLb" + i); if (lb) lb.textContent = "! " + friendlyMsg.slice(0, 48);
    setStatus(friendlyMsg, "err");
  }
}

function openCreateUrlBar(i) {
  state.cUrlSlot = i;
  const bar = $("cUrlBar"); if (bar) bar.style.display = "block";
  const tag = $("cUrlSlotTag"); if (tag) tag.textContent = "\u2192 Ref " + (i + 1);
  const inp = $("cUrlInput"); if (inp) { inp.value = ""; try { inp.focus(); } catch (e) { } }
}

function closeCreateUrlBar() {
  state.cUrlSlot = -1;
  const bar = $("cUrlBar"); if (bar) bar.style.display = "none";
}

async function loadCreateUrlIntoSlot(idx, rawUrl) {
  return loadUrlIntoAnySlot(rawUrl, {
    tmpPrefix: "hnk_cweb_",
    assign: function (ref) { state.cRefs[idx] = ref; },
    repaint: paintCreateRefs,
    close: closeCreateUrlBar
  });
}

/* Which engine a Create run will use, shown live above Generate. */
function updateCreateEngineTag() {
  const el = $("cEngineTag");
  if (el) el.textContent = t("cr_engine") + " \u00b7 " + provTag();
}

function updateCCmpPos(v) {
  const box = $("cCmpBox");
  const w = box ? box.clientWidth : 0;
  const px = Math.round(w * Number(v) / 100);
  const tp = $("cCmpTop"), ln = $("cCmpLine");
  if (tp) tp.style.width = px + "px";
  if (ln) ln.style.left = Math.max(0, px - 1) + "px";
}

/* Aspect for the Create compare box: the real result's ratio when we have one,
   else the chosen Create ratio (so the empty box already previews at size). */
function createAspect() {
  if (state.cResultB64) {
    try { const d = imgDimsFromB64(state.cResultB64, state.cMime); if (d && d.w) return d.h / d.w; } catch (e) { }
  }
  const p = String(state.cRatio || "1:1").split(":");
  const a = Number(p[0]), b = Number(p[1]);
  return (a && b) ? (b / a) : 1;
}

function refreshCreateCompare() {
  const iA = $("cImgAfter"), iB = $("cImgBefore"), box = $("cCmpBox");
  if (!iA || !box) return;
  if (state.cResultB64) iA.src = "data:" + state.cMime + ";base64," + state.cResultB64;
  if (iB && state.cBeforeB64) iB.src = "data:" + state.cMime + ";base64," + state.cBeforeB64;
  const w = box.clientWidth;
  if (w) {
    /* professional, aspect-aware size (matches the Output tab) with a generous
       floor so the preview is never a thin strip */
    const h = Math.max(340, Math.min(Math.round(w * createAspect()), 900));
    box.style.height = h + "px";
    if (iA) iA.style.width = w + "px";
    if (iB) iB.style.width = w + "px";
  }
  const sl = $("cCmpSlider");
  const hasResult = !!state.cResultB64;
  if (sl) sl.disabled = !hasResult;
  const psBtn = $("btnCreateToPS"), saveBtn = $("btnCreateSave"), refBtn = $("btnCreateToRef");
  if (psBtn) psBtn.disabled = !hasResult;
  if (saveBtn) saveBtn.disabled = !hasResult;
  if (refBtn) refBtn.disabled = !hasResult;
  updateCCmpPos(sl ? sl.value : 50);
}

async function createGenerate(restyle) {
  if (state.busy) return;
  const p = sanitizeExternal(getCreateText()).trim();
  if (restyle && !state.cResultB64) { setStatus(t("cr_need_result"), "err"); return; }
  if (!p && !restyle) { setStatus(t("st_no_prompt"), "err"); return; }
  const n = Math.max(1, Math.min(4, state.cVariations || 1));
  startBusy("st_gen");
  try {
    const cfg = { aspectRatio: state.cRatio || "1:1" };
    /* Snapshot the sources ONCE so every variation is an INDEPENDENT rendition.
       (Before: the loop reassigned cResultB64 each pass, so restyle variation 2
       restyled variation 1 \u2014 a compounding chain, not a distinct alternative.
       That is the "image 2 looks the same / missing" defect for OpenAI edits.) */
    const restyleBase = restyle ? state.cResultB64 : null;
    const restyleMime = state.cMime;
    const preRun = state.cResultB64;
    let firstNew = null;
    for (let i = 0; i < n; i++) {
      const parts = (restyle && restyleBase)
        ? [{ text: "Restyle this exact image as instructed - keep its subject and composition, change only what the prompt asks:" },
           { inlineData: { mimeType: restyleMime, data: restyleBase } },
           { text: (p || "enhance quality and lighting") + "\n" + CREATE_FINISH }]
        : buildCreateParts(p);
      const img = await callImageAPI(resolveModel(), parts, cfg);
      if (!imgMagicOk(img.b64)) throw new Error("HNKERR:st_img_bad:create result");
      if (i === 0) firstNew = img.b64;
      state.cResultB64 = img.b64;
      state.cMime = img.mime || "image/png";
      state.cGallery.unshift({ b64: img.b64, mime: state.cMime });
      if (state.cGallery.length > 8) state.cGallery.pop();
      state.cSel = 0;
      if (i === 0) { refreshCreateCompare(); paintCGallery(); }
    }
    /* Before/After pairs the pre-run image (or, on a first-ever run, the first
       new result) against the newest \u2014 never a mid-loop mutation. */
    state.cBeforeB64 = restyle ? (restyleBase || firstNew) : (preRun || firstNew);
    state.cSel = 0;
    refreshCreateCompare();
    paintCGallery();
    updateCreateEngineTag();
    endBusy();
    setStatus(t("st_done") + " \u00D7" + n + " \u00B7 " + provTag(), "ok");
  } catch (e) {
    endBusy();
    setStatus(friendlyErr(e), "err");
  }
}

function paintCGallery() {
  const g = $("cGallery");
  const info = $("cGalInfo");
  if (info) info.textContent = state.cGallery.length
    ? (state.cGallery.length + " " + t("cr_gal_have"))
    : t("cr_gal_empty");
  if (!g) return;
  g.innerHTML = "";
  for (let i = 0; i < state.cGallery.length; i++) {
    (function (item, idx) {
      const im = document.createElement("img");
      im.className = "gthumb" + (idx === state.cSel ? " sel" : "");
      im.src = "data:" + item.mime + ";base64," + item.b64;
      im.addEventListener("click", function () {
        state.cSel = idx;
        state.cResultB64 = item.b64; state.cMime = item.mime;
        refreshCreateCompare();
        paintCGallery();
      });
      g.appendChild(im);
    })(state.cGallery[i], i);
  }
}

/* Save the currently-selected Create result to disk (picks a folder once). */
async function saveCreateResult() {
  if (!state.cResultB64) { setStatus(t("cr_need_result"), "err"); return; }
  if (!imgMagicOk(state.cResultB64)) { setStatus(t("st_img_bad") + " (Save)", "err"); return; }
  try {
    if (!state.saveDirH) {
      const ok2 = await pickSaveFolder();
      if (!ok2) return;
    }
    const ext = state.cMime === "image/jpeg" ? "jpg" : "png";
    const nm = "HNK_" + tsStamp() + "_Create." + ext;
    const f = await state.saveDirH.createFile(nm, { overwrite: true });
    await f.write(b64ToBuf(state.cResultB64), { format: formats.binary });
    setStatus(t("st_exported") + " " + nm, "ok");
  } catch (e) {
    setStatus(t("st_export_fail"), "err");
  }
}

const PROMPT_LIB = [
  ["Studio Portrait", "studio portrait of a person, soft key light with large octabox, subtle rim light, clean seamless grey backdrop, 85mm f1.8 look, natural skin texture"],
  ["Golden Hour", "outdoor portrait at golden hour, warm backlight and gentle lens flare, creamy bokeh, soft rim light on hair, cinematic color"],
  ["Vietnam Soft", "soft airy beauty portrait, pastel tones, gentle glow, delicate makeup, dreamy Vietnamese aesthetic, fine skin detail"],
  ["Douyin Glam", "Douyin-style glam portrait, glossy skin, bright even light, sharp catchlights, high-fashion makeup, ultra clean retouch"],
  ["Editorial B&W", "high-fashion black and white editorial portrait, dramatic Rembrandt lighting, deep contrast, fine film grain"],
  ["Wedding Field", "bride in white gown standing in a green field at sunset, flowing veil in the wind, warm romantic light, luxury editorial wedding photograph"],
  ["Product Clean", "product photograph on a clean seamless background, soft gradient light, crisp reflections, commercial studio quality"],
  ["Cyberpunk Night", "cinematic cyberpunk street at night, neon signage, wet reflective ground, moody teal and magenta lighting, volumetric haze"]
];

const C_RATIOS = ["1:1", "3:4", "4:3", "9:16", "16:9"];

async function createImprove() {
  if (state.busy) return;
  const key = (state.apiKey || "").trim();
  if (!key) { setStatus(t("st_need_gem"), "err"); return; }
  const p = getCreateText().trim();
  if (!p) { setStatus(t("st_no_prompt"), "err"); return; }
  startBusy("st_improving");
  try {
    const sys = "You are an expert prompt engineer for AI image generation used by a professional Myanmar photo studio (portrait, wedding, prewedding, graduation, maternity). Rewrite and enrich the user's idea into ONE vivid, camera-accurate image prompt: specify subject, lighting, mood, color palette, background, lens/DOF and realism. Keep the original intent. Output ONLY the improved English prompt - no notes, no markdown, no quotes.";
    const out = await callGeminiText(sys + "\n\nIDEA:\n" + p);
    const el = $("cPromptBox");
    if (out && el) el.value = out.slice(0, 20000);
    endBusy();
    setStatus(t("st_improved"), "ok");
  } catch (e) { endBusy(); setStatus(friendlyErr(e), "err"); }
}

async function createDescribe() {
  if (state.busy) return;
  const key = (state.apiKey || "").trim();
  if (!key) { setStatus(t("st_need_gem"), "err"); return; }
  const ref = state.cRefs[0];
  if (!ref) { setStatus(t("st_need_ref1"), "err"); return; }
  startBusy("st_describing");
  try {
    const sys = "Look at this photograph and write a single detailed English image-generation prompt that would recreate its style: describe the subject, pose, lighting setup and direction, color grade, mood, background, lens and framing. Be concrete and photographic. Output ONLY the prompt - no notes, no markdown, no quotes.";
    const out = await callGeminiText([
      { text: sys },
      { inlineData: { mimeType: ref.mime, data: ref.b64 } }
    ]);
    const el = $("cPromptBox");
    if (out && el) el.value = out.slice(0, 20000);
    endBusy();
    setStatus(t("st_described"), "ok");
  } catch (e) { endBusy(); setStatus(friendlyErr(e), "err"); }
}

function insertLibPrompt(idx) {
  const el = $("cPromptBox");
  const item = PROMPT_LIB[idx];
  if (el && item) { el.value = (el.value ? el.value + "\n" : "") + item[1]; }
  setStatus(t("st_lib_added"), "ok");
}

function bindLib() {
  const g = $("libList");
  if (!g) return;
  g.innerHTML = "";
  for (let i = 0; i < PROMPT_LIB.length; i++) {
    (function (idx) {
      const b = document.createElement("button");
      b.className = "chip";
      b.textContent = PROMPT_LIB[idx][0];
      b.addEventListener("click", function () { insertLibPrompt(idx); });
      g.appendChild(b);
    })(i);
  }
}

function paintCRatio() {
  for (let i = 0; i < C_RATIOS.length; i++) {
    const b = $("cRatio" + i);
    if (b) b.className = "segb" + (state.cRatio === C_RATIOS[i] ? " on" : "");
  }
}

function bindCreate() {
  for (let i = 0; i < C_RATIOS.length; i++) {
    (function (idx) {
      const b = $("cRatio" + idx);
      if (b) {
        b.textContent = C_RATIOS[idx];
        b.addEventListener("click", function () { state.cRatio = C_RATIOS[idx]; paintCRatio(); saveSettings(); });
      }
    })(i);
  }
  paintCRatio();
  bindLib();
  const vmap = [1, 2, 3, 4];
  const paintV = function () {
    for (let i = 0; i < vmap.length; i++) {
      const b = $("cVar" + vmap[i]);
      if (b) b.className = "segb" + (state.cVariations === vmap[i] ? " on" : "");
    }
  };
  for (let i = 0; i < vmap.length; i++) {
    (function (v) {
      const b = $("cVar" + v);
      if (b) b.addEventListener("click", function () { state.cVariations = v; paintV(); saveSettings(); });
    })(vmap[i]);
  }
  paintV();
  paintCGallery();
  const im = $("btnCreateImprove");
  if (im) im.addEventListener("click", function () { createImprove(); });
  const de = $("btnCreateDescribe");
  if (de) de.addEventListener("click", function () { createDescribe(); });
  const rs = $("btnCreateRestyle");
  if (rs) rs.addEventListener("click", function () { createGenerate(true); });
  const g = $("btnCreateGen");
  if (g) g.addEventListener("click", function () { createGenerate(false); });
  for (let i = 0; i < 4; i++) {
    (function (idx) {
      const ly = $("cRefLayer" + idx);
      if (ly) ly.addEventListener("click", function () { addCreateLayerRef(idx); });
      const fl = $("cRefFile" + idx);
      if (fl) fl.addEventListener("click", function () { pickCreateRef(idx); });
      const wb = $("cRefWeb" + idx);
      if (wb) wb.addEventListener("click", function () { openCreateUrlBar(idx); });
      const x = $("cRefX" + idx);
      if (x) x.addEventListener("click", function () { state.cRefs[idx] = null; refLibForgetSlot("create-reference-" + (idx + 1)); paintCreateRefs(); });
    })(i);
  }
  const uc = $("cBtnUrlCancel");
  if (uc) uc.addEventListener("click", closeCreateUrlBar);
  const up = $("cBtnUrlPaste");
  if (up) up.addEventListener("click", function () {
    readClipboardText().then(function (s) { const inp = $("cUrlInput"); if (s && inp) inp.value = s.trim(); });
  });
  const ul = $("cBtnUrlLoad");
  if (ul) ul.addEventListener("click", function () {
    if (state.busy || state.cUrlSlot < 0) return;
    const inp = $("cUrlInput");
    loadCreateUrlIntoSlot(state.cUrlSlot, inp ? inp.value : "");
  });
  const sl = $("cCmpSlider");
  if (sl) sl.addEventListener("input", function () { updateCCmpPos(sl.value); });
  const ur = $("btnCreateToRef");
  if (ur) ur.addEventListener("click", function () {
    if (!state.cResultB64) { setStatus(t("cr_need_result"), "err"); return; }
    state.cRefs[0] = { b64: state.cResultB64, mime: state.cMime, label: "Result \u21BA" };
    paintCreateRefs();
    setStatus(t("st_to_ref"), "ok");
  });
  const tp = $("btnCreateToPS");
  if (tp) tp.addEventListener("click", function () {
    if (!state.cResultB64) { setStatus(t("cr_need_result"), "err"); return; }
    importImageToPS(state.cResultB64, state.cMime, "Create");
  });
  const sv = $("btnCreateSave");
  if (sv) sv.addEventListener("click", function () { saveCreateResult(); });
  paintCreateRefs();
  updateCreateEngineTag();
}

/* ---------------- API key UI ---------------- */
async function testKey() {
  const key = $("apiKey").value.trim();
  if (!key) { setStatus(t("st_need_key"), "err"); return; }
  setStatus(t("st_testing") + "\u2026");
  try {
    const res = await hnkFetch(API_BASE + "/models?key=" + encodeURIComponent(key) + "&pageSize=1", { method: "GET" }, 30000);
    const j = await res.json();
    if (res.ok) {
      state.apiKey = key;
      setStatus(t("st_key_ok"), "ok");
    } else {
      const msg = (j && j.error && j.error.message) ? j.error.message : ("HTTP " + res.status);
      setStatus(t("st_key_bad") + ": " + msg, "err");
    }
  } catch (e) {
    setStatus(t("st_key_bad") + ": " + (e && e.message ? e.message : e), "err");
  }
}

function bindScenes() {
  const segPaints = []; /* AUDIT-FIX #9: collect seg paints for post-load restore */
  const segRow = function (map, get, set) {
    const paint = function () { for (let i = 0; i < map.length; i++) { const b = $(map[i][0]); if (b) b.className = "segb" + (get() === map[i][1] ? " on" : ""); } };
    for (let i = 0; i < map.length; i++) { (function (id, v) { const b = $(id); if (b) b.addEventListener("click", function () { set(v); paint(); saveSettings(); }); })(map[i][0], map[i][1]); }
    paint();
    segPaints.push(paint);
  };
  /* target shares Reference-Ops-Pro's refTarget */
  segRow([["scnTgSolo", "solo"], ["scnTgCouple", "couple"], ["scnTgFamily", "family"]],
    function () { return state.refTarget; },
    function (v) { state.refTarget = v; try { paintRoTarget(); } catch (e) { } });
  /* birthday age */
  const ag = $("scnAge"), agv = $("scnAgeV");
  if (ag) {
    ag.value = String(state.bdayAge); if (agv) agv.textContent = String(state.bdayAge);
    ag.addEventListener("input", function () { state.bdayAge = Math.max(1, Math.min(45, Number(ag.value) || 1)); if (agv) agv.textContent = String(state.bdayAge); saveSettings(); });
  }
  /* caption */
  bindChecks([["ckCap", "capOn"]], state);
  const ct = $("capText"); if (ct) { ct.value = state.capText || ""; ct.addEventListener("input", function () { state.capText = ct.value; saveSettings(); }); }
  segRow([["capTop", "top"], ["capBottom", "bottom"]], function () { return state.capPos; }, function (v) { state.capPos = v; });
  /* scarf */
  segRow([["scnDirL", "left"], ["scnDirR", "right"], ["scnDirU", "up"]], function () { return state.scarfDir; }, function (v) { state.scarfDir = v; });
  segRow([["scnLenS", "short"], ["scnLenL", "long"]], function () { return state.scarfLen; }, function (v) { state.scarfLen = v; });
  /* collapsible layout (scene BUTTONS auto-wire via the generic PRESETS loop) */
  bindCard("cScnH", "cScnB", "scenes", false);
  bindGroup("scnStyleH", "scnStyleB", true);
  bindGroup("scnBdayH", "scnBdayB", false);
  bindGroup("scnCapH", "scnCapB", false);
  bindGroup("scnScarfH", "scnScarfB", false);
  /* AUDIT-FIX #9: repaint scene controls AFTER settings load (bindScenes ran with
     defaults). Registered in REFRESHERS => run by the apply block's applyI18n(). */
  REFRESHERS.push(function () {
    try {
      const a = $("scnAge"), av = $("scnAgeV");
      if (a) a.value = String(state.bdayAge);
      if (av) av.textContent = String(state.bdayAge);
      const c = $("capText"); if (c) c.value = state.capText || "";
      paintChecks([["ckCap", "capOn"]], state);
      for (let i = 0; i < segPaints.length; i++) segPaints[i]();
    } catch (e) { }
  });
}

function bindProvider() {
  const map = [["provGem", "gemini"], ["provOai", "openai"]];
  const paint = function () {
    for (let i = 0; i < map.length; i++) {
      const b = $(map[i][0]);
      if (b) b.className = "segb" + (state.provider === map[i][1] ? " on" : "");
    }
    const bp = $("brandProv");
    if (bp) bp.textContent = state.provider === "openai" ? "OpenAI" : "Gemini AI";
    try { populateSelects(); } catch (e) { }
  };
  for (let i = 0; i < map.length; i++) {
    (function (id, val) {
      const b = $(id);
      if (b) b.addEventListener("click", function () { state.provider = val; paint(); saveSettings(); });
    })(map[i][0], map[i][1]);
  }
  paint();
  const tk = $("btnTestOaiKey");
  if (tk) tk.addEventListener("click", async function () {
    const k = (($("oaiKey") && $("oaiKey").value) || state.oaiKey || "").trim();
    if (!k) { setStatus(t("st_need_key"), "err"); return; }
    setStatus(t("st_testing") + "\u2026");
    try {
      const res = await hnkFetch(OAI_BASE + "/models?limit=1", { method: "GET", headers: { "Authorization": "Bearer " + k } }, 30000);
      if (res.ok) { state.oaiKey = k; saveSettings(); setStatus(t("st_key_ok"), "ok"); }
      else {
        const j = await res.json().catch(function () { return null; });
        const msg = (j && j.error && j.error.message) ? j.error.message : ("HTTP " + res.status);
        setStatus(t("st_key_bad") + ": " + msg, "err");
      }
    } catch (e) { setStatus(t("st_key_bad") + ": " + (e && e.message ? e.message : e), "err"); }
  });
  const ok2 = $("btnSaveOaiKey");
  if (ok2) ok2.addEventListener("click", function () {
    /* AUDIT-FIX #2: only overwrite when the user typed something, so a Save click on a
       (transiently) blank field can never wipe a stored key. */
    const v = ($("oaiKey") ? $("oaiKey").value : "").trim();
    if (v) state.oaiKey = v;
    saveSettings();
    setStatus(t("st_key_saved"), "ok");
  });
  const ki = $("oaiKey");
  if (ki && state.oaiKey) ki.value = state.oaiKey;
  /* AUDIT-FIX #2 + #13: bindProvider runs before loadSettings resolves, so repaint the
     provider segment, brand label and the OpenAI key field AFTER settings load (the
     apply block calls applyI18n which runs every REFRESHER). */
  REFRESHERS.push(function () {
    try {
      for (let i = 0; i < map.length; i++) { const b = $(map[i][0]); if (b) b.className = "segb" + (state.provider === map[i][1] ? " on" : ""); }
      const bp = $("brandProv"); if (bp) bp.textContent = state.provider === "openai" ? "OpenAI" : "Gemini AI";
      const ki2 = $("oaiKey"); if (ki2) ki2.value = state.oaiKey || "";
    } catch (e) { }
  });
}

function saveKey() {
  state.apiKey = $("apiKey").value.trim();
  saveSettings();
  setStatus(t("st_key_saved"), "ok");
}

function paintShowKey() {
  const b = $("btnShowKey");
  if (b) b.textContent = t(state.keyShown ? "btn_hide" : "btn_show");
}

/* ---------------- Improve prompt ---------------- */
async function improvePrompt() {
  if (state.busy) return;
  const key = (state.apiKey || "").trim() || $("apiKey").value.trim();
  if (!key) { setStatus(t("st_need_key"), "err"); return; }
  state.apiKey = key;
  const p = getPromptText().trim();
  if (!p) { setStatus(t("st_no_prompt"), "err"); return; }
  startBusy("st_improving");
  try {
    const sys = "You are an expert prompt engineer for AI photo editing (Gemini image models) used by a professional Myanmar photo studio (portrait, wedding, graduation). Rewrite and improve the user's prompt: make it precise and richly detailed about lighting, skin, color, background, composition and camera realism. Keep the user's original intent and any IMAGE 1/2/3 references exactly. Output ONLY the improved prompt in English \u2014 no explanations, no markdown, no quotes.";
    const out = await callGeminiText(sys + "\n\nUSER PROMPT:\n" + p);
    if (out) setPromptText(out.slice(0, MAX_PROMPT));
    endBusy();
    setStatus(t("st_improved"), "ok");
  } catch (e) {
    endBusy();
    setStatus(t("st_err") + ": " + (e && e.message ? e.message : e), "err");
  }
}

/* ---------------- UI wiring ---------------- */
function bindToggle(id, key) {
  const b = $(id);
  if (!b) return; /* null-guard: a missing toggle must never abort the wiring block */
  const paint = function () {
    b.className = "tgl" + (state[key] ? " on" : "");
    b.textContent = t(state[key] ? "on" : "off");
  };
  b.addEventListener("click", function () {
    state[key] = !state[key];
    paint();
    saveSettings();
  });
  REFRESHERS.push(paint);
  paint();
}

function bindGroup(headId, bodyId, openDefault) {
  const h = $(headId), bd = $(bodyId);
  if (!h || !bd) return; /* null-guard: one missing group must never crash init and drop later handlers */
  let open = !!openDefault;
  const paint = function () {
    bd.style.display = open ? "block" : "none";
    const car = h.querySelector(".car");
    if (car) car.textContent = open ? "\u25BE" : "\u25B8";
  };
  h.addEventListener("click", function () { open = !open; paint(); });
  paint();
}

function paintSizeSeg() {
  const ids = { "1K": "size1K", "2K": "size2K", "4K": "size4K" };
  for (const k in ids) {
    const b = $(ids[k]);
    if (b) b.className = "segb" + (state.size === k ? " on" : "");
  }
}

function bindSizeSeg() {
  const map = [["size1K", "1K"], ["size2K", "2K"], ["size4K", "4K"]];
  for (let i = 0; i < map.length; i++) {
    (function (id, val) {
      const b = $(id);
      if (!b) return; /* null-guard: never let one missing chip abort wiring */
      b.addEventListener("click", function () {
        state.size = val;
        paintSizeSeg();
        saveSettings();
      });
    })(map[i][0], map[i][1]);
  }
  paintSizeSeg();
}

/* OpenAI output quality (gpt-image): auto / low / medium / high */
const OAI_QUALITIES = ["auto", "low", "medium", "high"];
function paintQualSeg() {
  const map = [["qAuto", "auto"], ["qLow", "low"], ["qMed", "medium"], ["qHigh", "high"]];
  for (let i = 0; i < map.length; i++) {
    const b = $(map[i][0]);
    if (b) b.className = "segb" + (state.oaiQuality === map[i][1] ? " on" : "");
  }
}
function bindQualSeg() {
  const map = [["qAuto", "auto"], ["qLow", "low"], ["qMed", "medium"], ["qHigh", "high"]];
  for (let i = 0; i < map.length; i++) {
    (function (id, val) {
      const b = $(id);
      if (!b) return;
      b.addEventListener("click", function () { state.oaiQuality = val; paintQualSeg(); saveSettings(); });
    })(map[i][0], map[i][1]);
  }
  paintQualSeg();
}

/* ---------------- Retouch Pro (v1.4) ---------------- */
const RT_DEFAULT = {
  smooth: 0, acne: 0, spots: 0, wrinkle: 0, tone: 0, glow: 0,
  reshape: 0, lash: 0, brow: 0, lipSmooth: 0, lipColor: null, lipName: null,
  lens: null, lensName: null, hairStray: 0, hairSmooth: 0, hairShine: 0,
  dressSmooth: 0, dressEdge: 0, dressWrinkle: 0, dressTexture: 0,
  bgSmooth: 0, bgColor: null, bgName: null, bgRecolor: 0,
  teeth: 0, eyeWhite: 0,
  faceSlim: 0, jaw: 0, chin: 0, noseSize: 0, eyeSize: 0, lipFull: 0,
  waist: 0, bodySlim: 0, shoulder: 0, hip: 0, legLen: 0, armSlim: 0,
  dressFit: 0, dressClean: 0, dressColorPure: 0,
  bust: 0, butt: 0, thigh: 0, calf: 0, neck: 0, fingers: 0,
  browStyle: null, lashStyle: null, contourStyle: null, blushColor: null, blushName: null,
  bodySmooth: 0, bodyBlemish: 0, bodyTone: 0, bodyGlow: 0, bodyHairRm: 0,
  hairVolume: 0, hairGloss: 0, hairFill: 0,
  petalColor: null, petalName: null
};
state.rt = JSON.parse(JSON.stringify(RT_DEFAULT));

const RT_SLIDERS = [
  { id: "rtSmooth", key: "smooth" }, { id: "rtAcne", key: "acne" },
  { id: "rtSpots", key: "spots" }, { id: "rtWrinkle", key: "wrinkle" },
  { id: "rtTone", key: "tone", bipolar: true }, { id: "rtGlow", key: "glow" },
  { id: "rtReshape", key: "reshape" }, { id: "rtLash", key: "lash" },
  { id: "rtBrow", key: "brow" }, { id: "rtLipSmooth", key: "lipSmooth" },
  { id: "rtHairStray", key: "hairStray" }, { id: "rtHairSmooth", key: "hairSmooth" },
  { id: "rtHairShine", key: "hairShine" }, { id: "rtDressSmooth", key: "dressSmooth" },
  { id: "rtDressEdge", key: "dressEdge" }, { id: "rtDressWrinkle", key: "dressWrinkle" },
  { id: "rtDressTexture", key: "dressTexture" }, { id: "rtBgSmooth", key: "bgSmooth" },
  { id: "rtBgRecolor", key: "bgRecolor" },
  { id: "rtTeeth", key: "teeth" }, { id: "rtEyeWhite", key: "eyeWhite" },
  { id: "rtFaceSlim", key: "faceSlim", bipolar: true }, { id: "rtJaw", key: "jaw", bipolar: true },
  { id: "rtChin", key: "chin", bipolar: true }, { id: "rtNoseSize", key: "noseSize", bipolar: true },
  { id: "rtEyeSize", key: "eyeSize", bipolar: true }, { id: "rtLipFull", key: "lipFull", bipolar: true },
  { id: "rtWaist", key: "waist", bipolar: true }, { id: "rtBodySlim", key: "bodySlim", bipolar: true },
  { id: "rtShoulder", key: "shoulder", bipolar: true }, { id: "rtHip", key: "hip", bipolar: true },
  { id: "rtLegLen", key: "legLen", bipolar: true }, { id: "rtArmSlim", key: "armSlim", bipolar: true },
  { id: "rtDressFit", key: "dressFit", bipolar: true },
  { id: "rtDressClean", key: "dressClean" }, { id: "rtDressColorPure", key: "dressColorPure" },
  { id: "rtBust", key: "bust", bipolar: true }, { id: "rtButt", key: "butt", bipolar: true },
  { id: "rtThigh", key: "thigh", bipolar: true }, { id: "rtCalf", key: "calf", bipolar: true },
  { id: "rtNeck", key: "neck", bipolar: true }, { id: "rtFingers", key: "fingers", bipolar: true },
  { id: "rtBodySmooth", key: "bodySmooth" }, { id: "rtBodyBlemish", key: "bodyBlemish" },
  { id: "rtBodyTone", key: "bodyTone" }, { id: "rtBodyGlow", key: "bodyGlow" },
  { id: "rtBodyHairRm", key: "bodyHairRm" },
  { id: "rtHairVolume", key: "hairVolume" },
  { id: "rtHairGloss", key: "hairGloss" }, { id: "rtHairFill", key: "hairFill" }
];

const SW_LIP = [["off", null], ["Pink", "#e78ba0"], ["Coral", "#f2705f"], ["Red", "#c62f3b"], ["Nude", "#c58f7d"], ["Berry", "#a53860"], ["Wine", "#6d1f33"]];
const SW_LENS = [["off", null], ["Brown", "#6b4a2b"], ["Hazel", "#8a6a3d"], ["Gray", "#9aa0a6"], ["Blue", "#5b84b1"], ["Green", "#5f8f6b"], ["Violet", "#7d6bb0"]];
const BROW_STYLES = [["off", null], ["Natural", "Natural"], ["Korean Straight", "Korean straight"], ["Soft Arch", "soft arch"], ["High Arch", "high arch"], ["Bold Defined", "bold defined"], ["Feathered", "feathered brushed-up"]];
const LASH_STYLES = [["off", null], ["Natural", "natural"], ["Wispy", "wispy"], ["Doll", "doll"], ["Cat-Eye", "cat-eye"], ["Volume", "full volume"], ["Manga", "manga spike"]];
const CONTOUR_STYLES = [["off", null], ["Soft", "soft everyday"], ["Defined", "defined"], ["Sculpted", "sculpted editorial"], ["Glowy", "glowy high-highlight"], ["Korean", "Korean gradient"]];
const SW_PETAL = [["auto", null], ["White", "#f5f2ec"], ["Blush", "#f7c6d0"], ["Cherry", "#ffb7c5"], ["Red", "#d94a5e"], ["Purple", "#b48fd9"], ["Peach", "#f6b39a"], ["Blue", "#8fb8e8"], ["Gold", "#f2d38b"]];

const SW_BLUSH = [["off", null], ["Peach", "#f6b39a"], ["Pink", "#f3a4b5"], ["Rose", "#e58a9c"], ["Coral", "#f08a76"], ["Berry", "#c96a86"], ["Apricot", "#f2b184"]];

function buildTextChips(containerId, options, valueKey) {
  const c = $(containerId);
  if (!c) return;
  while (c.firstChild) c.removeChild(c.firstChild);
  for (let i = 0; i < options.length; i++) {
    (function (label, val) {
      const b = document.createElement("button");
      b.className = "sw ltchip" + ((state.rt[valueKey] === val) ? " on" : "");
      b.textContent = label === "off" ? "\u2013" : label;
      b.addEventListener("click", function () {
        state.rt[valueKey] = val;
        buildTextChips(containerId, options, valueKey);
        saveSettings();
      });
      c.appendChild(b);
    })(options[i][0], options[i][1]);
  }
}

const SW_BG = [["off", null], ["White", "#f4f4f4"], ["Gray", "#9d9d9d"], ["Black", "#141414"], ["Beige", "#e8dcc7"], ["Sky Blue", "#bcd7ee"], ["Pastel Pink", "#f3d3dc"], ["Sage", "#cfe0d2"]];

function rtVal(def) {
  const v = state.rt[def.key];
  return def.bipolar && v > 0 ? "+" + v : String(v);
}

function paintRtSliders() {
  for (let i = 0; i < RT_SLIDERS.length; i++) {
    const d = RT_SLIDERS[i];
    const el = $(d.id), vl = $(d.id + "V");
    if (el) el.value = String(state.rt[d.key]);
    if (vl) vl.textContent = rtVal(d);
  }
}

function bindRtSliders() {
  for (let i = 0; i < RT_SLIDERS.length; i++) {
    (function (d) {
      const el = $(d.id);
      if (!el) return;
      el.addEventListener("input", function () {
        state.rt[d.key] = Math.round(Number(el.value));
        const vl = $(d.id + "V");
        if (vl) vl.textContent = rtVal(d);
      });
      el.addEventListener("change", function () { saveSettings(); });
    })(RT_SLIDERS[i]);
  }
}

function buildSwatches(containerId, palette, colorKey, nameKey) {
  const c = $(containerId);
  if (!c) return;
  while (c.firstChild) c.removeChild(c.firstChild);
  for (let i = 0; i < palette.length; i++) {
    (function (name, hex) {
      const b = document.createElement("button");
      b.className = "sw" + (hex ? "" : " none") + ((state.rt[colorKey] === hex) ? " on" : "");
      if (hex) { b.style.backgroundColor = hex; }
      else { b.textContent = "\u2013"; }
      b.addEventListener("click", function () {
        state.rt[colorKey] = hex;
        state.rt[nameKey] = hex ? name : null;
        buildSwatches(containerId, palette, colorKey, nameKey);
        saveSettings();
      });
      c.appendChild(b);
    })(palette[i][0], palette[i][1]);
  }
}

function paintSwatchesAll() {
  buildSwatches("swLip", SW_LIP, "lipColor", "lipName");
  buildSwatches("swLens", SW_LENS, "lens", "lensName");
  buildSwatches("swBg", SW_BG, "bgColor", "bgName");
  buildSwatches("swBlush", SW_BLUSH, "blushColor", "blushName");
  buildSwatches("swPetal", SW_PETAL, "petalColor", "petalName");
  buildTextChips("chBrow", BROW_STYLES, "browStyle");
  buildTextChips("chLash", LASH_STYLES, "lashStyle");
  buildTextChips("chContour", CONTOUR_STYLES, "contourStyle");
}

function buildRetouchPrompt() {
  const r = state.rt;
  const L = [];
  if (r.smooth > 0) L.push("Skin smoothing at " + r.smooth + "% with frequency-separation quality; keep realistic pores and texture.");
  if (r.acne > 0) L.push("Remove acne and pimples at " + r.acne + "% strength; heal the skin cleanly.");
  if (r.spots > 0) L.push("Remove dark spots, moles and blemishes at " + r.spots + "%.");
  if (r.wrinkle > 0) L.push("Reduce wrinkles and fine lines at " + r.wrinkle + "% while keeping natural skin.");
  if (r.tone > 0) L.push("Brighten and whiten the overall skin tone by " + r.tone + "% evenly with a natural undertone.");
  if (r.tone < 0) L.push("Deepen the skin tone with a healthy natural tan by " + (-r.tone) + "%.");
  if (r.glow > 0) L.push("Add a soft healthy skin glow at " + r.glow + "%.");
  if (r.reshape > 0) L.push("Subtle AI face reshape at " + r.reshape + "%: slightly slimmer jawline and cheeks with refined contours; the person must remain clearly recognizable as the same person.");
  if (r.lash > 0) L.push("Enhance the eyelashes at " + r.lash + "%: longer, darker, well defined.");
  if (r.brow > 0) L.push("Groom and define the eyebrows at " + r.brow + "%: clean shape, fill sparse areas naturally.");
  if (r.lipSmooth > 0) L.push("Smooth the lip texture at " + r.lipSmooth + "%.");
  if (r.lipColor) L.push("Apply " + (r.lipName || "") + " lipstick color (" + r.lipColor + ") with a natural gradient finish.");
  if (r.lens) L.push("Change the iris color to " + (r.lensName || "") + " (" + r.lens + ") like natural contact lenses; keep realistic catchlights and pupils.");
  if (r.hairStray > 0) L.push("Remove stray and flyaway hairs at " + r.hairStray + "%; clean the hairline edges.");
  if (r.hairSmooth > 0) L.push("Smooth the hair strands at " + r.hairSmooth + "% keeping natural hair texture.");
  if (r.hairShine > 0) L.push("Hair dodge-and-burn at " + r.hairShine + "%: glossy dimensional shine and depth.");
  if (r.dressSmooth > 0) L.push("Smooth the clothing fabric at " + r.dressSmooth + "%.");
  if (r.dressEdge > 0) L.push("Clean and refine the garment edges and outlines at " + r.dressEdge + "%.");
  if (r.dressWrinkle > 0) L.push("Remove fabric wrinkles and creases at " + r.dressWrinkle + "% then re-smooth the cloth naturally.");
  if (r.dressTexture > 0) L.push("Recover and enhance the fabric texture detail at " + r.dressTexture + "%.");
  if (r.bgSmooth > 0) L.push("Clean and smooth the ORIGINAL background at " + r.bgSmooth + "%: remove noise, dust and distractions while keeping the same background content.");
  if (r.bgColor) L.push("Recolor the background to " + (r.bgName || "") + " (" + r.bgColor + ") as a smooth professional studio backdrop with soft gradient falloff" + (r.bgRecolor > 0 ? (", smoothing at " + r.bgRecolor + "%") : "") + ".");
  else if (r.bgRecolor > 0) L.push("Polish and smooth the background color at " + r.bgRecolor + "%.");
  if (r.teeth > 0) L.push("Whiten the teeth at " + r.teeth + "% while keeping natural enamel texture.");
  if (r.eyeWhite > 0) L.push("Clean and brighten the eye whites (sclera) at " + r.eyeWhite + "%: remove redness and visible veins, keep them realistic.");
  const bip = function (v, inc, dec) {
    if (v > 0) L.push(inc + " at " + v + "%.");
    if (v < 0) L.push(dec + " at " + (-v) + "%.");
  };
  bip(r.faceSlim, "Subtly slim the overall face", "Make the face slightly fuller");
  bip(r.jaw, "Sharpen and slim the jawline", "Soften and round the jawline");
  bip(r.chin, "Lengthen and refine the chin", "Shorten and soften the chin");
  bip(r.noseSize, "Slightly enlarge the nose", "Reduce and refine the nose size");
  bip(r.eyeSize, "Enlarge the eyes", "Reduce the eye size");
  bip(r.lipFull, "Make the lips fuller", "Make the lips thinner");
  bip(r.waist, "Slim the waist", "Widen the waist");
  bip(r.bodySlim, "Slim the whole body silhouette", "Make the body silhouette fuller");
  bip(r.shoulder, "Broaden the shoulders", "Narrow the shoulders");
  bip(r.hip, "Slim the hips", "Widen the hips");
  bip(r.legLen, "Lengthen the legs proportionally", "Shorten the legs proportionally");
  bip(r.armSlim, "Slim the arms", "Make the arms fuller");
  if (r.faceSlim || r.jaw || r.chin || r.noseSize || r.eyeSize || r.lipFull || r.waist || r.bodySlim || r.shoulder || r.hip || r.legLen || r.armSlim || r.bust || r.butt || r.thigh || r.calf || r.neck || r.fingers) {
    L.push("All reshape adjustments must be subtle, anatomically correct and photorealistic - the person must remain clearly recognizable as the same person.");
  }
  bip(r.bust, "Enhance and gently lift the bust", "Reduce the bust size");
  bip(r.butt, "Lift and round the glutes", "Reduce the glutes");
  bip(r.thigh, "Slim the thighs", "Make the thighs fuller");
  bip(r.calf, "Slim the calves", "Make the calves fuller");
  bip(r.neck, "Slim and elongate the neck", "Shorten the neck slightly");
  bip(r.fingers, "Slim and lengthen the fingers", "Make the fingers shorter and softer");
  if (r.browStyle) L.push("Apply a " + r.browStyle + " eyebrow style, cleanly shaped and naturally filled.");
  if (r.lashStyle) L.push("Apply " + r.lashStyle + " style eyelashes, realistic and well separated.");
  if (r.blushColor) L.push("Apply " + (r.blushName || "") + " (" + r.blushColor + ") blush with soft airbrushed diffusion on the cheeks.");
  if (r.contourStyle) L.push("Apply " + r.contourStyle + " contour and highlight sculpting, blended invisibly into the skin.");
  if (r.bodySmooth > 0) L.push("Smooth and even the body skin (arms, shoulders, chest, back, legs) at " + r.bodySmooth + "%, keeping natural pores and realistic texture.");
  if (r.bodyBlemish > 0) L.push("Remove body blemishes, marks, bruises, mosquito bites and small scars at " + r.bodyBlemish + "%.");
  if (r.bodyTone > 0) L.push("Even out the body skin tone at " + r.bodyTone + "%: neck, chest, underarms and joints match the face tone naturally.");
  if (r.bodyGlow > 0) L.push("Add a healthy soft glow to the body skin at " + r.bodyGlow + "%, like professional body makeup.");
  if (r.bodyHairRm > 0) L.push("Reduce visible fine body hair on arms and legs at " + r.bodyHairRm + "%, keeping skin realistic.");
  if (r.hairVolume > 0) L.push("Add natural volume and body to the hair at " + r.hairVolume + "%.");
  if (r.hairGloss > 0) L.push("Add glossy healthy shine to the hair at " + r.hairGloss + "%.");
  if (r.hairFill > 0) L.push("Fill thin or sparse hair areas at " + r.hairFill + "%, matching the natural hair direction and color.");
  bip(r.dressFit, "Fit the outfit tighter and cleaner to the body", "Loosen the outfit's drape");
  if (r.dressClean > 0) L.push("Clean the outfit at " + r.dressClean + "%: remove stains, dust, lint, hairs and marks from the fabric.");
  if (r.dressColorPure > 0) L.push("Purify and enrich the outfit's color at " + r.dressColorPure + "%: even out the tone, remove color casts, keep the fabric texture.");
  if (!L.length) return "";
  return "PROFESSIONAL RETOUCH INSTRUCTIONS (studio quality, photorealistic):\n- " + L.join("\n- ");
}

function applyRetouch() {
  if (state.busy) return;
  const p = buildRetouchPrompt();
  if (!p) { setStatus(t("rt_none"), "err"); return; }
  runGenerate(p, true, ["skin", "subject"], false, { action: "Retouch", realDir: "edit" });
}

function resetRetouch() {
  state.rt = JSON.parse(JSON.stringify(RT_DEFAULT));
  paintRtSliders();
  paintSwatchesAll();
  saveSettings();
  setStatus(t("st_ready"));
}

/* ---------------- Tab pages (web-view style) ---------------- */
const PAGES = [
  { key: "setup", tab: "tabSetup", page: "pageSetup" },
  { key: "prompt", tab: "tabPrompt", page: "pagePrompt" },
  { key: "create", tab: "tabCreate", page: "pageCreate" },
  { key: "aitools", tab: "tabAiTools", page: "pageAiTools" },
  { key: "presets", tab: "tabPresets", page: "pagePresets" },
  { key: "retouch", tab: "tabRetouch", page: "pageRetouch" }
];

function switchPage(key) {
  try { disarm(); } catch (e) { }
  let found = false;
  for (let i = 0; i < PAGES.length; i++) { if (PAGES[i].key === key) found = true; }
  if (!found) key = "prompt";
  state.page = key;
  for (let i = 0; i < PAGES.length; i++) {
    const p = PAGES[i];
    const pe = $(p.page), te = $(p.tab);
    if (pe) pe.className = "page" + (p.key === key ? " on" : "");
    if (te) te.className = "tabb" + (p.key === key ? " on" : "");
  }
  const pg = $("pages");
  if (pg) pg.scrollTop = 0;
  if (key === "prompt") { try { fitCompareBox(); } catch (e) { } }
  if (key === "create") { try { refreshCreateCompare(); } catch (e) { } }
  if (key === "presets") { try { renderLightStage(); } catch (e) { } }
  if (key === "setup") {
    try {
      const wv = $("webView");
      if (wv && !state.webNudged) {
        state.webNudged = true;
        wv.style.width = "100%";
        if (!wv.style.height) wv.style.height = "500px"; /* no auto-load: user must tap Go */
      }
    } catch (e) { }
  }
}

function bindTabs() {
  for (let i = 0; i < PAGES.length; i++) {
    (function (p) {
      const te = $(p.tab);
      if (te) te.addEventListener("click", function () { switchPage(p.key); saveSettings(); });
    })(PAGES[i]);
  }
}

/* ---------------- Collapsible cards with persisted state ---------------- */
const CARD_PAINT = {};
/* AUDIT-FIX #13: bindCard paints each card's open/closed state from state.sections at
   bind time \u2014 before loadSettings resolves \u2014 so the saved layout was never shown.
   Repaint every card after settings load via REFRESHERS (run by the apply block's
   applyI18n()). Iterates the live CARD_PAINT, which is fully populated by then. */
REFRESHERS.push(function () { for (const k in CARD_PAINT) { try { CARD_PAINT[k](); } catch (e) { } } });

function bindCard(headId, bodyId, key, defaultOpen) {
  const h = $(headId), bd = $(bodyId);
  if (!h || !bd) return;
  if (!(key in state.sections)) state.sections[key] = !!defaultOpen;
  const paint = function () {
    /* re-seed a missing key so a repaint never collapses a default-open card
       (loadSettings replaces state.sections wholesale, dropping keys from a newer
       build that an older saved file didn't have). */
    if (!(key in state.sections)) state.sections[key] = !!defaultOpen;
    const open = !!state.sections[key];
    bd.style.display = open ? "block" : "none";
    const car = h.querySelector(".car");
    if (car) car.textContent = open ? "\u25BE" : "\u25B8";
  };
  CARD_PAINT[key] = paint;
  h.addEventListener("click", function () {
    state.sections[key] = !state.sections[key];
    paint();
    saveSettings();
  });
  paint();
}

function openCard(key) {
  if (!state.sections[key]) {
    state.sections[key] = true;
    if (CARD_PAINT[key]) CARD_PAINT[key]();
  }
}

function safe(name, fn) {
  try { fn(); } catch (e) { herr("wire-fail:", name, e); }
}

function installGlobalSafetyNet() {
  const handler = function (reason) {
    try {
      if (state.busy) endBusy();
      const msg = (reason && reason.message) ? reason.message : String(reason || "error");
      herr("uncaught:", msg);
      setStatus(friendlyErr(new Error(msg)), "err");
    } catch (e) { }
  };
  try {
    if (typeof window !== "undefined" && window.addEventListener) {
      window.addEventListener("unhandledrejection", function (ev) {
        handler(ev && ev.reason);
        if (ev && ev.preventDefault) ev.preventDefault();
      });
      window.addEventListener("error", function (ev) {
        handler(ev && (ev.error || ev.message));
      });
    }
  } catch (e) { }
}

function init() {
  installGlobalSafetyNet();
  loadSettings().then(function () {
    /* first: the wall comes down only if the plan says so */
    safe("gate", function () { gateBoot(); });
    safe("apply-settings", function () {
      $("apiKey").value = state.apiKey || "";
      $("selModel").value = state.model;
      $("selRatio").value = state.ratio;
      $("intSlider").value = String(state.intensity);
      $("intVal").textContent = state.intensity + "%";
      paintSizeSeg();
    });
    safe("i18n", function () { applyTheme(); populateSelects(); applyI18n(); });
    safe("version", function () { paintPanelVersion(); checkPanelUpdate(); });
    safe("rt-paint", function () { paintRtSliders(); paintSwatchesAll(); });
    safe("ck-paint", function () { paintClean(); paintChecks(RMIX_CK, state.rmix); paintChecks(I2P_CK, state.i2p); paintChecks(I2P_OPT_CK, state.i2p); paintChains(); paintRest(); paintChecks([["lgEquip", "lightEquip"]], state); paintRoTarget(); paintChecks([["ckRefMk", "refMkOn"], ["ckRefHair", "refHairOn"]], state); paintChecks(MATCH_CK, state.match); });
    safe("page-restore", function () { switchPage(state.page || "prompt"); });
    safe("meta", function () { refreshPromptMeta(); renderRefs(); refreshCompare(); });
    safe("reflib-restore", function () { try { refLibRestoreSlots(); } catch (e) { hwarn("lib restore:", e); } });
    safe("ready", function () { setStatus(t("st_ready")); });
  });

  /* language + theme */
  safe("lang", function () {
    const sl = $("selLang");
    if (sl) sl.addEventListener("change", function () {
      const v = sl.value;
      state.lang = (LANG_CODES.indexOf(v) >= 0) ? v : "en";
      applyI18n();
      saveSettings();
      setStatus(t("st_ready"));
    });
    const bt = $("btnTheme");
    if (bt) bt.addEventListener("click", function () {
      state.theme = (state.theme === "light") ? "dark" : "light";
      applyTheme();
      saveSettings();
    });
  });

  /* API key */
  safe("apikey", function () {
    $("btnShowKey").addEventListener("click", function () {
      state.keyShown = !state.keyShown;
      $("apiKey").type = state.keyShown ? "text" : "password";
      paintShowKey();
    });
    REFRESHERS.push(paintShowKey);
    $("btnTestKey").addEventListener("click", testKey);
    $("btnSaveKey").addEventListener("click", saveKey);
    $("apiKey").addEventListener("input", function () { state.apiKey = $("apiKey").value.trim(); });
  });

  /* model / ratio / size */
  safe("model", function () {
    $("selModel").addEventListener("change", function () {
      if (state.provider === "openai") state.oaiModel = $("selModel").value;
      else state.model = $("selModel").value;
      try { updateCreateEngineTag(); } catch (e) { }
      saveSettings();
    });
    $("selRatio").addEventListener("change", function () { state.ratio = $("selRatio").value; saveSettings(); });
    bindSizeSeg();
    bindQualSeg();
  });

  /* prompt — UXP has NO pointer-events:none; click anywhere focuses + places caret */
  safe("prompt", function () {
    const pb = $("promptBox");
    stylePromptBox(pb);
    detectPromptCap(pb);
    pb.addEventListener("input", onPromptInput);
    const pm = $("promptBoxMy");
    if (pm) {
      stylePromptBox(pm);
      pm.addEventListener("input", function () {
        const cap = promptCap();
        if (pm.value.length > cap) pm.value = pm.value.slice(0, cap);
        refreshPromptMeta();
        if (!state.fillingMy) scheduleLiveTrans("my2en");
      });
    }
    const fpb = $("finalPromptBox");
    if (fpb) {
      stylePromptBox(fpb);
      fpb.style.height = "150px";
      fpb.readOnly = true;
      try { fpb.setAttribute("readonly", "readonly"); } catch (re) { }
    }
    const bc = $("btnCopyFinal");
    if (bc) bc.addEventListener("click", copyFinalPrompt);
    $("pwrap").addEventListener("click", function () { try { pb.focus(); } catch (e) { } });
    $("btnClearP").addEventListener("click", function () { setPromptText(""); try { pb.focus(); } catch (e) { } });
    bindToggle("tglLiveTrans", "liveTrans");
    $("btnImprove").addEventListener("click", function () { setBusyBtn($("btnImprove")); improvePrompt(); });
    const rp = $("selRecentPrompts");
    if (rp) {
      rp.addEventListener("change", function () {
        if (rp.value) { setPromptText(rp.value); rp.value = ""; }
      });
      paintRecentPrompts();
      REFRESHERS.push(function () { try { paintRecentPrompts(); } catch (e) { } });
    }
  });

  /* reference slots */
  safe("refs", function () {
    $("refLayer0").addEventListener("click", function () { addLayerRef(0); });
    $("refLayer1").addEventListener("click", function () { addLayerRef(1); });
    $("refFile0").addEventListener("click", function () { addFileRef(0); });
    $("refFile1").addEventListener("click", function () { addFileRef(1); });
    $("refClear0").addEventListener("click", function () { state.refs[0] = null; refLibForgetSlot("subject-reference"); renderRefs(); });
    $("refClear1").addEventListener("click", function () { state.refs[1] = null; refLibForgetSlot("reference-2"); renderRefs(); });
    $("refWeb0").addEventListener("click", function () { openUrlBar(0); });
    $("refWeb1").addEventListener("click", function () { openUrlBar(1); });
    $("btnUrlCancel").addEventListener("click", closeUrlBar);
    $("btnUrlPaste").addEventListener("click", function () {
      readClipboardText().then(function (s) {
        if (s) $("urlInput").value = s.trim();
      });
    });
    $("btnUrlLoad").addEventListener("click", function () {
      if (state.busy || state.urlSlot < 0) return;
      loadUrlIntoSlot(state.urlSlot, $("urlInput").value);
  });
  });

  /* tab pages */
  safe("tabs", function () {
    bindTabs();
    switchPage(state.page || "prompt");
  });

  /* collapsible cards (persisted) */
  safe("cards", function () {
    bindCard("cApiH", "cApiB", "api", !state.apiKey);
    bindCard("cModelH", "cModelB", "model", false);
    bindCard("cPromptH", "cPromptB", "prompt", true);
    bindCard("cRefH", "cRefB", "refs", true);
    bindCard("cPresetH", "cPresetB", "presets", false);
    bindCard("cRtH", "cRtB", "rtpro", false);
    bindCard("cPrevH", "cPrevB", "prev", false);
    bindCard("cFinalH", "cFinalB", "final", false);
    bindCard("cPipeH", "cPipeB", "pipe", false);
    bindCard("cChRestH", "cChRestB", "chrest", true);
    bindCard("cRoH", "cRoB", "refops", true);
    bindCard("cWedH", "cWedB", "wed", true);
    bindCard("cRecH", "cRecB", "recipes2", true);
    bindCard("cCamH", "cCamB", "campro", false);
    bindCard("cBatchH", "cBatchB", "batch", false);
    bindCard("cCrefH", "cCrefB", "crefs", false);
    bindCard("cResH", "cResB", "cresults", false);
    bindCard("cLibH", "cLibB", "reflib", false);
    bindCard("cUserLibH", "cUserLibB", "userlib", false);
    bindCard("cLightH", "cLightB", "lightcard", false);
    bindCard("cWebH", "cWebB", "webcard", false);
    /* the lighting stage measures its own width — re-render when its card opens */
    const lh = $("cLightH");
    if (lh) lh.addEventListener("click", function () { try { renderLightStage(); } catch (e) { } });
    bindCard("cDiagH", "cDiagB", "diag", false);
    bindCard("cLogH", "cLogB", "log", false);
  });

  /* Retouch Pro */
  safe("retouch", function () {
    bindRtSliders();
    paintRtSliders();
    paintSwatchesAll();
    bindGroup("rtSkinH", "rtSkinB", true);
    bindGroup("rtFaceH", "rtFaceB", false);
    bindGroup("rtShapeH", "rtShapeB", false);
    bindGroup("rtBodyH", "rtBodyB", false);
    bindGroup("rtHairH", "rtHairB", false);
    bindGroup("rtDressH", "rtDressB", false);
    bindGroup("rtBgH", "rtBgB", false);
    $("btnRtApply").addEventListener("click", function () { const g0 = $("btnRtApply"); armGate("__retouch", g0, function () { setBusyBtn(g0); applyRetouch(); }); });
    $("btnRtReset").addEventListener("click", resetRetouch);
  });

  /* presets */
  safe("presets", function () {
    bindToggle("tglAutoRun", "autoRun");
    bindClean();
    bindChains();
    bindRest();
    bindRefOps();
    bindWedChips();
    /* AUDIT-FIX #9: wedding chips are built from defaults at bind time; rebuild them
       from restored state after settings load. buildObjChips wipes + recreates its
       children each call, so re-running bindWedChips never accumulates listeners. */
    REFRESHERS.push(function () { try { bindWedChips(); } catch (e) { } });
    bindPipeline();
    bindToggle("tglLearn", "learnMode");
    const tl = $("tglLearn");
    if (tl) tl.addEventListener("click", function () { if (!state.learnMode) disarm(); });
    const gc = $("guideClose");
    if (gc) gc.addEventListener("click", disarm);
    bindGroup("wpTrailH", "wpTrailB", false);
    bindGroup("wpVeilH", "wpVeilB", false);
    bindGroup("wpGownH", "wpGownB", false);
    bindGroup("wpPetalH", "wpPetalB", false);
    bindGroup("wpExtraH", "wpExtraB", false);
    bindGroup("grpRecipesH", "grpRecipesB", false);
    const rs = $("btnRecipeSave"); if (rs) rs.addEventListener("click", saveRecipe);
    const rl = $("btnRecipeLoad"); if (rl) rl.addEventListener("click", loadRecipe);
    bindGroup("grpCleanH", "grpCleanB", true);
    bindGroup("grpRepH", "grpRepB", false);
    bindGroup("grpMixH", "grpMixB", false);
    /* v4.20 fix: these two collapsible sub-groups were never wired, so Style
       Chains and Old Photo Restore could not open / showed no buttons. */
    bindGroup("grpChainsH", "grpChainsB", true);
    bindGroup("grpRestoreH", "grpRestoreB", true);
    bindChecks(RMIX_CK, state.rmix);
    $("btnRmixGen").addEventListener("click", function () { const g0 = $("btnRmixGen"); armGate("__rmix", g0, function () { setBusyBtn(g0); replaceMixRun(); }); });
    bindGroup("grpI2pH", "grpI2pB", false);
    bindChecks(I2P_CK, state.i2p);
    bindChecks(I2P_OPT_CK, state.i2p);
    $("btnI2pExtract").addEventListener("click", function () { setBusyBtn($("btnI2pExtract")); extractScenePrompt(); });
    $("btnSceneGen").addEventListener("click", function () { const g0 = $("btnSceneGen"); armGate("__scene", g0, function () { setBusyBtn(g0); sceneGenerate(); }); });
  });

  /* studio lighting */
  safe("lighting", function () {
    bindLighting();
  });

  /* web ai browser */
  safe("create", bindCreate);
  safe("provider", bindProvider);
  safe("scenes", bindScenes);
  safe("diag", bindDiag);
  safe("reflib", bindRefLib);
  safe("web", function () {
    bindWeb();
    bindGroup("grpSkinH", "grpSkinB", false);
    for (const k in PRESETS) {
      (function (key) {
        const b = $(PRESETS[key].btn);
        if (b) b.addEventListener("click", function () { onPreset(key); });
      })(k);
    }
    $("intSlider").addEventListener("input", function () {
      state.intensity = Math.round(Number($("intSlider").value));
      $("intVal").textContent = state.intensity + "%";
    });
    $("intSlider").addEventListener("change", function () { saveSettings(); });
    paintPresetSel();
  });

  /* options + generate */
  safe("options", function () {
    /* v4.5: keep-lock UI removed - HNK Guard protects everything by default.
       v4.16: a dead bindGroup call for the removed grpKeep* elements used to sit
       here; because those elements no longer exist, the unguarded call threw and
       silently dropped every handler below it — Auto-Place, Auto-Save, Camera
       Pro, History and Batch. bindGroup is now null-safe and the dead call is
       gone, so all of the wiring below always runs. */
    bindToggle("tglAutoPlace", "autoPlace");
    bindToggle("tglAutoSave", "autoSave");
    const tas = $("tglAutoSave");
    if (tas) tas.addEventListener("click", function () {
      if (state.autoSave && !state.saveDirH) { pickSaveFolder(); }
    });
    bindCamPro();
    const hp = $("btnHistPrompt"); if (hp) hp.addEventListener("click", histPromptToBox);
    const br = $("btnBatchRun"); if (br) br.addEventListener("click", batchRun);
    const bsp = $("btnBatchStop");
    if (bsp) {
      bsp.disabled = true;
      bsp.addEventListener("click", function () { state.batchStop = true; });
    }
  });
  safe("generate", function () {
    $("btnGenerate").addEventListener("click", function () { const g0 = $("btnGenerate"); armGate("__gen", g0, function () { setBusyBtn(g0); runGenerate(null, false, [], false, { action: "Prompt" }); }); });
  });

  /* compare + output */
  safe("compare", function () {
    $("cmpSlider").addEventListener("input", function () { updateCmpPos($("cmpSlider").value); });
    const r2r = $("btnResultToRef");
    if (r2r) r2r.addEventListener("click", function () {
      if (!state.resultB64) return;
      state.refs[0] = { b64: state.resultB64, mime: state.resultMime || "image/png", label: "Result \u21BA" };
      renderRefs();
      setStatus(t("st_to_ref"), "ok");
    });
    $("btnPlace").addEventListener("click", function () {
      if (state.busy || !state.resultB64) return;
      try { setStage("placing"); } catch (e0) { }
      setStatus(t("st_place"));
      placeResultToPS().then(function (r) {
        try { setStage(null); } catch (e1) { }
        /* r undefined = an early guard already set its own status line */
        if (!r) return;
        /* honest outcome: masked group vs plain layer (v6.9.0 standard) */
        if (r.placed && r.masked && r.grouped) setStatus(t("st_placed_masked"), "ok");
        else if (r.placed && !r.newDoc) setStatus(t("st_placed_plain"), "ok");
        else setStatus(t("st_done"), "ok");
      })
        .catch(function (e) { try { setStage(null); } catch (e2) { } setStatus(t("st_err") + ": " + (e && e.message ? e.message : e), "err"); });
    });
    $("btnSaveAs").addEventListener("click", saveResultAs);
  });

  /* resize (guarded window.*) */
  safe("resize", function () {
    if (typeof window !== "undefined" && window.addEventListener) {
      window.addEventListener("resize", fitCompareBox);
    }
  });
}

init();
