Sexy.ai Useful tools

Adds useful tools to the Sexy.AI❤️ image generator. [🔠Dynamic Prompts]. [📚Complete Tags feature], [🔎Search images by Index], [🔓Generate Button Always Enabled], [🔁Undo/Redo Button], [🖼️Keeps Images Feature] and more

// ==UserScript==
// @name    Sexy.ai Useful tools
// @name:af Sexy.ai Nuttige gereedskap
// @name:ak Sexy.ai Nnwinnade a mfaso wɔ so
// @name:sq Sexy.ai Mjete të dobishme
// @name:am Sexy.ai ጠቃሚ መሳሪያዎች
// @name:ar sexy.ai أدوات مفيدة
// @name:hy Sexy.ai Օգտակար գործիքներ
// @name:az Sexy.ai Faydalı alətlər
// @name:eu Sexy.ai Tresna erabilgarriak
// @name:be Sexy.ai Карысныя інструменты
// @name:bn Sexy.ai দরকারী টুলস
// @name:bh सेक्सी डॉट आई उपयोगी उपकरण बा
// @name:bs Sexy.ai Korisni alati
// @name:bg Sexy.ai Полезни инструменти
// @name:km Sexy.ai ឧបករណ៍មានប្រយោជន៍
// @name:ca Sexy.ai Eines útils
// @name:ny Sexy.ai Zida zothandiza
// @name:zh sexy.ai 有用的工具
// @name:co Sexy.ai Strumenti utili
// @name:hr Sexy.ai Korisni alati
// @name:cs Sexy.ai Užitečné nástroje
// @name:da Sexy.ai Nyttige værktøjer
// @name:nl Sexy.ai Handige hulpmiddelen
// @name:en Sexy.ai Useful tools
// @name:eo Sexy.ai Utilaj iloj
// @name:et Sexy.ai Kasulikud tööriistad
// @name:ee Sexy.ai Dɔwɔnu siwo ŋu viɖe le
// @name:tl Sexy.ai Mga kapaki-pakinabang na tool
// @name:fi Sexy.ai Hyödyllisiä työkaluja
// @name:fr Sexy.ai Outils utiles
// @name:fy Sexy.ai Nuttige ark
// @name:gl Sexy.ai Ferramentas útiles
// @name:ka Sexy.ai სასარგებლო ინსტრუმენტები
// @name:de Sexy.ai Nützliche Tools
// @name:el Sexy.ai Χρήσιμα εργαλεία
// @name:gn Sexy.ai Tembipurukuéra ideprovéchova
// @name:gu Sexy.ai ઉપયોગી સાધનો
// @name:ht Sexy.ai Zouti itil
// @name:ha Sexy.ai Kayan aiki masu amfani
// @name:haw    Sexy.ai Mea hana pono
// @name:iw Sexy.ai כלים שימושיים
// @name:hi सेक्सी.एआई उपयोगी उपकरण
// @name:hu Sexy.ai Hasznos eszközök
// @name:is Sexy.ai Gagnleg verkfæri
// @name:ig Ngwa sexy.ai bara uru
// @name:id Sexy.ai Alat yang berguna
// @name:ga Sexy.ai Uirlisí úsáideacha
// @name:it Sexy.ai Strumenti utili
// @name:ja sexy.ai 便利ツール
// @name:jw Sexy.ai Alat sing migunani
// @name:kn Sexy.ai ಉಪಯುಕ್ತ ಪರಿಕರಗಳು
// @name:kk Sexy.ai Пайдалы құралдар
// @name:rw Igitsina.ai Ibikoresho byingirakamaro
// @name:ko Sexy.ai 유용한 도구
// @name:kri    Sexy.ai Yuzful tul dɛn
// @name:ku Sexy.ai Amûrên bikêrhatî
// @name:ckb    Sexy.ai ئامرازی بەسوود
// @name:ky Sexy.ai Пайдалуу куралдар
// @name:lo Sexy.ai ເຄື່ອງມືທີ່ເປັນປະໂຫຍດ
// @name:la Sexy.ai instrumenta utilia
// @name:lv Sexy.ai Noderīgi rīki
// @name:ln Sexy.ai Bisaleli ya ntina
// @name:lt Sexy.ai Naudingos priemonės
// @name:lg Sexy.ai Ebikozesebwa eby'omugaso
// @name:mk Sexy.ai Корисни алатки
// @name:mg Sexy.ai Fitaovana ilaina
// @name:ms Sexy.ai Alat yang berguna
// @name:ml Sexy.ai ഉപയോഗപ്രദമായ ഉപകരണങ്ങൾ
// @name:mt Sexy.ai Għodda utli
// @name:mi Sexy.ai Nga taputapu whai hua
// @name:mr Sexy.ai उपयुक्त साधने
// @name:mo Sexy.ai Instrumente utile
// @name:mn Sexy.ai Хэрэгтэй хэрэгслүүд
// @name:sr "Sexy.ai" Корисни алати
// @name:ne Sexy.ai उपयोगी उपकरण
// @name:nso    Sexy.ai Didirišwa tše di nago le mohola
// @name:no Sexy.ai Nyttige verktøy
// @name:or Sexy.ai ଉପଯୋଗୀ ଉପକରଣଗୁଡ଼ିକ |
// @name:om Sexy.ai Meeshaalee faayidaa qaban
// @name:ps Sexy.ai ګټورې وسیلې
// @name:fa Sexy.ai ابزارهای مفید
// @name:pl Sexi.ai Przydatne narzędzia
// @name:pt      Sexy.ai Ferramentas uteis
// @name:pt-BR   Sexy.ai Ferramentas uteis
// @name:pt-PT   Sexy.ai Ferramentas uteis
// @name:pa Sexy.ai ګټورې وسیلې
// @name:qu Sexy.ai Allin yanapakuykuna
// @name:ro Sexy.ai Instrumente utile
// @name:ru Sexy.ai Полезные инструменты
// @name:gd Sexy.ai Innealan feumail
// @name:sr "Sexy.ai" Корисни алати
// @name:sh "Sexy.ai" Корисни алати
// @name:st Sexy.ai Lisebelisoa tse molemo
// @name:sn Sexy.ai Zvishandiso zvinobatsira
// @name:sd Sexy.ai مفيد اوزار
// @name:si Sexy.ai ප්‍රයෝජනවත් මෙවලම්
// @name:sk Sexy.ai Užitočné nástroje
// @name:sl Sexy.ai Uporabna orodja
// @name:so Sexy.ai Qalab waxtar leh
// @name:es Sexy.ai Herramientas útiles
// @name:su Sexy.ai parabot mangpaat
// @name:sw Sexy.ai Zana muhimu
// @name:sv Sexy.ai Användbara verktyg
// @name:tg Sexy.ai Воситаҳои муфид
// @name:ta Sexy.ai பயனுள்ள கருவிகள்
// @name:tt Sexy.ai Файдалы кораллар
// @name:te Sexy.ai ఉపయోగకరమైన సాధనాలు
// @name:th Sexy.ai เครื่องมือที่มีประโยชน์
// @name:ti Sexy.ai ጠቐምቲ መሳርሒታት
// @name:tr Sexy.ai Faydalı araçlar
// @name:tk Sexy.ai Peýdaly gurallar
// @name:tw Sexy.ai Nnwinnade a mfaso wɔ so
// @name:ug Sexy.ai پايدىلىق قوراللار
// @name:uk Sexy.ai Корисні інструменти
// @name:ur Sexy.ai مفید ٹولز
// @name:uz Sexy.ai Foydali vositalar
// @name:vi Sexy.ai Công cụ hữu ích
// @name:cy Sexy.ai Offer defnyddiol
// @name:xh Sexy.ai Izixhobo eziluncedo
// @name:yi Sexy.ai נוציק מכשירים
// @name:yo Sexy.ai Awọn irinṣẹ Wulo
// @name:zu Sexy.ai Amathuluzi awusizo
// @description     Adds useful tools to the Sexy.AI❤️ image generator. [🔠Dynamic Prompts]. [📚Complete Tags feature], [🔎Search images by Index], [🔓Generate Button Always Enabled], [🔁Undo/Redo Button], [🖼️Keeps Images Feature] and more
// @description:af  'n Skrip wat gemaak is om nuwe gereedskap by Sexy.ai te voeg.
// @description:ak  Script a wɔayɛ sɛ wɔde nnwinnade foforo bɛka Sexy.ai ho.
// @description:sq  Një skenar i krijuar për të shtuar mjete të reja në Sexy.ai.
// @description:am  አዲስ መሳሪያዎችን ወደ Sexy.ai ለመጨመር የተሰራ ስክሪፕት።
// @description:ar  يضيف أدوات مفيدة لصانع الصور المثيرة. [تحذيرات ديناميكية]. [ميزة إكمال العلامة]، [البحث عن الصور حسب الفهرس]، [إنشاء زر يعمل دائمًا]، [زر تراجع/إعادة]، [ميزة الاحتفاظ بالصور] والمزيد
// @description:hy  Սցենար՝ ստեղծված Sexy.ai-ում նոր գործիքներ ավելացնելու համար:
// @description:az  Sexy.ai-ə yeni alətlər əlavə etmək üçün hazırlanmış skript.
// @description:eu  Sexy.ai-ri tresna berriak gehitzeko egindako gidoia.
// @description:be  Скрыпт для дадання новых інструментаў у Sexy.ai.
// @description:bn  Sexy.ai-তে নতুন টুল যোগ করার জন্য তৈরি একটি স্ক্রিপ্ট।
// @description:bh  सेक्सी डॉट एआई में नया टूल जोड़े खातिर बनावल एगो स्क्रिप्ट।
// @description:bs  Skripta napravljena za dodavanje novih alata na Sexy.ai.
// @description:bg  Скрипт, създаден за добавяне на нови инструменти към Sexy.ai.
// @description:km  ស្គ្រីបដែលបង្កើតឡើងដើម្បីបន្ថែមឧបករណ៍ថ្មីទៅកាន់ Sexy.ai ។
// @description:ca  Un script fet per afegir noves eines a Sexy.ai.
// @description:ny  Zolemba zopangidwa kuti muwonjezere zida zatsopano ku Sexy.ai.
// @description:zh  为 Sex.AI❤️ 图像生成器添加了有用的工具。 [🔠动态提示]。 [📚填充标签功能]、[🔎按索引搜索图像]、[🔓生成按钮始终开启]、[🔁撤消/重做按钮]、[🖼️保留图像功能]等等
// @description:co  Un script fattu per aghjunghje novi strumenti à Sexy.ai.
// @description:hr  Skripta napravljena za dodavanje novih alata u Sexy.ai.
// @description:cs  Skript vytvořený pro přidání nových nástrojů do Sexy.ai.
// @description:da  Et script lavet for at tilføje nye værktøjer til Sexy.ai.
// @description:nl  Een script gemaakt om nieuwe tools toe te voegen aan Sexy.ai.
// @description:en  A script made to add new tools to Sexy.ai.
// @description:eo  Skripto farita por aldoni novajn ilojn al Sexy.ai.
// @description:et  Skript, mis on loodud Sexy.ai uute tööriistade lisamiseks.
// @description:ee  Script si wowɔ be woatsɔ dɔwɔnu yeyewo akpe ɖe Sexy.ai ŋu.
// @description:tl  Isang script na ginawa upang magdagdag ng mga bagong tool sa Sexy.ai.
// @description:fi  Skripti, joka on tehty uusien työkalujen lisäämiseksi Sexy.ai:iin.
// @description:fr  Ajoute des outils utiles au générateur d'images Sexy.AI❤️. [🔠Prompts dynamiques]. [📚Fonctionnalité de complétion des balises], [🔎Rechercher des images par index], [🔓Bouton Générer toujours activé], [🔁Bouton Annuler/Rétablir], [🖼️Conserve la fonctionnalité des images] et plus encore
// @description:fy  In skript makke om nije ark ta te foegjen oan Sexy.ai.
// @description:gl  Un guión feito para engadir novas ferramentas a Sexy.ai.
// @description:ka  სკრიპტი შექმნილია Sexy.ai-ზე ახალი ინსტრუმენტების დასამატებლად.
// @description:de  Fügt dem Sexy.AI❤️-Bildgenerator nützliche Tools hinzu. [🔠Dynamische Eingabeaufforderungen]. [📚Complete-Tags-Funktion], [🔎Bilder nach Index suchen], [🔓Generate-Schaltfläche immer aktiviert], [🔁Rückgängig-/Wiederholen-Schaltfläche], [🖼️Bilder-Funktion beibehalten] und mehr
// @description:el  Ένα σενάριο που δημιουργήθηκε για να προσθέσει νέα εργαλεία στο Sexy.ai.
// @description:gn  Peteĩ script ojejapóva oñembojoapy hag̃ua tembipuru pyahu Sexy.ai-pe.
// @description:gu  Sexy.ai માં નવા સાધનો ઉમેરવા માટે બનાવેલ સ્ક્રિપ્ટ.
// @description:ht  Yon script ki fèt pou ajoute nouvo zouti nan Sexy.ai.
// @description:ha  Rubutun da aka yi don ƙara sabbin kayan aiki zuwa Sexy.ai.
// @description:haw He palapala i hana ʻia e hoʻohui i nā mea hana hou iā Sexy.ai.
// @description:iw  סקריפט שנוצר כדי להוסיף כלים חדשים ל- Sexy.ai.
// @description:hi  सेक्सी.एआई❤️ छवि जनरेटर में उपयोगी उपकरण जोड़ता है। [🔠गतिशील संकेत]। [📚टैग पूर्णता सुविधा], [🔎सूचकांक द्वारा छवियां खोजें], [🔓जनरेट बटन हमेशा सक्षम], [🔁पूर्ववत करें/फिर से करें बटन], [🖼️छवियां सुविधा रखता है] और भी बहुत कुछ
// @description:hu  A Sexy.ai új eszközök hozzáadására készült szkript.
// @description:is  Handrit gert til að bæta nýjum verkfærum við Sexy.ai.
// @description:ig  Edemede emere ka ịgbakwunye ngwaọrụ ọhụrụ na Sexy.ai.
// @description:id  Sebuah skrip dibuat untuk menambahkan alat baru ke Sexy.ai.
// @description:ga  Script déanta chun uirlisí nua a chur le Sexy.ai.
// @description:it  Aggiunge strumenti utili al generatore di immagini Sexy.AI❤️. [🔠Suggerimenti dinamici]. [📚Funzione Completamento tag], [🔎Cerca immagini per indice], [🔓Pulsante Genera sempre abilitato], [🔁Pulsante Annulla/Ripeti], [🖼️Funzione Mantieni immagini] e altro ancora
// @description:ja  sexy.AI❤️ 画像ジェネレーターに便利なツールを追加します。 [🔠動的なプロンプト]。 [📚टैग पूरा करने का कार्य]、[🔎インデックスによる画像検索]、[🔓生成ボタンを常に有効にする]、[🔁元に戻す/やり直しボタン]、[🖼️画像保持機能] など
// @description:jw  Skrip sing digawe kanggo nambah alat anyar menyang Sexy.ai.
// @description:kn  Sexy.ai ಗೆ ಹೊಸ ಪರಿಕರಗಳನ್ನು ಸೇರಿಸಲು ಮಾಡಿದ ಸ್ಕ್ರಿಪ್ಟ್.
// @description:kk  Sexy.ai сайтына жаңа құралдар қосу үшін жасалған сценарий.
// @description:rw  Inyandiko yakozwe kugirango yongere ibikoresho bishya kuri Sexy.ai.
// @description:ko  Sex.ai에 새로운 도구를 추가하기 위해 만들어진 스크립트입니다.
// @description:kri Wan skript we dɛn mek fɔ ad nyu tul dɛn to Sexy.ai.
// @description:ku  Nivîsarek hatî çêkirin ku amûrên nû li Sexy.ai zêde bike.
// @description:ckb سکریپتێک کە بۆ زیادکردنی ئامرازی نوێ بۆ Sexy.ai دروستکراوە.
// @description:ky  Sexy.ai сайтына жаңы куралдарды кошуу үчүн жасалган скрипт.
// @description:lo  ສະຄຣິບທີ່ສ້າງຂຶ້ນເພື່ອເພີ່ມເຄື່ອງມືໃໝ່ໃສ່ Sexy.ai.
// @description:la  Scriptum est nova instrumenta addere Sexy.ai.
// @description:lv  Skripts, kas izveidots, lai vietnei Sexy.ai pievienotu jaunus rīkus.
// @description:ln  Script oyo esalemi mpo na kobakisa bisaleli ya sika na Sexy.ai.
// @description:lt  Scenarijus, skirtas pridėti naujų įrankių prie Sexy.ai.
// @description:lg  Script ekoleddwa okwongera ebikozesebwa ebipya ku Sexy.ai.
// @description:mk  Скрипта направена за додавање нови алатки на Sexy.ai.
// @description:mg  Script natao hanampiana fitaovana vaovao amin'ny Sexy.ai.
// @description:ms  Skrip yang dibuat untuk menambah alatan baharu pada Sexy.ai.
// @description:ml  Sexy.ai-യിലേക്ക് പുതിയ ടൂളുകൾ ചേർക്കാൻ തയ്യാറാക്കിയ സ്‌ക്രിപ്റ്റ്.
// @description:mt  Skript magħmul biex iżżid għodod ġodda ma' Sexy.ai.
// @description:mi  He tuhinga hei taapiri taputapu hou ki Sexy.ai.
// @description:mr  Sexy.ai वर नवीन साधने जोडण्यासाठी बनवलेली स्क्रिप्ट.
// @description:mo  Un script creat pentru a adăuga noi instrumente la Sexy.ai.
// @description:mn  Sexy.ai-д шинэ хэрэгсэл нэмэх скрипт.
// @description:sr  Скрипта направљена за додавање нових алата на Секи.аи.
// @description:ne  Sexy.ai मा नयाँ उपकरणहरू थप्नको लागि बनाइएको स्क्रिप्ट।
// @description:nso Sengwalwa se se dirilwego go oketša didirišwa tše mpsha go Sexy.ai.
// @description:no  Et skript laget for å legge til nye verktøy til Sexy.ai.
// @description:or  Sexy.ai ରେ ନୂତନ ଉପକରଣ ଯୋଗ କରିବାକୁ ଏକ ସ୍କ୍ରିପ୍ଟ ତିଆରି |
// @description:om  Iskiriiptii meeshaalee haaraa Sexy.ai irratti dabaluudhaaf hojjetame.
// @description:ps  یو سکریپټ چې په Sexy.ai کې د نوي وسیلو اضافه کولو لپاره جوړ شوی.
// @description:fa  اسکریپتی که برای افزودن ابزارهای جدید به Sexy.ai ساخته شده است.
// @description:pl  Skrypt stworzony w celu dodania nowych narzędzi do Sexi.ai.
// @description:pt      Adiciona ferramentas úteis ao gerador de imagens Sexy.AI❤️. [🔠Prompts Dinâmicos]. [📚Recurso Completar Tags], [🔎Pesquisar imagens por índice], [🔓Botão Gerar sempre ativado], [🔁Botão Desfazer/Refazer], [🖼️Recurso Manter Imagens] e muito mais
// @description:pt-BR   Adiciona ferramentas úteis ao gerador de imagens Sexy.AI❤️. [🔠Prompts Dinâmicos]. [📚Recurso Completar Tags], [🔎Pesquisar imagens por índice], [🔓Botão Gerar sempre ativado], [🔁Botão Desfazer/Refazer], [🖼️Recurso Manter Imagens] e muito mais
// @description:pt-PT   Adiciona ferramentas úteis ao gerador de imagens Sexy.AI❤️. [🔠Prompts Dinâmicos]. [📚Recurso Completar Tags], [🔎Pesquisar imagens por índice], [🔓Botão Gerar sempre ativado], [🔁Botão Desfazer/Refazer], [🖼️Recurso Manter Imagens] e muito mais
// @description:pa  Sexy.ai ਵਿੱਚ ਨਵੇਂ ਟੂਲ ਜੋੜਨ ਲਈ ਬਣਾਈ ਗਈ ਇੱਕ ਸਕ੍ਰਿਪਟ।
// @description:qu  Sexy.ai nisqaman musuq yanapakuykunata yapanapaq ruwasqa qillqa.
// @description:ro  Un script creat pentru a adăuga noi instrumente la Sexy.ai.
// @description:ru  Добавляет полезные инструменты в генератор изображений Sexy.AI❤️. [🔠Динамические подсказки]. [📚Функция завершения тегов], [🔎Поиск изображений по индексу], [🔓Кнопка «Создать всегда включена»], [🔁Кнопка «Отменить/Повторить»], [🖼️Функция сохранения изображений] и многое другое
// @description:gd  Sgriobt air a dhèanamh gus innealan ùra a chur ri Sexy.ai.
// @description:sr  Скрипта направљена за додавање нових алата на Секи.аи.
// @description:sh  Скрипта направљена за додавање нових алата на Секи.аи.
// @description:st  Script e entsoeng ho kenya lisebelisoa tse ncha ho Sexy.ai.
// @description:sn  Chinyorwa chakagadzirwa kuwedzera zvishandiso zvitsva kuSexy.ai.
// @description:sd  Sexy.ai ۾ نوان اوزار شامل ڪرڻ لاءِ ٺهيل اسڪرپٽ.
// @description:si  Sexy.ai වෙත නව මෙවලම් එක් කිරීමට සාදන ලද ස්ක්‍රිප්ට් එකක්.
// @description:sk  Skript vytvorený na pridanie nových nástrojov do Sexy.ai.
// @description:sl  Skript za dodajanje novih orodij v Sexy.ai.
// @description:so  Qoraal loo sameeyay in lagu daro qalab cusub Sexy.ai.
// @description:es  Agrega herramientas útiles al generador de imágenes Sexy.AI❤️. [🔠Prompts dinámicos]. [📚Función completar etiquetas], [🔎Buscar imágenes por índice], [🔓Botón Generar siempre habilitado], [🔁Botón Deshacer/Rehacer], [🖼️Función Mantener imágenes] y más
// @description:su  A skrip dijieun pikeun nambahkeun parabot anyar pikeun Sexy.ai.
// @description:sw  Hati iliyoundwa ili kuongeza zana mpya kwa Sexy.ai.
// @description:sv  Ett skript gjort för att lägga till nya verktyg till Sexy.ai.
// @description:tg  Скрипт барои илова кардани абзорҳои нав ба Sexy.ai сохта шудааст.
// @description:ta  Sexy.ai இல் புதிய கருவிகளைச் சேர்ப்பதற்காக உருவாக்கப்பட்ட ஸ்கிரிப்ட்.
// @description:tt  Sexy.ai'ка яңа кораллар өстәү өчен ясалган сценарий.
// @description:te  Sexy.aiకి కొత్త సాధనాలను జోడించడానికి రూపొందించిన స్క్రిప్ట్.
// @description:th  สคริปต์ที่สร้างขึ้นเพื่อเพิ่มเครื่องมือใหม่ให้กับ Sexy.ai
// @description:ti  ኣብ Sexy.ai ሓደስቲ መሳርሒታት ንምውሳኽ ዝተሰርሐ ስክሪፕት።
// @description:tr  Sexy.ai'ye yeni araçlar eklemek için hazırlanmış bir komut dosyası.
// @description:tk  Sexy.ai-a täze gurallary goşmak üçin ýasalan skript.
// @description:tw  Script a wɔayɛ sɛ wɔde nnwinnade foforo bɛka Sexy.ai ho.
// @description:ug  Sexy.ai غا يېڭى قوراللارنى قوشۇش ئۈچۈن ياسالغان قوليازما.
// @description:uk  Скрипт, створений для додавання нових інструментів до Sexy.ai.
// @description:ur  Sexy.ai میں نئے ٹولز شامل کرنے کے لیے بنائی گئی اسکرپٹ۔
// @description:uz  Sexy.ai-ga yangi vositalarni qo'shish uchun yaratilgan skript.
// @description:vi  Một tập lệnh được tạo để thêm các công cụ mới vào sexy.ai.
// @description:cy  Sgript a wnaed i ychwanegu offer newydd i Sexy.ai.
// @description:xh  Iskripthi esenziwe ukongeza izixhobo ezitsha kwi-Sexy.ai.
// @description:yi  א שריפט געמאכט צו לייגן נייַע מכשירים צו Sexy.ai.
// @description:yo  Iwe afọwọkọ ti a ṣe lati ṣafikun awọn irinṣẹ tuntun si Sexy.ai.
// @description:zu  Iskripthi esenziwe ukwengeza amathuluzi amasha ku-Sexy.ai.
// @namespace    http://tampermonkey.net/
// @version      6.01
// @author       Zlajoyast (Pedro)
// @match        https://sexy.ai/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=sexy.ai
// @run-at document-body
// @license      MIT
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       GM_deleteValue
// @grant       GM_xmlhttpRequest
// @grant       GM_registerMenuCommand
// ==/UserScript==

