/* Multilingual runtime generated for EduLovable v5.2. */
(function(){
  "use strict";
  var STORE_KEY = "ql_language";
  var LANGS = {
    "pt-BR": { flag: "BR", code: "PT", name: "Português" },
    "en-US": { flag: "US", code: "EN", name: "English" },
    "es-ES": { flag: "ES", code: "ES", name: "Español" }
  };
  var TEXTS = {
  "Bem vindo a": {
    "en": "Welcome to",
    "es": "Bienvenido a"
  },
  "Bem vindo": {
    "en": "Welcome",
    "es": "Bienvenido"
  },
  "Ativar LicenÃ§a": {
    "en": "Activate License",
    "es": "Activar Licencia"
  },
  "Insira sua chave de licenÃ§a para desbloquear.": {
    "en": "Enter your license key to unlock.",
    "es": "Ingresa tu clave de licencia para desbloquear."
  },
  "Validar LicenÃ§a": {
    "en": "Validate License",
    "es": "Validar Licencia"
  },
  "Adquirir licenÃ§a": {
    "en": "Get license",
    "es": "Adquirir licencia"
  },
  "Adquira sua licenÃ§a de forma rÃ¡pida e segura.": {
    "en": "Get your license quickly and securely.",
    "es": "Adquiere tu licencia de forma rÃ¡pida y segura."
  },
  "Entrar na comunidade": {
    "en": "Join the community",
    "es": "Entrar a la comunidad"
  },
  "Participe da comunidade exclusiva no WhatsApp.": {
    "en": "Join the exclusive WhatsApp community.",
    "es": "Participa en la comunidad exclusiva de WhatsApp."
  },
  "Obter suporte": {
    "en": "Get support",
    "es": "Obtener soporte"
  },
  "Fale com nossa equipe e tire suas dÃºvidas.": {
    "en": "Talk to our team and ask your questions.",
    "es": "Habla con nuestro equipo y resuelve tus dudas."
  },
  "Comprar na Loja": {
    "en": "Buy from Store",
    "es": "Comprar en la Tienda"
  },
  "Painel do Revendedor": {
    "en": "Reseller Panel",
    "es": "Panel del Revendedor"
  },
  "HistÃ³rico": {
    "en": "History",
    "es": "Historial"
  },
  "Limpar HistÃ³rico": {
    "en": "Clear History",
    "es": "Limpiar Historial"
  },
  "Prompt": {
    "en": "Prompt",
    "es": "Prompt"
  },
  "Digite seu comando...": {
    "en": "Type your command...",
    "es": "Escribe tu comando..."
  },
  "O que vamos criar hoje?": {
    "en": "What are we creating today?",
    "es": "Â¿QuÃ© vamos a crear hoy?"
  },
  "Enviar": {
    "en": "Send",
    "es": "Enviar"
  },
  "Remover Marca de Ãgua": {
    "en": "Remove Watermark",
    "es": "Eliminar Marca de Agua"
  },
  "Remover Marca d'Ãgua": {
    "en": "Remove Watermark",
    "es": "Eliminar Marca de Agua"
  },
  "Ativar Escudo": {
    "en": "Enable Shield",
    "es": "Activar Escudo"
  },
  "Desativar Escudo": {
    "en": "Disable Shield",
    "es": "Desactivar Escudo"
  },
  "Usar Chat PadrÃ£o": {
    "en": "Use Default Chat",
    "es": "Usar Chat Predeterminado"
  },
  "Voltar p/ ExtensÃ£o": {
    "en": "Back to Extension",
    "es": "Volver a la ExtensiÃ³n"
  },
  "Baixar Todos Arquivos": {
    "en": "Download All Files",
    "es": "Descargar Todos los Archivos"
  },
  "Criar Projeto no Lovable": {
    "en": "Create Project in Lovable",
    "es": "Crear Proyecto en Lovable"
  },
  "Publicar Projeto": {
    "en": "Publish Project",
    "es": "Publicar Proyecto"
  },
  "Ativar Cloud Do Lovable": {
    "en": "Enable Lovable Cloud",
    "es": "Activar Lovable Cloud"
  },
  "ATALHOS RÃPIDOS": {
    "en": "QUICK SHORTCUTS",
    "es": "ATAJOS RÃPIDOS"
  },
  "Suporte": {
    "en": "Support",
    "es": "Soporte"
  },
  "Desenvolvido por EduLovable": {
    "en": "Developed by EduLovable",
    "es": "Desarrollado por EduLovable"
  },
  "NotificaÃ§Ãµes": {
    "en": "Notifications",
    "es": "Notificaciones"
  },
  "NotificaÃ§Ãµes sonoras": {
    "en": "Sound notifications",
    "es": "Notificaciones sonoras"
  },
  "NotificaÃ§Ãµes sonoras ativadas": {
    "en": "Sound notifications enabled",
    "es": "Notificaciones sonoras activadas"
  },
  "NotificaÃ§Ãµes sonoras desativadas": {
    "en": "Sound notifications disabled",
    "es": "Notificaciones sonoras desactivadas"
  },
  "Tocar som quando o Lovable terminar": {
    "en": "Play a sound when Lovable finishes",
    "es": "Reproducir sonido cuando Lovable termine"
  },
  "Toca um som de notificaÃ§Ã£o quando o Lovable terminar de processar/editar a sua solicitaÃ§Ã£o.": {
    "en": "Plays a notification sound when Lovable finishes processing/editing your request.",
    "es": "Reproduce un sonido de notificaciÃ³n cuando Lovable termina de procesar/editar tu solicitud."
  },
  "Som habilitado": {
    "en": "Sound enabled",
    "es": "Sonido activado"
  },
  "Carregando...": {
    "en": "Loading...",
    "es": "Cargando..."
  },
  "Aguardando sincronizaÃ§Ã£o...": {
    "en": "Waiting for sync...",
    "es": "Esperando sincronizaciÃ³n..."
  },
  "Sincronizado! Projeto:": {
    "en": "Synced! Project:",
    "es": "Sincronizado! Proyecto:"
  },
  "VITALÃCIO": {
    "en": "LIFETIME",
    "es": "VITALICIO"
  },
  "Acesso sem expiraÃ§Ã£o": {
    "en": "Access without expiration",
    "es": "Acceso sin expiraciÃ³n"
  },
  "Acesso vitalÃ­cio ativado": {
    "en": "Lifetime access enabled",
    "es": "Acceso vitalicio activado"
  },
  "LicenÃ§a Expirada!": {
    "en": "License Expired!",
    "es": "Licencia Expirada!"
  },
  "O prazo da sua licenÃ§a terminou. Renove agora para continuar.": {
    "en": "Your license period has ended. Renew now to continue.",
    "es": "El plazo de tu licencia terminÃ³. Renueva ahora para continuar."
  },
  "Renovar Agora": {
    "en": "Renew Now",
    "es": "Renovar Ahora"
  },
  "Fechar": {
    "en": "Close",
    "es": "Cerrar"
  },
  "Escolha seu Plano": {
    "en": "Choose Your Plan",
    "es": "Elige tu Plan"
  },
  "Carregando planos...": {
    "en": "Loading plans...",
    "es": "Cargando planes..."
  },
  "Selecionar": {
    "en": "Select",
    "es": "Seleccionar"
  },
  "Permanente": {
    "en": "Permanent",
    "es": "Permanente"
  },
  "dias": {
    "en": "days",
    "es": "dÃ­as"
  },
  "Pagamento": {
    "en": "Payment",
    "es": "Pago"
  },
  "MÃ©todo de Pagamento": {
    "en": "Payment Method",
    "es": "MÃ©todo de Pago"
  },
  "NÃºmero de Telefone": {
    "en": "Phone Number",
    "es": "NÃºmero de TelÃ©fono"
  },
  "Pagamento Confirmado!": {
    "en": "Payment Confirmed!",
    "es": "Pago Confirmado!"
  },
  "Sua licenÃ§a foi ativada com sucesso.": {
    "en": "Your license was activated successfully.",
    "es": "Tu licencia fue activada correctamente."
  },
  "Sua chave de licenÃ§a": {
    "en": "Your license key",
    "es": "Tu clave de licencia"
  },
  "Copiar Chave": {
    "en": "Copy Key",
    "es": "Copiar Clave"
  },
  "Ativar Agora": {
    "en": "Activate Now",
    "es": "Activar Ahora"
  },
  "Prompt vazio": {
    "en": "Empty prompt",
    "es": "Prompt vacÃ­o"
  },
  "Prompt enviado!": {
    "en": "Prompt sent!",
    "es": "Prompt enviado!"
  },
  "Prompt inserido â€” revise e envie": {
    "en": "Prompt inserted â€” review and send",
    "es": "Prompt insertado â€” revisa y envÃ­a"
  },
  "Prompts Prontos": {
    "en": "Ready Prompts",
    "es": "Prompts Listos"
  },
  "Carregando promptsâ€¦": {
    "en": "Loading promptsâ€¦",
    "es": "Cargando promptsâ€¦"
  },
  "Ajuda": {
    "en": "Help",
    "es": "Ayuda"
  },
  "Tema": {
    "en": "Theme",
    "es": "Tema"
  },
  "Sair": {
    "en": "Logout",
    "es": "Salir"
  },
  "Corrigir Bug": {
    "en": "Fix Bug",
    "es": "Corregir Bug"
  },
  "Refatorar": {
    "en": "Refactor",
    "es": "Refactorizar"
  },
  "Melhorar UI": {
    "en": "Improve UI",
    "es": "Mejorar UI"
  },
  "Explicar CÃ³digo": {
    "en": "Explain Code",
    "es": "Explicar CÃ³digo"
  },
  "Otimizar": {
    "en": "Optimize",
    "es": "Optimizar"
  },
  "SeguranÃ§a": {
    "en": "Security",
    "es": "Seguridad"
  },
  "Criar Teste": {
    "en": "Create Tests",
    "es": "Crear Pruebas"
  },
  "Responsividade": {
    "en": "Responsiveness",
    "es": "Responsividad"
  },
  "Cards & BotÃµes": {
    "en": "Cards & Buttons",
    "es": "Cards y Botones"
  },
  "MigraÃ§Ã£o": {
    "en": "Migration",
    "es": "MigraciÃ³n"
  },
  "TransiÃ§Ã£o": {
    "en": "Transition",
    "es": "TransiciÃ³n"
  },
  "Nenhuma skill encontrada": {
    "en": "No skill found",
    "es": "No se encontrÃ³ ninguna skill"
  }
};
  var PROMPTS = {
  "Corrigir Bug": [
    "Fix Bug",
    "Identify and fix the bug in this code, explaining the root cause and the solution.",
    "Corregir Bug",
    "Identifica y corrige el bug en este cÃ³digo, explicando la causa raÃ­z y la soluciÃ³n."
  ],
  "Bugs": [
    "Bugs",
    "Analyze the code and identify all bugs, errors, and failures. Fix each one, explaining the problem and the applied solution.",
    "Bugs",
    "Analiza el cÃ³digo e identifica todos los bugs, errores y fallas. Corrige cada uno explicando el problema y la soluciÃ³n aplicada."
  ],
  "Refatorar": [
    "Refactor",
    "Refactor this code while preserving behavior, improving readability, modularity, and naming.",
    "Refactorizar",
    "Refactoriza este cÃ³digo manteniendo el comportamiento y mejorando legibilidad, modularidad y nombres."
  ],
  "Melhorar UI": [
    "Improve UI",
    "Improve this component UI: visual hierarchy, spacing, typography, and responsiveness.",
    "Mejorar UI",
    "Mejora la UI de este componente: jerarquÃ­a visual, espaciado, tipografÃ­a y responsividad."
  ],
  "Explicar CÃ³digo": [
    "Explain Code",
    "Explain this code step by step, including the reason behind each decision.",
    "Explicar CÃ³digo",
    "Explica este cÃ³digo paso a paso, incluyendo el motivo de cada decisiÃ³n."
  ],
  "Erros": [
    "Errors",
    "Implement robust error handling across the code, including try/catch, validations, and user-friendly error messages.",
    "Errores",
    "Implementa manejo robusto de errores en todo el cÃ³digo, incluyendo try/catch, validaciones y mensajes amigables."
  ],
  "Otimizar": [
    "Optimize",
    "Optimize this code for performance, complexity, and memory usage.",
    "Optimizar",
    "Optimiza este cÃ³digo en rendimiento, complejidad y uso de memoria."
  ],
  "ComentÃ¡rios": [
    "Comments",
    "Add clear comments and documentation throughout the code, explaining logic, parameters, and return values.",
    "Comentarios",
    "Agrega comentarios claros y documentaciÃ³n en todo el cÃ³digo, explicando lÃ³gica, parÃ¡metros y retornos."
  ],
  "SeguranÃ§a": [
    "Security",
    "Perform a security review: input validation, XSS, SQLi, authorization, and secrets.",
    "Seguridad",
    "Haz una revisiÃ³n de seguridad: validaciÃ³n de input, XSS, SQLi, autorizaciÃ³n y secrets."
  ],
  "Criar Teste": [
    "Create Tests",
    "Create unit tests covering happy paths, errors, and edge cases.",
    "Crear Pruebas",
    "Crea pruebas unitarias cubriendo casos felices, errores y casos lÃ­mite."
  ],
  "Responsividade": [
    "Responsiveness",
    "Make this layout fully responsive for mobile, tablet, and desktop without breaking the design.",
    "Responsividad",
    "Haz que este layout sea totalmente responsivo para mÃ³vil, tablet y desktop sin romper la estÃ©tica."
  ],
  "SEO": [
    "SEO",
    "Optimize SEO: title, meta description, headings, image alt text, schema/JSON-LD, and canonical.",
    "SEO",
    "Optimiza SEO: title, meta description, headings, alt de imÃ¡genes, schema/JSON-LD y canonical."
  ],
  "UI": [
    "UI",
    "Improve the user interface so it is more modern, responsive, and accessible.",
    "UI",
    "Mejora la interfaz para que sea mÃ¡s moderna, responsiva y accesible."
  ],
  "Componentes": [
    "Components",
    "Reorganize the code into reusable, well-structured components with clear responsibilities.",
    "Componentes",
    "Reorganiza el cÃ³digo en componentes reutilizables, bien estructurados y con responsabilidades claras."
  ],
  "Review": [
    "Review",
    "Perform a complete code review, identifying quality, security, and performance issues and suggesting improvements.",
    "Review",
    "Realiza una revisiÃ³n completa del cÃ³digo, identificando problemas de calidad, seguridad y rendimiento."
  ],
  "Copy & Marketing": [
    "Copy & Marketing",
    "Rewrite this content with a persuasive, clear, conversion-focused tone.",
    "Copy & Marketing",
    "Reescribe este contenido con un tono persuasivo, claro y orientado a conversiÃ³n."
  ],
  "Cards & BotÃµes": [
    "Cards & Buttons",
    "Create card and button variations with states consistent with the design system.",
    "Cards y Botones",
    "Crea variaciones de cards y botones con estados consistentes con el design system."
  ],
  "Fix Error": [
    "Fix Error",
    "Analyze this error and propose the exact fix, explaining the root cause.",
    "Corregir Error",
    "Analiza este error y propone la correcciÃ³n exacta, explicando la causa raÃ­z."
  ],
  "MigraÃ§Ã£o": [
    "Migration",
    "Perform the migration while preserving compatibility, with a step-by-step plan and rollback.",
    "MigraciÃ³n",
    "Realiza la migraciÃ³n manteniendo compatibilidad, con plan paso a paso y rollback."
  ],
  "TransiÃ§Ã£o": [
    "Transition",
    "Add smooth transitions and animations while respecting prefers-reduced-motion.",
    "TransiciÃ³n",
    "Agrega transiciones y animaciones suaves respetando prefers-reduced-motion."
  ]
};
  var current = "pt-BR";
  var applying = false;
  var reverse = {};

  function norm(v){ return String(v == null ? "" : v).replace(/\s+/g, " ").trim(); }
  function decodeMojibake(v){
    var text = String(v == null ? "" : v);
    if(!/[ÃÂâ]/.test(text)) return text;
    try {
      return decodeURIComponent(escape(text));
    } catch(_) {
      return text;
    }
  }
  function key(){ return current === "en-US" ? "en" : current === "es-ES" ? "es" : "pt"; }
  function detect(){
    var raw = ((navigator.languages && navigator.languages[0]) || navigator.language || "pt-BR").toLowerCase();
    if(raw.indexOf("en") === 0) return "en-US";
    if(raw.indexOf("es") === 0) return "es-ES";
    return "pt-BR";
  }
  function index(){
    Object.keys(TEXTS).forEach(function(pt){
      reverse[norm(pt)] = pt;
      reverse[norm(decodeMojibake(pt))] = pt;
      if(TEXTS[pt].en) reverse[norm(TEXTS[pt].en)] = pt;
      if(TEXTS[pt].en) reverse[norm(decodeMojibake(TEXTS[pt].en))] = pt;
      if(TEXTS[pt].es) reverse[norm(TEXTS[pt].es)] = pt;
      if(TEXTS[pt].es) reverse[norm(decodeMojibake(TEXTS[pt].es))] = pt;
    });
  }
  function localize(value){
    if(value == null) return value;
    var text = String(value);
    var trimmed = norm(text);
    if(!trimmed) return value;
    var pt = reverse[trimmed] || reverse[norm(decodeMojibake(trimmed))];
    if(pt){
      var entry = TEXTS[pt] || {};
      return key() === "en" && entry.en ? decodeMojibake(entry.en) : key() === "es" && entry.es ? decodeMojibake(entry.es) : decodeMojibake(pt);
    }
    return patterns(text);
  }
  function patterns(text){
    var v = decodeMojibake(String(text));
    if(current === "pt-BR") return v;
    var en = current === "en-US";
    v = v.replace(/Bem vindo a\s*/g, en ? "Welcome to " : "Bienvenido a ");
    v = v.replace(/Sincronizado! Projeto:/g, en ? "Synced! Project:" : "Sincronizado! Proyecto:");
    v = v.replace(/Aguardando sincronização/g, en ? "Waiting for sync" : "Esperando sincronización");
    v = v.replace(/(\d+) arquivo\(s\) adicionado\(s\)!/g, en ? "$1 file(s) added!" : "$1 archivo(s) agregado(s)!");
    v = v.replace(/Máximo de (\d+) arquivos/g, en ? "Maximum of $1 files" : "Máximo de $1 archivos");
    v = v.replace(/(.+) excede 20MB/g, en ? "$1 exceeds 20MB" : "$1 supera 20MB");
    v = v.replace(/Preparando criação/g, en ? "Preparing creation" : "Preparando creación");
    v = v.replace(/Baixando arquivos/g, en ? "Downloading files" : "Descargando archivos");
    v = v.replace(/Nenhuma notificação/g, en ? "No notifications" : "Sin notificaciones");
    return v;
  }
  function prompt(scope, label, fallbackPrompt){
    var row = PROMPTS[label] || PROMPTS[localize(label)];
    if(!row) return { label: localize(label), prompt: localize(fallbackPrompt) };
    if(current === "en-US") return { label: decodeMojibake(row[0]), prompt: decodeMojibake(row[1]) };
    if(current === "es-ES") return { label: decodeMojibake(row[2]), prompt: decodeMojibake(row[3]) };
    return { label: decodeMojibake(label), prompt: decodeMojibake(fallbackPrompt) };
  }
  function skip(el){
    return el && el.nodeType === 1 && /^(SCRIPT|STYLE|TEXTAREA|INPUT|CODE|PRE)$/.test(el.tagName);
  }
  function translateNode(root){
    if(!root || applying) return;
    applying = true;
    try {
      if(root.nodeType === 3){
        var n = localize(root.nodeValue);
        if(n !== root.nodeValue) root.nodeValue = n;
      } else if(root.nodeType === 1 && !skip(root)){
        ["title","placeholder","aria-label"].forEach(function(attr){
          if(root.hasAttribute && root.hasAttribute(attr)){
            var old = root.getAttribute(attr);
            var next = localize(old);
            if(next !== old) root.setAttribute(attr, next);
          }
        });
        var walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
          acceptNode:function(node){ return node.parentElement && !skip(node.parentElement) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT; }
        });
        var nodes = [];
        while(walker.nextNode()) nodes.push(walker.currentNode);
        nodes.forEach(function(node){
          var old = node.nodeValue;
          var next = localize(old);
          if(next !== old) node.nodeValue = next;
        });
        root.querySelectorAll && root.querySelectorAll("[title],[placeholder],[aria-label]").forEach(function(el){
          ["title","placeholder","aria-label"].forEach(function(attr){
            if(el.hasAttribute(attr)){
              var old = el.getAttribute(attr);
              var next = localize(old);
              if(next !== old) el.setAttribute(attr, next);
            }
          });
        });
      }
      translateSpecial();
    } finally {
      applying = false;
    }
  }
  function translateSpecial(){
    var brand = (window.tsBrandName && window.tsBrandName()) || "EduLovable";
    document.querySelectorAll(".sp-gate-title").forEach(function(el){
      if(current === "en-US") el.innerHTML = 'Welcome to <span data-ts-brand="name">' + brand + '</span>';
      else if(current === "es-ES") el.innerHTML = 'Bienvenido a <span data-ts-brand="name">' + brand + '</span>';
      else el.innerHTML = 'Bem-vindo &agrave; <span data-ts-brand="name">' + brand + '</span>';
    });
  }
  function selectorHtml(){
    return '<div class="ql-i18n-switcher" role="group" aria-label="Language">' +
      Object.keys(LANGS).map(function(lang){
        var l = LANGS[lang];
        return '<button type="button" class="ql-i18n-btn' + (lang === current ? ' ql-i18n-active' : '') + '" data-ql-lang="' + lang + '" title="' + l.name + '">' +
          '<span class="ql-i18n-code">' + l.code + '</span>' +
        '</button>';
      }).join("") + '</div>';
  }
  function mountAll(){
    var qh = document.querySelector("#ql-header .ql-header-right");
    if(qh && !qh.querySelector(".ql-i18n-switcher")) qh.insertAdjacentHTML("afterbegin", selectorHtml());
    var sh = document.querySelector(".sp-header");
    if(sh && !sh.querySelector(".ql-i18n-switcher")) sh.insertAdjacentHTML("beforeend", selectorHtml());
    document.querySelectorAll(".ql-i18n-btn").forEach(function(btn){
      if(btn.dataset.bound) return;
      btn.dataset.bound = "1";
      btn.addEventListener("click", function(e){
        e.preventDefault();
        e.stopPropagation();
        setLanguage(btn.getAttribute("data-ql-lang"));
      });
    });
  }
  function refreshButtons(){
    document.querySelectorAll(".ql-i18n-btn").forEach(function(btn){
      btn.classList.toggle("ql-i18n-active", btn.getAttribute("data-ql-lang") === current);
    });
  }
  var EXT_ROOT_SELECTOR = "#ql-floating,#ql-native-toast,#ql-native-sending-overlay,#ql-publish-modal,#ql-shield-overlay,#ql-native-badge,#ql-native-return-btn,.ql-alert-overlay,.ql-sweetalert-overlay,.sp-header,#sp-body,.sp-footer,.sp-notif-panel";
  function extensionRoots(){
    return Array.prototype.slice.call(document.querySelectorAll(EXT_ROOT_SELECTOR));
  }
  function isExtensionNode(node){
    if(!node) return false;
    var el = node.nodeType === 1 ? node : node.parentElement;
    if(!el) return false;
    if(el.matches && el.matches(EXT_ROOT_SELECTOR)) return true;
    if(el.closest && el.closest(EXT_ROOT_SELECTOR)) return true;
    return !!(el.querySelector && el.querySelector(EXT_ROOT_SELECTOR));
  }
  function translateAll(){
    mountAll();
    extensionRoots().forEach(function(root){ translateNode(root); });
    refreshButtons();
  }
  function setLanguage(lang){
    current = LANGS[lang] ? lang : "pt-BR";
    try { chrome.storage.local.set(Object.assign({}, { [STORE_KEY]: current })); } catch(e) {}
    translateAll();
  }
  function speechLang(){ return current; }
  function init(){
    index();
    try {
      chrome.storage.local.get([STORE_KEY], function(res){
        current = LANGS[res[STORE_KEY]] ? res[STORE_KEY] : detect();
        translateAll();
      });
      chrome.storage.onChanged.addListener(function(changes, area){
        if(area === "local" && changes[STORE_KEY] && LANGS[changes[STORE_KEY].newValue]){
          current = changes[STORE_KEY].newValue;
          translateAll();
        }
      });
    } catch(e) {
      current = detect();
      translateAll();
    }
    var obsTimer = null;
    var obs = new MutationObserver(function(muts){
      if(applying) return;
      var touchedExtension = false;
      muts.forEach(function(m){
        if(touchedExtension) return;
        if(m.type === "characterData") touchedExtension = isExtensionNode(m.target);
        if(!touchedExtension && m.addedNodes){
          Array.prototype.forEach.call(m.addedNodes, function(n){
            if(!touchedExtension && (n.nodeType === 1 || n.nodeType === 3)) touchedExtension = isExtensionNode(n);
          });
        }
      });
      if(!touchedExtension) return;
      clearTimeout(obsTimer);
      obsTimer = setTimeout(function(){ translateAll(); }, 60);
    });
    obs.observe(document.documentElement, { childList:true, subtree:true, characterData:true });
  }
  window.QLI18N = { init:init, localize:localize, translate:translateNode, translateAll:translateAll, mountAll:mountAll, setLanguage:setLanguage, speechLang:speechLang, prompt:prompt };
  if(document.readyState === "loading") document.addEventListener("DOMContentLoaded", init);
  else setTimeout(init, 0);
})();