(function () {
    'use strict';
    // TAG LIST CONFIGURATION
    var Tag_Lists = [
        // TITLE | LINK | CACHE
        ["Current (With updates)", "https://drive.google.com/uc?id=1uR_hEn_6BQz3gP4gO0nhVfF9TY97JSNP"],
        ["v6 - 686.000 Tags", "https://drive.google.com/uc?id=1S_bpo03506xzL4BK3w0rVsKs1IlDlnnE"],
        ["v5.01 - 55.212 Tags", "https://drive.google.com/uc?id=1IvdzH-dqEhLTRHxb3qygilB5qNgkxFI4"],
        ["v5.01 - 55.212 Tags  - (A-Z) Order", "https://drive.google.com/uc?id=1Jau11-gLnj8uGahwN40aSXIXQR65WreF"],
        ["v4.2 - 49.932 Tags", "https://drive.google.com/uc?id=13c0C_s9-5QVYwl3i8s0qi_f-gAkI-BRR"],
        ["v4 - 51.599 Tags", "https://drive.google.com/uc?id=1sBIzm7sodgLK-rLs6h05cbetbfLAHVHT"],
        ["v2 - 58.733 Tags", "https://drive.google.com/uc?id=1D7nFgL2vWCvs9LaDaSpuL1hOAHxWah2h"],
        ["v1.1 - 7.886 Tags - (A-Z) Order", "https://drive.google.com/uc?id=15yoHnDY9IAOatcH_IdqOd08Q60xz-AkR"],
        ["v1 - 9.018 Tags", "https://drive.google.com/uc?id=1hU-_CMV0BTGEIVC-cHy2RCgguCmxZ97P"],
        [""],
        ["E621 Tags - 148.030 Tags", "https://drive.google.com/uc?id=10RwpMKBkwTeotMA4Durs-3mT7aIGPlP5"],
        ["Danbooru Tags - 14.080 Tags", "https://drive.google.com/uc?id=1Z3WUZF7U2D1vKuJBH51ancND2o7R9uAy"],
        ["Rule34 Tags - 658.206 Tags", "https://drive.google.com/uc?id=1EB8GZYc7up0bPzg7tZ9PQXk0abpx_ETV"],
        [""],
        ["Animal Species + Pokemons - 2.290 Tags", "https://drive.google.com/uc?id=1LGrHe-PCnEPkOdarfYVIkl8yHszsBu1r"],
        ["E621 Character Species - 59.777 Tags", "https://drive.google.com/uc?id=1WJ7rs-Ns-gb-Pwc3whAs6Ef47meibkOd"],
        ["Fictional Characters - 504 Tags", "https://drive.google.com/uc?id=167FbFD0DkHXCfLiU77-coYqND66TJxc-"],
        ["Real Characters - 408 Tags", "https://drive.google.com/uc?id=1tRVgpemKiWomhdY3uoJwpTVjYU_XsaP2"],
        [""],
        ["E621 Artists - 7.374 Tags [use 'by ...']", "https://drive.google.com/uc?id=1v_GRcB0S67yOS1ZUOUW7CN1PsDgYZ-Bv"],
        [""],
        ["{CUSTOM LINK}", "CL"],
        [""],
        // ["New Link", "https://drive.google.com/uc?id="],
    ]
    // CODE
    function getElementByXpath(path, elem = undefined) {
        let e = elem;
        if (e == undefined)
            e = document
        return document.evaluate(path, e, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    }
    function getElementsByXpath(path, elem = undefined) {
        let e = elem;
        if (e == undefined)
            e = document
        var nodes = document.evaluate(path, e, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
        var result = [];
        for (var i = 0; i < nodes.snapshotLength; i++) {
            result.push(nodes.snapshotItem(i));
        }
        return result;
    }
    function add_button(element, text, size, tooltip, onclick_func, enabled = false) { // ADICIONA BOTÕES NA UI
        let b = document.createElement("span");
        if (size[2] == undefined) {
            {
                if (size[0] == 0)
                    size[0] = "100%";
                else
                    size[0] += "px";
                if (size[1] == 0)
                    size[1] = "100%";
                else
                    size[1] += "px";
                b.style = "width: " + size[0] + ";height:" + size[1] + ";margin: 0 1px;cursor:pointer;";
            }
        } else {
            if (size[2] == "locked")
                b.style = "min-width: " + size[0] + "px;min-height:" + size[1] + "px;max-width:" + size[0] + "px;max-height:" + size[1] + "px;margin: 1 1px;cursor:pointer;";
        }
        b.innerText = text;
        if (enabled)
            b.classList = C_SA2;
        else
            b.classList = C_SA;
        b.title = tooltip;
        b.onclick = onclick_func;
        element.append(b);
        return b;
    }
    function createOptions(selectelem, list) { // CRIA OPÇÕES
        list.forEach((a, i) => {
            let _op = document.createElement("option");
            _op.value = i; _op.innerHTML = a[0];
            selectelem.append(_op);
        });
    }
    // Ele filtra o texto para retornar apenas a palavra, remove sintaxes do stable diffusion como "()", "[]", "{}", e os pesos ":x.x"
    String.prototype.sdfilter = function () {
        // Na primeira parte ele remove qualquer caractere que contem ()[]{}
        // Na segunda parte ele remove o que tiver ":X.X"
        // Na terceira parte remove ":X"
        // na quarta remove o caractere ":"
        return this.toString().replace(/[\(\)\[\]\{\}]|\:[\d]+\.[\d]+|\:[\d]+\.?|\:/gm, "").trim().toLowerCase(); // Retorna apenas a tag
    };
    String.prototype.dynamicPrompts = function () {
        return ApplyDynamicsPrompt(this.toString());
    };
    String.prototype.replaceAt = function (index, replacement) {
        return this.substring(0, index) + replacement + this.substring(index + replacement.length);
    }
    function getModelCode(e) { // OBTEM O CODIGO DO MODELO
        switch (e) {
            case "SDXL (SFW)":
                return "sdxl_base_r2";
            case "Realistic [Empower]":
                return "model1";
            case "Realistic / Porn [PornMerge]":
                return "model2";
            case "Realistic / Artistic [Deliberate]":
                return "model3";
            case "Hentai / Anime  [BOM]":
                return "model4";
            case "Furry":
                return "furry";
            case "Homoerotic V2 [Realistic Men]":
                return "model6";
            case "Reliberate":
                return "model7";
            case "Realistic Vision":
                return "model8";
            case "DreamShaper":
                return "model9";
            case "Babes":
                return "model10";
            case "Epic Photo Gasm v31":
                return "epicphotogasm_v31Getwhatyouprompt";
            case "Yiffy Mix v34":
                return "yiffymix_v34";
            case "Real Cartoon 3D v8":
                return "realcartoon3d_v8";
            case "Art Universe v80":
                return "artUniverse_v80";
            case "Virile Reality v30":
                return "virileReality_v30BETA2";
            case "Cyber Realistic v33":
                return "cyberrealistic_v33";
            case "Ghostmix v20":
                return "ghostmix_v20Bakedvae";
            case "revAnimated v122":
                return "revAnimated_v122EOL";
            case "Buxom Brits V12":
                return "buxomBritsV12_v10";
            case "Transformix v10":
                return "transformix_v10";
            case "vrPorn v30":
                return "vrPorn_v30";
            case "Dreamshaper Pixel Art v10":
                return "dreamshaperPixelart_v10";
            case "Hassaku Hentai v13":
                return "hassakuHentaiModel_v13";
            case "EpicRealism Natural Sin":
                return "epicrealism_naturalSin";
            case "Fantasymix v11":
                return "fantasymix_v11";
            case "Realistic Vision v51":
                return "realisticVisionV51_v51VAE";
            case "Animated [Beta]":
                return "ad_v1";
            case "1 - Shirt Lift | Titty Flash":
                return "vid1";
            case "2 - Shirt Lift 2 | Titty Flash 2":
                return "vid2";
            case "3 - Deep Throat BJ":
                return "vid3";
            case "4 - Hair Pull BJ":
                return "vid4";
            case "5 - Solo Titty Love":
                return "vid5";
            case "6 - Doggie Style Begging":
                return "vid6";
            case "7 - Throat Fucking | Forced BJ":
                return "vid7";
            case "Sofa Sex":
                return "vid8";
            case "Best Titty Fuck":
                return "vid10";
            default:
                return ""
        }
    }
    function getModelName(e) { // OBTEM O NOME DO MODELO
        switch (e) {
            case "ad_v1":
                return "Animated (beta)";
            case "sdxl_base_r2":
                return "SDXL";
            case "model2":
                return "Pornmerge";
            case "model3":
                return "Deliberate";
            case "model1":
                return "Empower";
            case "model4":
                return "BOM";
            case "model6":
                return "Homoerotic";
            case "furry":
                return "Furry";
            case "model7":
                return "Reliberate";
            case "model8":
                return "Realistic Vision";
            case "model9":
                return "DreamShaper";
            case "model10":
                return "Babes";
            case "epicphotogasm_v31Getwhatyouprompt":
                return "epiCPhotoGasm";
            case "yiffymix_v34":
                return "YiffyMix";
            case "realcartoon3d_v8":
                return "RealCartoon3D";
            case "artUniverse_v80":
                return "Art Universe";
            case "virileReality_v30BETA2":
                return "Virile Reality";
            case "cyberrealistic_v33":
                return "CyberRealistic";
            case "ghostmix_v20Bakedvae":
                return "GhostMix";
            case "revAnimated_v122EOL":
                return "ReV Animated";
            case "buxomBritsV12_v10":
                return "Buxom Brits";
            case "transformix_v10":
                return "Transformix";
            case "vrPorn_v30":
                return "VR Porn";
            case "dreamshaperPixelart_v10":
                return "Dreamshaper PixelArt";
            case "hassakuHentaiModel_v13":
                return "Hassaku Hentai";
            case "epicrealism_naturalSin":
                return "ER Natural Sin";
            case "fantasymix_v11":
                return "FantasyMix";
            case "realisticVisionV51_v51VAE":
                return "Realistic Vision V51";
            default:
                return ""
        }
    }
    // Url
    var u = window.document.URL;
    // CAIXA AVANÇADA ABERTA PELA PRIMEIRA VEZ
    var first_open = false;
    var floating_tl = false;
    // CONFIGURAÇÕES PADRÃO DO SCRIPT
    window.document.SXConfig = () => { return Config };
    var Config = {
        Selected_Model: "model3", // Modelo Selecionado
        Selected_Tag_List: 0, // Index da Lista de Tags
        Keep_Image: false, // Bool de manter imagens
        Tag_List_Display_Index: 0, // Display da lista de tags inline e view 
        Custom_List_Link: undefined, // Link customizado da lista de tags
        Auto_Minifier: false, // Auto Minificador
        WeightNumber: true, // Bool de fazer adicionar numeros no peso da palavra chave
        delay: 1000, // Atraso do Script
        list_size: 40, // Quantidade de Tags
        UI_Order: [1, 2, 3, 4, 5, 6], // Ordem da Interface do Script
        FavoritesTags: [],
        ToggleFavorites: true, // Ativa/Desativa mostrar tags favoritas na lista de tags
        Auto_Save: true,
        Pending_Images: [], // Array de Imagens Pendentes
        Dynamic_Prompts: false,
        ToogleWildcardsTags: false,
        Enter_Generate: false,
        Notepad: "",
        Show_Noteped: false,
        Separator: ",",
        wildcards_lists: [
            ["__season__", ["summer", "autumn", "winter", "spring"]],
            ["__colors__", ["red", "green", "blue", "yellow", "black", "white"]],
            ["__example__", ["car", "bus", "{red bike|blue bike}", "airplane", "__colors__ flower"]],
        ],

    }
    var FB_start = 1000;
    var FB_end = 3000;
    // CONFIGURAÇÕES DA SEMENTE
    var GenConfig = {
        Seed: 0,
        LockSeed: false,
        Subseed: 0,
        LockSubseed: false,
        Subseed_Strength: 0,
    }
    // CACHE DA LISTA DE TAGS
    var DataList, DataList_Bkp

    var boundstore = JSON.parse(localStorage["bound-store"]);
    var totalimg = boundstore.state.user.itemCount;
    var showoptions = false;
    // OUTRAS VARIAVEIS
    var selectedarea, sw
    // CLASSE BOTÃO NORMAL
    const C_SA = "peer-disabled:opacity-70 inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground";
    // CLASSE BOTÃO ATIVO
    const C_SA2 = "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90";
    // CLASSE TEXTO
    const C_SAT = "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70";
    // CLASSE INPUT
    const C_SAI = "w-full h-10 rounded-md border border-input bg-background px-3 py-2 ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 cursor-pointer text-[16px]";
    function Initialize_Main_Script() {// COMEÇA A INICIAR O SCRIPT NA ABA (GENERATE)
        /*
        Não adicionei isso porque o botçao de "Avançado" ficaria na parte esquerda
        let title = document.getElementsByTagName("h1")[0] // OCULTA O ELEMENTO "generate"
        if (title != undefined)
            title.style.display = "none";*/

        // CONSTROI UI DA PARTE DE BAIXO QUE AMAZERNA AS IMAGENS GERADAS
        UIs.Build_Ui_Others();
        // CONSTROI A UI DE ACORDO COM A ORDEM DADA
        BuildUI();
        // DEFINE O INDICE DO MODELO SALVO
        let buttonmodels;
        try {
            buttonmodels =  getElementByXpath("//div[p[text()='Current Model:']]").children[1];
            buttonmodels.click();
        } catch {
            console.warn("Model list button not found");
        }
        
        if (buttonmodels) {
            setTimeout(() => {
                if (Config.Temp_Model) {
                    getElementByXpath(`//section/div/div[div[2][text()='${getModelName(Config.Temp_Model)}']]`).click();
                    Save_Config("Temp_Model", undefined);
                } else if (Config.Selected_Model)
                    getElementByXpath(`//section/div/div[div[2][text()='${getModelName(Config.Selected_Model)}']]`).click();
                console.log("Selected Model : " + getModelName(Config.Selected_Model));
                buttonmodels.click();
            }, 1);
        }

        // FAZ A VERIFICAÇÃO SE A CAIXA AVANÇADA FOI ABERTA
        const observer = new MutationObserver((mutationsList) => {
            for (let mutation of mutationsList) {
                if (mutation.type === 'childList') {
                    mutation.addedNodes.forEach(node => {
                        if (node.className === 'EZDrawer') {
                            console.log('Advanced Settings Open');
                            On_AdvancedSettings_Loads();
                        }
                    });
                }
            }
        });
        observer.observe(document.getElementById("image-form").children[0], { childList: true, subtree: false });
        const selected_textarea_observer = new MutationObserver((e) => {
            if (e[0].type == "childList") {
                On_Selected_Textarea_Changed();
            }
        });
        // call `observe()`, passing it the element to observe, and the options object
        selected_textarea_observer.observe(getElementByXpath("//div/div[@dir]"), {
            childList: true,
            subtree: true,
        });
        // EVENTOS NO BOTÃO GENERATE
        let gb = getElementByXpath("//button[@type='submit']");
        gb.addEventListener('click', function () {
            UpdateLabel();
            setTimeout(() => {
                if (GenConfig.LockSeed == false)
                    GenConfig.Seed = 0;
                if (GenConfig.LockSubseed == false)
                    GenConfig.Subseed = 0;
            }, 1000);
        })
        // REMOVE A PROPRIEDADE DESATIVADA
        var GenObserver = new MutationObserver(async function () {
            if (gb.getAttribute("disabled") != undefined) {
                gb.removeAttribute("disabled");
            }
        })
        GenObserver.observe(gb, {
            attributes: true,
            attributeFilter: ['disabled'],
        });
        On_Selected_Textarea_Changed();
        console.log("Loaded UI");
    }
    function BuildUI(clear = false) { // CONSTROI A UI NA ORDEM
        if (clear == true) {
            document.getElementById("ConfigUI").remove();
        }
        if (document.getElementById("ConfigUI") == null) {
            var _interface = getElementByXpath("//form[@id='image-form']");
            // O Div principal para inserir a UI do script
            let maindiv = document.createElement("div");
            maindiv.id = "ConfigUI";
            maindiv.style = "text-align:center;vertical-align: middle;";
            _interface.append(maindiv);
            _interface.insertBefore(maindiv, _interface.children[maindiv, _interface.children.length - 2])
        }
        for (let i = 0; i < Config.UI_Order.length; i++) {
            const order = Config.UI_Order[i];
            let op = order.toString().split("");
            if (order[1] == undefined) {
                orderlist[parseInt(op[0]) - 1]();
            }
        }

    }

    var UIs = { // LISTAS DE INTERFACE DO SCRIPT
        Build_Ui_Others() {
            let rangediv = getElementByXpath("//div[div[contains(@class,'mr-3')]]");
            rangediv.parentNode.parentNode.style["z-index"] = "5";
            // LABEL
            let label1 = document.createElement("span");
            label1.innerText = "vv Image storage vv"; label1.style = "display: flex;justify-content: center;"; label1.classList = C_SAT;
            // DIV PRINCIPAL
            let _divStorage = document.createElement("div");
            _divStorage.id = "DIVSTORAGE"
            _divStorage.className = "border";
            // DIV DO AMARZENAMENTO DE IMAGENS
            let emptygrid = document.createElement("div");
            emptygrid.id = "IMAGE_STORAGE";
            emptygrid.style = "display: grid; grid-template-columns: 1fr 1fr 1fr 1fr;justify-items: center;align-items: center";
            emptygrid.class = "border";
            // DIV DAS CONFIGURAÇÕES
            let div2 = document.createElement("div");
            div2.style = "display:flex;align-items: center;justify-content: center;";
            let label2 = document.createElement("span");
            label2.innerText = "Grid Column Count : ";
            label2.style = "display: flex;width:250px;padding:10px";
            label2.classList = C_SAT;
            let grid_size_setting = document.createElement("input");
            grid_size_setting.type = "range";
            grid_size_setting.min = 1;
            grid_size_setting.max = 10;
            grid_size_setting.value = 4;
            grid_size_setting.style = "width:100%";
            grid_size_setting.oninput = function () {
                emptygrid.style["grid-template-columns"] = "1fr ".repeat(grid_size_setting.value);
                rangediv.childNodes[0].childNodes[0].innerHTML = grid_size_setting.value;
            }
            // COMEÇA A ACRESCENTAR NO UI
            rangediv.append(label2)
            rangediv.append(grid_size_setting);
            rangediv.insertBefore(label2, rangediv.children[4]);
            rangediv.insertBefore(grid_size_setting, rangediv.children[5]);
            add_button(div2, "Clear all", [150, 40], "Clears all stored images", () => {
                emptygrid.innerHTML = "";
            });
            add_button(div2, "Show Options", [150, 40], "", (e) => {
                showoptions = !showoptions; e.target.className = showoptions ? C_SA2 : C_SA;
                let images = document.getElementById("IMAGE_STORAGE").children;
                for (let i = 0; i < images.length; i++) {
                    const e = images[i];
                    if (showoptions == true) {
                        e.children[0].style.display = "";
                    }
                    else {
                        e.children[0].style.display = "none";
                    }

                }
            });
            const _interface = getElementByXpath("//form[@id='image-form']");
            _divStorage.append(div2);
            _divStorage.append(label1);
            _divStorage.append(emptygrid);
            _interface.append(_divStorage);
            Check_Pending_Images();


            // CRIA TEXTAREA DO BLOCO DE ANOTAÇÕES
            let textarea = document.createElement("textarea");
            textarea.className = "flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 text-base";
            textarea.id = "NOTEPAD"
            textarea.style.height = "100px";
            textarea.placeholder = `You can use this text box to store your prompts and other notes. The text you put here will be remembered even after you've closed/refreshed this page.`
            textarea.oninput = () => {
                Save_Config("Notepad", textarea.value)
            }
            textarea.value = Config.Notepad;
            _interface.append(textarea);
            _interface.insertBefore(textarea, _interface.children[2]);
            keepimage(Config.Keep_Image);
        },
        Build_Ui_MainConfig(to_advanced = false) {
            // CRIA O DIV PRINCIPAL
            let UI_MC = document.createElement("div");
            UI_MC.id = "MAINCONFIG";
            UI_MC.style["min-height"] = "30px";
            UI_MC.className = "bg-background border";
            let divmain = document.createElement("div");
            divmain.id = "UI1";
            let div1 = document.createElement("div");
            let div2 = document.createElement("div");
            div2.style = "display:grid;grid-template-columns: 1fr 1fr 1fr;justify-items: stretch;align-items: stretch;place-items: center;";

            const _labeltitle = document.createElement("span");
            _labeltitle.innerHTML = "Main Config Box"; _labeltitle.style.display = "none";
            const _MB = document.createElement("span");
            _MB.id = "MENUBUTTON";
            _MB.style = "position:relative;display:flex;width: 30px; height: 30px; margin: 0px 1px; cursor: pointer; float: left";
            _MB.className = C_SA2;
            _MB.innerHTML = "O";
            _MB.onclick = () => {
                if (_MB.innerHTML == "-") {
                    divmain.style.display = "";
                    _labeltitle.style.display = "none";
                    _MB.className = C_SA2;
                    _MB.innerHTML = "O";
                }
                else {
                    divmain.style.display = "none";
                    _labeltitle.style.display = "";
                    _MB.className = C_SA;
                    _MB.innerHTML = "-";
                }
            };

            // CRIA OS LABELS
            let _labelTI = document.createElement("span");
            _labelTI.id = "timages"; _labelTI.innerText = "Total Images generated : Loading...";
            let _labelIC = document.createElement("span");
            _labelIC.id = "imgcount"; _labelIC.innerText = "Images generated : 0";
            div1.append(_labelTI);
            div1.append(document.createElement("br"));
            div1.append(_labelIC);
            // ADICIONA O BOTÃO DE SALVAR CONFIGURAÇÕES
            let _SB = add_button(div2, "Save Config", [0, 40], "Saves all script settings", () => {
                Save_Config();
                _SB.innerHTML = "💾 Saved 💾";
                setTimeout(() => { _SB.innerHTML = "Save Config" }, 1000);
            });
            // BOTÃO DE MANTER AS IMAGENS GERADAS
            add_button(div2, "Keep Images", [0, 40], "When activated, it will store the images generated on the current page, to avoid updating the library several times", (e) => {
                e.target.className = Config.Keep_Image ? C_SA : C_SA2; Save_Config("Keep_Image", !Config.Keep_Image); keepimage(Config.Keep_Image);
            }, Config.Keep_Image);
            // AUTO CARREGA COM AS CONFIGURAÇÕES SALVAS
            keepimage(Config.Keep_Image);
            // Auto-Save Button
            add_button(div2, "Auto-Save", [0, 40], "Saves prompt and negative prompt to local storage", (e) => {
                e.target.className = Config.Auto_Save ? C_SA : C_SA2; Save_Config("Auto_Save", !Config.Auto_Save);
            }, Config.Auto_Save);
            add_button(div2, "Press Enter to Generate", [0, 40], "When you press \"Enter\", it will generate image", (e) => {
                e.target.className = Config.Enter_Generate ? C_SA : C_SA2; Save_Config("Enter_Generate", !Config.Enter_Generate);
            }, Config.Enter_Generate);
            add_button(div2, "Image Filter", [0, 40], "Opens a box for you to configure image filters", (e) => {
                let filterui = document.getElementById("FILTERUI");
                let elem = e.currentTarget.getBoundingClientRect();
                let _x = elem.left;
                let _y = elem.top;
                if (window.mobileCheck() == false) {
                    filterui.style.transform = `translate(${_x}px,${_y + 40}px)`;
                } else {
                    filterui.style.transform = `translate(0px,${_y + 40}px)`;
                }

                if (filterui.style.display == "none") {
                    filterui.style.display = "";
                    document.body.style = "overflow:hidden;"

                }
                else {
                    filterui.style.display = "none";
                    document.body.style = "overflow:auto;"
                }
            });
            // ADICIONA NA UI
            divmain.append(div1);
            divmain.append(div2);
            UI_MC.append(_MB);
            UI_MC.append(_labeltitle);
            UI_MC.append(divmain);
            if (to_advanced)
                document.getElementById("ConfigUIAdvanced").append(UI_MC);
            else
                document.getElementById("ConfigUI").append(UI_MC);
        },
        Build_Ui_TagListBox() {
            // ADICIONA O DIV PRINCIPAL
            const _TAGLISTBOX = document.createElement("div");
            _TAGLISTBOX.id = "TAGLISTBOX";
            _TAGLISTBOX.style = "overflow: auto;min-height:30px;height:250px;resize: vertical;";
            _TAGLISTBOX.classList = "bg-background border";
            document.getElementById("ConfigUI").append(_TAGLISTBOX);

            const _TGTools = document.createElement("div");
            _TGTools.id = "TagListTools"
            _TGTools.style = "display:none;justify-items: stretch;align-items: stretch;place-items: center;";
            if (window.mobileCheck() == true) {
                _TGTools.style["grid-template-columns"] = "1fr";

            }
            else {
                _TGTools.style["grid-template-columns"] = "1fr 1fr 2fr";
            }
            const div2 = document.createElement("div");
            div2.append(_TGTools);

            const div1 = document.createElement("div");
            div1.style = "display:grid;float: left;";

            const _labeltitle = document.createElement("span");
            _labeltitle.innerHTML = "Tag List Box"; _labeltitle.style.display = "none";
            const _MB = document.createElement("span");
            _MB.id = "MENUBUTTON";
            _MB.style = "position:relative;display:flex;width: 30px; height: 30px; margin: 0px 1px; cursor: pointer; float: left";
            _MB.className = C_SA2;
            _MB.innerHTML = "O";
            _MB.onclick = () => {
                if (_MB.innerHTML == "-") {
                    div2.style.display = "";
                    _labeltitle.style.display = "none";
                    _MB.className = C_SA2;
                    _MB.innerHTML = "O";
                    _TAGLISTBOX.style.height = "250px";
                    _TAGLISTBOX.style.overflow = "auto";
                    _TAGLISTBOX.style.resize = "vertical";

                }
                else {
                    div2.style.display = "none";
                    _labeltitle.style.display = "";
                    _MB.className = C_SA;
                    _MB.innerHTML = "-";
                    _TAGLISTBOX.style.height = "30px";
                    _TAGLISTBOX.style.overflow = "hidden";
                    _TAGLISTBOX.style.resize = "";
                }
            };
            const _CM = document.createElement("span");
            _CM.id = "CONFIGMENUBUTTON";
            _CM.style = "width: 30px; height: 30px; margin: 0px 1px; cursor: pointer";
            _CM.className = C_SA;
            _CM.title = "Show/Hide settings";
            _CM.innerHTML = "⚙️";
            _CM.onclick = () => {
                if (_CM.className == C_SA) {
                    _TGTools.style.display = "grid";
                    _CM.className = C_SA2;
                }
                else {
                    _TGTools.style.display = "none";
                    _CM.className = C_SA;
                }
            };
            // FAVORITES TOOGLE BUTTON
            const _FMB = document.createElement("span");
            _FMB.id = "FAVORITETOOGLE";
            _FMB.style = "width: 30px; height: 30px; margin: 0px 1px; cursor: pointer";
            _FMB.className = Config.ToggleFavorites == true ? C_SA2 : C_SA;
            _FMB.innerHTML = "⭐";
            _FMB.title = "Make favorite tags appear in the tag list";
            _FMB.onclick = (e) => {
                e.target.className = Config.ToggleFavorites ? C_SA : C_SA2; Save_Config("ToggleFavorites", !Config.ToggleFavorites);
                ShowTags();
            };

            const _TWT = document.createElement("span");
            _TWT.id = "WILDCARDSTOOGLE";
            _TWT.style = "width: 30px; height: 30px; margin: 0px 1px; cursor: pointer";
            _TWT.className = Config.ToogleWildcardsTags == true ? C_SA2 : C_SA;
            _TWT.innerHTML = "🧾";
            _TWT.title = "Makes wildcards appear in the tag list";
            _TWT.onclick = (e) => {
                e.target.className = Config.ToogleWildcardsTags ? C_SA : C_SA2; Save_Config("ToogleWildcardsTags", !Config.ToogleWildcardsTags);
                ShowTags();
            };
            const _separatortype = document.createElement("span");
            _separatortype.id = "WILDCARDSTOOGLE";
            _separatortype.style = "width: 30px; height: 30px; margin: 0px 1px; cursor: pointer";
            _separatortype.className = C_SA;
            _separatortype.innerHTML = Config.Separator == "," ? `","` : `" "`;
            _separatortype.title = `Type of separator to split the prompt
"," : Comma
" " : Whitespaces`;
            _separatortype.onclick = (e) => {
                Save_Config("Separator", Config.Separator == "," ? " " : ",");
                _separatortype.innerHTML = Config.Separator == "," ? `","` : `" "`;
                ShowTags();
            };
            // ELEMENTO DA LISTA DE RESULTADOS DAS TAGS
            var results = document.createElement("ul");
            results.style.display = "inline"
            results.id = "results";
            const cssselectstyle = "width:100%;margin: 0 1px;padding:5px;cursor:pointer;"; // CSS
            // BOTÃO QUE MUDA A ORDEM DAS TAGS
            let btn_o = document.createElement("select");
            btn_o.style = cssselectstyle;
            btn_o.classList = C_SA;
            btn_o.id = "LISTORDER";
            btn_o.title = `Option to order the list`;
            let _o = [
                ["Sort (Normal)"],
                ["Sort (A-Z)"],
                ["Sort (Z-A)"],
                ["Sort (Random)"],
            ]
            createOptions(btn_o, _o);

            // BOTÃO DE MUDAR O TIPO DE VISUALIZAÇÃO DA LISTA DE TAGS
            let ftl = document.getElementById("FLOATING_TAGLIST");
            var _btn_vt = document.createElement("select");
            _btn_vt.style = cssselectstyle;
            _btn_vt.classList = C_SA;
            _btn_vt.id = "tagdisplay";
            _btn_vt.title = `It's the way the tag list is displayed`;
            let _vt = [
                ["View (Inline)", () => {
                    results.style = "display:inline";
                    floating_tl = false;
                    ftl.style.display = "none";
                }],
                ["View (Vertical)", () => {
                    results.style = "display:grid";
                    floating_tl = false;
                    ftl.style.display = "none";
                }],
                ["View (Grid [auto])", () => {
                    results.style = "display: grid; grid-template-columns: repeat( auto-fit, minmax(150px, 1fr) );";
                    floating_tl = false;
                    ftl.style.display = "none";
                }],
                ["Floating box below prompt", () => {
                    results.style = "display:none";
                    floating_tl = true;
                }]
            ]
            createOptions(_btn_vt, _vt);
            _btn_vt.onchange = () => { // EVENTO
                _btb_vt_changed();
            }
            _btn_vt.value = Config.Tag_List_Display_Index // SELECIONAR O INDICE SALVO NAS CONFIGURAÇÕES
            function _btb_vt_changed() {
                _vt[_btn_vt.value][1]();
                Save_Config("Tag_List_Display_Index", _btn_vt.value);
            }
            _btb_vt_changed();

            // Botão de escolher a lista 
            var _btn_sl = document.createElement("select");
            _btn_sl.style = cssselectstyle;
            _btn_sl.classList = C_SA;
            _btn_sl.id = "taglistoptions"
            _btn_sl.title = `This is the list of tags that are loaded from google drive`;
            Tag_Lists.forEach((array, index) => { // CRIA OPÇÕES
                let option = document.createElement("option");
                option.value = index;
                option.innerHTML = array[0];
                _btn_sl.append(option);
            });
            _btn_sl.childNodes[Config.Selected_Tag_List].selected = true; // SELECIONAR O INDICE SALVO NAS CONFIGURAÇÕES
            _btn_sl.onchange = (e) => { // EVENTO
                On_List_Selected(e.currentTarget.value);
            }

            // TIPO DE PESQUISA
            // BOTÃO QUE MUDA A ORDEM DAS TAGS
            let _btn_st = document.createElement("select");
            _btn_st.style = cssselectstyle;
            _btn_st.id = "SEARCHTYPE";
            _btn_st.classList = C_SA;
            _btn_st.title = `The search type in the tag list
Linear Search : Searches texts from left to right
Contains Text : If there is text in the tag
Equals : If the text is equal to the tag`
            let _searchtype = [
                ["Linear Search"],
                ["Contains text"],
                ["Equals"],
            ]
            createOptions(_btn_st, _searchtype);

            _TGTools.append(btn_o);
            _TGTools.append(_btn_vt);
            _TGTools.append(_btn_st);
            add_button(_TGTools, "Save Tag to Favorite", [0, 40], "", () => {
                let kw = ""
                if (sw != undefined)
                    kw = sw[1]
                let input = window.prompt("Save the tag to favorites, it appears at the top of the tag list", kw);
                if (input == undefined || input == "") return;
                Config.FavoritesTags.push(input);
                Save_Config("FavoritesTags", Config.FavoritesTags)
                console.log(Config.FavoritesTags);
            });
            add_button(_TGTools, "Remove Tag from Favorite", [0, 40], "", () => {
                let kw = ""
                if (sw != undefined)
                    kw = sw[1]
                let input = window.prompt("Enter tag to remove from favorites\r\n\r\n" + Config.FavoritesTags.toString(), kw);
                if (input == undefined || input == "") return;
                let i = Config.FavoritesTags.indexOf(input);
                Config.FavoritesTags.splice(i, 1);
                Save_Config("FavoritesTags", Config.FavoritesTags)
                console.log(Config.FavoritesTags);
            });

            _TGTools.append(_btn_sl);
            div2.append(results);
            // INSERIR ELEMENTOS
            div1.append(_MB);
            div1.append(_CM);
            div1.append(_FMB);
            div1.append(_TWT);
            div1.append(_separatortype);
            _TAGLISTBOX.append(div1);
            _TAGLISTBOX.append(_labeltitle);
            _TAGLISTBOX.append(div2);
            if (DataList == undefined) // AUTO CARREGAR A LISTA
                On_List_Selected(_btn_sl.value);
        },
        Build_Ui_WordBypass(to_advanced = false) {
            // DIV PRINCIPAL
            let div = document.createElement("div");
            div.id = "WORDBYPASS"
            div.style["min-height"] = "30px"
            div.classList = "bg-background border";
            const _labeltitle = document.createElement("span");
            _labeltitle.innerHTML = "Word Bypass Box"; _labeltitle.style.display = "none";
            const _MB = document.createElement("span");
            _MB.id = "MENUBUTTON";
            _MB.style = "position:relative;display:flex;width: 30px; height: 30px; margin: 0px 1px; cursor: pointer; float: left";
            _MB.className = C_SA2;
            _MB.innerHTML = "O";
            _MB.onclick = () => {
                if (_MB.innerHTML == "-") {
                    divmain.style = "";
                    _labeltitle.style.display = "none";
                    _MB.className = C_SA2;
                    _MB.innerHTML = "O";
                }
                else {
                    divmain.style = "display:none";
                    _labeltitle.style.display = "";
                    _MB.className = C_SA;
                    _MB.innerHTML = "-";
                }
            };
            let divmain = document.createElement("div");
            // LABEL COM AVISO
            let text = document.createElement("p");
            text.innerHTML = "Word Filter Bypass : <sup id='warning' style=\"color:yellow;display:none\">(Remember, follow the site rules, do not create inappropriate images.)</sup>";
            text.style = "height: 20px;font-weight: bold;display: block;"
            divmain.append(text);
            divmain.append(document.createElement("br"));
            // BOTÕES DE BURLAR O FILTRO DE PALAVRAS
            add_button(divmain, "'()' Parentheses Method", [200, 40], "Add parentheses to each letter to bypass the filter", () => {
                document.getElementById("warning").style.display = "";
                const antifilteredword = sw[1].sdfilter().split("").map(function (char, index) {
                    if (index == sw[1].split("").length - 1) // Não deve adicionar no final
                        return char;
                    if (char == " ") // Se for espaço, utilize esse
                        return "([])";
                    else if (sw[1].split("")[index + 1] == " ") // Caso o proximo caractere tiver um espaço, deixe apenas a letra
                        return char;
                    else // Se for apenas a letra, adicione esse após
                        return char + "()";
                }).join("");
                Replace_Prompt_Tag(sw[1].sdfilter(), antifilteredword);
            });
            // https://www.compart.com/en/unicode/U+0008
            add_button(divmain, "'' \\b Backspace Method", [200, 40], "It adds backspace (\\b), a special javascript character that is not filtered by generator", () => {
                document.getElementById("warning").style.display = "";
                const antifilteredword = sw[1].sdfilter().split("").map(function (char, index) {
                    if (index == sw[1].split("").length - 1) // Não deve adicionar no final
                        return char;
                    if (char == " ") // Se for espaço, utilize esse
                        return " ";
                    else if (sw[1].split("")[index + 1] == " ") // Caso o proximo caractere tiver um espaço, deixe apenas a letra
                        return char;
                    else // Se for apenas a letra, adicione esse após
                        return char + "";
                }).join("");
                Replace_Prompt_Tag(sw[1].sdfilter(), antifilteredword);
            });

            div.append(_MB);
            div.append(_labeltitle);
            div.append(divmain);
            if (to_advanced)
                document.getElementById("ConfigUIAdvanced").append(div);
            else
                document.getElementById("ConfigUI").append(div);

        },
        Build_Ui_PromptTools() {
            // DIV PRINCIPAL
            const prompttools = document.createElement("div");
            prompttools.id = "PROMPTTOOLS"
            prompttools.className = "bg-background border";
            const divweights = document.createElement("div"); // DIV DOS PESOS
            divweights.style = "width: 100%;display:flex;";
            const divtools = document.createElement("div"); // DIV DE OUTRAS FERRAMENTAS
            divtools.style = "width: 100%;display:inline-flex;justify-content: center;align-items: center;";

            let selectedweight = 0; // 0 == () | 1 == [] | 2 == {}
            // OPÇÕES DE PESOS
            let _wp1, _wp2, _wp3, _add, _remove, labelvalue;
            _wp1 = add_button(divweights, "( )", [40, 40, "locked"], "Increases keyword strength", () => {
                _wp1.className = C_SA2; _wp2.className = C_SA; _wp3.className = C_SA; // MUDA A CLASSE
                selectedweight = 0;
            });
            _wp1.className = C_SA2;
            _wp2 = add_button(divweights, "[ ]", [40, 40, "locked"], "Decreases keyword strength", () => {
                _wp1.className = C_SA; _wp2.className = C_SA2; _wp3.className = C_SA;
                selectedweight = 1;
            });
            _wp3 = add_button(divweights, "{ }", [40, 40, "locked"], "Similar to '( )'", () => {
                _wp1.className = C_SA; _wp2.className = C_SA; _wp3.className = C_SA2;
                selectedweight = 2;
            });
            // ADICIONAR PESO OU APLICAR
            _add = add_button(divweights, Config.WeightNumber ? "APPLY" : "ADD", [40, 40], "Add weight to the keyword", () => {
                let weightvalue = Config.WeightNumber == false ? "" : ":" + parseFloat(document.getElementById("labelweightvalue").innerText)
                let wordvalue = Config.WeightNumber ? sw[1].sdfilter() : sw[1];
                switch (selectedweight) {
                    case 0:
                        Replace_Prompt_Tag(sw[1], "(" + wordvalue + weightvalue + ")", true);
                        break;
                    case 1:
                        Replace_Prompt_Tag(sw[1], "[" + wordvalue + weightvalue + "]", true);
                        break;
                    case 2:
                        Replace_Prompt_Tag(sw[1], "{" + wordvalue + weightvalue + "}", true);
                        break;
                    default:
                        break;
                }
            });
            _add.style.width = "100%"; _add.style["word-break"] = "break-all";
            // REMOVER PESO
            _remove = add_button(divweights, "REMOVE", [40, 40], "Remove weight on keyword", () => {
                Replace_Prompt_Tag(sw[1], sw[1].sdfilter(), true);
            });
            _remove.style.width = "100%"; _remove.style["word-break"] = "break-all"
            // DIMINUIR PESO
            add_button(divweights, "-", [40, 40, "locked"], "Decreases 0.1 in value", () => {
                let v = parseFloat(labelvalue.innerHTML);
                labelvalue.innerHTML = Math.round((v - 0.1) * 10) / 10
            });
            // LABEL E DEFINIR PESO
            labelvalue = add_button(divweights, "1.0", [100, 40], "Weight Value", () => {
                let v = parseFloat(window.prompt("Set the weight value", "1.0"));
                if (!isNaN(v)) labelvalue.innerHTML = v;
            });
            labelvalue.style = "width: 100px;min-width:50px;display: inline-flex;align-items: center;justify-content: center;cursor:pointer;";
            labelvalue.id = "labelweightvalue";
            // ACRESCENTAR PESO
            add_button(divweights, "+", [40, 40, "locked"], "Decreases 0.1 in value", () => {
                let v = parseFloat(labelvalue.innerHTML);
                labelvalue.innerHTML = Math.round((v + 0.1) * 10) / 10
            });
            // MODO DE APLICAR OU INSERIR PESO
            add_button(divweights, "🔢", [40, 40, "locked"], "Switches between applying weight or adding weight", (e) => {
                if (Config.WeightNumber == false) {
                    _add.innerHTML = "APPLY";
                    e.target.className = C_SA2;
                    Save_Config("WeightNumber", true);
                }
                else {
                    _add.innerHTML = "ADD";
                    e.target.className = C_SA;
                    Save_Config("WeightNumber", false);
                }
            }, Config.WeightNumber);
            add_button(divtools, "Undo", [70, 40], "Undo", (e) => {
                document.execCommand("undo");
            });
            add_button(divtools, "Redo", [70, 40], "Redo", (e) => {
                document.execCommand("redo");
            });
            // Opções do Prompt
            // BOTÕES DE MOVER A PALAVRA
            add_button(divtools, "◄", [40, 40], "", () => {
                sw = getWord(selectedarea);
                Set_Text(array_move(sw[2], sw[0], sw[0] - 1));
                selectedarea.selectionStart = selectedarea.value.indexOf(sw[1]);
                selectedarea.selectionEnd = selectedarea.value.indexOf(sw[1]);
            });
            let b_moveword = document.createElement("span");
            b_moveword.innerText = "Move Word";
            b_moveword.style = "width: 100px; height: 30px; display: inline-flex;align-items: center;justify-content: center;";
            b_moveword.classList = C_SAT;
            divtools.append(b_moveword);
            add_button(divtools, "►", [40, 40], "", () => {
                sw = getWord(selectedarea);
                Set_Text(array_move(sw[2], sw[0], sw[0] + 1));
                selectedarea.selectionStart = selectedarea.value.indexOf(sw[1]);
                selectedarea.selectionEnd = selectedarea.value.indexOf(sw[1]);
            });
            // MINIFICADOR
            add_button(divtools, "Minifier", [80, 40], "Remove empty spaces to shorten prompt length", (e) => {
                e.target.className = Config.Auto_Minifier ? C_SA : C_SA2; Save_Config("Auto_Minifier", !Config.Auto_Minifier);
            }, Config.Auto_Minifier);
            // MINIFICADOR
            let _notepad = document.getElementById("NOTEPAD");
            add_button(divtools, "NotePad", [80, 40], "Adds a notepad to the top of the prompt box", (e) => {
                _notepad = document.getElementById("NOTEPAD");
                if (_notepad == undefined)
                    return;
                if (Config.Show_Noteped == false) {
                    Save_Config("Show_Noteped", true); e.target.className = C_SA2;
                    _notepad.style.display = "";
                }
                else {
                    Save_Config("Show_Noteped", false); e.target.className = C_SA;
                    _notepad.style.display = "none";
                }
            }, Config.Show_Noteped);
            if (Config.Show_Noteped == false) {
                if (_notepad != undefined)
                    _notepad.style.display = "none";
            }

            // ACRESCENTAR NA UI
            prompttools.append(divweights);
            prompttools.append(divtools);
            document.getElementById("ConfigUI").append(prompttools);

        },
        Build_Ui_RandomPromptBox(to_advanced = false) {
            // DIV PRINCIPAL
            let div = document.createElement("div");
            div.id = "RANDOM"
            div.style["min-height"] = "30px"
            div.classList = "bg-background border";
            const _labeltitle = document.createElement("span");
            _labeltitle.innerHTML = "Random Prompt Box"; _labeltitle.style.display = "none";
            const _MB = document.createElement("span");
            _MB.id = "MENUBUTTON";
            _MB.style = "position:relative;display:flex;width: 30px; height: 30px; margin: 0px 1px; cursor: pointer; float: left";
            _MB.className = C_SA2;
            _MB.innerHTML = "O";
            _MB.onclick = () => {
                if (_MB.innerHTML == "-") {
                    divmain.style = "";
                    _labeltitle.style.display = "none";
                    _MB.className = C_SA2;
                    _MB.innerHTML = "O";
                }
                else {
                    divmain.style = "display:none";
                    _labeltitle.style.display = "";
                    _MB.className = C_SA;
                    _MB.innerHTML = "-";
                }
            };
            let divmain = document.createElement("div");
            let grid = document.createElement("div");
            grid.style = "display:grid;grid-template-columns: auto 3fr;justify-items: stretch;align-items: stretch;";
            // RANDOM PROMPT
            let _randbutton = add_button(divmain, "Get Library Prompt", [180, 40], "It gets the prompt for an image from your library", (e) => {
                if (_randbutton.innerHTML == "Loading...")
                    return;
                _randbutton.innerHTML = "Loading...";
                _randbutton.className = _randbutton.className + " animate-pulse";
                let randindex = Math.floor(Math.random() * totalimg)
                fetch("https://api.sexy.ai/getMyCreations?sessionID=" + JSON.parse(localStorage["bound-store"]).state.user.sessionID + "&folderID=root&limit=1&skipCount=" + randindex + "&paginationIndex=undefined", {
                    method: "GET",
                    headers: { "Content-type": "application/json; charset=UTF-8" }
                })
                    .then(response => response.text())
                    .then(json => {
                        // CONVERTE EM JSON
                        let listimages = JSON.parse(json).payload;
                        var id = listimages[0].id;
                        fetch('https://sexy.ai/m/' + id)
                            .then(function (response) {
                                // When the page is loaded convert it to text
                                return response.text()
                            })
                            .then(function (html) {
                                // Initialize the DOM parser
                                var parser = new DOMParser();
                                // Parse the text
                                var doc = parser.parseFromString(html, "text/html");
                                let a = document.evaluate("//script[contains(text(),'negprompt')]", doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.innerHTML.replaceAll(/\\/g, "");
                                let imageinfos = JSON.parse(a.slice(a.indexOf("\"image\"") + 8, a.lastIndexOf("\"images\"") - a.length - 1));
                                console.log(imageinfos);
                                Set_Text(imageinfos.prompt);
                                //Set_Text(imageinfos.negprompt, true); Returns negprompt
                                Image.InsertImageToStorage([imageinfos.id], imageinfos.url)
                                _randbutton.innerHTML = "Get Library Prompt";
                                _randbutton.className = _randbutton.className.replace(" animate-pulse", "");
                            })
                            .catch(function (err) {
                                console.error('Failed to fetch page: ', err);
                                _randbutton.innerHTML = "Failed, try again.";
                                setTimeout(() => {
                                    _randbutton.innerHTML = "Get Library Prompt";
                                }, 2000)
                            });
                    });
            });
            let inputdanboruarea = document.createElement("input");
            inputdanboruarea.type = "text"
            inputdanboruarea.id = "e621input"
            inputdanboruarea.className = C_SAI;
            inputdanboruarea.value = "random:1 -comic"
            inputdanboruarea.title = "This is the search input for Danbooru posts";
            let _getdanboruprompt = add_button(grid, "Get Danbooru Prompt", [175, 40], "Returns the tag string of a random Danbooru image", (e) => {
                if (_getdanboruprompt.innerHTML == "Loading...")
                    return;
                _getdanboruprompt.innerHTML = "Loading...";
                _getdanboruprompt.className = _getdanboruprompt.className + " animate-pulse";
                GM_xmlhttpRequest({
                    method: "GET",
                    url: "https://danbooru.donmai.us/posts.json?limit=1&tags=" + inputdanboruarea.value,
                    onload: (ev) => {
                        const listimages = JSON.parse(ev.responseText);
                        if (listimages.success == false) {
                            _getdanboruprompt.innerHTML = "Error, see console";
                            _getdanboruprompt.className = _getdanboruprompt.className.replace(" animate-pulse", "");
                            setTimeout(() => {
                                _getdanboruprompt.innerHTML = "Get Danbooru Prompt";
                            }, 2000)
                            throw listimages.message;
                        }
                        if (listimages.length == 0) {
                            _getdanboruprompt.innerHTML = "No posts found";
                            _getdanboruprompt.className = _getdanboruprompt.className.replace(" animate-pulse", "");
                            setTimeout(() => {
                                _getdanboruprompt.innerHTML = "Get Danbooru Prompt";
                            }, 2000)
                            throw "No posts found";
                        }
                        let tag_string_general = listimages[0]["tag_string_general"].split(" ");
                        let tag_string_character = listimages[0]["tag_string_character"].split(" ");
                        let tag_string_artist = listimages[0]["tag_string_artist"].split(" ");
                        let tag_string_copyright = listimages[0]["tag_string_artist"].split(" ");
                        let tag_string_meta = listimages[0]["tag_string_meta"].split(" ");
                        tag_string_artist = tag_string_artist.map((a) => {
                            return "by " + a;
                        })
                        tag_string_artist = tag_string_artist.length == 0 ? "" : "(" + tag_string_artist.join(", ") + "),";
                        tag_string_character = tag_string_character.length == 0 ? "" : "(" + tag_string_character.join(", ") + ":1.4),";
                        tag_string_general = tag_string_general.length == 0 ? "" : "" + tag_string_general.join(", ") + ",";
                        tag_string_copyright = tag_string_copyright.length == 0 ? "" : "[" + tag_string_copyright.join(", ") + "],";
                        tag_string_meta = tag_string_meta.length == 0 ? "" : "" + tag_string_meta.join(", ") + ",";
                        let final = tag_string_artist + tag_string_character + tag_string_general + tag_string_copyright + tag_string_meta;
                        if (final.length >= 1024)
                            final = tag_string_artist + tag_string_character + tag_string_general;
                        Set_Text(final);
                        _getdanboruprompt.innerHTML = "Get Danbooru Prompt";
                        _getdanboruprompt.className = _getdanboruprompt.className.replace(" animate-pulse", "");
                        console.log("Post chosen:", "https://danbooru.donmai.us/posts/" + listimages[0].id);
                    },
                    onerror: () => {
                        console.error('Failed to fetch page: ', err);
                        _randbutton.innerHTML = "Failed, try again.";
                        _getdanboruprompt.className = _getdanboruprompt.className.replace(" animate-pulse", "");
                        setTimeout(() => {
                            _randbutton.innerHTML = "Get Danbooru Prompt";
                        }, 2000)
                    }
                });
            });
            grid.append(inputdanboruarea);
            let inpute621area = document.createElement("input");
            inpute621area.type = "text"
            inpute621area.id = "e621input"
            inpute621area.className = C_SAI;
            inpute621area.value = "order:random favcount:>35 -comic"
            inpute621area.title = "This is the search input for e621 posts";
            let _gete621prompt = add_button(grid, "Get E621 Prompt", [175, 40], "Returns the tag string of a random e621 image, the prompt order is : (Artists), (Character:1.4), (Species:1.2), General, [Copyright]", (e) => {
                if (_gete621prompt.innerHTML == "Loading...")
                    return;
                _gete621prompt.innerHTML = "Loading...";
                _gete621prompt.className = _gete621prompt.className + " animate-pulse";
                GM_xmlhttpRequest({
                    method: "GET",
                    url: "https://e621.net/posts.json?limit=1&tags=" + inpute621area.value,
                    onload: (ev) => {
                        const listimages = JSON.parse(ev.responseText);
                        if (listimages.posts.length == 0) {
                            _gete621prompt.innerHTML = "No posts found";
                            _gete621prompt.className = _gete621prompt.className.replace(" animate-pulse", "");
                            setTimeout(() => {
                                _gete621prompt.innerHTML = "Get E621 Prompt";
                            }, 2000)
                            throw "No posts found";
                        }
                        let general = listimages.posts[0].tags.general;
                        if (general.includes("feral")) // Apply more force to feral, because yiff is too weak to generate feral without weight syntax
                            general[general.indexOf("feral")] = "(feral:1.6)"; // 1.6 is enough... I usually use 1.7 to 2.0
                        if (general.includes("standing")) // Apply more force when standing, because there will be posts that have "standing" and "spread legs", this causes yiffy to generate more character sitting with legs open than standing with legs open
                            general[general.indexOf("standing")] = "(standing:1.2)";

                        let characters = listimages.posts[0].tags.character;
                        let species = listimages.posts[0].tags.species;
                        let copyright = listimages.posts[0].tags.copyright;
                        let artists = listimages.posts[0].tags.artist;
                        artists = artists.map((a) => {
                            return "by " + a;
                        })
                        artists = artists.length == 0 ? "" : "(" + artists.join(", ") + "),";
                        characters = characters.length == 0 ? "" : "(" + characters.join(", ") + ":1.4),";
                        species = species.length == 0 ? "" : "(" + species.join(", ") + ":1.2),";
                        general = general.length == 0 ? "" : "" + general.join(", ") + ",";
                        copyright = copyright.length == 0 ? "" : "[" + copyright.join(", ") + "]";
                        let final = artists + characters + species + general + copyright;
                        if (final.length >= 1024)
                            final = artists + characters + species + general; // REMOVE APENAS O COPYRIGHT PARA DIMINUIO O TAMANHO
                        Set_Text(final);
                        _gete621prompt.innerHTML = "Get E621 Prompt";
                        _gete621prompt.className = _gete621prompt.className.replace(" animate-pulse", "");
                        console.log("Post chosen:", "https://e621.net/posts/" + listimages.posts[0].id);
                    },
                    onerror: () => {
                        console.error('Failed to fetch page: ', err);
                        _gete621prompt.innerHTML = "Failed, try again.";
                        _gete621prompt.className = _gete621prompt.className.replace(" animate-pulse", "");
                        setTimeout(() => {
                            _gete621prompt.innerHTML = "Get E621 Prompt";
                        }, 2000)
                    }
                });
            });
            grid.append(inpute621area);
            let inputrule34area = document.createElement("input");
            inputrule34area.type = "text"
            inputrule34area.id = "e621input"
            inputrule34area.className = C_SAI;
            inputrule34area.value = ""
            inputrule34area.title = "This is the search input for rule34.xxx posts";
            let _getrule34prompt = add_button(grid, "Get Rule34 Prompt", [175, 40], "Returns the tag string of a random rule34.xxx image", (e) => {
                if (_getrule34prompt.innerHTML == "Loading...")
                    return;
                _getrule34prompt.innerHTML = "Loading...";
                _getrule34prompt.className = _getrule34prompt.className + " animate-pulse";
                GM_xmlhttpRequest({
                    method: "GET",
                    url: "https://api.rule34.xxx/index.php?page=dapi&s=post&q=index&limit=1&json=1&tags=" + inputrule34area.value,
                    onload: (ev) => {
                        if (ev.responseText == undefined) {
                            _getrule34prompt.innerHTML = "Error";
                            _getrule34prompt.className = _getrule34prompt.className.replace(" animate-pulse", "");
                            setTimeout(() => {
                                _getrule34prompt.innerHTML = "Get Rule34 Prompt";
                            }, 2000)
                            throw "Error";
                        }
                        const listimages = JSON.parse(ev.responseText);
                        if (listimages.length == 0) {
                            _getrule34prompt.innerHTML = "No posts found";
                            _getrule34prompt.className = _getrule34prompt.className.replace(" animate-pulse", "");
                            setTimeout(() => {
                                _getrule34prompt.innerHTML = "Get Rule34 Prompt";
                            }, 2000)
                            throw "No posts found";
                        }
                        let tag_string_general = listimages[0]["tags"].split(" ");
                        let final = tag_string_general.join(", ");
                        Set_Text(final);
                        _getrule34prompt.innerHTML = "Get Rule34 Prompt";
                        _getrule34prompt.className = _getrule34prompt.className.replace(" animate-pulse", "");
                        console.log("Post chosen:", "https://rule34.xxx/index.php?page=post&s=view&id=" + listimages[0].id);
                    },
                    onerror: () => {
                        console.error('Failed to fetch page: ', err);
                        _getrule34prompt.innerHTML = "Failed, try again.";
                        _getrule34prompt.className = _getrule34prompt.className.replace(" animate-pulse", "");
                        setTimeout(() => {
                            _getrule34prompt.innerHTML = "Get Rule34 Prompt";
                        }, 2000)
                    }
                });
            });
            grid.append(inputrule34area);
            divmain.append(grid);
            div.append(_MB);
            div.append(_labeltitle);
            div.append(divmain);
            if (to_advanced)
                document.getElementById("ConfigUIAdvanced").append(div);
            else
                document.getElementById("ConfigUI").append(div);

        },
        Build_Ui_Library() {
            // REMOVE O TIPO DE DISPLAY FLEX
            const menubar = getElementByXpath("//div[@class='bg-background pb-12']/div");
            menubar.className = menubar.className.replace(" flex ", "");
            // CRIA OS DIVS
            let div = document.createElement("div");
            div.classList = "flex justify-center";
            div.style = "margin-top:0px";
            let div2 = document.createElement("div");
            div2.classList = "flex h-10 items-center space-x-1 rounded-md border bg-background p-1";
            div.append(div2);
            // CRIA AS OPÇÕES DE PROCURA IMAGEM PELO INDICE
            let b_searchindex = document.createElement("span");
            b_searchindex.id = "search_index";
            b_searchindex.innerHTML = "Search";
            b_searchindex.classList = "flex select-none items-center rounded-sm px-3 py-1.5 text-sm font-medium outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground cursor-pointer";
            b_searchindex.style = "width:115px";
            b_searchindex.onclick = function () {
                let index = document.getElementById("index_input").value;
                let limit = document.getElementById("limit_input").value;
                const grid = getElementByXpath("//div[contains(@class,'grid')]");
                grid.innerHTML = "";
                console.log("Index :" + index + "\r\nLimit : " + limit);
                fetch("https://api.sexy.ai/getMyCreations?sessionID=" + boundstore.state.user.sessionID + "&folderID=root&limit=" + eval(limit) + "&skipCount=" + index + "&paginationIndex=undefined", {
                    method: "GET",
                    headers: { "Content-type": "application/json; charset=UTF-8" }
                })
                    .then(response => response.text())
                    .then(json => {
                        // CONVERTE EM JSON
                        let listimages = JSON.parse(json).payload;
                        if (listimages.length == 0) { alert("No images found"); return; }
                        listimages.forEach((item) => { // COMEÇA A ACRESCENTAR AS IMAGENS
                            let divimage = document.createElement("div");
                            divimage.classList = "after:content after:shadow-highlight group relative block w-full touch-pan-y select-none rounded-lg p-1 bg-slate-600 cursor-pointer";

                            let link = document.createElement("a");
                            link.classList = "cursor-zoom-in";
                            link.href = "/m/" + item.id;

                            let img = document.createElement("img");
                            img.alt = item.id;
                            img.src = item.url;
                            img.classList = "aspect-[3/5] w-screen rounded-lg object-cover";
                            img.style = "transform: translate3d(0px, 0px, 0px);";

                            link.append(img);
                            divimage.append(link);
                            grid.append(divimage);
                        })
                    });
            };
            const inputcss = "flex rounded-md bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50";
            // LABEL INDEX
            let label1 = document.createElement("span");
            label1.style = "width:50px";
            label1.classList = C_SAT;
            label1.innerHTML = "Index :";
            // INPUT INDEX
            let inputindex = document.createElement("input");
            inputindex.id = "index_input";
            inputindex.type = "number";
            inputindex.max = boundstore.state.user.itemCount;
            inputindex.min = 0;
            inputindex.value = 0;
            inputindex.style = "width:100px";
            inputindex.classList = inputcss;
            // LABEL LIMIT
            let label2 = document.createElement("span");
            label2.style = "width:50px";
            label2.classList = C_SAT;
            label2.innerHTML = "Limit :";
            // INPUT LIMIT
            let inputlimit = document.createElement("input");
            inputlimit.id = "limit_input";
            inputlimit.type = "number";
            inputlimit.max = 150;
            inputlimit.min = 1;
            inputlimit.value = 10;
            inputlimit.style = "width:100px";
            inputlimit.classList = inputcss;
            // ACRESCENTA NA UI
            div2.append(b_searchindex);
            div2.append(label1);
            div2.append(inputindex);
            div2.append(label2);
            div2.append(inputlimit);
            menubar.append(div);
            menubar.insertBefore(div, menubar.childNodes[1]);
        },
        Build_Ui_DynamicPrompts(to_advanced = false) {
            // DIV PRINCIPAL
            let div = document.createElement("div");
            div.id = "DP"
            div.style["min-height"] = "30px"
            div.classList = "bg-background border";
            const _labeltitle = document.createElement("span");
            _labeltitle.innerHTML = "Dynamic Prompts"; _labeltitle.style.display = "none";
            const _MB = document.createElement("span");
            _MB.id = "MENUBUTTON";
            _MB.style = "position:relative;display:flex;width: 30px; height: 30px; margin: 0px 1px; cursor: pointer; float: left";
            _MB.className = C_SA2;
            _MB.innerHTML = "O";
            _MB.onclick = () => {
                if (_MB.innerHTML == "-") {
                    divmain.style = "";
                    _labeltitle.style.display = "none";
                    _MB.className = C_SA2;
                    _MB.innerHTML = "O";
                }
                else {
                    divmain.style = "display:none";
                    _labeltitle.style.display = "";
                    _MB.className = C_SA;
                    _MB.innerHTML = "-";
                }
            };
            let divmain = document.createElement("div");
            add_button(divmain, "Dynamic Prompts", [150, 40], "This feature implements an expressive template language to generate random prompts.", (e) => {
                if (Config.Dynamic_Prompts == false) {
                    Save_Config("Dynamic_Prompts", true); e.target.className = C_SA2;
                } else {
                    Save_Config("Dynamic_Prompts", false); e.target.className = C_SA;
                }
            }, Config.Dynamic_Prompts);
            let link = document.createElement("span");
            link.style = "color:#6262ff;cursor: pointer;";
            link.innerHTML = "<ins>Syntax Guide</ins>";
            link.title = "This opens a github page where there is a dynamic prompts syntax guide\r\nhttps://github.com/adieyal/sd-dynamic-prompts/blob/main/docs/SYNTAX.md";
            link.onclick = () => {
                window.open("https://github.com/adieyal/sd-dynamic-prompts/blob/main/docs/SYNTAX.md");
            };
            const cssselectstyle = "margin: 0 1px;padding:5px;cursor:pointer;"; // CSS
            let flexdiv = document.createElement("div");
            flexdiv.className = "inline-flex w-full";
            let flexdiv2 = document.createElement("div");
            flexdiv2.className = "inline-flex w-full";
            let grid = document.createElement("div");
            grid.className = "w-full";
            // TEXTAREA
            let wildcardtextarea = selectedarea.cloneNode(true);
            wildcardtextarea.value = "";
            wildcardtextarea.style = "grid-row-start: 2;grid-column-start: 1;white-space: nowrap;height:500px";
            wildcardtextarea.placeholder = "Here is the list of wildcard values";
            wildcardtextarea.removeAttribute("id"); wildcardtextarea.removeAttribute("name");
            wildcardtextarea.onkeyup = () => {
                _sw.innerHTML = "Save Wildcard*";
            }
            // WILDCARD LIST
            let wildcards = document.createElement("select");
            wildcards.style = cssselectstyle + "grid-row-start: 1;grid-column-start: 1;";
            wildcards.classList = C_SA + " w-full";
            createOptions(wildcards, Config.wildcards_lists);
            wildcards.onchange = (v) => { // EVENTO
                _wChanged(v.target.selectedIndex);

            }
            function _wChanged(i) {
                let wordslist = Config.wildcards_lists[i][1];
                if (wordslist == null)
                    wildcardtextarea.value = "";
                else
                    wildcardtextarea.value = wordslist.join("\r\n");
            }
            add_button(flexdiv, "Add Wildcard from File", [0, 40], "Wildcards are placeholders that inject values from a file into your prompt. Open a file with the desired values and use double underscores __ to indicate the wildcard:", (e) => {
                inputfile.click();
                _sw.innerHTML = "Save Wildcard*";
            });
            add_button(flexdiv, "Create Empty Wildcard", [0, 40], "", (e) => {
                let name = window.prompt("Set the wildcard name", "");
                if (name == "" || name == null)
                    return;
                name = fixname(name);
                if (check_name_exist(name) == true) {
                    if (window.confirm("A wildcard with that name already exists, do you want to replace it?") == true) {
                        Config.wildcards_lists.find(e => e[0] == name)[1] = [];
                    }
                    else {
                        return;
                    }
                } else {
                    Config.wildcards_lists.push([name]);
                    refreshlist(wildcards.children.length);
                }
                wildcardtextarea.value = "";
                _sw.innerHTML = "Save Wildcard*";
            });
            // REMOVE WILDCARD
            add_button(flexdiv, "Remove Wildcard", [0, 40], "", (v) => {
                let index = wildcards.selectedIndex;
                Config.wildcards_lists.splice(wildcards.selectedIndex, 1);
                wildcards.innerHTML = "";
                createOptions(wildcards, Config.wildcards_lists);
                let wordslist = Config.wildcards_lists.find(e => e[0] == wildcards.selectedOptions[0].innerHTML)[1];
                if (wordslist == null)
                    wildcardtextarea.value = "";
                else
                    wildcardtextarea.value = wordslist.join("\n");
                wildcards.selectedIndex = index - 1;
                _wChanged(index - 1);
                _sw.innerHTML = "Save Wildcard";
            });

            // INPUT FILE
            let inputfile = document.createElement("input");
            inputfile.type = "file";
            inputfile.accept = ".txt";
            inputfile.id = "inputfile"
            inputfile.style = "display:none";
            inputfile.setAttribute("multiple", "");
            grid.append(wildcards); // select
            grid.append(wildcardtextarea);
            grid.append(inputfile);
            var _sw = add_button(flexdiv2, "Save Wildcard", [0, 40], "", (e) => {
                Config.wildcards_lists.find(e => e[0] == wildcards.selectedOptions[0].innerHTML)[1] = wildcardtextarea.value.match(/[^\r\n]+/g)
                Save_Config("wildcards_lists", Config.wildcards_lists);
                e.target.innerHTML = "Saved";
                setTimeout(() => { e.target.innerHTML = "Save Wildcard" }, 1000);
            });
            add_button(flexdiv2, "Change name", [0, 40], "", () => {
                let index = wildcards.selectedIndex;
                let name = window.prompt("Set the wildcard name", "");
                if (name == "" || name == null)
                    return;
                if (check_name_exist(fixname(name)) == true && wildcards.selectedOptions[0].innerHTML != fixname(name)) {
                    name = fixname(name + "-new");
                }
                name = fixname(name);
                Config.wildcards_lists.find(e => e[0] == wildcards.selectedOptions[0].innerHTML)[0] = name;
                refreshlist(wildcards.selectedIndex);
            });
            divmain.append(link);
            divmain.append(document.createElement("hr"));
            div.append(_MB);
            div.append(_labeltitle);
            div.append(divmain);
            divmain.append(flexdiv);
            divmain.append(grid)
            divmain.append(flexdiv2);
            if (to_advanced)
                document.getElementById("ConfigUIAdvanced").append(div);
            else
                document.getElementById("ConfigUI").append(div);

            document.getElementById('inputfile').addEventListener('change', function (e) {
                for (let i = 0; i < e.target.files.length; i++) {
                    const file = e.target.files[i];
                    let name = file.name.split(".")[0];
                    let fr = new FileReader();
                    fr.onload = function () {
                        name = fixname(name);
                        if (Config.wildcards_lists.find(e => e[0] == name)) {
                            if (window.confirm(`A wildcard with that name already exists, do you want to replace it?\nName : ${name}`) == true) {
                                Config.wildcards_lists.find(e => e[0] == name)[1] = fr.result.match(/[^\r\n]+/g);
                            }
                            else {
                                return;
                            }
                        }
                        else {
                            Config.wildcards_lists.push([name.toLowerCase(), fr.result.match(/[^\r\n]+/g)]);
                        }
                        wildcardtextarea.value = fr.result;
                        let index = Config.wildcards_lists.findIndex(e => e[0] == name);
                        refreshlist(index);
                        _wChanged(index);
                    }
                    fr.readAsText(file);
                }
            })
            function check_name_exist(name) {
                if (Config.wildcards_lists.find(e => e[0] == name)) {
                    return true;
                }
                else {
                    return false;
                }
            }
            function fixname(name) {
                name = name.replaceAll("_", "-");
                if (!name.startsWith("__"));
                name = "__" + name;
                if (!name.endsWith("__"))
                    name = name + "__";
                name = name.toLowerCase().replace(" ", "-");
                return name;
            }
            function refreshlist(index) {
                wildcards.innerHTML = "";
                createOptions(wildcards, Config.wildcards_lists);
                wildcards.selectedIndex = index;
                Save_Config("wildcards_lists", Config.wildcards_lists);
            }
            _wChanged(0);
        }
    };
    var orderlist = [UIs.Build_Ui_PromptTools, UIs.Build_Ui_TagListBox, UIs.Build_Ui_WordBypass, UIs.Build_Ui_MainConfig, UIs.Build_Ui_RandomPromptBox, UIs.Build_Ui_DynamicPrompts];
    function keepimage(bool) {
        // Oculta as interface que tem grid de imagem e a opção de resize o grid e altera o tamanho do botão generate do mobile se manter imagens for desativada
        if (document.getElementById("DIVSTORAGE") == null)
            return;
        let rangediv = getElementByXpath("//div[div[contains(@class,'mr-3')]]");
        if (bool == true) {
            rangediv.childNodes[4].style.display = "";
            rangediv.childNodes[5].style.display = "";
            rangediv.childNodes[2].style.display = "none";
            rangediv.childNodes[0].childNodes[0].innerHTML = 4;
            getElementByXpath("//div[@class='p-3']/div").style.display = "none";
            document.getElementById("DIVSTORAGE").style = "";
        }
        else {
            rangediv.childNodes[4].style.display = "none";
            rangediv.childNodes[5].style.display = "none";
            rangediv.childNodes[2].style.display = "";
            rangediv.childNodes[0].childNodes[0].innerHTML = rangediv.childNodes[3].value;
            getElementByXpath("//div[@class='p-3']/div").style.display = "";
            document.getElementById("DIVSTORAGE").style.display = "none";
        }
    }
    function ImageFilter() {
        function createlabel(elem, text) {
            let l = document.createElement("span");
            l.innerText = text;
            l.style = "width: 150px; height: 30px; display: inline-flex;align-items: center;justify-content: center;";
            l.classList = C_SAT;
            elem.append(l);
            return l;
        }
        let div = document.createElement("div");
        div.style = "z-index:5000;position:fixed;left:0px;top:0px;width:300px;display:none;padding:5px";
        div.id = "FILTERUI";
        div.className = "border border-input bg-background";
        div.style.transform = "translate(0px,200px)";

        // BRILHO
        let _b = createlabel(div, "Brightness (100%)");

        let b_input = document.createElement("input");
        b_input.style = "width:100%";
        b_input.type = "range";
        b_input.value = "100"; b_input.min = "0"; b_input.max = "200";
        b_input.oninput = () => {
            _b.innerText = `Brightness (${b_input.value}%)`
        }
        div.append(b_input);
        div.append(document.createElement("br"));
        // CONTRASTE
        let _c = createlabel(div, "Contrast (100%)");

        let c_input = document.createElement("input");
        c_input.style = "width:100%";
        c_input.type = "range";
        c_input.value = "100"; c_input.min = "0"; c_input.max = "200";
        c_input.oninput = () => {
            _c.innerText = `Contrast (${c_input.value}%)`
        }
        div.append(c_input);
        div.append(document.createElement("br"));
        // SATURAÇÃO
        let _s = createlabel(div, "Saturation (100%)")

        let s_input = document.createElement("input");
        s_input.style = "width:100%";
        s_input.type = "range";
        s_input.value = "100"; s_input.min = "0"; s_input.max = "200";
        s_input.oninput = () => {
            _s.innerText = `Saturation (${s_input.value}%)`
        }
        div.append(s_input);
        div.append(document.createElement("br"));

        let _p1 = document.createElement("p")
        _p1.innerHTML = "Note: The filter is not applied when the image is downloaded";
        div.append(_p1);
        document.body.append(div);
        div.onmouseleave = () => {
            div.style.display = "none";
            document.body.style = "overflow:auto;"
        };
        setInterval(() => {
            let images = getElementsByXpath("//img[contains(@src,'fs4')]");
            images.forEach((i) => {
                i.style = `filter:contrast(${c_input.value}%) saturate(${s_input.value}%) brightness(${b_input.value}%);`;
            })
        }, 100);
    };
    ImageFilter();
    function TagList_TinyFloatingBox() {
        let div = document.createElement("div");
        div.style = "z-index:5;position:absolute;left:0px;top:0px;width:300px;padding:5px;display:none;background:transparent";
        div.id = "FLOATING_TAGLIST";
        document.body.append(div);
    }
    TagList_TinyFloatingBox();
    function Check_Pending_Images() {
        Config.Pending_Images.forEach((e) => {
            Image.SendToQueue(e);
        })
    }
    function Load_TagList(link, index = -1) {// CARREGA A LISTA DE TAGS
        if (link == undefined || link == "")
            return;
        // LIMPA OS RESULTADOS
        document.getElementById("results").innerHTML = "";
        let _TAGLISTBOX = document.getElementById("TAGLISTBOX");
        // CRIA ETIQUETA DE CARREGANDO
        var labelloading = document.createElement("p");
        labelloading.id = "loadlabel";
        labelloading.style = "font-size:24px;font-weight: bold;color:Cyan";
        labelloading.className = "animate-pulse";
        labelloading.innerText = "Loading TagList...";
        labelloading.addEventListener("click", () => { labelloading.remove() });
        _TAGLISTBOX.append(labelloading);
        // COMEÇA A CARREGAR A LISTA
        GM_xmlhttpRequest({
            method: "GET",
            url: link,
            onload: (ev) => {
                if (ev.finalUrl.toString().includes("accounts.google.com")) // SE A CONTA GMAIL NÃO ESTIVER LOGADA
                {
                    labelloading.innerText = "Your Gmail account must be logged in to load the tag list";
                    labelloading.style.color = "Red";
                    throw "Your Gmail account must be logged in to load the tag list";
                }
                DataList = ev.responseText.match(/[^\r\n]+/g); // SEPARA POR QUEBRA DE LINHA
                labelloading.innerHTML = "Tag list loaded";
                labelloading.className = "";
                labelloading.style.color = "#66FF99";
                labelloading.style.cursor = "pointer";
                // INSERE O TITULO DA LISTA NO LABEL
                if (DataList[0].startsWith("(")) {
                    labelloading.innerHTML += "<sup>" + DataList[0] + "</sup>";
                    DataList.shift();
                }
                if (index != -1) // AMAZERNA A LISTA NO CACHE PARA NÃO USAR A SOLICITAÇÃO VARIAS VEZES
                    Tag_Lists[index][2] = DataList;
                // MUDA O LABEL COM ANIMAÇÃO DE DESAPARAECER LENTAMENTE
                var o = 0;
                var fade = setInterval(function () {
                    if (o < 100) {
                        labelloading.style.opacity = ((100 - o) + "%"); o = o + 0.11;
                    }
                    else {
                        clearInterval(fade);
                        labelloading.remove();
                    }
                }, 1);
                labelloading.addEventListener("click", () => { clearInterval(fade) });
            },
            onerror: () => {
                console.error("List not loaded, see console.");
                labelloading.innerText = "Error."
                labelloading.style.color = "Red";
                throw "Error loading the tag list, possible causes\n"
                + "1. Request denied by user\n"
                + "2. Incorrect link\n"
                + "3. Gmail account not logged in\n"
                + "4. File does not exist\n."
            }
        });
    }
    function On_List_Selected(index) {// QUANDO UMA LISTA DE TAGS FOR SELECIONADA
        let selected = Tag_Lists[index];
        Save_Config("Selected_Tag_List", index);
        if (selected[2] != undefined) { // CASO A LISTA FOR AMAZENADO NO ARRAY, PEGUE ELA
            DataList = selected[2];
            document.getElementById("results").innerHTML = "";
            ShowTags();
        }
        else {
            if (selected[1] == "CL") { // LINK CUSTOMIZADO
                if (Config.Custom_List_Link == undefined) {
                    let p = window.prompt("Insert a tag list link\r\n\r\nExamples :\r\n- https://drive.google.com/uc?id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n- https://pastebin.com/raw/xxxxxxxxx");
                    if (isValidHttpUrl(p)) {
                        Save_Config("Custom_List_Link", p);
                        Load_TagList(p);
                    }
                    else {
                        DataList = undefined;
                        alert("Invalid URL");
                    }
                } else { // SE O LINK ESTIVER SALVO NAS CONFIGURAÇÕES
                    Load_TagList(Config.Custom_List_Link);
                }
                return;
            }
            else if (selected[1] != "") { // SE FOR UMA LISTA NORMAL
                Load_TagList(selected[1], index);
            }
            else if (selected[0] == "") { // VAZIO
                return;
            }
            else // SE O LINK FOR VAZIO
                alert("There is no link to load the list");
            Config.Custom_List_Link = undefined;
        }
    }
    function On_AdvancedSettings_Loads() {// QUANDO A CAIXA AVANÇADA SE ABRE
        let ConfigUIAdvanced = document.createElement("div");
        ConfigUIAdvanced.id = "ConfigUIAdvanced";
        ConfigUIAdvanced.style = "text-align:center;vertical-align: middle;";
        getElementByXpath("//nav[@role='navigation']").append(ConfigUIAdvanced);
        for (let i = 0; i < Config.UI_Order.length; i++) {
            const order = Config.UI_Order[i];
            let op = order.toString().split("");
            if (order[1] != undefined && order[1].toLowerCase() == "s") {
                orderlist[parseInt(op[0]) - 1](true);
            }
        }
        let empty = document.createElement("div");
        empty.style.height = "200px";
        UpdateLabel();
    }
    window.document.RPT = (_old, _new, _blur = false, onselection = false) => {
        Replace_Prompt_Tag(_old, _new, _blur = false, onselection = false);
    };
    function Replace_Prompt_Tag(_old, _new, _blur = false, onselection = false) {// FUNÇÃO SUBSITUI A TAG DO PROMPT PRESEVANDO A SINTAXE
        let text = selectedarea.value.toLowerCase();
        let indexPosition = selectedarea.selectionEnd;
        if (Config.Separator == " ") {
            let index = text.lastIndexOf(_old, indexPosition);
            /*
            if (_old.includes("_"))
                _new = _new.replaceAll(" ", "_");*/
            text = text.slice(0, index) + _new + text.slice(index + _old.length);
            Set_Text(text, _blur);
            ShowTags();
            return;
        }
        let split_text = text.split(',');
        split_text = split_text.map(function (word) {
            return word.trim().replace(/[\"'+]+/g, " ").replace("/(\r\n|\n|\r)/gm", "");
        });
        if (onselection == false) {
            split_text[sw[0]] = split_text[sw[0]].replace(_old, _new);
            Set_Text(split_text.join(Config.Auto_Minifier ? "," : ", "), _blur)
        } else { // SE TIVER USADO CTRL  
            text = text.slice(0, indexPosition - 1) + _new + text.slice(indexPosition);
            split_text = text.split(',');
            Set_Text(split_text.join(Config.Auto_Minifier ? "," : ", "), _blur)
        }
    }
    function Set_Text(text, _blur = false, r = true) {// FUNÇÃO DE DEFINIR O TEXTO DO PROMPT
        // SELECIONA O TEXTAREA
        if (text == undefined)
            return;
        const cursorposition = selectedarea.selectionEnd;
        let length = selectedarea.value.length;
        selectedarea.focus();
        if (r == true) selectedarea.select(); // SELECIONA TUDO PARA APAGAR TUDO DEPOIS
        // INSERE O TEXTO
        if (Array.isArray(text))
            document.execCommand("insertText", false, text.join(""))
        else
            document.execCommand("insertText", false, text)
        length = selectedarea.value.length - length;
        selectedarea.selectionEnd = cursorposition + length;
        // RETORNA A SELEÇÃO DE ONDE ERA PARA SER POSICIONADO
        if (_blur == true)
            selectedarea.blur();  // REMOVE O FOCO

    }
    let _a, _b;
    function ShowTags(results = undefined, lastindex = 0) {// FUNÇÃO QUE INSERE TAGS NA LISTA
        let _length = Config.list_size;
        sw = getWord(selectedarea);
        let autocompletelist;
        if (floating_tl == false) {
            autocompletelist = document.getElementById("results");
        }
        else { // CASO FOR CAIXA FLUTUANTE
            _length = 5;
            autocompletelist = document.getElementById("FLOATING_TAGLIST");
            autocompletelist.innerHTML = "";
            let elem = selectedarea.getBoundingClientRect();
            let _x = elem.left;
            let _y = elem.top;
            autocompletelist.style.transform = `translate(${_x}px,${_y + window.pageYOffset+ elem.height}px)`;
            // TEMPO PARA APARECER E DESAPARECER
            clearTimeout(_a);_a=undefined;
            clearTimeout(_b);_b=undefined;
            _a = setTimeout(() => {
                autocompletelist.style.display="grid";
            }, FB_start);
            _b = setTimeout(()=>{
                autocompletelist.style.display="none";
            },FB_end)
        }
        
        // COMEÇA A PROCURAR POR TAGS CASO NÃO HOVUER RESULTADOS
        if (results == undefined) {
            autocompletelist.innerHTML = "";
            results = getResults(sw[1].sdfilter());
        }
        let ordertype = document.getElementById("LISTORDER").selectedIndex;
        switch (ordertype) {
            case 1:
                { results.sort() }
                break;
            case 2:
                { results.reverse() }
                break;
            case 3:
                { shuffle(results) }
                break;
            default:
                break;
        }
        if (results.length > 0) {
            let i = lastindex;
            let v = lastindex;
            for (i; i < results.length; i++) { // COMEÇA A ACRESCENTAR AS TAGS NO DIV
                if (i >= v + _length) // SE EXCEDER O LIMITE DE TAGS
                    break;
                const tags = document.createElement("li");
                tags.style = "padding: 0.5rem;cursor:pointer;";
                /* MAKES THE TAGS SEMI TRANSPARENT
                if (floating_tl)
                    tags.style.background = "rgba(0,0,0,0.5)";*/
                tags.innerText = results[i][0];
                if (results[i][1] == 1) { // SE A TAG FOR IGUAL A ENTRADA, ELA SERA DESTACADA
                    tags.classList = C_SA2;
                    autocompletelist.append(tags);
                    autocompletelist.insertBefore(tags, autocompletelist.childNodes[0]);
                }
                else if (results[i][1] == 2) { // TAG FAVORITA
                    tags.classList = C_SA;
                    tags.style["background-color"] = "gray"
                    autocompletelist.append(tags);
                }
                else if (results[i][1] == 3) { // TAG FAVORITA
                    tags.classList = C_SA;
                    tags.style["background-color"] = "#8c8c00"
                    autocompletelist.append(tags);
                }
                else if (results[i][1] == 0) { // O RESTO APEANS INSERE NORMAL
                    tags.classList = C_SA;
                    autocompletelist.append(tags);
                }
                tags.onclick = (e) => { // AO CLICAR NA TAG, ELE COMEÇA A SUSBTITUIR NO PROMPT
                    if (floating_tl)
                    {
                        autocompletelist.style.display = "none";
                    }
                    let texto = sw[1];
                    let novotexto = tags.innerText;
                    if (e.ctrlKey == true) {
                        Replace_Prompt_Tag(texto.sdfilter(), novotexto, false, true);
                    }
                    else {
                        Replace_Prompt_Tag(texto.sdfilter(), novotexto);
                        if (novotexto.includes("_"))
                            ShowTags();
                    }

                }
            }
            // SE CHEGAR AO LIMITE, MOSTRARA O BOTÃO DE "MOSTRAR MAIS"
            if (i < results.length) {
                let _showmore = document.createElement("li");
                _showmore.id = "showmore";
                _showmore.classList = C_SA2;
                _showmore.style = "padding: 0.5rem;cursor:pointer;";
                _showmore.innerHTML = "Show More";
                _showmore.onclick = () => { // EVENTO
                    // OBTEM O TEXTO DA ULTIMA TAG E COMEÇA A PROCURAR POR MAIS TAGS
                    const lasttagarea = autocompletelist.childNodes[autocompletelist.childNodes.length - 2].innerText;
                    _showmore.remove();
                    ShowTags(results, i);
                };
                autocompletelist.append(_showmore);
            }
        }
    }
    function getResults(input, last) {// RETORNA O ARRAY DAS TAGS PROCURADAS PELA ENTRADA
        const results = [];
        let i = 0;
        for (let v = 0; v < Config.wildcards_lists.length; v++) {
            const w = Config.wildcards_lists[v];
            if (w[0] == input) {
                results.push([w[0], 1])
                for (const key in w[1]) {
                    results.push([w[1][key], 0])
                }
                return results;
            }
        }
        if (Config.ToogleWildcardsTags || (Config.Dynamic_Prompts && input.startsWith("_"))) {
            Config.wildcards_lists.forEach((e) => {
                if (input === e[0].slice(0, input.length)) {
                    results.push([e[0], 3]);
                }
            });
        }
        if (Config.ToggleFavorites) {
            Config.FavoritesTags.forEach((e) => {
                results.push([e, 2]);
            });
        }
        if (DataList == undefined)
            return results;
        input = input.replace(/[\r\n\"'+_]+/g, " ");
        if (input.startsWith("_"))
            return results;
        // QUANDO VOCÊ TIVER CLICADO EM "Show More", ELE PEGA O INDICE DA ULTIMA TAG E COMEÇA A PROCURAR POR MAIS
        if (last) i = DataList.indexOf(last) + 1;
        const l = DataList.length;
        const searchtype = document.getElementById("SEARCHTYPE").selectedIndex;
        for (i; i < l; i++) {// Pega palavras proximas
            if (searchtype == 0 || searchtype == 2) {
                if (input === DataList[i].slice(0, input.length)) {
                    if (input == DataList[i]) {
                        results.push([DataList[i], 1]); // 1 A ENTRADA É IGUAL A TAG
                        continue;
                    }
                    if (searchtype == 2) // SEARCHTYPE EQUALS
                        continue;
                    results.push([DataList[i], 0]); // 0 A ENTRADA É PROXIMA A TAG
                }
            } else if (searchtype == 1) // SEARHTYPE CONTAINS TEXT
            {
                if (DataList[i].includes(input)) {
                    results.push([DataList[i], 0]); // 0 A ENTRADA É PROXIMA A TAG
                }
            }

        }
        return results;
    }
    function getWord(textarea, ignoreseparator = false) { // OBTEM A PALAVRA
        var cursorPos = textarea.selectionStart;
        var text = textarea.value;
        // ENCONTRAR A PALAVRA NA POSIÇÃO DO CURSOR
        var start = text.lastIndexOf(",", cursorPos - 1) + 1;
        var end = text.indexOf(",", cursorPos);
        end = end === -1 ? text.length : end;
        // EXTRAIR A PALAVRA
        var selectedWord = text.substring(start, end).trim();
        // SEPARA AS PALAVRAS POR VIRGULA
        var wordsArray = text.split(",").map(function (word) {
            return word.trim();
        });
        var selectedIndex = wordsArray.indexOf(selectedWord);

        const n = text.substring(cursorPos).match(/^[a-zA-Z0-9-_:.\(\)\{\}\[\]]+/)
        const p = text.substring(0, cursorPos).match(/[a-zA-Z0-9-_:.\(\)\{\}\[\]]+$/)
        //console.log("Posição do cursor:", cursorPos);
        //console.log("Palavra selecionada:", selectedWord);
        //console.log("Array de palavras:", wordsArray);
        if (Config.Separator == "," || ignoreseparator == true) {
            return [selectedIndex, selectedWord.trim().toLowerCase(), wordsArray];
        } else {
            return [selectedIndex, ((p || '') + (n || '')).toString().trim().toLowerCase(), wordsArray];
        }


    };
    function On_Selected_Textarea_Changed() { // APLICA EVENTOS TODA VEZ QUE MUDA A OPÇÃO DO PROMPT
        selectedarea = getElementByXpath("//div[contains(@aria-labelledby,'Prompt')]/div/textarea");
        selectedarea.onkeydown = (e) => {
            if (floating_tl)
                document.getElementById("FLOATING_TAGLIST").style.display = "none";
                
            if (e.ctrlKey == true && e.key == "ArrowUp") {
                sw = getWord(selectedarea);
                e.preventDefault();
                let weight = sw[1].match(/\:[\d]+\.[\d]+|\:[\d]/g);
                if (weight == null)
                    weight = 1.0;
                else
                    weight = parseFloat(weight[0]?.slice(1));
                let v = (Math.round((weight + 0.1) * 10) / 10);
                if (v > 5)
                    v = 5;
                Replace_Prompt_Tag(sw[1], "(" + sw[1].sdfilter() + ":" + v.toString() + ")", false);
            } else if (e.ctrlKey == true && e.key == "ArrowDown") {
                sw = getWord(selectedarea);
                e.preventDefault();
                let weight = sw[1].match(/\:[\d]+\.[\d]+|\:[\d]/g);
                if (weight == null)
                    weight = 1.0;
                else
                    weight = parseFloat(weight[0]?.slice(1));
                let v = (Math.round((weight - 0.1) * 10) / 10);
                if (v < 0)
                    v = 0.0;
                Replace_Prompt_Tag(sw[1], "(" + sw[1].sdfilter() + ":" + v.toString() + ")", false);
            } else if (e.code == "Enter" && e.ctrlKey == false && e.altKey == false && e.shiftKey == false) {
                e.preventDefault();
                if (Config.Enter_Generate == true) {
                    getElementByXpath("//button[@type='submit']").click();
                }
            }
        }
        selectedarea.onkeyup = function (e) {
            UpdateLabel();
            ShowTags();
        };
        selectedarea.onclick = function (e) {
            sw = getWord(selectedarea);
            ShowTags();
        };
        selectedarea.onselect = function (e) {
            sw = getWord(selectedarea);
        }
    }
    function UpdateLabel() {// ATUALIZA OS LABELS
        boundstore = JSON.parse(localStorage["bound-store"]);
        if (document.getElementById("timages") != undefined)
            document.getElementById("timages").innerText = "Total Images generated : " + boundstore.state.user.itemCount;
        if (document.getElementById("imgcount") != undefined)
            document.getElementById("imgcount").innerText = "Images generated : " + (boundstore.state.user.itemCount - totalimg);
    };
    function Save_Config(name, value) {
        // SALVA O VALOR DE UMA VARIAVEL E MANTEM OS OUTROS
        if (name != undefined) {
            Config[name] = value;
            GM.setValue("Config", Config);
            return;
        }
        // SALVA TUDO
        boundstore = JSON.parse(localStorage["bound-store"]);
        Config.Selected_Model = boundstore.state.image.activeModel.modelID;
        Config.Selected_Tag_List = document.getElementById("taglistoptions").value;
        Config.Tag_List_Display_Index = document.getElementById("tagdisplay").value
        GM.setValue("Config", Config);

    };
    async function Load_Config() {// OBTEM OS VALORES DA CONFIGURAÇÃO
        let _config = await GM.getValue("Config");
        if (_config != undefined) {
            for (var k in _config) {
                Config[k] = _config[k]
            }
        }
        console.log("Script Settings", _config);
        Load();
    };
    function ApplyDynamicsPrompt(text) {
        // https://github.com/adieyal/sd-dynamic-prompts/blob/main/docs/SYNTAX.md

        /* for fun
        for (let i = 0; i < 50; i++) {
            console.log("".toDynamicprompts());
        }
        */
        function randomize(_array, iswildcard = false) {
            try {
                if (_array.length != 0) {
                    _array.forEach((e) => {
                        let separator = ",";
                        let words = [];
                        if (iswildcard == false)
                            words = e.split("|");
                        else {
                            if (e.includes("*")) {
                                const wi2 = e.slice(2, -2);
                                if (wi2.endsWith("*")) {
                                    Config.wildcards_lists.forEach((v) => {
                                        if (v[0].startsWith("__" + wi2.slice(0, -1))) {
                                            words = words.concat(v[1]);
                                        }
                                    })
                                }
                            }
                            else {
                                let wildcwrds = Config.wildcards_lists.find(l => l[0] == e);
                                if (wildcwrds == undefined)
                                    return "";
                                words = Config.wildcards_lists.find(l => l[0] == e)[1]
                            }

                            //words = Config.wildcards_lists.find(l => l[0] == e)[1]
                        }
                        // OBTEM RANGE OPTIONS
                        let multiplevalues = words[0].split("$$"); // ENCONTRAR SINTAXE DE MULTIPLOS VALORES
                        words[0] = multiplevalues[multiplevalues.length - 1]; // SEPARA VALORES DA PALAVRA
                        let num = 1;
                        if (multiplevalues.length > 1) // DEFININDO MULTIPLE VALUES
                        {
                            if (multiplevalues[0].includes("-")) // DEFININDO RANGE
                            {
                                let rangearray = multiplevalues[0].split("-");

                                if (rangearray[0] == "")
                                    rangearray[0] = 1;
                                if (rangearray[1] == "")
                                    rangearray[1] = (parseInt(rangearray[0]) + 1);

                                num = parseInt(rangearray[0]) + Math.floor(Math.random() * parseInt(rangearray[1]));
                            }
                            else {
                                num = multiplevalues[0];
                            }

                        }
                        if (multiplevalues.length == 3) // DEFININDO SEPARADOR CUSTOMIZADO
                            separator = multiplevalues[1];
                        // CRIA OPÇÕES DE PONDERAÇÃO
                        let frequencywords = [];
                        for (let v = 0; v < words.length; v++) {
                            const word = words[v];
                            let weightfrequency = word.split("::");
                            if (weightfrequency.length != 1) {
                                let wffloat = parseFloat(weightfrequency[0]) * 10;
                                for (let n = 0; n < wffloat; n++) {
                                    frequencywords.push(weightfrequency[1]);
                                }

                            } else {
                                frequencywords.push(word);
                            }
                        }
                        // CONSTROI O PROMPT FINAL
                        let final = [];
                        for (let i = 0; i < num; i++) {
                            if (frequencywords.length == 0) {
                                alert(`You entered the range options greater than the word list
    
    "{${e}}"
    set the range to ${words.length}`)
                            }
                            let palavraescolhida = frequencywords[Math.floor(Math.random() * frequencywords.length)];
                            if (Config.wildcards_lists.find(l => l[0] == palavraescolhida) == null) {
                                frequencywords.splice(frequencywords.indexOf(palavraescolhida), 1); // REMOVE A PALAVRA NO ARRAY PARA NÃO SER ESCOLHIDA NOVAMENTE
                            }
                            palavraescolhida = ApplyDynamicsPrompt(palavraescolhida); // APLICA PROMPTS DINAMICOS DENTRO DA PALAVRA ESCOLHIDA
                            final.push(palavraescolhida.trim());
                        }
                        if (iswildcard == false)
                            text = text.replace("{" + e + "}", final.join(separator));
                        else
                            text = text.replace(e, final.join(separator));
                    })
                }
            }
            catch (err) {
                console.warn("Erro no Dynamic Prompts : " + err);
                return;
            }
        }
        // ENCONTRA LISTA DE PALAVRAS
        const regex = /\{([^\}]+)\}/g;
        let match;
        let list = [];
        while ((match = regex.exec(text)) !== null) { // MATCH PALAVRAS DENTRO DO COLCHETES
            list.push(match[1]);
        }
        randomize(list);
        list = [];
        // ENCONTRA WILDCARDS
        let wildcardsidentify = text.match(/__([A-Za-z0-9\-\*]+)__/g);
        if (wildcardsidentify != null) {
            for (let i = 0; i < wildcardsidentify.length; i++) {
                const wi = wildcardsidentify[i];
                list.push(wi);
            }
            randomize(list, true);
        }
        return text;
    }
    // GERANCIAMENTO DE IMAGENS PEGO PELO SCRIPT, DETECTA IMAGENS SENDO GERADAS
    var Image = {
        ImagensExistentes: [],
        SendToQueue(ID) {
            let i = this.ImagensExistentes.find((n) => n[0] == ID);
            if (i == undefined) {
                // iNSERE NO ARRAY
                this.ImagensExistentes.push([ID]);
                if (Config.Pending_Images.find((n) => n == ID) == undefined) {
                    Config.Pending_Images.push(ID);
                    Save_Config("Pending_Images", Config.Pending_Images);
                }
                let i = [ID];
                let _QueuesSquare = document.createElement("div");
                _QueuesSquare.style = "cursor:pointer;display:grid;align-content: center;width:100%";
                _QueuesSquare.innerHTML = "<p>Queue Position</p>";
                _QueuesSquare.classList = "text-center shadow-highlight aspect-square animate-pulse items-center justify-center border";
                _QueuesSquare.id = ID;
                // EVENTOS
                _QueuesSquare.onclick = function () { clearInterval(i[2]); i[2] = null; _QueuesSquare.remove(); };
                _QueuesSquare.onmouseover = function () { _QueuesSquare.innerText = "Skip image?"; }
                _QueuesSquare.onmouseout = function () { _QueuesSquare.innerText = "Queue Position"; }
                // INSERE O QUADRADO DA FILA NO AMAZENAMENTO ABAIXO
                let imgstr = document.getElementById("IMAGE_STORAGE");
                imgstr.append(_QueuesSquare);
                imgstr.insertBefore(_QueuesSquare, imgstr.childNodes[0]);
                i[1] = _QueuesSquare;
                if (i[2] == undefined)
                    this.ImageCheck(i);
            }
        },
        ImageCheck(Arroz) { // VERIFICA A IMAGEM SE FOI GERADA
            let _i = setInterval(() => {
                fetch('https://api.sexy.ai/getItemStatus?imageID=' + Arroz[0], {
                    method: "GET",
                    headers: { "Content-type": "application/json; charset=UTF-8" }
                })
                    .then(response => response.text())
                    .then(json => {
                        let _queueposition = JSON.parse(json).payload.queuePosition;
                        Arroz[1].innerHTML = "<p>Queue Position</p><p>" + _queueposition + "</p>";
                        let url = JSON.parse(json).payload.url
                        if (url != null) { // SE A IMAGEM FOR FINALIZADA
                            this.InsertImageToStorage(Arroz, url);
                        }
                    });
            }, 2000);
            Arroz[2] = _i;
        },
        InsertImageToStorage(Arroz, url) {
            if (Arroz[1] != undefined) {
                var child = Arroz[1];
                var parent = child.parentNode;
                var index = Array.prototype.indexOf.call(parent.children, child);
                // ADICIONA A IMAGEM NA POSIÇÃO ONDE O QUADRADO DA FILA ESTA POSICIONADO
                this.CreateImage(Arroz[0], url, index);
                // REMOVE O QUADRADO
                Arroz[1].remove();
            }
            else {
                this.CreateImage(Arroz[0], url, 0);
            }
            if (Arroz[2] != undefined)
                clearInterval(Arroz[2]);
            console.log("Finished [" + Arroz[0] + "]");
        },
        CreateImage(imgid, url, pos = 0) { // ACRESCENTA A IMAGEM NO AMAZENAMENTO DE IMAGEM
            let imageexist = getElementByXpath("//div[@id='IMAGE_STORAGE']/div[@href='/m/" + imgid + "']");
            if (imageexist == undefined) {
                let div = document.createElement("div");
                div.classList = "after:shadow-highlight select-none rounded-lg p-1 bg-slate-600";
                div.href = "/m/" + imgid;
                let divoptions = document.createElement("div");

                add_button(divoptions, "❌", [30, 30], "Remove from page (This function does not delete an image from the library)", () => {
                    div.remove();
                })
                add_button(divoptions, "📃", [30, 30], "Override prompt in configuration", () => {
                    const imginfo = GetImageInfoByID(imgid);
                    imginfo.then((a) => {
                        if (selectedarea.id = "negprompt")
                            Set_Text(a.negprompt);
                        if (selectedarea.id = "prompt")
                            Set_Text(a.prompt);
                    }).catch((e) => {
                        console.error(e);
                    })
                })
                let imgelem = document.createElement("img");
                imgelem.alt = imgid;
                imgelem.classList = "max-h-full rounded-lg cursor-pointer";
                imgelem.src = url
                imgelem.onclick = () => {
                    window.open("/m/" + imgid);
                }
                if (showoptions == false) {
                    divoptions.style.display = "none";
                    div.setAttribute("option", false);
                }
                div.append(divoptions);
                div.append(imgelem);
                let _imgstr = document.getElementById("IMAGE_STORAGE");
                _imgstr.append(div);
                _imgstr.insertBefore(div, _imgstr.childNodes[pos]);

                // REMOVE DAS IMAGENS PENDENTES
                Config.Pending_Images.splice(Config.Pending_Images.indexOf(imgid), 1);
                Save_Config("Pending_Images", Config.Pending_Images);
            }
        },
        FetchInterceptor() { // SERVE PARA VERIFICAR IMAGENS NA FILA E USER RECURSOS PRO
            const window = unsafeWindow;
            const { fetch: originalFetch } = window;
            window.fetch = async (...args) => {
                let [resource, config] = args;
                if (Config.Dynamic_Prompts == true) {
                    if (resource == "https://api.sexy.ai/generateImage") {
                        let c = JSON.parse(config.body);
                        if (Config.Dynamic_Prompts == true) {
                            c.prompt = ApplyDynamicsPrompt(localStorage.prompt);
                            c.negprompt = ApplyDynamicsPrompt(localStorage.negprompt);
                        }
                        //c.folderID = "6bb05ffa-0d47-4558-8a68-23a0a27d9c6f"; // just testing
                        // SALVA AS CONFIGURAÇÕES DO FETCH
                        config.body = JSON.stringify(c);
                        console.log("Intercepted by my script :", [resource, config], c)
                    }
                }
                let response = await originalFetch(resource, config);
                if (Config.Keep_Image == true) {
                    // RESPONSE INTERCEPTOR
                    const json = () =>
                        response
                            .clone()
                            .json()
                            .then((data) => ({ ...data, title: `Intercepted: ${data.title}` }));
                    json().then(function (result) {
                        let _imageid = result.payload.imageID;
                        if (_imageid != null)
                            Image.SendToQueue(_imageid);
                    })
                }
                return response;
            };
        },
    }
    function Load() // VERIFICA SE A PAGINA FOI CARREGADA, PARA CONSTRUIR NOVAS UIS DO SCRIPT
    {
        setInterval(function () {
            u = window.document.URL;
            if (u.startsWith("https://sexy.ai/generate")) {
                if (document.getElementById("ConfigUI") == null) {
                    Initialize_Main_Script();
                    Image.FetchInterceptor();
                }
            } else if (u.startsWith("https://sexy.ai/library") && u.endsWith("library")) {
                if (document.getElementById("search_index") == null) {
                    UIs.Build_Ui_Library();
                }
            } else if (u.startsWith("https://sexy.ai/m/")) {
                // none
            }
        }, Config.delay);
        // ACRESCENTA O COMANDO DE MENU DO TAMPERMONKEY
        GM_registerMenuCommand("⚙️Set script loading delay", () => {
            let _int = parseInt(window.prompt("Set the delay (in milliseconds) to check if the UI has loaded to load the script\n\nDefault: 1sec = 1000", Config.delay))
            if (_int == null || _int == "" || isNaN(_int)) return;
            Save_Config("delay", _int);
        });
        GM_registerMenuCommand("⚙️Set the number of tags to be shown", () => {
            let _int = parseInt(window.prompt("Define the number of tags to be shown in the list.\n\nDefault: 40\nMax : 500", Config.list_size))
            if (_int == null || _int == "" || isNaN(_int)) return;
            if (_int > 9000) { alert("IT'S OVER NINE THOUSAND!!!!!!") }; // lol
            if (_int > 500) _int = 500; // Grandes valores pode apresentar lags
            Save_Config("list_size", _int);
        }, "t");
        GM_registerMenuCommand("⚙️Manage Script Interface", () => {
            let _order = window.prompt(`-Set the order of the script UI to be shown on the page.
-You can disable the UI just by not putting the number.
-If you want one of the interfaces to be in the advanced box, just put "s" at the end. Ex:. "3s", "4s"

Default order: 1,2,3s,4s,5s,6s
1 = Prompt Toolbox
2 = Tag List Box
3 = Word Bypass Box
4 = Main Config Box
5 = Random Prompt Box
6 = Dynamic Prompts Box`, Config.UI_Order.join());
            if (_order == null || _order == "") return;
            Save_Config("UI_Order", _order.split(','));
            BuildUI(true);
        });
        GM_registerMenuCommand("⚙️Edit Favorites Tags", () => {
            let _i = window.prompt("Editing favorite tags. Separate using a comma\r\n\r\n" + Config.FavoritesTags.toString(), Config.FavoritesTags.toString());
            if (_i == null || _i == "") return;
            _i = _i.split(",").map(function (word) {
                return word.trim();
            });
            Save_Config("FavoritesTags", _i);
        });
        GM_registerMenuCommand("🧹Reset Script Settings", () => {
            GM_deleteValue("Config"); alert("Settings have been reset");
        });
        GM_registerMenuCommand("🧹Clear Pending Images", () => {
            Save_Config("Pending_Images", [])
        });
    }
    navigation.addEventListener('navigate', (e) => { // FUNÇÃO QUE ARMAZENA PROMPTS TEMPORARIOS QUANDO VOCÊ MUDAR DE ABA
        let url = e.destination.url;
        if (!url.startsWith("https://sexy.ai/generate")) {
            // DEFINE PROMPTS TEMPORARIOS
            first_open = false;
            console.log("URL changed to : " + url);
        }
    })
    window.addEventListener("beforeunload", function (e) { // AUTO-SAVE
        if (Config.Auto_Save)
            Save_Config();
    });
    // PRIMEIRAS FUNÇÕES SER EXECUTADA
    Load_Config();
    // OUTRAS FUNÇÕES
    function shuffle(array) {
        let currentIndex = array.length, randomIndex;
        // While there remain elements to shuffle.
        while (currentIndex > 0) {
            // Pick a remaining element.
            randomIndex = Math.floor(Math.random() * currentIndex);
            currentIndex--;
            // And swap it with the current element.
            [array[currentIndex], array[randomIndex]] = [
                array[randomIndex], array[currentIndex]];
        }

        return array;
    };
    function isValidHttpUrl(string) {
        let url;
        try {
            url = new URL(string);
        } catch (_) {
            return false;
        }
        return url.protocol === "http:" || url.protocol === "https:";
    }
    function array_move(arr, old_index, new_index) {
        if (new_index >= arr.length) {
            var k = new_index - arr.length + 1;
            while (k--) {
                arr.push(undefined);
            }
        }
        arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
        return arr.toString(); // for testing
    };
    window.mobileCheck = function () {
        let check = false;
        (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; })(navigator.userAgent || navigator.vendor || window.opera);
        return check;
    };
})();