User:MSK/wikishield dev build.js
(()=>{"use strict";var t={694:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.fullTrim=void 0;e.fullTrim=t=>{const e=t.split("\n"),n=e.length;let i=!0,o=1/0,a=[],r=[];for(let t=0;t<n;t++){const n=e[t];if(""===n.trim()){if(i)continue;a.push("")}else{i?i=!1:(r=r.concat(a),a=[]);const t=n.match(/^(\s*)/)[0].length;o=Math.min(o,t),r.push(n)}}const s=r.length;if(0===s)return"";const l=[];for(let t=0;t<s;t++){const e=r[t].trimEnd();""===e?l.push(""):l.push(e.slice(o))}return l.join("\n")}},707:(t,e)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.subdomains=void 0;e.subdomains={aa:"Afar",ab:"Abkhaz",ace:"Acehnese",ady:"Adyghe",af:"Afrikaans",ak:"Akan",als:"Alemannic",alt:"Southern Altai",am:"Amharic",ami:"Amis",an:"Aragonese",ang:"Old English",ann:"Obolo",anp:"Angika",ar:"Arabic",arc:"Aramaic",ary:"Moroccan Arabic",arz:"Egyptian Arabic",as:"Assamese",ast:"Asturian",atj:"Atikamekw",av:"Avar",avk:"Kotava",awa:"Awadhi",ay:"Aymara",az:"Azerbaijani",azb:"South Azerbaijani",ba:"Bashkir",ban:"Balinese",bar:"Bavarian","bat-smg":"Samogitian",bbc:"Toba Batak",bcl:"Central Bikol",bdr:"Bajau Sama",be:"Belarusian","be-tarask":"Belarusian (Classical)",bew:"Betawi",bg:"Bulgarian",bh:"Bhojpuri",bi:"Bislama",bjn:"Banjarese",blk:"Pa'O",bm:"Bambara",bn:"Bengali",bo:"Tibetan",bpy:"Bishnupriya Manipuri",br:"Breton",bs:"Bosnian",btm:"Mandailing Batak",bug:"Buginese",bxr:"Buryat",ca:"Catalan","cbk-zam":"Chavacano",cdo:"Eastern Min",ce:"Chechen",ceb:"Cebuano",ch:"Chamorro",cho:"Choctaw",chr:"Cherokee",chy:"Cheyenne",ckb:"Sorani Kurdish",co:"Corsican",cr:"Cree",crh:"Crimean Tatar",cs:"Czech",csb:"Kashubian",cu:"Old Church Slavonic",cv:"Chuvash",cy:"Welsh",da:"Danish",dag:"Dagbani",de:"German",dga:"Dagaare",din:"Dinka",diq:"Zazaki",dsb:"Lower Sorbian",dtp:"Dusun",dty:"Doteli",dv:"Maldivian",dz:"Dzongkha",ee:"Ewe",el:"Greek",eml:"Emilian–Romagnol",en:"English",eo:"Esperanto",es:"Spanish",et:"Estonian",eu:"Basque",ext:"Extremaduran",fa:"Persian",fat:"Fante",ff:"Fula",fi:"Finnish","fiu-vro":"Võro",fj:"Fijian",fo:"Faroese",fon:"Fon",fr:"French",frp:"Franco-Provençal",frr:"North Frisian",fur:"Friulian",fy:"West Frisian",ga:"Irish",gag:"Gagauz",gan:"Gan",gcr:"Guianan Creole",gd:"Scottish Gaelic",gl:"Galician",glk:"Gilaki",gn:"Guarani",gom:"Konkani",gor:"Gorontalo",got:"Gothic",gpe:"Ghanaian Pidgin English",gu:"Gujarati",guc:"Wayuu",gur:"Gurenne",guw:"Gun",gv:"Manx",ha:"Hausa",hak:"Hakka",haw:"Hawaiian",he:"Hebrew",hi:"Hindi",hif:"Fiji Hindi",ho:"Hiri Motu",hr:"Croatian",hsb:"Upper Sorbian",ht:"Haitian Creole",hu:"Hungarian",hy:"Armenian",hyw:"Western Armenian",hz:"Herero",ia:"Interlingua",iba:"Iban",id:"Indonesian",ie:"Interlingue",ig:"Igbo",igl:"Igala",ii:"Sichuan Yi",ik:"Inupiaq",ilo:"Ilocano",inh:"Ingush",io:"Ido",is:"Icelandic",it:"Italian",iu:"Inuktitut",ja:"Japanese",jam:"Jamaican Patois",jbo:"Lojban",jv:"Javanese",ka:"Georgian",kaa:"Karakalpak",kab:"Kabyle",kbd:"Kabardian",kbp:"Kabiye",kcg:"Tyap",kg:"Kongo",kge:"Komering",ki:"Kikuyu",kj:"Kwanyama",kk:"Kazakh",kl:"Greenlandic",km:"Khmer",kn:"Kannada",knc:"Central Kanuri",ko:"Korean",koi:"Komi-Permyak",kr:"Kanuri",krc:"Karachay-Balkar",ks:"Kashmiri",ksh:"Ripuarian",ku:"Kurdish",kus:"Kusaal",kv:"Komi",kw:"Cornish",ky:"Kyrgyz",la:"Latin",lad:"Judaeo-Spanish",lb:"Luxembourgish",lbe:"Lak",lez:"Lezgian",lfn:"Lingua Franca Nova",lg:"Luganda",li:"Limburgish",lij:"Ligurian",lld:"Ladin",lmo:"Lombard",ln:"Lingala",lo:"Lao",lrc:"Northern Luri",lt:"Lithuanian",ltg:"Latgalian",lv:"Latvian",mad:"Madurese",mai:"Maithili","map-bms":"Banyumasan",mdf:"Moksha",mg:"Malagasy",mh:"Marshallese",mhr:"Meadow Mari",mi:"Maori",min:"Minangkabau",mk:"Macedonian",ml:"Malayalam",mn:"Mongolian",mni:"Meitei",mnw:"Mon",mo:"Moldovan",mos:"Moore",mr:"Marathi",mrj:"Hill Mari",ms:"Malay",mt:"Maltese",mus:"Muscogee",mwl:"Mirandese",my:"Burmese",myv:"Erzya",mzn:"Mazanderani",na:"Nauruan",nah:"Nahuatl",nap:"Neapolitan",nds:"Low German","nds-nl":"Dutch Low Saxon",ne:"Nepali",new:"Newar",ng:"Ndonga",nia:"Nias",nl:"Dutch",nn:"Norwegian (Nynorsk)",no:"Norwegian",nostalgia:"Nostalgia",nov:"Novial",nqo:"N'Ko",nr:"Southern Ndebele",nrm:"Norman",nso:"Northern Sotho",nup:"Nupe",nv:"Navajo",ny:"Chewa",oc:"Occitan",olo:"Livvi-Karelian",om:"Oromo",or:"Odia",os:"Ossetian",pa:"Punjabi",pag:"Pangasinan",pam:"Kapampangan",pap:"Papiamento",pcd:"Picard",pcm:"Nigerian Pidgin",pdc:"Pennsylvania Dutch",pfl:"Palatine German",pi:"Pali",pih:"Norfuk",pl:"Polish",pms:"Piedmontese",pnb:"Western Punjabi",pnt:"Pontic",ps:"Pashto",pt:"Portuguese",pwn:"Paiwan",qu:"Quechua",rki:"Rakhine",rm:"Romansh",rmy:"Romani",rn:"Kirundi",ro:"Romanian","roa-rup":"Aromanian","roa-tara":"Tarantino",rsk:"Pannonian Rusyn",ru:"Russian","ru-sib":"Siberian",rue:"Rusyn",rw:"Kinyarwanda",sa:"Sanskrit",sah:"Yakut",sat:"Santali",sc:"Sardinian",scn:"Sicilian",sco:"Scots",sd:"Sindhi",se:"Northern Sami",sep11:"September 11",sg:"Sango",sh:"Serbo-Croatian",shi:"Shilha",shn:"Shan",si:"Sinhala",simple:"Simple English",sk:"Slovak",skr:"Saraiki",sl:"Slovene",sm:"Samoan",smn:"Inari Sami",sn:"Shona",so:"Somali",sq:"Albanian",sr:"Serbian",srn:"Sranan Tongo",ss:"Swazi",st:"Sotho",stq:"Saterland Frisian",su:"Sundanese",sv:"Swedish",sw:"Swahili",syl:"Sylheti",szl:"Silesian",szy:"Sakizaya",ta:"Tamil",tay:"Atayal",tcy:"Tulu",tdd:"Tai Nuea",te:"Telugu",ten:"10",test:"Test",test2:"Test2",tet:"Tetum",tg:"Tajik",th:"Thai",ti:"Tigrinya",tig:"Tigre",tk:"Turkmen",tl:"Tagalog",tlh:"Klingon",tly:"Talysh",tn:"Tswana",to:"Tongan",tokipona:"Toki Pona",tpi:"Tok Pisin",tr:"Turkish",trv:"Seediq",ts:"Tsonga",tt:"Tatar",tum:"Tumbuka",tw:"Twi",ty:"Tahitian",tyv:"Tuvan",udm:"Udmurt",ug:"Uyghur",uk:"Ukrainian",ur:"Urdu",uz:"Uzbek",ve:"Venda",vec:"Venetian",vep:"Veps",vi:"Vietnamese",vls:"West Flemish",vo:"Volapük",wa:"Walloon",war:"Waray",wo:"Wolof",wuu:"Wu",xal:"Kalmyk",xh:"Xhosa",xmf:"Mingrelian",yi:"Yiddish",yo:"Yoruba",za:"Zhuang",zea:"Zeelandic",zgh:"Moroccan Amazigh",zh:"Chinese","zh-classical":"Classical Chinese","zh-min-nan":"Southern Min","zh-yue":"Cantonese",zu:"Zulu"}}},e={};function n(i){var o=e[i];if(void 0!==o)return o.exports;var a=e[i]={exports:{}};return t[i](a,a.exports,n),a.exports}n(707);var i=n(694);{const t=t=>{var e,n,o,a;const r=t.diff,s=t.sizediff||0,l=t.ores||0,d=(null===(e=t.page)||void 0===e?void 0:e.title)||"Unknown",c=(null===(n=t.user)||void 0===n?void 0:n.editCount)||0,p=(null===(o=t.user)||void 0===o?void 0:o.warningLevel)||"0",u=(null===(a=t.user)||void 0===a?void 0:a.name)||"Unknown",g=t.comment||"No summary",m=mw.util.isTemporaryUser(u);let b="Main",h="Main article namespace - STRICT standards. Accuracy, neutrality, verifiability required. Catch vandalism and policy violations.";if(d.includes(":")){const t=d.split(":")[0];b={Talk:"Talk",User:"User","User talk":"User talk",Wikipedia:"Project","Wikipedia talk":"Project talk",File:"File","File talk":"File talk",Template:"Template","Template talk":"Template talk",Category:"Category","Category talk":"Category talk",Draft:"Draft","Draft talk":"Draft talk",Help:"Help",Portal:"Portal"}[t]||t;h={Talk:"Discussion/conversation page - VERY LENIENT. Opinions and debates are normal and expected. Only flag offensive/attack content.",User:"User's personal sandbox - EXTREMELY LENIENT. Users can experiment here. Only flag severe policy violations or attack pages.","User talk":"User communication page - VERY LENIENT. Direct messages to users. Only flag if attacking/harassing.",Project:"Wikipedia policy/guideline space - MODERATE. Discussion and proposals are normal. Check for disruption.","Project talk":"Project discussion page - VERY LENIENT. Policy debates happen here. Opinions expected.",Draft:"Draft article space - LENIENT. Work in progress. Missing sources and formatting issues are NORMAL and ACCEPTABLE. Only flag clear vandalism.","Draft talk":"Draft discussion page - VERY LENIENT. Feedback and questions are normal.",File:"File description pages - MODERATE. Check for copyright issues and appropriate descriptions.","File talk":"File discussion page - VERY LENIENT. Questions and discussions are normal.",Template:"Template pages - MODERATE. Technical pages. Check for vandalism breaking functionality.","Template talk":"Template discussion page - VERY LENIENT. Technical discussions are normal.",Category:"Category pages - MODERATE. Check for inappropriate categorization.","Category talk":"Category discussion page - VERY LENIENT. Discussions are normal."}[b]||h}(d.toLowerCase().includes("/sandbox")||d.toLowerCase().endsWith(":sandbox"))&&(h="User sandbox - MAXIMUM LENIENCY. Test/practice space. Experiments and incomplete content are EXPECTED and FINE. Almost always approve.");const f=y.ollamaAI.convertDiffToReadable(r);let v="";v=m?"Anonymous temporary editor - could be anyone. Temporary accounts have higher vandalism rates but many make good edits. Judge the edit, not the editor.":0===c?"Brand new account (0 edits) - First ever edit. Could be legitimate new user or sockpuppet/vandal. Higher scrutiny needed.":c<10?"Very new user (< 10 edits) - Still learning. Expect mistakes but assume good faith unless clearly malicious.":c<50?"New user (< 50 edits) - Gaining experience. Minor errors expected, likely good faith.":c<500?"Intermediate user (50-500 edits) - Should understand basic policies. Mistakes possible but less common.":"Experienced user (500+ edits) - Knows Wikipedia policies well. Trust their judgment unless clearly problematic.";let x="";switch(p){case"0":x="No previous warnings - Clean record. First problematic edit (if any).";break;case"1":x="Warning level 1 - Minor previous issue. They've been notified once. Still assume good faith.";break;case"2":x="Warning level 2 - Has been warned twice. Pattern may be emerging. Less benefit of doubt.";break;case"3":x="Warning level 3 - Serious warnings given. Next vandalism = likely block. Watch closely.";break;case"4":case"4im":x="Warning level 4/4im - FINAL WARNING given. Any further vandalism should result in AIV report.";break;default:x=`Warning level ${p} - Has received warnings previously.`}return(0,i.fullTrim)(`\n\t\t\tYou are an expert Wikipedia anti-vandalism reviewer. Analyze the provided edit decisively and produce a single JSON verdict (see schema at end). Be fast, precise, and conservative only when required. Default to APPROVE unless clear evidence of vandalism, policy violation, or harmful material appears.\n\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\tEDIT METADATA (inputs)\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\tPage: "${d}"\n\t\t\tNamespace: ${b} — ${h}\n\t\t\tPage title: "${d}"\n\t\t\tEditor: ${u}${m?" (TEMPORARY)":""} • ${c} edits\n\t\t\tUser profile: ${v}\n\t\t\tSummary: "${g}"\n\t\t\tSize change: ${s>0?"+":""}${s} bytes\n\t\t\tORES score: ${(100*l).toFixed(1)}%\n\t\t\tReadable diff:\n\t\t\t${f}\n\n\t\t\tIf namespace is a talk, user, draft, or sandbox page, treat missing citations and opinion as acceptable. Flag only attacks, harassment, spam, or clear disruption on those pages.\n\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\tQUICK DECEPTIVE-SUMMARY CHECK\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\tCompare edit summary to byte delta. Treat large mismatches as red flags:\n\t\t\t• "typo/spelling/grammar" ≈ 5–20 bytes. Not 100+.\n\t\t\t• "nothing/minor/fix" should be tiny. Not 200+.\n\t\t\t• "punctuation/comma" < 50 bytes.\n\t\t\t• "formatting" < 500 bytes.\n\t\t\tIf mismatch → treat as potential deception and escalate severity. (such as "fixed typo" but then adds new information)\n\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\tDIFF LEGEND\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\t" " = unchanged context\n\t\t\t"- " = removed\n\t\t\t"+ " = added\n\t\t\t[[text]] = inline addition\n\t\t\t~~text~~ = inline removal\n\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\tDECISIVE RULES (apply in this order)\n\t\t\t════════════════════════════════════════════════════════════════\n\n\t\t\t1) Namespace rules (highest priority)\n\t\t\t- Main/article namespace: enforce strict standards (vandalism, unsourced BLP claims, POV).\n\t\t\t- Talk/User/Sandbox/Draft: extremely lenient for sourcing. Only flag attacks, harassment, spam, or clear disruption.\n\n\t\t\t2) Obvious vandalism → immediate rollback\n\t\t\tRollback when any of:\n\t\t\t- Profanity or slurs.\n\t\t\t- Gibberish or repeated nonsense ("asdfgh", "lololol").\n\t\t\t- Graffiti signatures ("X was here").\n\t\t\t- Blank/erase content without reason.\n\t\t\t- Obvious jokes, memes, or patently false claims.\n\t\t\t- Summary explicitly says "test" or "vandalism".\n\t\t\t- Deceptive summary that masks a large change.\n\n\t\t\t3) Not vandalism (do not flag)\n\t\t\t- Poor grammar or style.\n\t\t\t- Unsourced but plausible claims (except BLP on main namespace).\n\t\t\t- Formatting fixes and rewording.\n\t\t\t- Minor POV or pushing a viewpoint without clear policy violation.\n\t\t\t- Any constructive edit on talk/user/sandbox/draft pages unless harassment or spam.\n\n\t\t\t4) Constructive signals (favor APPROVE)\n\t\t\t• Fixes to grammar, formatting, or readability.\n\t\t\t• Adding information that appears relevant.\n\t\t\t• Removing clear error or vandalism.\n\t\t\t• Detailed, honest edit summary.\n\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\tACTIONS (use one)\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\t- approve: Default. Use for constructive or harmless edits.\n\t\t\t- thank: Exceptional contribution (added sources, major improvement).\n\t\t\t- welcome: New user (<50 edits) who made a good contribution.\n\t\t\t- warn-and-revert: Policy violation but possibly good faith (e.g., unsourced BLP, promotional content).\n\t\t\t- rollback: Definite vandalism (profanity, blanking, gibberish).\n\t\t\t- report-aiv: Serious malicious pattern or sustained bad actor (admin report needed).\n\t\t\t- review: Rare (<3%). Only when evaluation is truly impossible from the diff.\n\n\t\t\tGuideline: 85–90% of edits should be APPROVE. Use REVIEW under 3% of the time. When uncertain, APPROVE.\n\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\tEVIDENCE & REASONING\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\tWhen you flag or choose a non-approve action:\n\t\t\t• Quote the exact problematic text from the diff.\n\t\t\t• State the rule and namespace that justify the action.\n\t\t\t• Provide a concise one-sentence remediation recommendation (e.g., "Revert and warn; unsourced BLP on main page. Provide reliable references before re-adding.").\n\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\tRESPONSE FORMAT (strict JSON only)\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\tReturn exactly one JSON object with these fields:\n\n\t\t\t{\n\t\t\t"hasIssues": boolean,\n\t\t\t"probability": 0-100,\n\t\t\t"confidence": "high" | "medium" | "low",\n\t\t\t"reasoning": "Concise statement of why",\n\t\t\t"issues": [\n\t\t\t\t{\n\t\t\t\t"type": "vandalism|spam|pov|unsourced|attack|copyright|disruptive|factual-error|policy|username",\n\t\t\t\t"severity": "critical|major|minor",\n\t\t\t\t"description": "Quoted evidence and brief note"\n\t\t\t\t}\n\t\t\t],\n\t\t\t"constructive": boolean,\n\t\t\t"summary": "One-sentence final assessment",\n\t\t\t"action": "approve|thank|review|warn-and-revert|rollback|report-aiv|welcome",\n\t\t\t"recommendation": "One-line explaining chosen action and next steps"\n\t\t\t}\n\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\tPERFORMANCE NOTES\n\t\t\t════════════════════════════════════════════════════════════════\n\t\t\t• Be decisive. Short, specific reasoning only.\n\t\t\t• Do not invent external facts. Judge only by the diff, metadata, and provided context.\n\t\t\t• If a claim requires external verification but is not obviously harmful, APPROVE.\n\t\t\t• Use "review" only when the diff cannot be judged at all from available inputs.\n\n\t\t\tAnalyze now and return the JSON verdict.\n\t\t`)},e=(t,e)=>(0,i.fullTrim)(`\n\t\t\tYou are analyzing a Wikipedia username to determine if it violates Wikipedia's username policy.\n\n\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\t\t\tUSERNAME TO ANALYZE\n\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n\t\t\tUsername: ${t}\n\t\t\tCurrently editing: ${e}\n\t\t\t→ The page title should ONLY be taken onto account to detect promotional edits.\n\n\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\t\t\tWIKIPEDIA USERNAME POLICY\n\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n\t\t\tVIOLATIONS TO FLAG:\n\n\t\t\t1. PROMOTIONAL/ADVERTISING\n\t\t\t• Company/organization names (e.g., "AppleInc", "CocaCola")\n\t\t\t• Product/brand names (e.g., "iPhone15Pro", "TeslaModelS")\n\t\t\t• Website/domain names (e.g., "ExampleDotCom", "MyWebsite123")\n\t\t\t• Commercial slogans or marketing language\n\t\t\t• Exception: Personal names that happen to match brands are usually OK\n\n\t\t\t2. IMPERSONATION\n\t\t\t• Claiming to be a famous person (e.g., "RealTaylorSwift", "ElonMusk")\n\t\t\t• Pretending to be a Wikipedia admin/official (e.g., "WikipediaAdmin")\n\t\t\t• Using "official" or "real" prefixes to imply authority\n\t\t\t• Exception: Obviously fictional/parody names are usually OK\n\n\t\t\t3. OFFENSIVE/INAPPROPRIATE\n\t\t\t• Profanity, slurs, or vulgar language\n\t\t\t• Sexual/explicit content in username\n\t\t\t• Hateful or discriminatory language\n\t\t\t• Attack usernames targeting individuals\n\n\t\t\t4. SHARED/ROLE ACCOUNTS\n\t\t\t• Implies multiple people (e.g., "MarketingTeam", "CompanyStaff")\n\t\t\t• Organization/group accounts\n\n\t\t\tACCEPTABLE USERNAMES:\n\n\t\t\t✓ Personal names (even if unusual): "John Smith", "StardustDreamer"\n\t\t\t✓ Random/creative combinations: "PurpleCat42", "MountainReader"\n\t\t\t✓ Descriptive interests: "HistoryBuff", "ScienceFan2023"\n\t\t\t✓ Misspellings or variations of common words\n\t\t\t✓ Foreign language names/words (unless offensive)\n\t\t\t✓ Numbers and dates (birthdates, lucky numbers, etc.)\n\n\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\t\t\tANALYSIS GUIDELINES\n\t\t\t━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n\t\t\tBE CONSERVATIVE: When in doubt, DON'T flag\n\t\t\t• Most usernames are acceptable\n\t\t\t• Only flag clear violations\n\t\t\t• Consider context (editing relevant articles is OK)\n\t\t\t• Personal names that match brands are usually fine\n\n\t\t\tCONFIDENCE LEVELS:\n\t\t\t• 0.9-1.0: Obvious violation (company name, clear impersonation)\n\t\t\t• 0.7-0.9: Strong indicators (promotional with editing pattern)\n\t\t\t• 0.5-0.7: Moderate concern (borderline case)\n\t\t\t• 0.0-0.5: Acceptable or insufficient evidence\n\n\t\t\tCONTEXT MATTERS:\n\t\t\t• User editing related articles? (e.g., "AppleFan" editing Apple Inc.)\n\t\t\t• Username could be personal name? (e.g., "Jordan" is a name AND brand)\n\t\t\t• Is it obviously parody/fictional?\n\n\t\t\t═══════════════════════════════════════════════════════════\n\t\t\tRESPONSE FORMAT (JSON)\n\t\t\t═══════════════════════════════════════════════════════════\n\n\t\t\t{\n\t\t\t\t"shouldFlag": boolean,\n\t\t\t\t"confidence": 0.0-1.0,\n\t\t\t\t"violationType": "promotional|impersonation|offensive|confusing|shared|none",\n\t\t\t\t"reasoning": "Specific explanation of why username violates or doesn't violate policy",\n\t\t\t\t"recommendation": "Brief recommendation for action or why it's acceptable"\n\t\t\t}\n\n\t\t\tAnalyze the username now. Be conservative and consider context.\n\t\t`),n={version:"1.0.0",changelog:{version:"1",HTML:'<h1 class="settings-section-title">Changelog</h1>\n\t\t\t<p>In development</p>'},pages:{AVI:"Wikipedia:Administrator intervention against vandalism",UAA:"Wikipedia:Usernames for administrator attention",RFPP:"Wikipedia:Requests for page protection/Increase"},config:{refresh:1e3,historyCount:10}},o={defaultSettings:{maxQueueSize:50,maxEditCount:50,minimumORESScore:0,soundAlertORESScore:.95,enableSoundAlerts:!1,enableUsernameHighlighting:!0,enableWelcomeLatin:!1,enableAutoWelcome:!1,enableEditAnalysis:!1,enableUsernameAnalysis:!1,masterVolume:.5,volumes:{click:.5,notification:.5,alert:.5,whoosh:.5,warn:.5,rollback:.5,report:.5,thank:.5,protection:.5,block:.5,sparkle:.5},soundMappings:{click:"click",notification:"notify",alert:"alert",whoosh:"whoosh",warn:"warn",rollback:"rollback",report:"report",thank:"thank",protection:"protection",block:"block",sparkle:"sparkle"},watchlistExpiry:"1 week",highlightedExpiry:"1 hour",wiki:"en",namespacesShown:[0,2,4,6,8,10,12,14,100,118,1,3,5,7,9,11,13,15,101,119],showTemps:!0,showUsers:!0,sortQueueItems:!0,enableOllamaAI:!1,ollamaServerUrl:"http://localhost:11434",ollamaModel:"",controlScripts:[{keys:["arrowright"],actions:[{name:"nextEdit",params:{}}]},{keys:[" "],actions:[{name:"nextEdit",params:{}}]},{keys:["q"],actions:[{name:"rollbackAndWarn",params:{warningType:"Vandalism",level:"auto"}},{name:"if",condition:"atFinalWarning",actions:[{name:"if",condition:"operatorNonAdmin",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]}]},{name:"highlight",params:{}},{name:"nextEdit",params:{}}]},{keys:["arrowleft"],actions:[{name:"prevEdit",params:{}}]},{keys:["h"],actions:[{name:"openHistory",params:{}}]},{keys:["c"],actions:[{name:"openUserContribs",params:{}}]},{keys:["t"],actions:[{name:"thankUser",params:{}}]},{keys:["w"],actions:[{name:"welcome",params:{template:"default"}}]}],selectedPalette:0,theme:"theme-light"},warningTemplateColors:{0:"grey",1:"#4169e1",2:"#ff8c00",3:"#ff4500",4:"#b22222","4im":"#000000"},colorPalettes:[["#78c675","#fdff7a","#fcff54","#fbff12","#ffc619","#ff8812","#f56214","#f73214","#fc0303","#fc0303"],["#bfbfbf","#ffd9d9","#ffc9c9","#ffb0b0","#ff9797","#ff7d7d","#ff6464","#ff4b4b","#ff3131","#ff1818"],["#bfbfbf","#d9ffd9","#c9ffc9","#b0ffb0","#97ff97","#7dff7d","#64ff64","#4bff4b","#31ff31","#18ff18"],["#bfbfbf","#d9d9ff","#c9c9ff","#b0b0ff","#9797ff","#7d7dff","#6464ff","#4b4bff","#3131ff","#1818ff"]],warnings:{Vandalism:{templates:["subst:uw-vandalism1","subst:uw-vandalism2","subst:uw-vandalism3","subst:uw-vandalism4","subst:uw-vandalism4im"],label:"vandalism",desc:"Default warning for vandalism."},"Subtle vandalism":{templates:["subst:uw-subtle1","subst:uw-subtle2","subst:uw-subtle3","subst:uw-subtle4"],label:"subtle vandalism",desc:"Warning for subtle vandalism that may not be immediately obvious."},"AI-generated content":{templates:["subst:uw-ai1","subst:uw-ai2","subst:uw-ai3","subst:uw-ai4"],label:"adding [[WP:AIGEN|AI-generated content]]",desc:"Warning for adding AI-generated content without disclosure."},Disruption:{templates:["subst:uw-disruptive1","subst:uw-disruptive2","subst:uw-disruptive3","subst:uw-generic4"],label:"[[WP:DE|disruptive editing]]",desc:"Default warning for making disruptive edits (not always vandalism)"},Deleting:{templates:["subst:uw-delete1","subst:uw-delete2","subst:uw-delete3","subst:uw-delete4","subst:uw-delete4im"],label:"unexplained deletion",desc:"Used when a user does not explain deletion of part of an article."},Advertising:{templates:["subst:uw-advert1","subst:uw-advert2","subst:uw-advert3","subst:uw-advert4","subst:uw-advert4im"],label:"[[WP:PROMO|advertising or promotion]]",desc:"Adding promotional content to an article."},"Spam links":{templates:["subst:uw-spam1","subst:uw-spam2","subst:uw-spam3","subst:uw-spam4","subst:uw-spam4im"],label:"adding [[WP:ELNO|inappropriate links]]",desc:"Adding external links that could be considered spam."},Unsourced:{templates:["subst:uw-unsourced1","subst:uw-unsourced2","subst:uw-unsourced3","subst:uw-unsourced4"],label:"adding [[WP:CITE|unsourced content]]",desc:"Adding unsourced, possibly defamatory, content to an article."},"Unsourced (BLP)":{templates:["subst:uw-biog1","subst:uw-biog2","subst:uw-biog3","subst:uw-biog4","subst:uw-biog4im"],label:"adding unsourced content to [[WP:BLP|biographies of living persons]]",desc:"Adding unsourced content to biographies of living persons."},"Editing tests":{templates:["subst:uw-test1","subst:uw-test2","subst:uw-test3","subst:uw-vandalism4"],label:"making editing tests",desc:"Making editing tests to articles."},Commentary:{templates:["subst:uw-talkinarticle1","subst:uw-talkinarticle2","subst:uw-talkinarticle3","subst:uw-generic4"],label:"adding commentary",desc:"Adding opinion or commentary to articles."},POV:{templates:["subst:uw-npov1","subst:uw-npov2","subst:uw-npov3","subst:uw-npov4"],label:"adding [[WP:NPOV|non-neutral content]]",desc:"Adding content which violates the neutral point of view policy."},Errors:{templates:["subst:uw-error1","subst:uw-error2","subst:uw-error3","subst:uw-error4"],label:"adding deliberate errors to articles",desc:"Adding deliberate errors to articles."},Owning:{templates:["subst:uw-own1","subst:uw-own2","subst:uw-own3","subst:uw-own4"],label:"assuming [[WP:OWN|ownership of articles]]",desc:"Assuming ownership of articles."},Chatting:{templates:["subst:uw-chat1","subst:uw-chat2","subst:uw-chat3","subst:uw-chat4"],label:"conversation in article talk space",desc:"Using article talk pages for inappropriate discussion."},"Image vandalism":{templates:["subst:uw-image1","subst:uw-image2","subst:uw-image3","subst:uw-image4"],label:"image vandalism",desc:"Image vandalism."},"AfD removal":{templates:["subst:uw-afd1","subst:uw-afd2","subst:uw-afd3","subst:uw-afd4"],label:"removing AfD templates or comments",desc:"Removing AfD templates or other users' comments from AfD discussions."},Jokes:{templates:["subst:uw-joke1","subst:uw-joke2","subst:uw-joke3","subst:uw-joke4","subst:uw-joke4im"],label:"adding inappropriate humor",desc:"Adding inappropriate humor to articles."},"Personal attacks":{templates:["subst:uw-npa1","subst:uw-npa2","subst:uw-npa3","subst:uw-npa4","subst:uw-npa4im"],label:"[[WP:NPA|personal attacks]]",desc:"Personal attacks towards another user."},"MOS violation":{templates:["subst:uw-mos1","subst:uw-mos2","subst:uw-mos3","subst:uw-mos4"],label:"[[WP:MOS|manual of style]] violation",desc:"Not following the Manual of Style."},Censoring:{templates:["subst:uw-notcensored1","subst:uw-notcensored2","subst:uw-notcensored3","subst-uw-generic4"],label:"[[WP:NOTCENSORED|Censoring content]]",desc:"Censoring topically-relevant content."}},namespaces:[{name:"Main",id:0},{name:"User",id:2},{name:"Project",id:4},{name:"File",id:6},{name:"MediaWiki",id:8},{name:"Template",id:10},{name:"Help",id:12},{name:"Category",id:14},{name:"Portal",id:100},{name:"Draft",id:118},{name:"Talk",id:1},{name:"User talk",id:3},{name:"Project talk",id:5},{name:"File talk",id:7},{name:"MediaWiki talk",id:9},{name:"Template talk",id:11},{name:"Help talk",id:13},{name:"Category talk",id:15},{name:"Portal talk",id:101},{name:"Draft talk",id:119}],sounds:{click:{name:"Click",description:"Crisp UI click",category:"ui",type:"sine",frequencies:[600],duration:.15,volume:1,envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.7*i,n+.06),t.gain.exponentialRampToValueAtTime(.001*i,n+.15)}},tap:{name:"Tap",description:"Soft tap",category:"ui",type:"sine",frequencies:[440],duration:.15,volume:1,envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.6*i,n+.06),t.gain.exponentialRampToValueAtTime(.001*i,n+.15)}},pop:{name:"Pop",description:"Bouncy pop",category:"ui",type:"sine",frequencies:[660,528],duration:.2,volume:1,repeats:[0,.1],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.6*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.2)}},alert:{name:"Alert",description:"Urgent notification",category:"alert",type:"sine",frequencies:[440,523.25],duration:.15,volume:1,repeats:[0,.18],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.7*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.3)}},bell:{name:"Bell",description:"Notification bell",category:"alert",type:"sine",frequencies:[523.25,659.25],duration:.35,volume:1,repeats:[0,.18],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.8*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.35)}},ping:{name:"Ping",description:"High ping",category:"alert",type:"sine",frequencies:[784],duration:.3,volume:1,envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.7*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.3)}},warn:{name:"Warning",description:"Caution tone",category:"warning",type:"sine",frequencies:[587.33,523.25],duration:.18,volume:1,repeats:[0,.2],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.7*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.18)}},beep:{name:"Beep",description:"Simple beep",category:"warning",type:"sine",frequencies:[784],duration:.12,volume:1,envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.7*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.12)}},buzz:{name:"Buzz",description:"Attention buzz",category:"warning",type:"sine",frequencies:[440],duration:.15,volume:1,repeats:[0,.08,.16],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.6*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.05)}},whoosh:{name:"Whoosh",description:"Smooth transition",category:"action",type:"sine",frequencies:[600],duration:.25,volume:1,sweep:{from:600,to:250},envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.8*i,n+.04),t.gain.exponentialRampToValueAtTime(.001*i,n+.25)}},swoosh:{name:"Swoosh",description:"Quick swipe",category:"action",type:"sine",frequencies:[800],duration:.18,volume:1,sweep:{from:800,to:400},envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.6*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.18)}},swipe:{name:"Swipe",description:"Fast swipe",category:"action",type:"sine",frequencies:[750],duration:.12,volume:1,sweep:{from:750,to:400},envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.5*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.12)}},rollback:{name:"Rollback",description:"Reverse action",category:"action",type:"sine",frequencies:[400],duration:.22,volume:1,sweep:{from:400,to:800},envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.65*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.22)}},notify:{name:"Notify",description:"Soft notification",category:"notification",type:"sine",frequencies:[523.25,392],duration:.2,volume:1,repeats:[0,.12],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.8*i,n+.02),t.gain.exponentialRampToValueAtTime(.001*i,n+.2)}},chime:{name:"Chime",description:"Pleasant chime",category:"notification",type:"sine",frequencies:[523.25,659.25,783.99],duration:.3,volume:1,repeats:[0,.08,.16],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.7*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.3)}},ding:{name:"Ding",description:"Gentle ding",category:"notification",type:"sine",frequencies:[523.25],duration:.28,volume:1,envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.7*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.28)}},success:{name:"Success",description:"Achievement",category:"positive",type:"sine",frequencies:[523.25,659.25,783.99,523.25],duration:.18,volume:1,repeats:[0,.06,.12,.18],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.7*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.25)}},complete:{name:"Complete",description:"Task complete",category:"positive",type:"sine",frequencies:[659.25,440,659.25],duration:.25,volume:1,repeats:[0,.08,.16],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.65*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.28)}},sparkle:{name:"Sparkle",description:"Magical sparkle",category:"positive",type:"sine",frequencies:[659.25,784,988,1175],duration:.15,volume:1,repeats:[0,.04,.08,.12],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.6*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.12)}},twinkle:{name:"Twinkle",description:"Soft twinkle",category:"positive",type:"sine",frequencies:[784,1047,1319],duration:.2,volume:1,repeats:[0,.07,.14],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.6*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.18)}},error:{name:"Error",description:"Error tone",category:"negative",type:"sine",frequencies:[392],duration:.25,volume:1,sweep:{from:392,to:294},envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.7*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.25)}},denied:{name:"Denied",description:"Access denied",category:"negative",type:"sine",frequencies:[330,311],duration:.2,volume:1,repeats:[0,.12],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.7*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.18)}},thud:{name:"Thud",description:"Heavy thud",category:"negative",type:"sine",frequencies:[165],duration:.18,volume:1,envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.8*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.25)}},report:{name:"Report",description:"Report sent",category:"notification",type:"sine",frequencies:[587.33,698.46,880],duration:.16,volume:1,repeats:[0,.08,.16],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.65*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.2)}},thank:{name:"Thank",description:"Thank you",category:"positive",type:"sine",frequencies:[523.25,659.25],duration:.3,volume:1,repeats:[0,.15],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.7*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.3)}},protection:{name:"Protection",description:"Shield up",category:"action",type:"sine",frequencies:[440,554,659],duration:.3,volume:1,repeats:[0,.1,.2],envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.7*i,n+.04),t.gain.exponentialRampToValueAtTime(.001*i,n+.25)}},block:{name:"Block",description:"Blocked",category:"negative",type:"sine",frequencies:[220],duration:.2,volume:1,envelope:(t,e,n,i)=>{t.gain.setValueAtTime(.001*i,n),t.gain.exponentialRampToValueAtTime(.8*i,n+.08),t.gain.exponentialRampToValueAtTime(.001*i,n+.2)}},none:{name:"None (Silent)",description:"No sound",category:"other",type:"sine",frequencies:[440],duration:.001,volume:1,envelope:(t,e,n,i)=>{t.gain.setValueAtTime(0,n)}}}},a={base:'\n\t\t\t/* Base theme configuration */\n\t\t\t:root {\n\t\t\t\t/* Light theme colors */\n\t\t\t\t--light-bg-primary: #ffffff;\n\t\t\t\t--light-bg-secondary: #f8f9fa;\n\t\t\t\t--light-bg-tertiary: #f1f3f5;\n\t\t\t\t--light-bg-hover: #e2e8f0;\n\t\t\t\t--light-text-primary: #1a1a1a;\n\t\t\t\t--light-text-secondary: #4a5568;\n\t\t\t\t--light-border: #e2e8f0;\n\t\t\t\t--light-primary: #2962ff;\n\t\t\t\t--light-primary-hover: #1e88e5;\n\t\t\t\t--light-danger: #dc3545;\n\t\t\t\t--light-warning: #f59e0b;\n\t\t\t\t--light-success: #22c55e;\n\t\t\t\t--light-surface: #ffffff;\n\t\t\t\t--light-shadow: rgba(0, 0, 0, 0.1);\n\t\t\t\t--light-shadow-hover: rgba(0, 0, 0, 0.15);\n\t\t\t\t--light-highlight: rgba(41, 98, 255, 0.1);\n\n\t\t\t\t/* Dark theme colors */\n\t\t\t\t--dark-bg-primary: #1a1a1a;\n\t\t\t\t--dark-bg-secondary: #242424;\n\t\t\t\t--dark-bg-tertiary: #2d2d2d;\n\t\t\t\t--dark-bg-hover: #333333;\n\t\t\t\t--dark-text-primary: #f8f9fa;\n\t\t\t\t--dark-text-secondary: #a0aec0;\n\t\t\t\t--dark-border: #404040;\n\t\t\t\t--dark-primary: #60a5fa;\n\t\t\t\t--dark-primary-hover: #3b82f6;\n\t\t\t\t--dark-danger: #ef4444;\n\t\t\t\t--dark-warning: #f59e0b;\n\t\t\t\t--dark-success: #10b981;\n\t\t\t\t--dark-surface: #242424;\n\t\t\t\t--dark-shadow: rgba(0, 0, 0, 0.3);\n\t\t\t\t--dark-shadow-hover: rgba(0, 0, 0, 0.4);\n\t\t\t\t--dark-highlight: rgba(96, 165, 250, 0.15);\n\n\t\t\t\t/* Default fallback values (will be overridden by theme) */\n\t\t\t\t--bg-primary: var(--light-bg-primary);\n\t\t\t\t--bg-secondary: var(--light-bg-secondary);\n\t\t\t\t--bg-tertiary: var(--light-bg-tertiary);\n\t\t\t\t--bg-hover: var(--light-bg-hover);\n\t\t\t\t--text-primary: var(--light-text-primary);\n\t\t\t\t--text-secondary: var(--light-text-secondary);\n\t\t\t\t--border-color: var(--light-border);\n\t\t\t\t--primary: var(--light-primary);\n\t\t\t\t--primary-hover: var(--light-primary-hover);\n\t\t\t\t--danger: var(--light-danger);\n\t\t\t\t--warning: var(--light-warning);\n\t\t\t\t--success: var(--light-success);\n\t\t\t\t--surface: var(--light-surface);\n\t\t\t\t--shadow: var(--light-shadow);\n\t\t\t\t--shadow-hover: var(--light-shadow-hover);\n\t\t\t\t--highlight: var(--light-highlight);\n\n\t\t\t\t/* Animation durations */\n\t\t\t\t--transition-fast: 0.15s;\n\t\t\t\t--transition-normal: 0.25s;\n\t\t\t\t--transition-slow: 0.4s;\n\n\t\t\t\t/* Border radius */\n\t\t\t\t--radius-sm: 4px;\n\t\t\t\t--radius-md: 8px;\n\t\t\t\t--radius-lg: 12px;\n\n\t\t\t\t/* Spacing */\n\t\t\t\t--space-1: 4px;\n\t\t\t\t--space-2: 8px;\n\t\t\t\t--space-3: 12px;\n\t\t\t\t--space-4: 16px;\n\t\t\t\t--space-5: 20px;\n\t\t\t\t--space-6: 24px;\n\n\t\t\t\t/* Elevation shadows */\n\t\t\t\t--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\n\t\t\t\t--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n\t\t\t\t--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);\n\t\t\t\t--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.15);\n\t\t\t}\n\n\t\t\t/* Base styles */\n\t\t\t* {\n\t\t\t\tmargin: 0;\n\t\t\t\tpadding: 0;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\ttransition: background-color var(--transition-normal),\n\t\t\t\t\t\t\tborder-color var(--transition-normal),\n\t\t\t\t\t\t\tcolor var(--transition-normal),\n\t\t\t\t\t\t\tbox-shadow var(--transition-normal),\n\t\t\t\t\t\t\ttransform var(--transition-fast);\n\t\t\t}\n\n\t\t\tbody {\n\t\t\t\tfont-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;\n\t\t\t\tline-height: 1.5;\n\t\t\t\t-webkit-font-smoothing: antialiased;\n\t\t\t\t-moz-osx-font-smoothing: grayscale;\n\t\t\t}\n\n\t\t\t/* Interactive elements */\n\t\t\tbutton,\n\t\t\t.interactive {\n\t\t\t\tcursor: pointer;\n\t\t\t\tborder-radius: var(--radius-md);\n\t\t\t\tborder: 1px solid transparent;\n\t\t\t\tpadding: var(--space-2) var(--space-4);\n\t\t\t\tfont-weight: 500;\n\t\t\t\ttransition: all var(--transition-normal);\n\t\t\t}\n\n\t\t\tbutton:hover,\n\t\t\t.interactive:hover {\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t}\n\n\t\t\tbutton:active,\n\t\t\t.interactive:active {\n\t\t\t\ttransform: translateY(0);\n\t\t\t}\n\n\t\t\t/* Accessibility */\n\t\t\tbutton:focus-visible,\n\t\t\ta:focus-visible,\n\t\t\tinput:focus-visible,\n\t\t\tselect:focus-visible {\n\t\t\t\toutline: 2px solid var(--light-primary);\n\t\t\t\toutline-offset: 2px;\n\t\t\t}\n\n\t\t\t[data-theme="dark"] button:focus-visible,\n\t\t\t[data-theme="dark"] a:focus-visible,\n\t\t\t[data-theme="dark"] input:focus-visible,\n\t\t\t[data-theme="dark"] select:focus-visible {\n\t\t\t\toutline-color: var(--dark-primary);\n\t\t\t}\n\n\t\t\t/* Scrollbars */\n\t\t\t::-webkit-scrollbar {\n\t\t\t\twidth: 10px;\n\t\t\t\theight: 10px;\n\t\t\t}\n\n\t\t\t::-webkit-scrollbar-track {\n\t\t\t\tbackground: transparent;\n\t\t\t}\n\n\t\t\t::-webkit-scrollbar-thumb {\n\t\t\t\tbackground: var(--light-border);\n\t\t\t\tborder-radius: var(--radius-lg);\n\t\t\t\tborder: 2px solid transparent;\n\t\t\t\tbackground-clip: content-box;\n\t\t\t}\n\n\t\t\t::-webkit-scrollbar-thumb:hover {\n\t\t\t\tbackground: var(--light-text-secondary);\n\t\t\t\tborder: 2px solid transparent;\n\t\t\t\tbackground-clip: content-box;\n\t\t\t}\n\n\t\t\t[data-theme="dark"] ::-webkit-scrollbar-thumb {\n\t\t\t\tbackground: var(--dark-border);\n\t\t\t}\n\n\t\t\t[data-theme="dark"] ::-webkit-scrollbar-thumb:hover {\n\t\t\t\tbackground: var(--dark-text-secondary);\n\t\t\t}\n\n\t\t\t/* Floating iframe modal */\n\t\t\t.wiki-iframe-overlay {\n\t\t\t\tposition: fixed;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tbackground: rgba(0, 0, 0, 0.6);\n\t\t\t\tbackdrop-filter: blur(4px);\n\t\t\t\t-webkit-backdrop-filter: blur(4px);\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tz-index: 10000;\n\t\t\t\tanimation: fadeIn 0.2s ease;\n\t\t\t}\n\n\t\t\t@keyframes fadeIn {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.wiki-iframe-container {\n\t\t\t\twidth: 90%;\n\t\t\t\theight: 90%;\n\t\t\t\tmax-width: 1400px;\n\t\t\t\tmax-height: 900px;\n\t\t\t\tbackground: var(--bg-primary);\n\t\t\t\tborder-radius: var(--radius-lg);\n\t\t\t\tbox-shadow: var(--shadow-xl);\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\toverflow: hidden;\n\t\t\t\tanimation: slideUp 0.3s ease;\n\t\t\t}\n\n\t\t\t@keyframes slideUp {\n\t\t\t\tfrom {\n\t\t\t\t\ttransform: translateY(20px);\n\t\t\t\t\topacity: 0;\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\ttransform: translateY(0);\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.wiki-iframe-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tpadding: var(--space-3) var(--space-4);\n\t\t\t\tbackground: var(--bg-secondary);\n\t\t\t\tborder-bottom: 1px solid var(--border-color);\n\t\t\t}\n\n\t\t\t.wiki-iframe-title {\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: var(--text-primary);\n\t\t\t\tfont-size: 0.95rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--space-2);\n\t\t\t\tflex: 1;\n\t\t\t\tmin-width: 0;\n\t\t\t}\n\n\t\t\t.wiki-iframe-title-text {\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.wiki-iframe-controls {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: var(--space-2);\n\t\t\t}\n\n\t\t\t.wiki-iframe-btn {\n\t\t\t\tpadding: var(--space-2) var(--space-3);\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder: 1px solid var(--border-color);\n\t\t\t\tborder-radius: var(--radius-md);\n\t\t\t\tcursor: pointer;\n\t\t\t\tcolor: var(--text-primary);\n\t\t\t\tfont-size: 0.9rem;\n\t\t\t\ttransition: all var(--transition-fast);\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--space-2);\n\t\t\t}\n\n\t\t\t.wiki-iframe-btn:hover {\n\t\t\t\tbackground: var(--bg-hover);\n\t\t\t\tborder-color: var(--primary);\n\t\t\t}\n\n\t\t\t.wiki-iframe-btn.close-btn {\n\t\t\t\tcolor: var(--danger);\n\t\t\t}\n\n\t\t\t.wiki-iframe-btn.close-btn:hover {\n\t\t\t\tbackground: var(--danger);\n\t\t\t\tcolor: white;\n\t\t\t\tborder-color: var(--danger);\n\t\t\t}\n\n\t\t\t.wiki-iframe-content {\n\t\t\t\tflex: 1;\n\t\t\t\tposition: relative;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\t.wiki-iframe-content iframe {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tborder: none;\n\t\t\t}\n\n\t\t\t.wiki-iframe-loading {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 50%;\n\t\t\t\tleft: 50%;\n\t\t\t\ttransform: translate(-50%, -50%);\n\t\t\t\tcolor: var(--text-secondary);\n\t\t\t\tfont-size: 0.95rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: var(--space-3);\n\t\t\t}\n\n\t\t\t.wiki-iframe-spinner {\n\t\t\t\twidth: 40px;\n\t\t\t\theight: 40px;\n\t\t\t\tborder: 3px solid var(--border-color);\n\t\t\t\tborder-top-color: var(--primary);\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tanimation: spin 0.8s linear infinite;\n\t\t\t}\n\n\t\t\t@keyframes spin {\n\t\t\t\tto {\n\t\t\t\t\ttransform: rotate(360deg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Dark mode specific overrides for iframe modal */\n\t\t\t[data-theme="dark"] .wiki-iframe-overlay {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.8);\n\t\t\t}\n\n\t\t\t[data-theme="dark"] .wiki-iframe-container {\n\t\t\t\tbackground: var(--dark-bg-primary);\n\t\t\t}\n\n\t\t\t[data-theme="dark"] .wiki-iframe-header {\n\t\t\t\tbackground: var(--dark-bg-secondary);\n\t\t\t\tborder-bottom-color: var(--dark-border);\n\t\t\t}\n\n\t\t\t[data-theme="dark"] .wiki-iframe-title {\n\t\t\t\tcolor: var(--dark-text-primary);\n\t\t\t}\n\n\t\t\t[data-theme="dark"] .wiki-iframe-btn {\n\t\t\t\tcolor: var(--dark-text-primary);\n\t\t\t\tborder-color: var(--dark-border);\n\t\t\t\tbackground: transparent;\n\t\t\t}\n\n\t\t\t[data-theme="dark"] .wiki-iframe-btn:hover {\n\t\t\t\tbackground: var(--dark-bg-hover);\n\t\t\t\tborder-color: var(--dark-primary);\n\t\t\t}\n\n\t\t\t[data-theme="dark"] .wiki-iframe-btn.close-btn {\n\t\t\t\tcolor: var(--dark-danger);\n\t\t\t}\n\n\t\t\t[data-theme="dark"] .wiki-iframe-btn.close-btn:hover {\n\t\t\t\tbackground: var(--dark-danger);\n\t\t\t\tcolor: white;\n\t\t\t\tborder-color: var(--dark-danger);\n\t\t\t}\n\n\t\t\t[data-theme="dark"] .wiki-iframe-loading {\n\t\t\t\tcolor: var(--dark-text-secondary);\n\t\t\t}\n\n\t\t\t[data-theme="dark"] .wiki-iframe-spinner {\n\t\t\t\tborder-color: var(--dark-border);\n\t\t\t\tborder-top-color: var(--dark-primary);\n\t\t\t}\n\t\t',initial:"\n\t\t\t* {\n\t\t\t\tmargin: 0;\n\t\t\t\tpadding: 0;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tfont-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n\t\t\t}\n\n\t\t\tbody, html, #container {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\t#container {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tbackground: linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%);\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t/* Animated dots canvas background */\n\t\t\t#dots-canvas {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tz-index: 0;\n\t\t\t}\n\n\t\t\t/* Animated background particles */\n\t\t\t#container::before {\n\t\t\t\tcontent: '';\n\t\t\t\tposition: absolute;\n\t\t\t\twidth: 200%;\n\t\t\t\theight: 200%;\n\t\t\t\tbackground:\n\t\t\t\t\tradial-gradient(circle at 20% 50%, rgba(102, 126, 234, 0.15) 0%, transparent 50%),\n\t\t\t\t\tradial-gradient(circle at 80% 80%, rgba(240, 147, 251, 0.15) 0%, transparent 50%),\n\t\t\t\t\tradial-gradient(circle at 40% 20%, rgba(118, 75, 162, 0.1) 0%, transparent 50%);\n\t\t\t\tanimation: particles 20s ease-in-out infinite;\n\t\t\t\tz-index: 1;\n\t\t\t}\n\n\t\t\t@keyframes particles {\n\t\t\t\t0%, 100% {\n\t\t\t\t\ttransform: translate(0, 0) rotate(0deg);\n\t\t\t\t}\n\t\t\t\t33% {\n\t\t\t\t\ttransform: translate(30px, -30px) rotate(120deg);\n\t\t\t\t}\n\t\t\t\t66% {\n\t\t\t\t\ttransform: translate(-20px, 20px) rotate(240deg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t#welcome-container {\n\t\t\t\tposition: relative;\n\t\t\t\tz-index: 1;\n\t\t\t\ttext-align: center;\n\t\t\t\tpadding: 60px;\n\t\t\t\tbackground: linear-gradient(135deg, rgba(15, 12, 41, 0.8), rgba(48, 43, 99, 0.8));\n\t\t\t\tbackdrop-filter: blur(20px);\n\t\t\t\t-webkit-backdrop-filter: blur(20px);\n\t\t\t\tborder-radius: 24px;\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 20px 60px rgba(0, 0, 0, 0.5),\n\t\t\t\t\t0 0 40px rgba(102, 126, 234, 0.4),\n\t\t\t\t\t0 0 80px rgba(240, 147, 251, 0.3),\n\t\t\t\t\tinset 0 0 60px rgba(102, 126, 234, 0.15),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.2),\n\t\t\t\t\t0 0 0 2px rgba(102, 126, 234, 0.6),\n\t\t\t\t\t0 0 0 4px rgba(240, 147, 251, 0.4);\n\t\t\t\tanimation: containerFadeIn 1s ease-out, borderGlow 3s ease-in-out infinite;\n\t\t\t\tmax-width: 500px;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\t#welcome-container::before {\n\t\t\t\tcontent: '';\n\t\t\t\tposition: absolute;\n\t\t\t\tinset: -6px;\n\t\t\t\tbackground: linear-gradient(135deg, #667eea, #f093fb, #764ba2);\n\t\t\t\tborder-radius: 28px;\n\t\t\t\tz-index: -1;\n\t\t\t\tfilter: blur(12px);\n\t\t\t\topacity: 0.5;\n\t\t\t\tanimation: pulseGlow 2s ease-in-out infinite;\n\t\t\t}\n\n\t\t\t#welcome-container::after {\n\t\t\t\tcontent: '';\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: -100%;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tbackground: linear-gradient(90deg,\n\t\t\t\t\ttransparent,\n\t\t\t\t\trgba(255, 255, 255, 0.15),\n\t\t\t\t\ttransparent\n\t\t\t\t);\n\t\t\t\tanimation: shimmer 3s ease-in-out infinite;\n\t\t\t\tz-index: 1;\n\t\t\t\tpointer-events: none;\n\t\t\t\tborder-radius: 24px;\n\t\t\t}\n\n\t\t\t#welcome-container > * {\n\t\t\t\tposition: relative;\n\t\t\t\tz-index: 2;\n\t\t\t}\n\n\t\t\t@keyframes containerFadeIn {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: translateY(30px) scale(0.95);\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: translateY(0) scale(1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@keyframes pulseGlow {\n\t\t\t\t0%, 100% {\n\t\t\t\t\topacity: 0.4;\n\t\t\t\t\tfilter: blur(10px);\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\topacity: 0.8;\n\t\t\t\t\tfilter: blur(15px);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@keyframes borderGlow {\n\t\t\t\t0%, 100% {\n\t\t\t\t\tbox-shadow:\n\t\t\t\t\t\t0 20px 60px rgba(0, 0, 0, 0.5),\n\t\t\t\t\t\t0 0 40px rgba(102, 126, 234, 0.4),\n\t\t\t\t\t\t0 0 80px rgba(240, 147, 251, 0.3),\n\t\t\t\t\t\tinset 0 0 60px rgba(102, 126, 234, 0.15),\n\t\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.2);\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\tbox-shadow:\n\t\t\t\t\t\t0 20px 60px rgba(0, 0, 0, 0.5),\n\t\t\t\t\t\t0 0 60px rgba(240, 147, 251, 0.6),\n\t\t\t\t\t\t0 0 120px rgba(102, 126, 234, 0.4),\n\t\t\t\t\t\tinset 0 0 80px rgba(240, 147, 251, 0.2),\n\t\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.3);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@keyframes shimmer {\n\t\t\t\t0% {\n\t\t\t\t\tleft: -100%;\n\t\t\t\t}\n\t\t\t\t50%, 100% {\n\t\t\t\t\tleft: 100%;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\t50%, 100% {\n\t\t\t\t\tleft: 100%;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Shield icon container */\n\t\t\t.shield-container {\n\t\t\t\tposition: relative;\n\t\t\t\twidth: 120px;\n\t\t\t\theight: 120px;\n\t\t\t\tmargin: 0 auto 30px;\n\t\t\t\tanimation: shieldEntrance 1.5s cubic-bezier(0.34, 1.56, 0.64, 1);\n\t\t\t}\n\n\t\t\t@keyframes shieldEntrance {\n\t\t\t\t0% {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: scale(0) rotate(-180deg);\n\t\t\t\t}\n\t\t\t\t60% {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: scale(1.15) rotate(10deg);\n\t\t\t\t}\n\t\t\t\t100% {\n\t\t\t\t\ttransform: scale(1) rotate(0deg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.shield-icon {\n\t\t\t\tfont-size: 100px;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 50%;\n\t\t\t\tleft: 50%;\n\t\t\t\ttransform: translate(-50%, -50%);\n\t\t\t\tz-index: 2;\n\t\t\t\tfilter: drop-shadow(0 10px 20px rgba(102, 126, 234, 0.4));\n\t\t\t\tanimation: shieldFloat 3s ease-in-out infinite;\n\n\t\t\t\tuser-select: none;\n\t\t\t\t-webkit-user-select: none;\n\t\t\t\t-moz-user-select: none;\n\t\t\t\t-ms-user-select: none;\n\t\t\t}\n\n\t\t\t@keyframes shieldFloat {\n\t\t\t\t0%, 100% {\n\t\t\t\t\ttransform: translate(-50%, -50%) translateY(0px);\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\ttransform: translate(-50%, -50%) translateY(-10px);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Pulsing glow rings */\n\t\t\t.glow-ring {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 50%;\n\t\t\t\tleft: 50%;\n\t\t\t\twidth: 300px;\n\t\t\t\theight: 300px;\n\t\t\t\tborder: 3px solid rgba(102, 126, 234, 0.6);\n\t\t\t\tborder-radius: 50%;\n\t\t\t\ttransform: translate(-50%, -50%);\n\t\t\t\tanimation: pulse 2s ease-out infinite;\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\n\t\t\t.glow-ring:nth-child(2) {\n\t\t\t\tanimation-delay: 0.5s;\n\t\t\t\tborder-color: rgba(240, 147, 251, 0.6);\n\t\t\t}\n\n\t\t\t.glow-ring:nth-child(3) {\n\t\t\t\tanimation-delay: 1s;\n\t\t\t\tborder-color: rgba(118, 75, 162, 0.6);\n\t\t\t}\n\n\t\t\t@keyframes pulse {\n\t\t\t\t0% {\n\t\t\t\t\ttransform: translate(-50%, -50%) scale(0.8);\n\t\t\t\t\topacity: 0;\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\ttransform: translate(-50%, -50%) scale(1);\n\t\t\t\t\topacity: 0.8;\n\t\t\t\t}\n\t\t\t\t100% {\n\t\t\t\t\ttransform: translate(-50%, -50%) scale(1.5);\n\t\t\t\t\topacity: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\t\topacity: 0.8;\n\t\t\t\t}\n\t\t\t\t100% {\n\t\t\t\t\ttransform: translate(-50%, -50%) scale(1.5);\n\t\t\t\t\topacity: 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Sparkles */\n\t\t\t.sparkle {\n\t\t\t\tposition: absolute;\n\t\t\t\twidth: 6px;\n\t\t\t\theight: 6px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tanimation: sparkle 1.5s ease-in-out infinite;\n\t\t\t}\n\n\t\t\t.sparkle:nth-child(4) {\n\t\t\t\ttop: 10%;\n\t\t\t\tleft: 20%;\n\t\t\t\tbackground: #f093fb;\n\t\t\t\tbox-shadow: 0 0 15px #f093fb;\n\t\t\t\tanimation-delay: 0s;\n\t\t\t}\n\n\t\t\t.sparkle:nth-child(5) {\n\t\t\t\ttop: 20%;\n\t\t\t\tright: 15%;\n\t\t\t\tbackground: #667eea;\n\t\t\t\tbox-shadow: 0 0 15px #667eea;\n\t\t\t\tanimation-delay: 0.3s;\n\t\t\t}\n\n\t\t\t.sparkle:nth-child(6) {\n\t\t\t\tbottom: 15%;\n\t\t\t\tleft: 25%;\n\t\t\t\tbackground: #d946ef;\n\t\t\t\tbox-shadow: 0 0 15px #d946ef;\n\t\t\t\tanimation-delay: 0.6s;\n\t\t\t}\n\n\t\t\t.sparkle:nth-child(7) {\n\t\t\t\tbottom: 20%;\n\t\t\t\tright: 20%;\n\t\t\t\tbackground: #764ba2;\n\t\t\t\tbox-shadow: 0 0 15px #764ba2;\n\t\t\t\tanimation-delay: 0.9s;\n\t\t\t}\n\n\t\t\t@keyframes sparkle {\n\t\t\t\t0%, 100% {\n\t\t\t\t\ttransform: scale(0);\n\t\t\t\t\topacity: 0;\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\ttransform: scale(1.5);\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\th1 {\n\t\t\t\tmargin: 0 0 10px 0;\n\t\t\t\tfont-size: 2.5em;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tcolor: white;\n\t\t\t\ttext-shadow: 0 0 20px rgba(102, 126, 234, 0.5);\n\t\t\t\tanimation: titleFadeIn 1s ease-out 0.3s both;\n\t\t\t}\n\t\t\t\t-webkit-text-fill-color: transparent;\n\t\t\t\tbackground-clip: text;\n\t\t\t\tanimation: titleSlideIn 1s ease-out 0.3s both;\n\t\t\t}\n\n\t\t\t@keyframes titleSlideIn {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: translateY(-20px);\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: translateY(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.about-links {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 15px;\n\t\t\t\tjustify-content: center;\n\t\t\t\tmargin: 20px 0;\n\t\t\t\tanimation: linksSlideIn 1s ease-out 0.5s both;\n\t\t\t}\n\n\t\t\t@keyframes linksSlideIn {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: translateY(-10px);\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: translateY(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.about-links > .about-link {\n\t\t\t\tcolor: #a0a0ff;\n\t\t\t\ttext-decoration: none;\n\t\t\t\tpadding: 8px 16px;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\ttransition: all 0.3s ease;\n\t\t\t\tbackground: rgba(102, 126, 234, 0.2);\n\t\t\t\tdisplay: inline-block;\n\t\t\t\ttext-align: center;\n\t\t\t\tborder: 1px solid rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\t.about-link:hover {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.3);\n\t\t\t\ttransform: translateY(-2px);\n\t\t\t\tbox-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);\n\t\t\t\tcolor: #c0c0ff;\n\t\t\t}\n\n\t\t\t#rollback-needed {\n\t\t\t\tmargin: 25px 0;\n\t\t\t\tpadding: 20px;\n\t\t\t\tbackground: linear-gradient(135deg, rgba(255, 107, 107, 0.1), rgba(255, 142, 83, 0.1));\n\t\t\t\tborder-radius: 12px;\n\t\t\t\tborder: 2px solid rgba(255, 107, 107, 0.3);\n\t\t\t\tanimation: warningFadeIn 1s ease-out 0.7s both;\n\t\t\t}\n\n\t\t\t@keyframes warningFadeIn {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: scale(0.95);\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: scale(1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t#rollback-needed p {\n\t\t\t\tmargin: 8px 0;\n\t\t\t\tcolor: #e74c3c;\n\t\t\t\tfont-weight: 500;\n\t\t\t}\n\n\t\t\t#rollback-needed a {\n\t\t\t\tcolor: #667eea !important;\n\t\t\t\tfont-weight: 600;\n\t\t\t}\n\n\t\t\tbutton {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 16px 32px;\n\t\t\t\tbackground: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n\t\t\t\tborder: none;\n\t\t\t\tborder-radius: 12px;\n\t\t\t\tcolor: white;\n\t\t\t\tcursor: pointer;\n\t\t\t\tfont-size: 1.1em;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 10px 30px rgba(102, 126, 234, 0.4),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.3);\n\t\t\t\ttransition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\n\t\t\t\tposition: relative;\n\t\t\t\toverflow: hidden;\n\t\t\t\tanimation: buttonSlideIn 1s ease-out 0.9s both;\n\t\t\t}\n\n\t\t\t@keyframes buttonSlideIn {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: translateY(20px);\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: translateY(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbutton::before {\n\t\t\t\tcontent: '';\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: -100%;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tbackground: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);\n\t\t\t\ttransition: left 0.5s;\n\t\t\t}\n\n\t\t\tbutton:hover::before {\n\t\t\t\tleft: 100%;\n\t\t\t}\n\n\t\t\tbutton:hover {\n\t\t\t\ttransform: translateY(-3px) scale(1.02);\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 15px 40px rgba(102, 126, 234, 0.5),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.4);\n\t\t\t}\n\n\t\t\tbutton:active {\n\t\t\t\ttransform: translateY(-1px) scale(1);\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 8px 25px rgba(102, 126, 234, 0.4),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.3);\n\t\t\t}\n\n\t\t\t/* Sound toggle button */\n\t\t\t.sound-toggle {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 20px;\n\t\t\t\tright: 20px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.2);\n\t\t\t\tborder: 2px solid rgba(255, 255, 255, 0.4);\n\t\t\t\tborder-radius: 50%;\n\t\t\t\twidth: 50px;\n\t\t\t\theight: 50px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: all 0.3s ease;\n\t\t\t\tz-index: 10;\n\t\t\t\tfont-size: 1.5em;\n\t\t\t\tcolor: white;\n\t\t\t\tanimation: soundButtonFadeIn 1s ease-out 1.2s both;\n\t\t\t\tbox-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);\n\t\t\t\tbackdrop-filter: blur(10px);\n\t\t\t}\n\n\t\t\t.sound-toggle::before {\n\t\t\t\tcontent: '🔊';\n\t\t\t}\n\n\t\t\t.sound-toggle.muted::before {\n\t\t\t\tcontent: '🔇';\n\t\t\t}\n\n\t\t\t@keyframes soundButtonFadeIn {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: scale(0) rotate(-180deg);\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: scale(1) rotate(0deg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.sound-toggle:hover {\n\t\t\t\ttransform: scale(1.1);\n\t\t\t\tbox-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);\n\t\t\t\tbackground: rgba(255, 255, 255, 0.3);\n\t\t\t}\n\n\t\t\t.sound-toggle.muted {\n\t\t\t\topacity: 0.5;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.1);\n\t\t\t}\n\t\t",main:'\n\t\t\t* {\n\t\t\t\tfont-family: sans-serif;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t}\n\n\t\t\tbody, html, #container {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tmargin: 0;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\tbody {\n\t\t\t\tbackground: #ffffff;\n\t\t\t\tcolor: #333;\n\t\t\t\ttransition: background-color 0.3s ease, color 0.3s ease;\n\t\t\t}\n\n\t\t\tbody.dark-mode {\n\t\t\t\tbackground: #1a1d24;\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t#container {\n\t\t\t\tdisplay: flex;\n\t\t\t}\n\n\t\t\t#queue {\n\t\t\t\twidth: 300px;\n\t\t\t\theight: 100%;\n\t\t\t\tborder-right: 2px solid #bfbfbf;\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\tbody.dark-mode #queue {\n\t\t\t\tborder-right: 2px solid #3a3d4a;\n\t\t\t}\n\n\t\t\t#queue-top {\n\t\t\t\theight: 60px;\n\t\t\t\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n\t\t\t\tposition: relative;\n\t\t\t\tz-index: 2;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 15px;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tuser-select: none;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.98);\n\t\t\t\tbackdrop-filter: blur(8px);\n\t\t\t\t-webkit-backdrop-filter: blur(8px);\n\t\t\t}\n\n\t\t\tbody.dark-mode #queue-top {\n\t\t\t\tbackground: rgba(30, 33, 42, 0.98);\n\t\t\t\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n\t\t\t}\n\n\t\t\t#queue-top-left, #user-contribs-left {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t}\n\n\t\t\t#queue-top-title {\n\t\t\t\tfont-weight: bold;\n\t\t\t\tfont-size: 1.1em;\n\t\t\t}\n\n\t\t\tbody.dark-mode #queue-top-title {\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t#queue-top-items, #user-contribs-count {\n\t\t\t\tfont-size: 0.85em;\n\t\t\t}\n\n\t\t\tbody.dark-mode #queue-top-items,\n\t\t\tbody.dark-mode #user-contribs-count {\n\t\t\t\tcolor: #999;\n\t\t\t}\n\n\t\t\t#queue-top-right {\n\t\t\t\tfont-size: 1.4em;\n\t\t\t}\n\n\t\t\t#queue-top-right span {\n\t\t\t\tmargin-left: 5px;\n\t\t\t\tcursor: pointer;\n\t\t\t\tcolor: #444;\n\t\t\t\ttransition: 0.2s;\n\t\t\t}\n\n\t\t\tbody.dark-mode #queue-top-right span {\n\t\t\t\tcolor: #c0c0c0;\n\t\t\t}\n\n\t\t\t#queue-top-right span:hover {\n\t\t\t\tcolor: black;\n\t\t\t}\n\n\t\t\tbody.dark-mode #queue-top-right span:hover {\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t}\n\n\t\t\t#notifications-panel {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 55px;\n\t\t\t\tright: 15px;\n\t\t\t\twidth: 380px;\n\t\t\t\tmax-height: 550px;\n\t\t\t\tbackground: rgba(30, 33, 42, 0.97);\n\t\t\t\tbackdrop-filter: blur(20px);\n\t\t\t\t-webkit-backdrop-filter: blur(20px);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.12);\n\t\t\t\tborder-radius: 16px;\n\t\t\t\tbox-shadow: 0 12px 48px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(255, 255, 255, 0.05);\n\t\t\t\tdisplay: none;\n\t\t\t\tz-index: 1000;\n\t\t\t\tflex-direction: column;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\tbody.dark-mode #notifications-panel {\n\t\t\t\tbackground: rgba(30, 33, 42, 0.97);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.12);\n\t\t\t\tbox-shadow: 0 12px 48px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(255, 255, 255, 0.05);\n\t\t\t}\n\n\t\t\t#notifications-panel.show {\n\t\t\t\tdisplay: flex;\n\t\t\t\tanimation: slideDownFancy 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);\n\t\t\t}\n\n\t\t\t@keyframes slideDownFancy {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: translateY(-20px) scale(0.95);\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: translateY(0) scale(1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t#notifications-header {\n\t\t\t\tpadding: 16px 18px;\n\t\t\t\tborder-bottom: 1px solid rgba(255, 255, 255, 0.08);\n\t\t\t\tfont-weight: 700;\n\t\t\t\tfont-size: 1.05em;\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.1) 0%, rgba(118, 75, 162, 0.1) 100%);\n\t\t\t}\n\n\t\t\tbody.dark-mode #notifications-header {\n\t\t\t\tborder-bottom: 1px solid rgba(255, 255, 255, 0.08);\n\t\t\t\tcolor: #e8e8e8;\n\t\t\t}\n\n\t\t\t#notifications-list {\n\t\t\t\toverflow: hidden auto;\n\t\t\t\tmax-height: 500px;\n\t\t\t}\n\n\t\t\t.notification-item {\n\t\t\t\tpadding: 14px 18px;\n\t\t\t\tborder-bottom: 1px solid rgba(255, 255, 255, 0.05);\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\tbody.dark-mode .notification-item {\n\t\t\t\tborder-bottom: 1px solid rgba(255, 255, 255, 0.05);\n\t\t\t}\n\n\t\t\t.notification-item:hover {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.06);\n\t\t\t\ttransform: translateX(4px);\n\t\t\t}\n\n\t\t\tbody.dark-mode .notification-item:hover {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.06);\n\t\t\t}\n\n\t\t\t.notification-item.unread {\n\t\t\t\tbackground: linear-gradient(90deg, rgba(102, 126, 234, 0.2) 0%, rgba(102, 126, 234, 0.05) 100%);\n\t\t\t\tborder-left: 3px solid #8fa3ff;\n\t\t\t\tpadding-left: 15px;\n\t\t\t}\n\n\t\t\t.notification-item.unread::before {\n\t\t\t\tcontent: \'\';\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 0;\n\t\t\t\ttop: 0;\n\t\t\t\tbottom: 0;\n\t\t\t\twidth: 3px;\n\t\t\t\tbackground: linear-gradient(180deg, #8fa3ff 0%, rgba(143, 163, 255, 0.5) 100%);\n\t\t\t}\n\n\t\t\tbody.dark-mode .notification-item.unread {\n\t\t\t\tbackground: linear-gradient(90deg, rgba(102, 126, 234, 0.2) 0%, rgba(102, 126, 234, 0.05) 100%);\n\t\t\t\tborder-left: 3px solid #8fa3ff;\n\t\t\t}\n\n\t\t\t.notification-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: flex-start;\n\t\t\t\tmargin-bottom: 6px;\n\t\t\t}\n\n\t\t\t.notification-type {\n\t\t\t\tfont-size: 0.7em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tletter-spacing: 0.8px;\n\t\t\t\topacity: 0.7;\n\t\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.25), rgba(118, 75, 162, 0.25));\n\t\t\t\tpadding: 2px 8px;\n\t\t\t\tborder-radius: 4px;\n\t\t\t}\n\n\t\t\t.notification-title {\n\t\t\t\tfont-weight: 600;\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t\tfont-size: 0.98em;\n\t\t\t\tline-height: 1.4;\n\t\t\t\tcolor: #222;\n\t\t\t}\n\n\t\t\tbody.dark-mode .notification-title {\n\t\t\t\tcolor: #e8e8e8;\n\t\t\t}\n\n\t\t\t.notification-subtitle {\n\t\t\t\tfont-size: 0.88em;\n\t\t\t\tcolor: #555;\n\t\t\t\tmargin-bottom: 6px;\n\t\t\t\tline-height: 1.45;\n\t\t\t}\n\n\t\t\tbody.dark-mode .notification-subtitle {\n\t\t\t\tcolor: #aaa;\n\t\t\t}\n\n\t\t\t.notification-time {\n\t\t\t\tfont-size: 0.78em;\n\t\t\t\tcolor: #888;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 5px;\n\t\t\t\tfont-style: italic;\n\t\t\t}\n\n\t\t\tbody.dark-mode .notification-time {\n\t\t\t\tcolor: #777;\n\t\t\t}\n\n\t\t\t.notification-time::before {\n\t\t\t\tcontent: \'🕒\';\n\t\t\t\tfont-size: 1.1em;\n\t\t\t\tfilter: grayscale(0.3);\n\t\t\t}\n\n\t\t\t.toast-notification {\n\t\t\t\tposition: fixed;\n\t\t\t\tbottom: 100px;\n\t\t\t\tright: 30px;\n\t\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.95) 0%, rgba(118, 75, 162, 0.95) 100%);\n\t\t\t\tbackdrop-filter: blur(20px);\n\t\t\t\t-webkit-backdrop-filter: blur(20px);\n\t\t\t\tcolor: white;\n\t\t\t\tpadding: 18px 24px;\n\t\t\t\tborder-radius: 16px;\n\t\t\t\tbox-shadow: 0 12px 40px rgba(102, 126, 234, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.1);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.2);\n\t\t\t\tz-index: 10000;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 14px;\n\t\t\t\tmin-width: 320px;\n\t\t\t\tmax-width: 500px;\n\t\t\t\tanimation: slideInBounce 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);\n\t\t\t\topacity: 0;\n\t\t\t\ttransform: translateX(100%) scale(0.8);\n\t\t\t}\n\n\t\t\t.toast-notification.success {\n\t\t\t\tbackground: linear-gradient(135deg, rgba(76, 175, 80, 0.95) 0%, rgba(56, 142, 60, 0.95) 100%);\n\t\t\t\tbox-shadow: 0 12px 40px rgba(76, 175, 80, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.1);\n\t\t\t}\n\n\t\t\t.toast-notification.error {\n\t\t\t\tbackground: linear-gradient(135deg, rgba(244, 67, 54, 0.95) 0%, rgba(211, 47, 47, 0.95) 100%);\n\t\t\t\tbox-shadow: 0 12px 40px rgba(244, 67, 54, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.1);\n\t\t\t}\n\n\t\t\t.toast-notification.warning {\n\t\t\t\tbackground: linear-gradient(135deg, rgba(255, 152, 0, 0.95) 0%, rgba(245, 124, 0, 0.95) 100%);\n\t\t\t\tbox-shadow: 0 12px 40px rgba(255, 152, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.1);\n\t\t\t}\n\n\t\t\t.toast-notification.show {\n\t\t\t\topacity: 1;\n\t\t\t\ttransform: translateX(0) scale(1);\n\t\t\t}\n\n\t\t\t.toast-notification.hide {\n\t\t\t\tanimation: slideOutBounce 0.4s cubic-bezier(0.6, -0.28, 0.735, 0.045) forwards;\n\t\t\t}\n\n\t\t\t@keyframes slideInBounce {\n\t\t\t\t0% {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: translateX(100%) scale(0.8);\n\t\t\t\t}\n\t\t\t\t60% {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: translateX(-10px) scale(1.05);\n\t\t\t\t}\n\t\t\t\t100% {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: translateX(0) scale(1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@keyframes slideOutBounce {\n\t\t\t\t0% {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: translateX(0) scale(1);\n\t\t\t\t}\n\t\t\t\t100% {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: translateX(150%) scale(0.7);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.toast-icon {\n\t\t\t\tfont-size: 1.8em;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tfilter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3));\n\t\t\t}\n\n\t\t\t.toast-content {\n\t\t\t\tflex: 1;\n\t\t\t}\n\n\t\t\t.toast-title {\n\t\t\t\tfont-weight: 700;\n\t\t\t\tfont-size: 1.05em;\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t\tletter-spacing: 0.3px;\n\t\t\t}\n\n\t\t\t.toast-message {\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\topacity: 0.95;\n\t\t\t\tline-height: 1.4;\n\t\t\t}\n\n\t\t\t.toast-close {\n\t\t\t\tcursor: pointer;\n\t\t\t\tfont-size: 1.3em;\n\t\t\t\topacity: 0.8;\n\t\t\t\ttransition: all 0.2s;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tpadding: 4px;\n\t\t\t\tborder-radius: 6px;\n\t\t\t}\n\n\t\t\t.toast-close:hover {\n\t\t\t\topacity: 1;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.15);\n\t\t\t\ttransform: scale(1.1);\n\t\t\t}\n\n\t\t\t.confirmation-modal-overlay {\n\t\t\t\tposition: fixed;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\tright: 0;\n\t\t\t\tbottom: 0;\n\t\t\t\tbackground: rgba(0, 0, 0, 0.5);\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tz-index: 10001;\n\t\t\t\tanimation: fadeIn 0.2s ease-out;\n\t\t\t}\n\n\t\t\t@keyframes fadeIn {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@keyframes fadeOut {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.confirmation-modal {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.98);\n\t\t\t\tbackdrop-filter: blur(20px);\n\t\t\t\t-webkit-backdrop-filter: blur(20px);\n\t\t\t\tborder-radius: 16px;\n\t\t\t\tbox-shadow: 0 12px 48px rgba(0, 0, 0, 0.25);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.8);\n\t\t\t\tmin-width: 400px;\n\t\t\t\tmax-width: 500px;\n\t\t\t\tanimation: scaleIn 0.2s ease-out;\n\t\t\t}\n\n\t\t\t@keyframes scaleIn {\n\t\t\t\tfrom {\n\t\t\t\t\ttransform: scale(0.9);\n\t\t\t\t\topacity: 0;\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\ttransform: scale(1);\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@keyframes scaleOut {\n\t\t\t\tfrom {\n\t\t\t\t\ttransform: scale(1);\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\ttransform: scale(0.9);\n\t\t\t\t\topacity: 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.confirmation-modal-overlay.closing {\n\t\t\t\tanimation: fadeOut 0.2s ease-out forwards;\n\t\t\t}\n\n\t\t\t.confirmation-modal.closing {\n\t\t\t\tanimation: scaleOut 0.2s ease-out forwards;\n\t\t\t}\n\n\t\t\t.confirmation-modal-header {\n\t\t\t\tpadding: 20px 24px;\n\t\t\t\tborder-bottom: 1px solid #e0e0e0;\n\t\t\t}\n\n\t\t\t.confirmation-modal-title {\n\t\t\t\tfont-size: 1.2em;\n\t\t\t\tfont-weight: bold;\n\t\t\t\tcolor: #333;\n\t\t\t}\n\n\t\t\t.confirmation-modal-body {\n\t\t\t\tpadding: 24px;\n\t\t\t\tcolor: #555;\n\t\t\t\tline-height: 1.5;\n\t\t\t}\n\n\t\t\t.confirmation-modal-username {\n\t\t\t\tfont-weight: bold;\n\t\t\t\tcolor: #0645ad;\n\t\t\t}\n\n\t\t\t.confirmation-modal-footer {\n\t\t\t\tpadding: 16px 24px;\n\t\t\t\tborder-top: 1px solid #e0e0e0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 12px;\n\t\t\t}\n\n\t\t\t.confirmation-modal-footer-right {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 12px;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button {\n\t\t\t\tpadding: 10px 24px;\n\t\t\t\tborder-radius: 6px;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tcursor: pointer;\n\t\t\t\tborder: none;\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\ttransition: all 0.2s;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-no {\n\t\t\t\tbackground: #f5f5f5;\n\t\t\t\tcolor: #333;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-no:hover {\n\t\t\t\tbackground: #e0e0e0;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-yes {\n\t\t\t\tbackground: #36c;\n\t\t\t\tcolor: white;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-yes:hover {\n\t\t\t\tbackground: #2855a8;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-uaa {\n\t\t\t\tbackground: #d33;\n\t\t\t\tcolor: white;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-uaa:hover {\n\t\t\t\tbackground: #a82828;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-yes:hover {\n\t\t\t\tbackground: #2855a8;\n\t\t\t}\n\n\t\t\t.confirmation-modal-footer-vertical {\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: stretch;\n\t\t\t}\n\n\t\t\t.confirmation-modal-footer-vertical .confirmation-modal-button {\n\t\t\t\twidth: 100%;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-reason {\n\t\t\t\tbackground: #36c;\n\t\t\t\tcolor: white;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-reason:hover {\n\t\t\t\tbackground: #2855a8;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-cancel {\n\t\t\t\tbackground: #f5f5f5;\n\t\t\t\tcolor: #333;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-cancel:hover {\n\t\t\t\tbackground: #e0e0e0;\n\t\t\t}\n\n\t\t\t#queue-items {\n\t\t\t\theight: calc(100% - 60px);\n\t\t\t\toverflow-x: hidden;\n\t\t\t\toverflow-y: auto;\n\t\t\t}\n\n\t\t\t.width-adjust {\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 100%;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tright: -4px;\n\t\t\t\tz-index: 3;\n\t\t\t\tcursor: col-resize;\n\t\t\t}\n\n\t\t\t#details-width-adjust {\n\t\t\t\tleft: -4px;\n\t\t\t}\n\n\t\t\t#right-container {\n\t\t\t\twidth: calc(100% - 300px);\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t}\n\n\t\t\t#middle-top, #right-top {\n\t\t\t\theight: 60px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tjustify-content: center;\n\t\t\t\tpadding: 8px 15px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.98);\n\t\t\t\tbackdrop-filter: blur(8px);\n\t\t\t\t-webkit-backdrop-filter: blur(8px);\n\t\t\t\tborder-bottom: 2px solid #e0e0e0;\n\t\t\t}\n\t\t\t#middle-top {\n\t\t\t\twidth: calc(100% - 300px);\n\t\t\t\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.08) !important;\n\t\t\t}\n\t\t\t#right-top {\n\t\t\t\tfont-size: 0.8em;\n\t\t\t\twidth: 300px;\n\t\t\t\tbox-shadow: 0 2px 0px rgba(0, 0, 0, 0.08) !important;\n\t\t\t}\n\n\t\t\t#middle-top a, #right-top a {\n\t\t\t\ttext-decoration: none;\n\t\t\t\tcolor: #0645ad;\n\t\t\t\tfont-weight: 500;\n\t\t\t\ttransition: color 0.2s ease;\n\t\t\t}\n\n\t\t\t#middle-top a:hover, #right-top a:hover {\n\t\t\t\tcolor: #0b7ad1;\n\t\t\t}\n\n\t\t\t#middle-top div, #right-top div {\n\t\t\t\tpadding: 0 6px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 0px;\n\t\t\t}\n\n\t\t\t#middle-top .fa, #right-top .fa {\n\t\t\t\tmargin-right: 6px;\n\t\t\t\tcolor: #555;\n\t\t\t\tfont-size: 0.95em;\n\t\t\t}\n\n\t\t\t.middle-top-comment, .right-top-comment {\n\t\t\t\tflex-basis: 100%;\n\t\t\t\ttext-align: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tmax-width: 100%;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t#right-content {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: calc(100% - 60px);\n\t\t\t\tdisplay: flex;\n\t\t\t}\n\n\t\t\t#main-container {\n\t\t\t\tposition: relative;\n\t\t\t\twidth: calc(100% - 300px);\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\theight: 100%;\n\t\t\t}\n\n\t\t\t/* Diff Container - Modern Redesign */\n\t\t\t#diff-container {\n\t\t\t\toverflow-y: auto;\n\t\t\t\tflex: 1;\n\t\t\t\tpadding: 16px;\n\t\t\t\tscroll-behavior: smooth;\n\t\t\t\tbackground: linear-gradient(180deg,\n\t\t\t\t\trgba(248, 249, 250, 0.3) 0%,\n\t\t\t\t\trgba(241, 243, 245, 0.2) 100%);\n\t\t\t}\n\n\t\t\tbody.dark-mode #diff-container {\n\t\t\t\tbackground: linear-gradient(180deg,\n\t\t\t\t\trgba(30, 34, 45, 0.4) 0%,\n\t\t\t\t\trgba(25, 28, 36, 0.3) 100%);\n\t\t\t}\n\n\t\t\t#diff-container table {\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-collapse: separate;\n\t\t\t\tborder-spacing: 0;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.6);\n\t\t\t\tbackdrop-filter: blur(20px);\n\t\t\t\t-webkit-backdrop-filter: blur(20px);\n\t\t\t\tborder-radius: 12px;\n\t\t\t\toverflow: hidden;\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 4px 20px rgba(0, 0, 0, 0.08),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.4),\n\t\t\t\t\tinset 0 -1px 0 rgba(0, 0, 0, 0.05);\n\t\t\t\tborder: 1px solid rgba(102, 126, 234, 0.15);\n\t\t\t\tmargin-bottom: 16px;\n\t\t\t}\n\n\t\t\tbody.dark-mode #diff-container table {\n\t\t\t\tbackground: rgba(35, 40, 52, 0.7);\n\t\t\t\tborder: 1px solid rgba(143, 163, 255, 0.2);\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 4px 20px rgba(0, 0, 0, 0.3),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.08),\n\t\t\t\t\tinset 0 -1px 0 rgba(0, 0, 0, 0.3);\n\t\t\t}\n\n\t\t\t#diff-container td,\n\t\t\t#diff-container tr {\n\t\t\t\toverflow-wrap: anywhere;\n\t\t\t\tborder: none;\n\t\t\t}\n\n\t\t\t#diff-container * {\n\t\t\t\tfont-family: \'Consolas\', \'Monaco\', \'Courier New\', monospace;\n\t\t\t\tvertical-align: baseline;\n\t\t\t\tfont-size: .95em;\n\t\t\t\tline-height: 1.5;\n\t\t\t}\n\n\t\t\t#diff-container td:not(.diff-marker) {\n\t\t\t\twidth: 50%;\n\t\t\t\tpadding: 8px 14px;\n\t\t\t\ttransition: background 0.2s ease;\n\t\t\t}\n\n\t\t\t/* Diff Line Numbers */\n\t\t\t.diff-lineno {\n\t\t\t\tbackground: linear-gradient(135deg,\n\t\t\t\t\trgba(102, 126, 234, 0.12) 0%,\n\t\t\t\t\trgba(118, 75, 162, 0.08) 100%) !important;\n\t\t\t\tborder-bottom: 1px solid rgba(102, 126, 234, 0.2) !important;\n\t\t\t\tcolor: #667eea !important;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tpadding: 8px 16px !important;\n\t\t\t\ttext-align: center;\n\t\t\t\tfont-size: 0.85em;\n\t\t\t\tletter-spacing: 0.5px;\n\t\t\t\tuser-select: none;\n\t\t\t}\n\n\t\t\tbody.dark-mode .diff-lineno {\n\t\t\t\tbackground: linear-gradient(135deg,\n\t\t\t\t\trgba(143, 163, 255, 0.15) 0%,\n\t\t\t\t\trgba(158, 115, 212, 0.1) 100%) !important;\n\t\t\t\tborder-bottom: 1px solid rgba(143, 163, 255, 0.25) !important;\n\t\t\t\tcolor: #8fa3ff !important;\n\t\t\t}\n\n\t\t\t/* Diff Marker Column */\n\t\t\t.diff-marker {\n\t\t\t\twidth: 30px !important;\n\t\t\t\ttext-align: center;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tuser-select: none;\n\t\t\t\tpadding: 6px 8px !important;\n\t\t\t\tbackground: rgba(0, 0, 0, 0.03);\n\t\t\t\tborder-right: 1px solid rgba(0, 0, 0, 0.08);\n\t\t\t}\n\n\t\t\tbody.dark-mode .diff-marker {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.2);\n\t\t\t\tborder-right: 1px solid rgba(255, 255, 255, 0.05);\n\t\t\t}\n\n\t\t\t/* Added Lines */\n\t\t\t.diff-addedline {\n\t\t\t\tbackground: linear-gradient(90deg,\n\t\t\t\t\trgba(76, 175, 80, 0.15) 0%,\n\t\t\t\t\trgba(76, 175, 80, 0.08) 100%) !important;\n\t\t\t\tborder-left: 3px solid #4CAF50 !important;\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t.diff-addedline::before {\n\t\t\t\tcontent: \'\';\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 0;\n\t\t\t\ttop: 0;\n\t\t\t\tbottom: 0;\n\t\t\t\twidth: 3px;\n\t\t\t\tbackground: linear-gradient(180deg,\n\t\t\t\t\trgba(76, 175, 80, 0.8) 0%,\n\t\t\t\t\trgba(76, 175, 80, 0.4) 100%);\n\t\t\t\tbox-shadow: 0 0 8px rgba(76, 175, 80, 0.4);\n\t\t\t}\n\n\t\t\t.diff-addedline:hover {\n\t\t\t\tbackground: linear-gradient(90deg,\n\t\t\t\t\trgba(76, 175, 80, 0.22) 0%,\n\t\t\t\t\trgba(76, 175, 80, 0.12) 100%) !important;\n\t\t\t}\n\n\t\t\tbody.dark-mode .diff-addedline {\n\t\t\t\tbackground: linear-gradient(90deg,\n\t\t\t\t\trgba(0, 164, 0, 0.25) 0%,\n\t\t\t\t\trgba(0, 164, 0, 0.12) 100%) !important;\n\t\t\t\tborder-left: 3px solid #00a400 !important;\n\t\t\t}\n\n\t\t\tbody.dark-mode .diff-addedline:hover {\n\t\t\t\tbackground: linear-gradient(90deg,\n\t\t\t\t\trgba(0, 164, 0, 0.32) 0%,\n\t\t\t\t\trgba(0, 164, 0, 0.16) 100%) !important;\n\t\t\t}\n\n\t\t\t/* Deleted Lines */\n\t\t\t.diff-deletedline {\n\t\t\t\tbackground: linear-gradient(90deg,\n\t\t\t\t\trgba(244, 67, 54, 0.15) 0%,\n\t\t\t\t\trgba(244, 67, 54, 0.08) 100%) !important;\n\t\t\t\tborder-left: 3px solid #f44336 !important;\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t.diff-deletedline::before {\n\t\t\t\tcontent: \'\';\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 0;\n\t\t\t\ttop: 0;\n\t\t\t\tbottom: 0;\n\t\t\t\twidth: 3px;\n\t\t\t\tbackground: linear-gradient(180deg,\n\t\t\t\t\trgba(244, 67, 54, 0.8) 0%,\n\t\t\t\t\trgba(244, 67, 54, 0.4) 100%);\n\t\t\t\tbox-shadow: 0 0 8px rgba(244, 67, 54, 0.4);\n\t\t\t}\n\n\t\t\t.diff-deletedline:hover {\n\t\t\t\tbackground: linear-gradient(90deg,\n\t\t\t\t\trgba(244, 67, 54, 0.22) 0%,\n\t\t\t\t\trgba(244, 67, 54, 0.12) 100%) !important;\n\t\t\t}\n\n\t\t\tbody.dark-mode .diff-deletedline {\n\t\t\t\tbackground: linear-gradient(90deg,\n\t\t\t\t\trgba(244, 67, 54, 0.25) 0%,\n\t\t\t\t\trgba(244, 67, 54, 0.12) 100%) !important;\n\t\t\t\tborder-left: 3px solid #f44336 !important;\n\t\t\t}\n\n\t\t\tbody.dark-mode .diff-deletedline:hover {\n\t\t\t\tbackground: linear-gradient(90deg,\n\t\t\t\t\trgba(244, 67, 54, 0.32) 0%,\n\t\t\t\t\trgba(244, 67, 54, 0.16) 100%) !important;\n\t\t\t}\n\n\t\t\t/* Inline Changes Highlighting */\n\t\t\tins {\n\t\t\t\tbackground: rgba(76, 175, 80, 0.35) !important;\n\t\t\t\ttext-decoration: none;\n\t\t\t\tborder-radius: 4px;\n\t\t\t\tpadding: 0px 2px;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tbox-shadow: 0 0 0 1px rgba(76, 175, 80, 0.3);\n\t\t\t\ttransition: all 0.15s ease;\n\t\t\t}\n\n\t\t\tins:hover {\n\t\t\t\tbackground: rgba(76, 175, 80, 0.5) !important;\n\t\t\t\tbox-shadow: 0 0 0 2px rgba(76, 175, 80, 0.5);\n\t\t\t}\n\n\t\t\tbody.dark-mode ins {\n\t\t\t\tbackground: rgba(130, 169, 26, 0.45) !important;\n\t\t\t\tbox-shadow: 0 0 0 1px rgba(130, 169, 26, 0.4);\n\t\t\t}\n\n\t\t\tbody.dark-mode ins:hover {\n\t\t\t\tbackground: rgba(130, 169, 26, 0.6) !important;\n\t\t\t\tbox-shadow: 0 0 0 2px rgba(130, 169, 26, 0.6);\n\t\t\t}\n\n\t\t\tdel {\n\t\t\t\tbackground: rgba(244, 67, 54, 0.35) !important;\n\t\t\t\ttext-decoration: none;\n\t\t\t\tborder-radius: 4px;\n\t\t\t\tpadding: 2px 4px;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tbox-shadow: 0 0 0 1px rgba(244, 67, 54, 0.3);\n\t\t\t\ttransition: all 0.15s ease;\n\t\t\t}\n\n\t\t\tdel:hover {\n\t\t\t\tbackground: rgba(244, 67, 54, 0.5) !important;\n\t\t\t\tbox-shadow: 0 0 0 2px rgba(244, 67, 54, 0.5);\n\t\t\t}\n\n\t\t\tbody.dark-mode del {\n\t\t\t\tbackground: rgba(244, 67, 54, 0.45) !important;\n\t\t\t\tbox-shadow: 0 0 0 1px rgba(244, 67, 54, 0.4);\n\t\t\t}\n\n\t\t\tbody.dark-mode del:hover {\n\t\t\t\tbackground: rgba(244, 67, 54, 0.6) !important;\n\t\t\t\tbox-shadow: 0 0 0 2px rgba(244, 67, 54, 0.6);\n\t\t\t}\n\n\t\t\t/* Context Lines (unchanged) */\n\t\t\t#diff-container tr:not(.diff-addedline):not(.diff-deletedline) td {\n\t\t\t\tcolor: #666;\n\t\t\t\tbackground: rgba(0, 0, 0, 0.02);\n\t\t\t}\n\n\t\t\tbody.dark-mode #diff-container tr:not(.diff-addedline):not(.diff-deletedline) td {\n\t\t\t\tcolor: #aaa;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.02);\n\t\t\t}\n\n\t\t\t#diff-container tr:hover td {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.05);\n\t\t\t}\n\n\t\t\tbody.dark-mode #diff-container tr:hover td {\n\t\t\t\tbackground: rgba(143, 163, 255, 0.08);\n\t\t\t}\n\n\t\t\t#bottom-tools {\n\t\t\t\theight: 50px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t#right-details {\n\t\t\t\twidth: 300px;\n\t\t\t\tborder-left: 2px solid #cfcfcf;\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t#user-contribs, #page-history {\n\t\t\t\theight: 50%;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t}\n\n\t\t\t#page-history {\n\t\t\t\tborder-top: 2px solid rgba(102, 126, 234, 0.2);\n\t\t\t}\n\n\t\t\tbody.dark-mode #page-history {\n\t\t\t\tborder-top: 2px solid rgba(143, 163, 255, 0.25);\n\t\t\t}\n\n\t\t\t#user-contribs-top, #page-history-top {\n\t\t\t\theight: 70px;\n\t\t\t\tborder-bottom: 1px solid rgba(102, 126, 234, 0.15);\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tpadding: 0 16px;\n\t\t\t\tuser-select: none;\n\t\t\t\tbackground: linear-gradient(135deg,\n\t\t\t\t\trgba(102, 126, 234, 0.1) 0%,\n\t\t\t\t\trgba(118, 75, 162, 0.08) 50%,\n\t\t\t\t\trgba(102, 126, 234, 0.06) 100%);\n\t\t\t\tbackdrop-filter: blur(25px);\n\t\t\t\t-webkit-backdrop-filter: blur(25px);\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 2px 12px rgba(102, 126, 234, 0.1),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.15),\n\t\t\t\t\tinset 0 -1px 0 rgba(102, 126, 234, 0.1);\n\t\t\t\tposition: relative;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\tbody.dark-mode #user-contribs-top,\n\t\t\tbody.dark-mode #page-history-top {\n\t\t\t\tbackground: linear-gradient(135deg,\n\t\t\t\t\trgba(143, 163, 255, 0.15) 0%,\n\t\t\t\t\trgba(158, 115, 212, 0.12) 50%,\n\t\t\t\t\trgba(143, 163, 255, 0.1) 100%);\n\t\t\t\tborder-bottom: 1px solid rgba(143, 163, 255, 0.2);\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 2px 16px rgba(0, 0, 0, 0.4),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.08),\n\t\t\t\t\tinset 0 -1px 0 rgba(143, 163, 255, 0.15);\n\t\t\t}\n\n\t\t\t#user-contribs-title, #page-history-title {\n\t\t\t\tfont-weight: 700;\n\t\t\t\tfont-size: 1em;\n\t\t\t\tcolor: #2c3e50;\n\t\t\t\tletter-spacing: 0.5px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tfont-size: 0.85em;\n\t\t\t}\n\n\t\t\tbody.dark-mode #user-contribs-title,\n\t\t\tbody.dark-mode #page-history-title {\n\t\t\t\tcolor: #e8e8e8;\n\t\t\t}\n\n\t\t\t#user-contribs-title::before {\n\t\t\t\tcontent: "\f007";\n\t\t\t\tfont-family: "Font Awesome 6 Free";\n\t\t\t\tfont-weight: 900;\n\t\t\t\tcolor: #667eea;\n\t\t\t\tfont-size: 1.2em;\n\t\t\t\tfilter: drop-shadow(0 2px 4px rgba(102, 126, 234, 0.3));\n\t\t\t}\n\n\t\t\tbody.dark-mode #user-contribs-title::before {\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t\tfilter: drop-shadow(0 2px 6px rgba(143, 163, 255, 0.4));\n\t\t\t}\n\n\t\t\t#page-history-title::before {\n\t\t\t\tcontent: "\f1da";\n\t\t\t\tfont-family: "Font Awesome 6 Free";\n\t\t\t\tfont-weight: 900;\n\t\t\t\tcolor: #667eea;\n\t\t\t\tfont-size: 1.2em;\n\t\t\t\tfilter: drop-shadow(0 2px 4px rgba(102, 126, 234, 0.3));\n\t\t\t}\n\n\t\t\tbody.dark-mode #page-history-title::before {\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t\tfilter: drop-shadow(0 2px 6px rgba(143, 163, 255, 0.4));\n\t\t\t}\n\n\t\t\t#user-contribs-left {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 4px;\n\t\t\t}\n\n\t\t\t#user-contribs-count {\n\t\t\t\tfont-size: 0.8em;\n\t\t\t\tcolor: #777;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tletter-spacing: 0.3px;\n\t\t\t}\n\n\t\t\tbody.dark-mode #user-contribs-count {\n\t\t\t\tcolor: #aaa;\n\t\t\t}\n\n\t\t\t/* Warn Level Badge - Modern Redesign */\n\t\t\t#user-contribs-level {\n\t\t\t\tpadding: 4px 10px;\n\t\t\t\tborder-radius: 10px;\n\t\t\t\tcolor: white;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tfont-size: 0.8em;\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 2px 8px rgba(0, 0, 0, 0.2),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.2),\n\t\t\t\t\tinset 0 -1px 0 rgba(0, 0, 0, 0.1);\n\t\t\t\ttransition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\tcursor: help;\n\t\t\t\tposition: relative;\n\t\t\t\tletter-spacing: 0.3px;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.2);\n\t\t\t}\n\n\t\t\t#user-contribs-level:hover {\n\t\t\t\ttransform: translateY(-1px) scale(1.03);\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 4px 12px rgba(0, 0, 0, 0.25),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.25),\n\t\t\t\t\tinset 0 -1px 0 rgba(0, 0, 0, 0.15);\n\t\t\t\tborder-color: rgba(255, 255, 255, 0.3);\n\t\t\t}\n\n\t\t\t/* Block Count Badge - Modern Redesign */\n\t\t\t#block-count-indicator {\n\t\t\t\tpadding: 4px 10px;\n\t\t\t\tborder-radius: 10px;\n\t\t\t\tbackground: linear-gradient(135deg,\n\t\t\t\t\trgba(255, 68, 68, 0.95) 0%,\n\t\t\t\t\trgba(220, 38, 38, 0.95) 100%);\n\t\t\t\tcolor: white;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tfont-size: 0.8em;\n\t\t\t\tmargin-right: 6px;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.3);\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 2px 8px rgba(255, 68, 68, 0.3),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.2),\n\t\t\t\t\tinset 0 -1px 0 rgba(0, 0, 0, 0.15);\n\t\t\t\ttransition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\tcursor: help;\n\t\t\t\tletter-spacing: 0.3px;\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t#block-count-indicator::before {\n\t\t\t\tcontent: "🚫";\n\t\t\t\tmargin-right: 4px;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tfilter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.3));\n\t\t\t}\n\n\t\t\t#block-count-indicator:hover {\n\t\t\t\ttransform: translateY(-1px) scale(1.03);\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 4px 14px rgba(255, 68, 68, 0.4),\n\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.25),\n\t\t\t\t\tinset 0 -1px 0 rgba(0, 0, 0, 0.2);\n\t\t\t\tborder-color: rgba(255, 255, 255, 0.4);\n\t\t\t}\n\n\t\t\t/* Protection Indicator - Modern Redesign */\n\t\t\t#protection-indicator {\n\t\t\t\tfont-size: 1.6em;\n\t\t\t\tcolor: #667eea;\n\t\t\t\tfilter: drop-shadow(0 2px 6px rgba(102, 126, 234, 0.4));\n\t\t\t\ttransition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\tcursor: help;\n\t\t\t}\n\n\t\t\tbody.dark-mode #protection-indicator {\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t\tfilter: drop-shadow(0 2px 8px rgba(143, 163, 255, 0.5));\n\t\t\t}\n\n\t\t\t#protection-indicator:hover {\n\t\t\t\ttransform: scale(1.15) rotate(5deg);\n\t\t\t\tfilter: drop-shadow(0 4px 12px rgba(102, 126, 234, 0.6));\n\t\t\t}\n\n\t\t\tbody.dark-mode #protection-indicator:hover {\n\t\t\t\tfilter: drop-shadow(0 4px 12px rgba(143, 163, 255, 0.7));\n\t\t\t}\n\n\t\t\t#user-contribs-content, #page-history-content {\n\t\t\t\theight: calc(100% - 70px);\n\t\t\t\toverflow-y: auto;\n\t\t\t\toverflow-x: hidden;\n\t\t\t\tflex: 1;\n\t\t\t\tbackground: rgba(248, 249, 252, 0.4);\n\t\t\t\tpadding: 4px;\n\t\t\t}\n\n\t\t\tbody.dark-mode #user-contribs-content,\n\t\t\tbody.dark-mode #page-history-content {\n\t\t\t\tbackground: rgba(20, 22, 28, 0.3);\n\t\t\t}\n\n\t\t\t#user-contribs-content .queue-edit,\n\t\t\t#page-history-content .queue-edit {\n\t\t\t\tanimation: none !important;\n\t\t\t\tmargin: 4px 0;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\toverflow: hidden;\n\t\t\t}\n\n\t\t\t#bottom-tools {\n\t\t\t\toverflow: auto hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\theight: 56px;\n\t\t\t\tpadding: 0 16px;\n\t\t\t\tborder-top: 1px solid rgba(0, 0, 0, 0.1);\n\t\t\t\tbackground: rgba(255, 255, 255, 0.98);\n\t\t\t\tbackdrop-filter: blur(12px);\n\t\t\t\t-webkit-backdrop-filter: blur(12px);\n\t\t\t\tbox-shadow: 0 -2px 8px rgba(0, 0, 0, 0.05);\n\t\t\t\tposition: relative;\n\t\t\t\tz-index: 10;\n\t\t\t}\n\n\t\t\tbody.dark-mode #bottom-tools {\n\t\t\t\tbackground: rgba(30, 33, 42, 0.98);\n\t\t\t\tborder-top: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tbox-shadow: 0 -2px 8px rgba(0, 0, 0, 0.3);\n\t\t\t}\n\n\t\t\t/* Blur bottom bar when settings are open */\n\t\t\tbody.settings-open #bottom-tools {\n\t\t\t\tfilter: blur(4px);\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\n\t\t\t#bottom-tools-left {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t/* Menu Trigger Buttons */\n\t\t\t.bottom-tool-item {\n\t\t\t\tposition: relative;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.bottom-tool-trigger {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 8px 14px;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tcursor: pointer;\n\t\t\t\tuser-select: none;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tcolor: #444;\n\t\t\t\tbackground: transparent;\n\t\t\t}\n\n\t\t\tbody.dark-mode .bottom-tool-trigger {\n\t\t\t\tcolor: #c0c0c0;\n\t\t\t}\n\n\t\t\t.bottom-tool-trigger:hover {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.05);\n\t\t\t\tcolor: #667eea;\n\t\t\t}\n\n\t\t\tbody.dark-mode .bottom-tool-trigger:hover {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.08);\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t}\n\n\t\t\t.bottom-tool-trigger.active {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.12);\n\t\t\t\tcolor: #667eea;\n\t\t\t}\n\n\t\t\tbody.dark-mode .bottom-tool-trigger.active {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.2);\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t}\n\n\t\t\t.bottom-tool-trigger i:first-child {\n\t\t\t\tfont-size: 1em;\n\t\t\t}\n\n\t\t\t.bottom-tool-chevron {\n\t\t\t\tfont-size: 0.75em;\n\t\t\t\ttransition: transform 0.2s ease;\n\t\t\t}\n\n\t\t\t.bottom-tool-trigger.active .bottom-tool-chevron {\n\t\t\t\ttransform: rotate(180deg);\n\t\t\t}\n\n\t\t\t/* Dropdown Menus */\n\t\t\t.bottom-tool-menu {\n\t\t\t\tposition: absolute;\n\t\t\t\tbottom: calc(100% + 8px);\n\t\t\t\tleft: 0;\n\t\t\t\tmin-width: 240px;\n\t\t\t\tmax-width: calc(100vw - 40px);\n\t\t\t\tbackground: rgba(255, 255, 255, 0.98);\n\t\t\t\tbackdrop-filter: blur(20px);\n\t\t\t\t-webkit-backdrop-filter: blur(20px);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.08);\n\t\t\t\tborder-radius: 12px;\n\t\t\t\tbox-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);\n\t\t\t\tpadding: 6px;\n\t\t\t\tdisplay: none;\n\t\t\t\tz-index: 1000;\n\t\t\t\tanimation: slideUpFadeIn 0.2s ease-out;\n\t\t\t\toverflow-y: visible;\n\t\t\t}\n\n\t\t\t.bottom-tool-menu::-webkit-scrollbar {\n\t\t\t\theight: 8px;\n\t\t\t}\n\n\t\t\t.bottom-tool-menu::-webkit-scrollbar-track {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.05);\n\t\t\t\tborder-radius: 4px;\n\t\t\t}\n\n\t\t\t.bottom-tool-menu::-webkit-scrollbar-thumb {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.2);\n\t\t\t\tborder-radius: 4px;\n\t\t\t}\n\n\t\t\tbody.dark-mode .bottom-tool-menu::-webkit-scrollbar-track {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.05);\n\t\t\t}\n\n\t\t\tbody.dark-mode .bottom-tool-menu::-webkit-scrollbar-thumb {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.2);\n\t\t\t}\n\n\t\t\tbody.dark-mode .bottom-tool-menu {\n\t\t\t\tbackground: rgba(35, 38, 48, 0.98);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tbox-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);\n\t\t\t}\n\n\t\t\t.bottom-tool-menu.show {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\t@keyframes slideUpFadeIn {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: translateY(10px);\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: translateY(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Menu Options */\n\t\t\t.menu-option {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 12px;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tcursor: pointer;\n\t\t\t\tuser-select: none;\n\t\t\t\ttransition: all 0.15s ease;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tcolor: #333;\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\tbody.dark-mode .menu-option {\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t.menu-option:hover {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.08);\n\t\t\t\tcolor: #667eea;\n\t\t\t}\n\n\t\t\tbody.dark-mode .menu-option:hover {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.15);\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t}\n\n\t\t\t.menu-option i:first-child {\n\t\t\t\twidth: 18px;\n\t\t\t\tfont-size: 1.1em;\n\t\t\t\ttext-align: center;\n\t\t\t\topacity: 0.8;\n\t\t\t}\n\n\t\t\t.menu-option:hover i:first-child {\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\t.menu-option span {\n\t\t\t\tflex: 1;\n\t\t\t}\n\n\t\t\t.menu-option-icon,\n\t\t\t.menu-option-chevron {\n\t\t\t\tfont-size: 0.85em;\n\t\t\t\topacity: 0.5;\n\t\t\t\tmargin-left: auto;\n\t\t\t}\n\n\t\t\t.menu-option:hover .menu-option-icon,\n\t\t\t.menu-option:hover .menu-option-chevron {\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\t/* Menu Divider */\n\t\t\t.menu-divider {\n\t\t\t\theight: 1px;\n\t\t\t\tbackground: rgba(0, 0, 0, 0.08);\n\t\t\t\tmargin: 6px 8px;\n\t\t\t}\n\n\t\t\tbody.dark-mode .menu-divider {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.1);\n\t\t\t}\n\n\t\t\t/* Submenus */\n\t\t\t.submenu-trigger {\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t.submenu {\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: calc(100% + 4px);\n\t\t\t\ttop: -6px;\n\t\t\t\tmin-width: 240px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.98);\n\t\t\t\tbackdrop-filter: blur(20px);\n\t\t\t\t-webkit-backdrop-filter: blur(20px);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.08);\n\t\t\t\tborder-radius: 12px;\n\t\t\t\tbox-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);\n\t\t\t\tpadding: 6px;\n\t\t\t\tdisplay: none;\n\t\t\t\tz-index: 1100;\n\t\t\t}\n\n\t\t\tbody.dark-mode .submenu {\n\t\t\t\tbackground: rgba(35, 38, 48, 0.98);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tbox-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);\n\t\t\t}\n\n\t\t\t.submenu.show {\n\t\t\t\tdisplay: block;\n\t\t\t\tanimation: slideRightFadeIn 0.2s ease-out;\n\t\t\t}\n\n\t\t\t@keyframes slideRightFadeIn {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: translateX(-10px);\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: translateX(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Stats Section */\n\t\t\t#bottom-tools-stats {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 16px;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t}\n\n\t\t\t.stat-item {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 6px;\n\t\t\t\tpadding: 6px 12px;\n\t\t\t\tbackground: rgba(0, 0, 0, 0.03);\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tcolor: #666;\n\t\t\t}\n\n\t\t\tbody.dark-mode .stat-item {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.05);\n\t\t\t\tcolor: #999;\n\t\t\t}\n\n\t\t\t.stat-item i {\n\t\t\t\tfont-size: 1.1em;\n\t\t\t}\n\n\t\t\t.bottom-stat-value {\n\t\t\t\tfont-weight: 700;\n\t\t\t\tcolor: #333;\n\t\t\t\tfont-size: 1em;\n\t\t\t}\n\n\t\t\tbody.dark-mode .bottom-stat-value {\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t.stat-value {\n\t\t\t\tfont-weight: 700;\n\t\t\t\tcolor: #333;\n\t\t\t}\n\n\t\t\tbody.dark-mode .stat-value {\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t.stat-label {\n\t\t\t\topacity: 0.8;\n\t\t\t}\n\n\t\t\t/* Revert & Warn Menu Tables */\n\t\t\t.revert-menu-table {\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-collapse: separate;\n\t\t\t\tborder-spacing: 4px;\n\t\t\t}\n\n\t\t\t.revert-menu-table tr {\n\t\t\t\tborder-bottom: none;\n\t\t\t}\n\n\t\t\t.revert-menu-table tr:last-child {\n\t\t\t\tborder-bottom: none;\n\t\t\t}\n\n\t\t\t.revert-menu-title {\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tfont-size: 0.85em;\n\t\t\t\tcolor: #333;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder-radius: 0;\n\t\t\t}\n\n\t\t\tbody.dark-mode .revert-menu-title {\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t\tbackground: transparent;\n\t\t\t}\n\n\t\t\t.revert-menu-info {\n\t\t\t\tpadding: 8px 6px;\n\t\t\t\ttext-align: center;\n\t\t\t\tcursor: help;\n\t\t\t\tcolor: #667eea;\n\t\t\t\tfont-size: 0.85em;\n\t\t\t\twidth: 28px;\n\t\t\t\tbackground: transparent;\n\t\t\t\tborder-radius: 0;\n\t\t\t}\n\n\t\t\tbody.dark-mode .revert-menu-info {\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t\tbackground: transparent;\n\t\t\t}\n\n\t\t\t.revert-menu-info:hover {\n\t\t\t\tcolor: #5a67d8;\n\t\t\t}\n\n\t\t\tbody.dark-mode .revert-menu-info:hover {\n\t\t\t\tcolor: #a5b4ff;\n\t\t\t}\n\n\t\t\t.revert-menu-item {\n\t\t\t\tpadding: 6px 8px;\n\t\t\t\ttext-align: center;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tfont-size: 0.8em;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: all 0.15s ease;\n\t\t\t\tcolor: white;\n\t\t\t\tuser-select: none;\n\t\t\t\tmin-width: 38px;\n\t\t\t\twidth: 38px;\n\t\t\t\tborder-radius: 6px;\n\t\t\t}\n\n\t\t\t.revert-menu-item:hover {\n\t\t\t\tfilter: brightness(1.15);\n\t\t\t\ttransform: scale(1.08);\n\t\t\t\tbox-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n\t\t\t}\n\n\t\t\t.revert-menu-item:active {\n\t\t\t\ttransform: scale(0.98);\n\t\t\t}\n\n\t\t\t.revert-menu-category {\n\t\t\t\tpadding: 10px 12px 6px 12px;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tfont-size: 0.75em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.5px;\n\t\t\t\tcolor: #667eea;\n\t\t\t\tbackground: rgba(102, 126, 234, 0.08);\n\t\t\t\tborder-radius: 6px 6px 0 0;\n\t\t\t}\n\n\t\t\tbody.dark-mode .revert-menu-category {\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t\tbackground: rgba(143, 163, 255, 0.1);\n\t\t\t}\n\n\t\t\tselect, input[type=text] {\n\t\t\t\tmax-width: 250px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.95);\n\t\t\t\tbackdrop-filter: blur(8px);\n\t\t\t\t-webkit-backdrop-filter: blur(8px);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.15);\n\t\t\t\tpadding: 8px 12px;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\tbox-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);\n\t\t\t}\n\n\t\t\tbody.dark-mode select,\n\t\t\tbody.dark-mode input[type=text] {\n\t\t\t\tbackground: rgba(40, 43, 52, 0.95);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.15);\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t\tbox-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);\n\t\t\t}\n\n\t\t\tselect:hover, input[type=text]:hover {\n\t\t\t\tborder-color: rgba(0, 0, 0, 0.25);\n\t\t\t\tbox-shadow: 0 3px 10px rgba(0, 0, 0, 0.08);\n\t\t\t}\n\n\t\t\tbody.dark-mode select:hover,\n\t\t\tbody.dark-mode input[type=text]:hover {\n\t\t\t\tborder-color: rgba(255, 255, 255, 0.25);\n\t\t\t\tbox-shadow: 0 3px 10px rgba(0, 0, 0, 0.4);\n\t\t\t}\n\n\t\t\tselect:focus, input[type=text]:focus {\n\t\t\t\toutline: none;\n\t\t\t\tborder-color: rgba(33, 150, 243, 0.6);\n\t\t\t\tbox-shadow: 0 0 0 3px rgba(33, 150, 243, 0.15);\n\t\t\t\tbackground: rgba(255, 255, 255, 1);\n\t\t\t}\n\n\t\t\tbody.dark-mode select:focus,\n\t\t\tbody.dark-mode input[type=text]:focus {\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.8);\n\t\t\t\tbox-shadow: 0 0 0 3px rgba(102, 126, 234, 0.3);\n\t\t\t\tbackground: rgba(40, 43, 52, 1);\n\t\t\t}\n\n\t\t\tinput[type=text] {\n\t\t\t\tcursor: text !important;\n\t\t\t}\n\n\t\t\t#revert-menu {\n\t\t\t\tmax-height: calc(100vh - 120px);\n\t\t\t\toverflow: hidden auto;\n\t\t\t}\n\n\t\t\t#warn-menu {\n\t\t\t\tmax-height: calc(100vh - 120px);\n\t\t\t\toverflow: hidden auto;\n\t\t\t}\n\n\t\t\t.revert-menu-table {\n\t\t\t\tpadding: 12px;\n\t\t\t}\n\n\t\t\t.revert-menu-title, .revert-menu-info {\n\t\t\t\tpadding-right: 15px;\n\t\t\t}\n\n\t\t\t.revert-menu-item {\n\t\t\t\tcolor: white;\n\t\t\t\twidth: 35px;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\theight: 35px;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\ttext-align: center;\n\t\t\t\tuser-select: none;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\tbox-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n\t\t\t\tbackdrop-filter: blur(8px);\n\t\t\t\t-webkit-backdrop-filter: blur(8px);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.15);\n\t\t\t}\n\n\t\t\t.revert-menu-item:hover {\n\t\t\t\tfilter: brightness(0.9);\n\t\t\t\ttransform: translateY(-2px);\n\t\t\t\tbox-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);\n\t\t\t}\n\n\t\t\t.revert-menu-item:active {\n\t\t\t\ttransform: translateY(0);\n\t\t\t\tbox-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);\n\t\t\t}\n\n\t\t\t/* Submenu Form Content */\n\t\t\t.bottom-subcontent-title {\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: #333;\n\t\t\t\tmargin-bottom: 12px;\n\t\t\t\tpadding-bottom: 8px;\n\t\t\t\tborder-bottom: 1px solid rgba(0, 0, 0, 0.08);\n\t\t\t}\n\n\t\t\tbody.dark-mode .bottom-subcontent-title {\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t\tborder-bottom: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t}\n\n\t\t\t.bottom-subcontent-input-title {\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tmargin: 10px 0 2px 0;\n\t\t\t\tcolor: #666;\n\t\t\t}\n\n\t\t\tbody.dark-mode .bottom-subcontent-input-title {\n\t\t\t\tcolor: #999;\n\t\t\t}\n\n\t\t\t.submenu select,\n\t\t\t.submenu input[type="text"] {\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 8px 12px;\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.15);\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.8);\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\tbody.dark-mode .submenu select,\n\t\t\tbody.dark-mode .submenu input[type="text"] {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.3);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.2);\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t.submenu select:focus,\n\t\t\t.submenu input[type="text"]:focus {\n\t\t\t\toutline: none;\n\t\t\t\tborder-color: #667eea;\n\t\t\t\tbox-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);\n\t\t\t}\n\n\t\t\t.bottom-subcontent-button {\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tmargin: 10px 0 2px 0;\n\t\t\t}\n\n\t\t\t.bottom-subcontent-button {\n\t\t\t\tmargin-top: 10px;\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: 100%;\n\t\t\t\tbackground: linear-gradient(to bottom, #667eea, #5a67d8);\n\t\t\t\tborder: 1px solid rgba(102, 126, 234, 0.3);\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tcursor: pointer;\n\t\t\t\tpadding: 10px 16px;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: white;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\tbox-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\t.bottom-subcontent-button:hover {\n\t\t\t\tbackground: linear-gradient(to bottom, #5a67d8, #4c51bf);\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t\tbox-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n\t\t\t}\n\n\t\t\t.bottom-subcontent-button:active {\n\t\t\t\ttransform: translateY(0);\n\t\t\t\tbox-shadow: 0 1px 4px rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\tbody.dark-mode .bottom-subcontent-button {\n\t\t\t\tbackground: linear-gradient(to bottom, #8fa3ff, #7b8ff5);\n\t\t\t\tbox-shadow: 0 2px 8px rgba(143, 163, 255, 0.3);\n\t\t\t}\n\n\t\t\tbody.dark-mode .bottom-subcontent-button:hover {\n\t\t\t\tbackground: linear-gradient(to bottom, #7b8ff5, #667eea);\n\t\t\t\tbox-shadow: 0 4px 12px rgba(143, 163, 255, 0.4);\n\t\t\t}\n\n\t\t\t.queue-edit {\n\t\t\t\tdisplay: flex;\n\t\t\t\tposition: relative;\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\tborder-radius: 10px;\n\t\t\t\tmargin: 8px;\n\t\t\t\toverflow: hidden;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.6);\n\t\t\t\tbackdrop-filter: blur(10px);\n\t\t\t\t-webkit-backdrop-filter: blur(10px);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.08);\n\t\t\t\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n\t\t\t}\n\n\t\t\tbody.dark-mode .queue-edit {\n\t\t\t\tcolor: #c0c0c0;\n\t\t\t\tbackground: rgba(40, 43, 52, 0.7);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08);\n\t\t\t\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);\n\t\t\t}\n\n\t\t\t.queue-edit:hover {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.85);\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.3);\n\t\t\t\tbox-shadow: 0 4px 16px rgba(102, 126, 234, 0.15);\n\t\t\t\ttransform: translateX(2px);\n\t\t\t}\n\n\t\t\tbody.dark-mode .queue-edit:hover {\n\t\t\t\tbackground: rgba(50, 54, 66, 0.85);\n\t\t\t\tborder-color: rgba(143, 163, 255, 0.3);\n\t\t\t\tbox-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);\n\t\t\t}\n\n\t\t\t.queue-edit:not(.queue-edit-current) {\n\t\t\t\tanimation: fadein 0.5s ease-out 0s 1;\n\t\t\t}\n\n\t\t\t@keyframes fadein {\n\t\t\t\tfrom {\n\t\t\t\t\tbackground: #e8e8e8;\n\t\t\t\t\ttransform: translateX(-5px);\n\t\t\t\t}\n\n\t\t\t\tto {\n\t\t\t\t\tbackground: transparent;\n\t\t\t\t\ttransform: translateX(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbody.dark-mode .queue-edit:not(.queue-edit-current) {\n\t\t\t\tanimation: fadeinDark 0.5s ease-out 0s 1;\n\t\t\t}\n\n\t\t\t@keyframes fadeinDark {\n\t\t\t\tfrom {\n\t\t\t\t\tbackground: rgba(255, 255, 255, 0.1);\n\t\t\t\t\ttransform: translateX(-5px);\n\t\t\t\t}\n\n\t\t\t\tto {\n\t\t\t\t\tbackground: transparent;\n\t\t\t\t\ttransform: translateX(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.queue-edit-title, .queue-edit-user, .queue-edit-summary, .queue-edit-time {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\tmargin-bottom: 3px;\n\t\t\t\tposition: relative;\n\t\t\t\twidth: max-content;\n\t\t\t\tmax-width: 100%;\n\t\t\t\theight: 22px;\n\t\t\t}\n\n\t\t\t.queue-edit-user, .queue-edit-summary, .queue-edit-time {\n\t\t\t\tfont-size: 0.9em;\n\t\t\t}\n\n\t\t#user-contribs-content .queue-edit-content,\n\t\t#page-history-content .queue-edit-content {\n\t\t\tpadding: 12px 14px;\n\t\t\tgap: 5px;\n\t\t}\n\n\t\t#user-contribs-content .queue-edit,\n\t\t#page-history-content .queue-edit {\n\t\t\ttransition: all 0.2s ease;\n\t\t}\n\n\t\t#user-contribs-content .queue-edit:hover,\n\t\t#page-history-content .queue-edit:hover {\n\t\t\ttransform: translateX(3px);\n\t\t\tbackground: rgba(102, 126, 234, 0.08) !important;\n\t\t}\n\n\t\tbody.dark-mode #user-contribs-content .queue-edit:hover,\n\t\tbody.dark-mode #page-history-content .queue-edit:hover {\n\t\t\tbackground: rgba(143, 163, 255, 0.12) !important;\n\t\t}\n\n\t\t#user-contribs-content .queue-edit-change,\n\t\t#page-history-content .queue-edit-change {\n\t\t\tfont-size: 0.75em !important;\n\t\t\tmin-width: 45px;\n\t\t\tpadding: 2px 6px;\n\t\t}\t\t.queue-edit-icon {\n\t\t\t\twidth: 25px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tcolor: #333;\n\t\t\t}\n\n\t\t\tbody.dark-mode .queue-edit-icon {\n\t\t\t\tcolor: #c0c0c0;\n\t\t\t}\n\n\t\t\t.queue-edit-color {\n\t\t\t\twidth: 8px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tbackground: gray;\n\t\t\t\ttransition: all 0.3s ease;\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t.queue-edit-color::after {\n\t\t\t\tcontent: attr(data-ores-score);\n\t\t\t\tposition: absolute;\n\t\t\t\tright: 10px;\n\t\t\t\ttop: 50%;\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t\tfont-size: 0.7em;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tcolor: white;\n\t\t\t\tbackground: rgba(0, 0, 0, 0.3);\n\t\t\t\tbackdrop-filter: blur(8px);\n\t\t\t\t-webkit-backdrop-filter: blur(8px);\n\t\t\t\tpadding: 3px 6px;\n\t\t\t\tborder-radius: 5px;\n\t\t\t\topacity: 0;\n\t\t\t\ttransition: opacity 0.3s ease;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\tpointer-events: none;\n\t\t\t\tz-index: 10;\n\t\t\t}\n\n\t\t\t.queue-edit:hover .queue-edit-color {\n\t\t\t\twidth: 55px;\n\t\t\t}\n\n\t\t\t.queue-edit:hover .queue-edit-color::after {\n\t\t\t\topacity: 1;\n\t\t\t}\n\n\t\t\t.queue-edit-content {\n\t\t\t\tpadding: 14px 16px;\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-bottom: none;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\tbody.dark-mode .queue-edit-content {\n\t\t\t\tborder-bottom: none;\n\t\t\t}\n\n\t\t\t.queue-edit-tags {\n\t\t\t\tdisplay: flex;\n\t\t\t}\n\n\t\t\t.queue-edit-tag {\n\t\t\t\tfont-size: 0.8em;\n\t\t\t\tpadding: 3px 10px;\n\t\t\t\tflex-shrink: 0;\n\t\t\t\tmargin-right: 5px;\n\t\t\t\tborder-radius: 6px;\n\t\t\t\tbackground: rgba(234, 234, 234, 0.9);\n\t\t\t\tbackdrop-filter: blur(8px);\n\t\t\t\t-webkit-backdrop-filter: blur(8px);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.08);\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\tbody.dark-mode .queue-edit-tag {\n\t\t\t\tbackground: rgba(50, 54, 66, 0.9);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tcolor: #c0c0c0;\n\t\t\t}\n\n\t\t\t.queue-edit-tag:hover {\n\t\t\t\tbackground: rgba(220, 220, 220, 0.95);\n\t\t\t}\n\n\t\t\tbody.dark-mode .queue-edit-tag:hover {\n\t\t\t\tbackground: rgba(60, 64, 76, 0.95);\n\t\t\t}\n\n\t\t\t.queue-edit-tag-minor {\n\t\t\t\tbackground: rgba(212, 212, 212, 0.95);\n\t\t\t\tbackdrop-filter: blur(8px);\n\t\t\t\t-webkit-backdrop-filter: blur(8px);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\t\t\t\tfont-weight: bold;\n\t\t\t\tcolor: #666;\n\t\t\t\tfont-style: italic;\n\t\t\t}\n\n\t\t\tbody.dark-mode .queue-edit-tag-minor {\n\t\t\t\tbackground: rgba(60, 64, 76, 0.95);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.15);\n\t\t\t\tcolor: #999;\n\t\t\t}\n\n\t\t\t.minor-indicator {\n\t\t\t\tfont-weight: bold;\n\t\t\t\tcolor: #666;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tpadding: 0px 4px;\n\t\t\t\tbackground: rgba(232, 232, 232, 0.9);\n\t\t\t\tbackdrop-filter: blur(8px);\n\t\t\t\t-webkit-backdrop-filter: blur(8px);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.08);\n\t\t\t\tborder-radius: 4px;\n\t\t\t\tmargin-right: 4px;\n\t\t\t}\n\n\t\t\tbody.dark-mode .minor-indicator {\n\t\t\t\tcolor: #999;\n\t\t\t\tbackground: rgba(60, 64, 76, 0.9);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t}\n\n\t\t\t.queue-edit-change {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\theight: calc(100% - 2px);\n\t\t\t\tright: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\twidth: 100px;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: right;\n\t\t\t\tpadding-right: 10px;\n\t\t\t\tbackground: linear-gradient(to right, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));\n\t\t\t}\n\n\t\t\t.queue-edit-current {\n\t\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.12), rgba(118, 75, 162, 0.08)) !important;\n\t\t\t\tborder-left: 5px solid #667eea !important;\n\t\t\t\tbox-shadow:\n\t\t\t\t\tinset 0 0 20px rgba(102, 126, 234, 0.1),\n\t\t\t\t\t0 4px 16px rgba(102, 126, 234, 0.2) !important;\n\t\t\t\ttransform: translateX(0) !important;\n\t\t\t}\n\n\t\t\tbody.dark-mode .queue-edit-current {\n\t\t\t\tbackground: linear-gradient(135deg, rgba(143, 163, 255, 0.15), rgba(158, 115, 212, 0.1)) !important;\n\t\t\t\tborder-left: 5px solid #8fa3ff !important;\n\t\t\t\tbox-shadow:\n\t\t\t\t\tinset 0 0 20px rgba(143, 163, 255, 0.15),\n\t\t\t\t\t0 4px 16px rgba(0, 0, 0, 0.5) !important;\n\t\t\t}\n\n\t\t\t.queue-edit:hover .queue-edit-color {\n\t\t\t\twidth: 80px;\n\t\t\t}\n\n\t\t\t.tooltip {\n\t\t\t\tposition: fixed;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\tz-index: 10000;\n\t\t\t\topacity: 0;\n\t\t\t\ttransition: opacity 0.2s ease;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tmax-width: 450px;\n\t\t\t\tmin-width: 250px;\n\t\t\t\tpadding: 10px 14px;\n\t\t\t\tbackground: rgba(44, 62, 80, 0.96);\n\t\t\t\tbackdrop-filter: blur(12px);\n\t\t\t\t-webkit-backdrop-filter: blur(12px);\n\t\t\t\tborder-radius: 10px;\n\t\t\t\tcolor: white;\n\t\t\t\tbox-shadow: 0 4px 16px rgba(0, 0, 0, 0.35);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\twhite-space: normal;\n\t\t\t\tline-height: 1.5;\n\t\t\t\tfont-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;\n\t\t\t\tword-wrap: break-word;\n\t\t\toverflow-wrap: break-word;\n\t\t}\n\n\t\t/* Tooltip Content Styling - Modern Redesign */\n\t\t.tooltip-title {\n\t\t\tfont-weight: 700;\n\t\t\tfont-size: 1em;\n\t\t\tmargin-bottom: 10px;\n\t\t\tborder-bottom: 2px solid rgba(255, 255, 255, 0.25);\n\t\t\tpadding-bottom: 6px;\n\t\t\tword-wrap: break-word;\n\t\t\tletter-spacing: 0.3px;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: 6px;\n\t\t}\n\n\t\t.tooltip-item {\n\t\t\tmargin: 8px 0;\n\t\t\tpadding: 8px 10px;\n\t\t\tbackground: rgba(0, 0, 0, 0.15);\n\t\t\tborder-radius: 6px;\n\t\t\tborder-left: 3px solid rgba(255, 215, 0, 0.5);\n\t\t\tword-wrap: break-word;\n\t\t\toverflow-wrap: break-word;\n\t\t\ttransition: all 0.2s ease;\n\t\t}\n\n\t\t.tooltip-item:hover {\n\t\t\tbackground: rgba(0, 0, 0, 0.25);\n\t\t\tborder-left-color: rgba(255, 215, 0, 0.8);\n\t\t\ttransform: translateX(2px);\n\t\t}\n\n\t\t.tooltip-item-level {\n\t\t\tdisplay: inline-block;\n\t\t\tmin-width: 65px;\n\t\t\tfont-weight: 700;\n\t\t\tcolor: #ffd700;\n\t\t\tword-wrap: break-word;\n\t\t\tbackground: rgba(255, 215, 0, 0.15);\n\t\t\tpadding: 2px 8px;\n\t\t\tborder-radius: 4px;\n\t\t\tfont-size: 0.95em;\n\t\t\tletter-spacing: 0.3px;\n\t\t}\n\n\t\t.tooltip-item-article {\n\t\t\tcolor: #87ceeb;\n\t\t\tword-wrap: break-word;\n\t\t\tfont-weight: 500;\n\t\t}\n\n\t\t.tooltip-item-time {\n\t\t\tcolor: #c0c0c0;\n\t\t\tfont-size: 0.85em;\n\t\t\tword-wrap: break-word;\n\t\t\tfont-weight: 500;\n\t\t\topacity: 0.9;\n\t\t}\n\n\t\t.tooltip-more {\n\t\t\tmargin-top: 10px;\n\t\t\tpadding-top: 8px;\n\t\t\tborder-top: 1px solid rgba(255, 255, 255, 0.15);\n\t\t\tfont-style: italic;\n\t\t\tcolor: #aaa;\n\t\t\tfont-size: 0.9em;\n\t\t\ttext-align: center;\n\t\t}\n\n\t\t\t.context-menu {\n\t\t\t\tposition: fixed;\n\t\t\t\tpadding: 8px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.95);\n\t\t\t\tbackdrop-filter: blur(12px);\n\t\t\t\t-webkit-backdrop-filter: blur(12px);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\t\t\t\tborder-radius: 10px;\n\t\t\t\tz-index: 100;\n\t\t\t\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);\n\t\t\t}\n\n\t\t\t.context-menu div {\n\t\t\t\tpadding: 8px 12px;\n\t\t\t\tmargin: 4px;\n\t\t\t\tuser-select: none;\n\t\t\t\tcursor: pointer;\n\t\t\t\tborder-radius: 6px;\n\t\t\t\ttransition: background 0.2s ease;\n\t\t\t}\n\n\t\t\t.context-menu div:not(#context-ores):hover {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.08);\n\t\t\t}\n\n\t\t\t#context-ores {\n\t\t\t\tcolor: #444;\n\t\t\t\tfont-size: 0.8em;\n\t\t\t}\n\n\t\t\t#context-ores-number {\n\t\t\t\tfont-size: 1.2em;\n\t\t\t\tfont-weight: bold;\n\t\t\t\tfilter: brightness(0.6);\n\t\t\t}\n\n\t\t\t.settings-container {\n\t\t\t\tposition: fixed;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tbackdrop-filter: blur(12px);\n\t\t\t\tbackground: rgba(0, 0, 0, 0.4);\n\t\t\t\tz-index: 10;\n\t\t\t\tanimation: settingsBackdropFadeIn 0.3s ease-out;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-container {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.7);\n\t\t\t}\n\n\t\t\t@keyframes settingsBackdropFadeIn {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\tbackdrop-filter: blur(0px);\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\tbackdrop-filter: blur(12px);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.settings {\n\t\t\t\tdisplay: flex;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.95);\n\t\t\t\tbackdrop-filter: blur(30px);\n\t\t\t\t-webkit-backdrop-filter: blur(30px);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.3);\n\t\t\t\tborder-radius: 20px;\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 20px 60px rgba(0, 0, 0, 0.3),\n\t\t\t\t\t0 0 1px rgba(255, 255, 255, 0.5) inset;\n\t\t\t\toverflow: hidden;\n\t\t\t\tanimation: settingsPanelSlideIn 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);\n\t\t\t\tmax-width: 1100px;\n\t\t\t\twidth: 90vw;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings {\n\t\t\t\tbackground: rgba(30, 33, 42, 0.95);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 20px 60px rgba(0, 0, 0, 0.6),\n\t\t\t\t\t0 0 1px rgba(102, 126, 234, 0.3) inset;\n\t\t\t}\n\n\t\t\t@keyframes settingsPanelSlideIn {\n\t\t\t\tfrom {\n\t\t\t\t\topacity: 0;\n\t\t\t\t\ttransform: scale(0.95) translateY(20px);\n\t\t\t\t}\n\t\t\t\tto {\n\t\t\t\t\topacity: 1;\n\t\t\t\t\ttransform: scale(1) translateY(0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.settings > div {\n\t\t\t\theight: 650px;\n\t\t\t}\n\n\t\t\t.settings-left {\n\t\t\t\twidth: 240px;\n\t\t\t\tborder-right: 1px solid rgba(0, 0, 0, 0.08);\n\t\t\t\tbackground: linear-gradient(180deg, rgba(0, 0, 0, 0.02), rgba(0, 0, 0, 0.05));\n\t\t\t\tpadding: 20px 0;\n\t\t\t\toverflow-y: auto;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-left {\n\t\t\t\tborder-right: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tbackground: linear-gradient(180deg, rgba(255, 255, 255, 0.02), rgba(255, 255, 255, 0.05));\n\t\t\t}\n\n\t\t\t.settings-category {\n\t\t\t\tmargin-bottom: 20px;\n\t\t\t}\n\n\t\t\t.settings-category:last-child {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t.settings-category-header {\n\t\t\t\tpadding: 12px 20px;\n\t\t\t\tfont-size: 0.7em;\n\t\t\t\tfont-weight: 800;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 1.5px;\n\t\t\t\tcolor: #999;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-category-header {\n\t\t\t\tcolor: #666;\n\t\t\t}\n\n\t\t\t.settings-category-header i {\n\t\t\t\tfont-size: 1.1em;\n\t\t\t\topacity: 0.7;\n\t\t\t}\n\n\t\t\t.settings-left-menu-item {\n\t\t\t\tpadding: 12px 20px;\n\t\t\t\tuser-select: none;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\tmargin: 2px 12px;\n\t\t\t\tborder-radius: 10px;\n\t\t\t\tcolor: #444;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\tposition: relative;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 12px;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-left-menu-item {\n\t\t\t\tcolor: #c0c0c0;\n\t\t\t}\n\n\t\t\t.settings-left-menu-item i {\n\t\t\t\twidth: 20px;\n\t\t\t\tfont-size: 1.1em;\n\t\t\t\tcolor: #666;\n\t\t\t\ttransition: color 0.2s ease;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-left-menu-item i {\n\t\t\t\tcolor: #888;\n\t\t\t}\n\n\t\t\t.settings-left-menu-item:hover {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.08);\n\t\t\t\tcolor: #667eea;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-left-menu-item:hover {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.15);\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t}\n\n\t\t\t.settings-left-menu-item:hover i {\n\t\t\t\tcolor: #667eea;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-left-menu-item:hover i {\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t}\n\n\t\t\t.settings-left-menu-item.selected {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.12) !important;\n\t\t\t\tcolor: #667eea !important;\n\t\t\t\tfont-weight: 600;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-left-menu-item.selected {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.2) !important;\n\t\t\t\tcolor: #8fa3ff !important;\n\t\t\t\tbox-shadow: 0 0 20px rgba(102, 126, 234, 0.2);\n\t\t\t}\n\n\t\t\t.settings-left-menu-item.selected i {\n\t\t\t\tcolor: #667eea;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-left-menu-item.selected i {\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t}\n\n\t\t\t.settings-right {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tpadding: 30px 40px;\n\t\t\t\tbackground: rgba(250, 250, 252, 0.5);\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-right {\n\t\t\t\tbackground: rgba(20, 22, 28, 0.5);\n\t\t\t}\n\n\t\t\t.settings-section {\n\t\t\t\tmargin-bottom: 30px;\n\t\t\t\tpadding: 25px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.8);\n\t\t\t\tbackdrop-filter: blur(10px);\n\t\t\t\tborder-radius: 16px;\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.06);\n\t\t\t\tbox-shadow: 0 4px 20px rgba(0, 0, 0, 0.06);\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-section {\n\t\t\t\tbackground: rgba(35, 38, 48, 0.8) !important;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08) !important;\n\t\t\t\tbox-shadow: 0 4px 20px rgba(0, 0, 0, 0.3) !important;\n\t\t\t}\n\n\t\t\t.settings-section-title {\n\t\t\t\tfont-size: 1.4em;\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tcolor: #1a1a1a;\n\t\t\t\tletter-spacing: -0.5px;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-section-title {\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t.settings-section-desc {\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\tmargin-bottom: 20px;\n\t\t\t\tcolor: #666;\n\t\t\t\tline-height: 1.6;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-section-desc {\n\t\t\t\tcolor: #999;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-section a {\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-section a:hover {\n\t\t\t\tcolor: #b0c0ff;\n\t\t\t}\n\n\t\t\t.stats-grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n\t\t\t\tgap: 16px;\n\t\t\t\tmargin-top: 20px;\n\t\t\t}\n\n\t\t\t.stat-card {\n\t\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.08) 0%, rgba(118, 75, 162, 0.08) 100%);\n\t\t\t\tpadding: 20px;\n\t\t\t\tborder-radius: 12px;\n\t\t\t\ttext-align: center;\n\t\t\t\tborder: 2px solid rgba(102, 126, 234, 0.15);\n\t\t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t}\n\n\t\t\tbody.dark-mode .stat-card {\n\t\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.15) 0%, rgba(118, 75, 162, 0.15) 100%);\n\t\t\t\tborder: 2px solid rgba(102, 126, 234, 0.25);\n\t\t\t}\n\n\t\t\t.stat-card:hover {\n\t\t\t\ttransform: translateY(-4px);\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.4);\n\t\t\t\tbox-shadow: 0 8px 24px rgba(102, 126, 234, 0.2);\n\t\t\t}\n\n\t\t\tbody.dark-mode .stat-card:hover {\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.5);\n\t\t\t\tbox-shadow: 0 8px 24px rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\t.stat-value {\n\t\t\t\tfont-size: 2.2em;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tbackground: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n\t\t\t\t-webkit-background-clip: text;\n\t\t\t\t-webkit-text-fill-color: transparent;\n\t\t\t\tbackground-clip: text;\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t}\n\n\t\t\t.stat-label {\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: #555;\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t}\n\n\t\t\tbody.dark-mode .stat-label {\n\t\t\t\tcolor: #aaa;\n\t\t\t}\n\n\t\t\t.stat-sublabel {\n\t\t\t\tfont-size: 0.8em;\n\t\t\t\tcolor: #888;\n\t\t\t\tfont-style: italic;\n\t\t\t}\n\n\t\t\tbody.dark-mode .stat-sublabel {\n\t\t\t\tcolor: #777;\n\t\t\t}\n\n\t\t\t.danger-button {\n\t\t\t\tbackground: linear-gradient(135deg, #ff5252 0%, #f44336 100%) !important;\n\t\t\t\tcolor: white !important;\n\t\t\t\tborder: none;\n\t\t\t\tpadding: 12px 24px;\n\t\t\t\tborder-radius: 10px;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\tbox-shadow: 0 4px 12px rgba(244, 67, 54, 0.3) !important;\n\t\t\t}\n\n\t\t\tdanger-button:hover {\n\t\t\t\ttransform: translateY(-2px);\n\t\t\t\tbox-shadow: 0 6px 16px rgba(244, 67, 54, 0.4) !important;\n\t\t\t}\n\n\t\t\tdanger-button:active {\n\t\t\t\ttransform: translateY(0);\n\t\t\t}\n\n\t\t\t.settings-compact-grid {\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: repeat(2, 1fr);\n\t\t\t\tgap: 18px;\n\t\t\t\tmargin-bottom: 25px;\n\t\t\t}\n\n\t\t\t.settings-section.compact {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t\tpadding: 18px;\n\t\t\t}\n\n\t\t\t.settings-section.compact .settings-section-title {\n\t\t\t\tfont-size: 1.05em;\n\t\t\t\tmargin-bottom: 5px;\n\t\t\t}\n\n\t\t\t.settings-section.compact .settings-section-desc {\n\t\t\t\tfont-size: 0.85em;\n\t\t\t\tmargin-bottom: 12px;\n\t\t\t}\n\n\t\t\t.settings-toggles-section {\n\t\t\t\tmargin-bottom: 30px;\n\t\t\t\tpadding: 20px;\n\t\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.08) 0%, rgba(118, 75, 162, 0.08) 100%);\n\t\t\t\tbackdrop-filter: blur(10px);\n\t\t\t\tborder-radius: 16px;\n\t\t\t\tborder: 1px solid rgba(102, 126, 234, 0.2);\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-toggles-section {\n\t\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.15) 0%, rgba(118, 75, 162, 0.15) 100%);\n\t\t\t\tborder: 1px solid rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\t.settings-section-header {\n\t\t\t\tfont-size: 1.2em;\n\t\t\t\tfont-weight: 700;\n\t\t\t\tmargin-bottom: 15px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t\tcolor: #333;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-section-header {\n\t\t\t\tcolor: #e8e8e8;\n\t\t\t}\n\n\t\t\t.settings-section-header-icon {\n\t\t\t\tfont-size: 1.3em;\n\t\t\t\tfilter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2));\n\t\t\t}\n\n\t\t\t.settings-section.inline {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tpadding: 14px 16px;\n\t\t\t\tmargin-bottom: 12px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.6);\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-section.inline {\n\t\t\t\tbackground: rgba(35, 38, 48, 0.6) !important;\n\t\t\t}\n\n\t\t\t.settings-section.inline:last-child {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t.settings-section.inline .settings-section-content {\n\t\t\t\tflex: 1;\n\t\t\t}\n\n\t\t\t.settings-section.inline .settings-section-title {\n\t\t\t\tfont-size: 1em;\n\t\t\t\tmargin-bottom: 3px;\n\t\t\t}\n\n\t\t\t.settings-section.inline .settings-section-desc {\n\t\t\t\tfont-size: 0.82em;\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t#settings-general-button:nth-child(1) {\n\t\t\t\tborder-top-left-radius: 8px;\n\t\t\t}\n\n\t\t\t#namespace-container {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t}\n\n\t\t\t#namespace-container > div {\n\t\t\t\twidth: 200px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t}\n\n\t\t\t/* Custom checkbox styling */\n\t\t\t.ns-checkbox {\n\t\t\t\tappearance: none;\n\t\t\t\t-webkit-appearance: none;\n\t\t\t\twidth: 22px;\n\t\t\t\theight: 22px;\n\t\t\t\tborder: 2px solid rgba(102, 126, 234, 0.4);\n\t\t\t\tborder-radius: 6px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.8);\n\t\t\t\tcursor: pointer;\n\t\t\t\tposition: relative;\n\t\t\t\ttransition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\tbody.dark-mode .ns-checkbox {\n\t\t\t\tbackground: rgba(35, 38, 48, 0.8);\n\t\t\t\tborder: 2px solid rgba(102, 126, 234, 0.5);\n\t\t\t}\n\n\t\t\t.ns-checkbox:hover {\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.7);\n\t\t\t\tbackground: rgba(255, 255, 255, 1);\n\t\t\t\ttransform: scale(1.08);\n\t\t\t}\n\n\t\t\tbody.dark-mode .ns-checkbox:hover {\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.8);\n\t\t\t\tbackground: rgba(35, 38, 48, 1);\n\t\t\t}\n\n\t\t\t.ns-checkbox:checked {\n\t\t\t\tbackground: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.8);\n\t\t\t}\n\n\t\t\t.ns-checkbox:checked::after {\n\t\t\t\tcontent: \'✓\';\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 50%;\n\t\t\t\tleft: 50%;\n\t\t\t\ttransform: translate(-50%, -50%);\n\t\t\t\tcolor: white;\n\t\t\t\tfont-size: 14px;\n\t\t\t\tfont-weight: bold;\n\t\t\t\ttext-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\n\t\t\t}\n\n\t\t\t.ns-checkbox:focus {\n\t\t\t\toutline: none;\n\t\t\t\tbox-shadow: 0 0 0 4px rgba(102, 126, 234, 0.2);\n\t\t\t}\n\n\t\t\t#namespace-container label {\n\t\t\t\tcursor: pointer;\n\t\t\t\tuser-select: none;\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\tcolor: #333;\n\t\t\t\ttransition: color 0.2s;\n\t\t\t}\n\n\t\t\tbody.dark-mode #namespace-container label {\n\t\t\t\tcolor: #d5d5d5;\n\t\t\t}\n\n\t\t\t#namespace-container > div:hover label {\n\t\t\t\tcolor: #667eea;\n\t\t\t}\n\n\t\t\tbody.dark-mode #namespace-container > div:hover label {\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t}\n\n\t\t\t.numeric-input-container {\n\t\t\t\tdisplay: flex;\n\t\t\t}\n\n\t\t\t.settings-toggle {\n\t\t\t\twidth: 60px;\n\t\t\t\theight: 32px;\n\t\t\t\tcursor: pointer;\n\t\t\t\tposition: relative;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.toggle-switch {\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tbackground: rgba(200, 200, 200, 0.6);\n\t\t\t\tborder-radius: 16px;\n\t\t\t\tposition: relative;\n\t\t\t\ttransition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\tbox-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.15);\n\t\t\t\tborder: 2px solid rgba(0, 0, 0, 0.06);\n\t\t\t}\n\n\t\t\t.settings-toggle.active .toggle-switch {\n\t\t\t\tbackground: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 4px 12px rgba(102, 126, 234, 0.4),\n\t\t\t\t\tinset 0 1px 2px rgba(255, 255, 255, 0.2);\n\t\t\t\tborder: 2px solid rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\t.toggle-slider {\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tbackground: white;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 2px;\n\t\t\t\tleft: 2px;\n\t\t\t\ttransition: all 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\tbox-shadow: 0 3px 8px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.15);\n\t\t\t}\n\n\t\t\t.settings-toggle.active .toggle-slider {\n\t\t\t\tleft: 30px;\n\t\t\t\tbox-shadow: 0 4px 10px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.2);\n\t\t\t}\n\n\t\t\t.settings-toggle:hover .toggle-switch {\n\t\t\t\ttransform: scale(1.02);\n\t\t\t}\n\n\t\t\tbody.dark-mode .toggle-switch {\n\t\t\t\tbackground: rgba(60, 63, 75, 0.8);\n\t\t\t\tbox-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.4);\n\t\t\t\tborder: 2px solid rgba(255, 255, 255, 0.08);\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-toggle.active .toggle-switch {\n\t\t\t\tbackground: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n\t\t\t\tbox-shadow:\n\t\t\t\t\t0 4px 12px rgba(102, 126, 234, 0.5),\n\t\t\t\t\tinset 0 1px 2px rgba(255, 255, 255, 0.2);\n\t\t\t\tborder: 2px solid rgba(102, 126, 234, 0.4);\n\t\t\t}\n\n\t\t\t.numeric-input-button {\n\t\t\t\twidth: 35px;\n\t\t\t\theight: 35px;\n\t\t\t\tfont-size: 1.3em;\n\t\t\t\tdisplay: flex !important;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tcursor: pointer;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.6);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\t\t\t\tcolor: #444;\n\t\t\t}\n\n\t\t\tbody.dark-mode .numeric-input-button {\n\t\t\t\tbackground: rgba(50, 54, 66, 0.8);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tcolor: #c0c0c0;\n\t\t\t}\n\n\t\t\t.numeric-input-button:hover {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.1);\n\t\t\t\tborder-color: #667eea;\n\t\t\t\tcolor: #667eea;\n\t\t\t\ttransform: scale(1.05);\n\t\t\t}\n\n\t\t\tbody.dark-mode .numeric-input-button:hover {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.2);\n\t\t\t\tborder-color: #8fa3ff;\n\t\t\t\tcolor: #8fa3ff;\n\t\t\t}\n\n\t\t\t.numeric-input {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.8);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\t\t\t\tcolor: #333;\n\t\t\t\tfont-size: 1.1em;\n\t\t\t\tpadding: 6px 12px;\n\t\t\t\twidth: 100px;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tmargin: 0 5px;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\tbody.dark-mode .numeric-input {\n\t\t\t\tbackground: rgba(50, 54, 66, 0.8);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t.numeric-input:focus {\n\t\t\t\tborder: 1px solid #667eea !important;\n\t\t\t\toutline: none;\n\t\t\t\tbox-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);\n\t\t\t\tbackground: white;\n\t\t\t}\n\n\t\t\tbody.dark-mode .numeric-input:focus {\n\t\t\t\tbackground: rgba(50, 54, 66, 1);\n\t\t\t\tbox-shadow: 0 0 0 3px rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\t/* Style number input arrows/spinners */\n\t\t\tinput[type="number"]::-webkit-inner-spin-button,\n\t\t\tinput[type="number"]::-webkit-outer-spin-button {\n\t\t\t\t-webkit-appearance: none;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\tinput[type="number"] {\n\t\t\t\t-moz-appearance: textfield;\n\t\t\t}\n\n\t\t\t.audio-volume-input {\n\t\t\t\tposition: relative;\n\t\t\t}\n\n\t\t\t/* Custom number input with styled arrows */\n\t\t\t.audio-volume-input-wrapper {\n\t\t\t\tposition: relative;\n\t\t\t\tdisplay: inline-block;\n\t\t\t}\n\n\t\t\t.audio-volume-input-arrows {\n\t\t\t\tposition: absolute;\n\t\t\t\tright: 2px;\n\t\t\t\ttop: 50%;\n\t\t\t\ttransform: translateY(-50%);\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 1px;\n\t\t\t}\n\n\t\t\t.audio-volume-input-arrow {\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 14px;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tcursor: pointer;\n\t\t\t\tbackground: rgba(102, 126, 234, 0.1);\n\t\t\t\tborder-radius: 3px;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\tfont-size: 10px;\n\t\t\t\tcolor: #667eea;\n\t\t\t}\n\n\t\t\tbody.dark-mode .audio-volume-input-arrow {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.15);\n\t\t\t\tcolor: #8898f0;\n\t\t\t}\n\n\t\t\t.audio-volume-input-arrow:hover {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.25);\n\t\t\t\tcolor: #5568d3;\n\t\t\t}\n\n\t\t\tbody.dark-mode .audio-volume-input-arrow:hover {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.3);\n\t\t\t\tcolor: #a0aef5;\n\t\t\t}\n\n\t\t\t.audio-volume-input-arrow:active {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.4);\n\t\t\t\ttransform: scale(0.95);\n\t\t\t}\n\n\t\t\t/* Audio Volume Controls */\n\t\t\t.audio-volume-control {\n\t\t\t\tmargin: 20px 0;\n\t\t\t\tpadding: 20px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.6);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.08);\n\t\t\t\tborder-radius: 12px;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\tbody.dark-mode .audio-volume-control {\n\t\t\t\tbackground: rgba(40, 43, 52, 0.7);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08);\n\t\t\t}\n\n\t\t\t.audio-volume-control:hover {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.8);\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.2);\n\t\t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n\t\t\t}\n\n\t\t\tbody.dark-mode .audio-volume-control:hover {\n\t\t\t\tbackground: rgba(40, 43, 52, 0.9);\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.3);\n\t\t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);\n\t\t\t}\n\n\t\t\t.audio-control-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: flex-start;\n\t\t\t\tmargin-bottom: 16px;\n\t\t\t\tgap: 20px;\n\t\t\t}\n\n\t\t\t.audio-control-info {\n\t\t\t\tflex: 1;\n\t\t\t}\n\n\t\t\t.audio-control-title {\n\t\t\t\tfont-size: 1.05em;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: #1a1a1a;\n\t\t\t\tmargin-bottom: 6px;\n\t\t\t}\n\n\t\t\tbody.dark-mode .audio-control-title {\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t.audio-control-desc {\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tcolor: #666;\n\t\t\t\tline-height: 1.4;\n\t\t\t}\n\n\t\t\tbody.dark-mode .audio-control-desc {\n\t\t\t\tcolor: #999;\n\t\t\t}\n\n\t\t\t.audio-preview-button {\n\t\t\t\tpadding: 10px 18px;\n\t\t\t\tbackground: linear-gradient(135deg, #667eea, #764ba2);\n\t\t\t\tcolor: white;\n\t\t\t\tborder: none;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tcursor: pointer;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\tbox-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\t.audio-preview-button:hover {\n\t\t\t\tbackground: linear-gradient(135deg, #5568d3, #6a3f8f);\n\t\t\t\tbox-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t}\n\n\t\t\t.audio-preview-button:active {\n\t\t\t\ttransform: translateY(0);\n\t\t\t\tbox-shadow: 0 2px 6px rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\t.audio-control-slider-container {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 16px;\n\t\t\t}\n\n\t\t\t.audio-volume-slider {\n\t\t\t\tflex: 1;\n\t\t\t\theight: 6px;\n\t\t\t\tbackground: rgba(0, 0, 0, 0.1);\n\t\t\t\tborder-radius: 3px;\n\t\t\t\toutline: none;\n\t\t\t\t-webkit-appearance: none;\n\t\t\t\tappearance: none;\n\t\t\t}\n\n\t\t\tbody.dark-mode .audio-volume-slider {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.1);\n\t\t\t}\n\n\t\t\t.audio-volume-slider::-webkit-slider-thumb {\n\t\t\t\t-webkit-appearance: none;\n\t\t\t\tappearance: none;\n\t\t\t\twidth: 18px;\n\t\t\t\theight: 18px;\n\t\t\t\tbackground: linear-gradient(135deg, #667eea, #764ba2);\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tcursor: pointer;\n\t\t\t\tbox-shadow: 0 2px 6px rgba(102, 126, 234, 0.3);\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\t.audio-volume-slider::-webkit-slider-thumb:hover {\n\t\t\t\ttransform: scale(1.15);\n\t\t\t\tbox-shadow: 0 3px 10px rgba(102, 126, 234, 0.5);\n\t\t\t}\n\n\t\t\t.audio-volume-slider::-moz-range-thumb {\n\t\t\t\twidth: 18px;\n\t\t\t\theight: 18px;\n\t\t\t\tbackground: linear-gradient(135deg, #667eea, #764ba2);\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tcursor: pointer;\n\t\t\t\tborder: none;\n\t\t\t\tbox-shadow: 0 2px 6px rgba(102, 126, 234, 0.3);\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\t.audio-volume-slider::-moz-range-thumb:hover {\n\t\t\t\ttransform: scale(1.15);\n\t\t\t\tbox-shadow: 0 3px 10px rgba(102, 126, 234, 0.5);\n\t\t\t}\n\n\t\t\t.audio-volume-input {\n\t\t\t\twidth: 70px;\n\t\t\t\tpadding: 8px 12px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.8);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tcolor: #333;\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\ttext-align: center;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\tbody.dark-mode .audio-volume-input {\n\t\t\t\tbackground: rgba(50, 54, 66, 0.8);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t.audio-volume-input:focus {\n\t\t\t\tborder: 1px solid #667eea;\n\t\t\t\toutline: none;\n\t\t\t\tbox-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);\n\t\t\t\tbackground: white;\n\t\t\t}\n\n\t\t\tbody.dark-mode .audio-volume-input:focus {\n\t\t\t\tbackground: rgba(50, 54, 66, 1);\n\t\t\t\tbox-shadow: 0 0 0 3px rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\t/* Sound selector dropdown */\n\t\t\t.audio-sound-selector {\n\t\t\t\tpadding: 8px 12px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.8);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tcolor: #333;\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\twidth: 100%;\n\t\t\t\tmargin-top: 12px;\n\t\t\t}\n\n\t\t\tbody.dark-mode .audio-sound-selector {\n\t\t\t\tbackground: rgba(50, 54, 66, 0.8);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t.audio-sound-selector:hover {\n\t\t\t\tborder-color: #667eea;\n\t\t\t\tbackground: rgba(255, 255, 255, 1);\n\t\t\t}\n\n\t\t\tbody.dark-mode .audio-sound-selector:hover {\n\t\t\t\tbackground: rgba(50, 54, 66, 1);\n\t\t\t\tborder-color: #667eea;\n\t\t\t}\n\n\t\t\t.audio-sound-selector:focus {\n\t\t\t\tborder: 1px solid #667eea;\n\t\t\t\toutline: none;\n\t\t\t\tbox-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);\n\t\t\t}\n\n\t\t\tbody.dark-mode .audio-sound-selector:focus {\n\t\t\t\tbox-shadow: 0 0 0 3px rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\t#sound-volumes-container {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 0;\n\t\t\t}\n\n\t\t\t#sound-volumes-container .audio-volume-control:last-child {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\n\t\t\t.control-container {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.6);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.08);\n\t\t\t\tpadding: 18px 22px;\n\t\t\t\tborder-radius: 12px;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tmargin-bottom: 15px;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\tbody.dark-mode .control-container {\n\t\t\t\tbackground: rgba(40, 43, 52, 0.7);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08);\n\t\t\t}\n\n\t\t\t.control-container:hover {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.8);\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.2);\n\t\t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n\t\t\t}\n\n\t\t\tbody.dark-mode .control-container:hover {\n\t\t\t\tbackground: rgba(40, 43, 52, 0.9);\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.3);\n\t\t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);\n\t\t\t}\n\n\t\t\t.control-container-title {\n\t\t\t\tfont-size: 1.1em;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tcolor: #1a1a1a;\n\t\t\t\tmargin-bottom: 12px;\n\t\t\t}\n\n\t\t\tbody.dark-mode .control-container-title {\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t.control-action {\n\t\t\t\tmargin-top: 12px;\n\t\t\t\tpadding: 0 0 0 16px;\n\t\t\t\tborder-left: 2px solid rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\tbody.dark-mode .control-action {\n\t\t\t\tborder-left-color: rgba(102, 126, 234, 0.5);\n\t\t\t}\n\n\t\t\t.control-action-title {\n\t\t\t\tcolor: #666;\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t\tfont-weight: 500;\n\t\t\t}\n\n\t\t\tbody.dark-mode .control-action-title {\n\t\t\t\tcolor: #999;\n\t\t\t}\n\n\t\t\t.control-action-title span {\n\t\t\t\tmargin-right: 5px;\n\t\t\t}\n\n\t\t\t.control-action-title-left span {\n\t\t\t\twidth: 17px;\n\t\t\t}\n\n\t\t\t.control-action-title-left select {\n\t\t\t\tmargin: 0 5px;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.8);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\t\t\t\tcolor: #333;\n\t\t\t\tpadding: 6px 10px;\n\t\t\t\tborder-radius: 6px;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\tbody.dark-mode .control-action-title-left select {\n\t\t\t\tbackground: rgba(50, 54, 66, 0.8);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t}\n\n\t\t\t.control-action-title-left select:focus {\n\t\t\t\toutline: none;\n\t\t\t\tborder-color: #667eea;\n\t\t\t\tbox-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);\n\t\t\t}\n\n\t\t\tbody.dark-mode .control-action-title-left select:focus {\n\t\t\t\tbox-shadow: 0 0 0 3px rgba(102, 126, 234, 0.3);\n\t\t\t}\n\n\t\t\t.control-keys {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 8px;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t}\n\n\t\t\t.control-keys > div {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.9);\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\t\t\t\twidth: max-content;\n\t\t\t\tpadding: 8px 14px;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tcolor: #444;\n\t\t\t\tfont-weight: 500;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\tbox-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);\n\t\t\t}\n\n\t\t\tbody.dark-mode .control-keys > div {\n\t\t\t\tbackground: rgba(50, 54, 66, 0.9);\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.15);\n\t\t\t\tcolor: #c0c0c0;\n\t\t\t\tbox-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);\n\t\t\t}\n\n\t\t\t.control-keys > div:hover {\n\t\t\t\tbackground: white;\n\t\t\t\tborder-color: #667eea;\n\t\t\t\tbox-shadow: 0 4px 12px rgba(102, 126, 234, 0.15);\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t}\n\n\t\t\tbody.dark-mode .control-keys > div:hover {\n\t\t\t\tbackground: rgba(60, 64, 76, 1);\n\t\t\t\tborder-color: #8fa3ff;\n\t\t\t\tbox-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);\n\t\t\t}\n\t\t\t\tmargin: 5px 5px 5px 0;\n\t\t\t\tuser-select: none;\n\t\t\t\tbox-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\t.control-keys > div:hover {\n\t\t\t\tborder-color: rgba(0, 0, 0, 0.25);\n\t\t\t\tbox-shadow: 0 3px 10px rgba(0, 0, 0, 0.12);\n\t\t\t}\n\n\t\t\t.control-keys .remove {\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\n\t\t\t.key-elem-title {\n\t\t\t\tmargin-right: 10px;\n\t\t\t}\n\n\t\t\t.key-select {\n\t\t\t\tfont-style: italic;\n\t\t\t\tborder: 2px solid #8989ec !important;\n\t\t\t}\n\n\t\t\t.key-duplicate {\n\t\t\t\tborder: 2px solid red !important;\n\t\t\t}\n\n\t\t\t.control-action-title {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.control-action-title-right {\n\t\t\t\tdisplay: flex;\n\t\t\t}\n\n\t\t\t.control-action-title-right span {\n\t\t\t\tfont-size: 1.2em;\n\t\t\t\twidth: 30px;\n\t\t\t\theight: 30px;\n\t\t\t\tmargin-right: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tcursor: pointer;\n\t\t\t\tborder-radius: 5px;\n\t\t\t\ttransition: 0.1s;\n\t\t\t}\n\n\t\t\t.control-action-title-right span:hover {\n\t\t\t\tbackground: #eaeaea;\n\t\t\t}\n\n\t\t\t.add-action-button {\n\t\t\t\twidth: max-content;\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.15);\n\t\t\t\tpadding: 8px 16px;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tbackground: linear-gradient(to bottom, #ffffff, #f5f5f5);\n\t\t\t\tcursor: pointer;\n\t\t\t\tuser-select: none;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tbox-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);\n\t\t\t}\n\n\t\t\t.add-action-button:hover {\n\t\t\t\tborder-color: rgba(0, 0, 0, 0.2);\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t\tbox-shadow: 0 3px 10px rgba(0, 0, 0, 0.12);\n\t\t\t}\n\n\t\t\t.add-action-button:active {\n\t\t\t\ttransform: translateY(0);\n\t\t\t\tbox-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);\n\t\t\t}\n\n\t\t\t.add-action-button:hover {\n\t\t\t\tbackground: linear-gradient(to bottom, #ffffff, #f0f0f0);\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t\tbox-shadow: 0 2px 5px rgba(0, 0, 0, 0.15);\n\t\t\t}\n\n\t\t\t.add-action-button:active {\n\t\t\t\ttransform: translateY(0);\n\t\t\t\tbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n\t\t\t}\n\n\t\t\t.add-action-container {\n\t\t\t\tdisplay: flex;\n\t\t\t}\n\n\t\t\t.cancel-button, .create-button {\n\t\t\t\tmargin-left: 5px;\n\t\t\t}\n\n\t\t\t.control-delete {\n\t\t\t\tcolor: red;\n\t\t\t}\n\n\t\t\t.control-bottom-container {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tmargin-top: 10px;\n\t\t\t}\n\n\t\t\t.new-control-script {\n\t\t\t\tfont-size: 0.9em;\n\t\t\t}\n\n\t\t\t.new-control-script span {\n\t\t\t\tmargin-right: 5px;\n\t\t\t}\n\n\t\t\t.action-parameter {\n\t\t\t\tmargin-left: 26px;\n\t\t\t\tdisplay: inline-block;\n\t\t\t}\n\n\t\t\t.parameter-title {\n\t\t\t\tmargin: 5px 0 2px 0;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t}\n\n\t\t\t.user-input-container {\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 12px;\n\t\t\t\tmargin-top: 18px;\n\t\t\t\tpadding: 16px;\n\t\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.08) 0%, rgba(118, 75, 162, 0.08) 100%);\n\t\t\t\tborder-radius: 12px;\n\t\t\t\tborder: 2px dashed rgba(102, 126, 234, 0.25);\n\t\t\t}\n\n\t\t\tbody.dark-mode .user-input-container {\n\t\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.15) 0%, rgba(118, 75, 162, 0.15) 100%);\n\t\t\t\tborder: 2px dashed rgba(102, 126, 234, 0.35);\n\t\t\t}\n\n\t\t\t.username-input {\n\t\t\t\tflex: 1;\n\t\t\t\tpadding: 10px 16px;\n\t\t\t\tborder: 2px solid rgba(102, 126, 234, 0.3);\n\t\t\t\tborder-radius: 10px;\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\tbackground: rgba(255, 255, 255, 0.9);\n\t\t\t\ttransition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\toutline: none;\n\t\t\t}\n\n\t\t\t.username-input:focus {\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.6);\n\t\t\t\tbox-shadow: 0 0 0 4px rgba(102, 126, 234, 0.15);\n\t\t\t\tbackground: white;\n\t\t\t}\n\n\t\t\tbody.dark-mode .username-input {\n\t\t\t\tbackground: rgba(35, 38, 48, 0.9);\n\t\t\t\tborder: 2px solid rgba(102, 126, 234, 0.4);\n\t\t\t\tcolor: #e8e8e8;\n\t\t\t}\n\n\t\t\tbody.dark-mode .username-input:focus {\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.7);\n\t\t\t\tbox-shadow: 0 0 0 4px rgba(102, 126, 234, 0.2);\n\t\t\t\tbackground: rgba(35, 38, 48, 1);\n\t\t\t}\n\n\t\t\t.add-user-button {\n\t\t\t\tpadding: 10px 24px;\n\t\t\t\tbackground: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n\t\t\t\tcolor: white;\n\t\t\t\tborder: none;\n\t\t\t\tborder-radius: 10px;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tfont-size: 0.95em;\n\t\t\t\tcursor: pointer;\n\t\t\t\ttransition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tbox-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);\n\t\t\t\twhite-space: nowrap;\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.add-user-button:hover {\n\t\t\t\ttransform: translateY(-2px);\n\t\t\t\tbox-shadow: 0 6px 16px rgba(102, 126, 234, 0.4);\n\t\t\t}\n\n\t\t\t.add-user-button:active {\n\t\t\t\ttransform: translateY(0);\n\t\t\t}\n\n\t\t\t.user-container > div {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tpadding: 8px 8px 8px 15px;\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t\tbackground: rgba(0, 0, 0, 0.02);\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\t.user-container > div:hover {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.04);\n\t\t\t\tborder-color: rgba(0, 0, 0, 0.15);\n\t\t\t\ttransform: translateX(2px);\n\t\t\t}\n\n\t\t\t.user-container a {\n\t\t\t\tcolor: black;\n\t\t\t\ttext-decoration: none;\n\t\t\t}\n\n\t\t.queue-edit-user-highlight {\n\t\t\tcolor: #d4a400 !important;\n\t\t\tfont-weight: 600 !important;\n\t\t\tbackground: none !important;\n\t\t\tbackdrop-filter: none !important;\n\t\t\t-webkit-backdrop-filter: none !important;\n\t\t\tborder: none !important;\n\t\t\tpadding: 0 !important;\n\t\t\tborder-radius: 0 !important;\n\t\t\tbox-shadow: none !important;\n\t\t}\n\n\t\t.queue-edit-user-highlight .queue-edit-icon {\n\t\t\tcolor: #d4a400 !important;\n\t\t}\n\n\t\t.queue-edit-user-empty-talk {\n\t\t\tcolor: #d63031 !important;\n\t\t\tfont-weight: 600 !important;\n\t\t\tbackground: none !important;\n\t\t\tbackdrop-filter: none !important;\n\t\t\t-webkit-backdrop-filter: none !important;\n\t\t\tborder: none !important;\n\t\t\tpadding: 0 !important;\n\t\t\tborder-radius: 0 !important;\n\t\t\tbox-shadow: none !important;\n\t\t}\n\n\t\t.queue-edit-user-empty-talk .queue-edit-icon {\n\t\t\tcolor: #d63031 !important;\n\t\t}\n\n\t\t/* Special highlight for edits that mention current user */\n\t\t.queue-edit-mentions-me {\n\t\t\tborder: 2px solid #667eea !important;\n\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.15) 0%, rgba(118, 75, 162, 0.15) 100%) !important;\n\t\t\tbox-shadow: 0 0 20px rgba(102, 126, 234, 0.3), 0 4px 16px rgba(0, 0, 0, 0.1) !important;\n\t\t\tanimation: pulse-mention 2s ease-in-out infinite !important;\n\t\t}\n\n\t\tbody.dark-mode .queue-edit-mentions-me {\n\t\t\tborder: 2px solid #8fa3ff !important;\n\t\t\tbackground: linear-gradient(135deg, rgba(143, 163, 255, 0.2) 0%, rgba(168, 85, 247, 0.2) 100%) !important;\n\t\t\tbox-shadow: 0 0 20px rgba(143, 163, 255, 0.4), 0 4px 16px rgba(0, 0, 0, 0.3) !important;\n\t\t}\n\n\t\t.queue-edit-mentions-me:hover {\n\t\t\tborder-color: #764ba2 !important;\n\t\t\tbox-shadow: 0 0 25px rgba(118, 75, 162, 0.5), 0 6px 20px rgba(0, 0, 0, 0.15) !important;\n\t\t}\n\n\t\tbody.dark-mode .queue-edit-mentions-me:hover {\n\t\t\tborder-color: #a855f7 !important;\n\t\t\tbox-shadow: 0 0 25px rgba(168, 85, 247, 0.6), 0 6px 20px rgba(0, 0, 0, 0.4) !important;\n\t\t}\n\n\t\t@keyframes pulse-mention {\n\t\t\t0%, 100% {\n\t\t\t\ttransform: scale(1);\n\t\t\t\tbox-shadow: 0 0 20px rgba(102, 126, 234, 0.3), 0 4px 16px rgba(0, 0, 0, 0.1);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\ttransform: scale(1.01);\n\t\t\t\tbox-shadow: 0 0 30px rgba(102, 126, 234, 0.5), 0 6px 20px rgba(0, 0, 0, 0.15);\n\t\t\t}\n\t\t}\n\n\t\tbody.dark-mode @keyframes pulse-mention {\n\t\t\t0%, 100% {\n\t\t\t\tbox-shadow: 0 0 20px rgba(143, 163, 255, 0.4), 0 4px 16px rgba(0, 0, 0, 0.3);\n\t\t\t}\n\t\t\t50% {\n\t\t\t\tbox-shadow: 0 0 30px rgba(143, 163, 255, 0.6), 0 6px 20px rgba(0, 0, 0, 0.4);\n\t\t\t}\n\t\t}\n\n\t\t#progress-bar-container {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: calc(100% - 120px);\n\t\t\t\theight: 40px;\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: flex-end;\n\t\t\t\talign-items: center;\n\t\t\t\twidth: 100%;\n\t\t\t\tpadding: 0px 20px;\n\t\t\t}\n\n\t\t\t.progress-bar {\n\t\t\t\tborder-radius: 16px;\n\t\t\t\twidth: 180px;\n\t\t\t\theight: 32px;\n\t\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.1), rgba(118, 75, 162, 0.1));\n\t\t\t\tbackdrop-filter: blur(12px);\n\t\t\t\t-webkit-backdrop-filter: blur(12px);\n\t\t\t\tfont-size: 0.85em;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tposition: relative;\n\t\t\t\tmargin-left: 10px;\n\t\t\t\topacity: 1;\n\t\t\t\ttransition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\toverflow: hidden;\n\t\t\t\tborder: 1px solid rgba(102, 126, 234, 0.2);\n\t\t\t\tbox-shadow: 0 4px 16px rgba(0, 0, 0, 0.15), 0 2px 4px rgba(0, 0, 0, 0.1);\n\t\t\t}\n\n\t\t\t.progress-bar-overlay {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\tborder-radius: 16px;\n\t\t\t\twidth: 0px;\n\t\t\t\ttransition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\theight: 100%;\n\t\t\t\tbackground: linear-gradient(90deg,\n\t\t\t\t\trgba(102, 126, 234, 0.4),\n\t\t\t\t\trgba(118, 75, 162, 0.4));\n\t\t\t\tbox-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.2);\n\t\t\t}\n\n\t\t\t.progress-bar-text {\n\t\t\t\tposition: relative;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\tpadding: 0 12px;\n\t\t\t\tmax-width: 100%;\n\t\t\t\tcolor: #ffffff;\n\t\t\t\ttext-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);\n\t\t\t}\n\n\t\t\t.changelog {\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tline-height: 1.6em;\n\t\t\t}\n\n\t\t\t.settings-appearance-box {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\twidth: 160px;\n\t\t\t\theight: 70px;\n\t\t\t\tjustify-content: center;\n\t\t\t\talign-items: center;\n\t\t\t\tborder-radius: 12px;\n\t\t\t\tmargin: 10px 10px 0 0;\n\t\t\t\tcursor: pointer;\n\t\t\t\tuser-select: none;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\tfont-weight: 600;\n\t\t\t\tfont-size: 1em;\n\t\t\t\tborder: 2px solid rgba(0, 0, 0, 0.08);\n\t\t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-appearance-box {\n\t\t\t\tborder: 2px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n\t\t\t}\n\n\t\t\t.settings-appearance-box:hover {\n\t\t\t\ttransform: translateY(-3px);\n\t\t\t\tbox-shadow: 0 8px 20px rgba(0, 0, 0, 0.12);\n\t\t\t\tborder-color: #667eea;\n\t\t\t}\n\n\t\t\tbody.dark-mode .settings-appearance-box:hover {\n\t\t\t\tbox-shadow: 0 8px 20px rgba(0, 0, 0, 0.5);\n\t\t\t\tborder-color: #8fa3ff;\n\t\t\t}\n\n\t\t\t#box-light {\n\t\t\t\tbackground: linear-gradient(135deg, #ffffff, #f5f5f5);\n\t\t\t\tcolor: #333 !important;\n\t\t\t}\n\t\t\t#box-light > div {\n\t\t\t\tcolor: #333 !important;\n\t\t\t}\n\n\t\t\t#box-dark {\n\t\t\t\tbackground: linear-gradient(135deg, #2a2d3a, #1f2229);\n\t\t\t\tcolor: white;\n\t\t\t}\n\n\t\t\t.add-action-button {\n\t\t\t\twidth: max-content;\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.15);\n\t\t\t\tpadding: 8px 16px;\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tbackground: linear-gradient(to bottom, #ffffff, #f5f5f5);\n\t\t\t\tcursor: pointer;\n\t\t\t\tuser-select: none;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\tfont-weight: 500;\n\t\t\t\tbox-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);\n\t\t\t}\n\n\t\t\tbody.dark-mode .add-action-button {\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.15);\n\t\t\t\tbackground: linear-gradient(to bottom, #3a3d4a, #2f323e);\n\t\t\t\tcolor: #e0e0e0;\n\t\t\t\tbox-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);\n\t\t\t}\n\n\t\t\t.add-action-button:hover {\n\t\t\t\tborder-color: rgba(0, 0, 0, 0.2);\n\t\t\t\ttransform: translateY(-1px);\n\t\t\t\tbox-shadow: 0 3px 10px rgba(0, 0, 0, 0.12);\n\t\t\t\tbackground: linear-gradient(to bottom, #ffffff, #f0f0f0);\n\t\t\t}\n\n\t\t\tbody.dark-mode .add-action-button:hover {\n\t\t\t\tborder-color: rgba(102, 126, 234, 0.5);\n\t\t\t\tbox-shadow: 0 3px 10px rgba(0, 0, 0, 0.5);\n\t\t\t\tbackground: linear-gradient(to bottom, #4a4d5a, #3f424e);\n\t\t\t}\n\n\t\t\t.add-action-button:active {\n\t\t\t\ttransform: translateY(0);\n\t\t\t\tbox-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);\n\t\t\t}\n\n\t\t\t.control-action-title-right span:hover {\n\t\t\t\tbackground: #eaeaea;\n\t\t\t}\n\n\t\t\tbody.dark-mode .control-action-title-right span:hover {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.1);\n\t\t\t}\n\n\t\t\t.user-container > div {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tborder: 1px solid rgba(0, 0, 0, 0.1);\n\t\t\t\tborder-radius: 8px;\n\t\t\t\tpadding: 8px 8px 8px 15px;\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t\tbackground: rgba(0, 0, 0, 0.02);\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\tbody.dark-mode .user-container > div {\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1);\n\t\t\t\tbackground: rgba(255, 255, 255, 0.03);\n\t\t\t}\n\n\t\t\t.user-container > div:hover {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.04);\n\t\t\t\tborder-color: rgba(0, 0, 0, 0.15);\n\t\t\t\ttransform: translateX(2px);\n\t\t\t}\n\n\t\t\tbody.dark-mode .user-container > div:hover {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.06);\n\t\t\t\tborder-color: rgba(255, 255, 255, 0.15);\n\t\t\t}\n\n\t\t\t.user-container a {\n\t\t\t\tcolor: black;\n\t\t\t\ttext-decoration: none;\n\t\t\t}\n\n\t\t\tbody.dark-mode .user-container a {\n\t\t\t\tcolor: #c0c0c0;\n\t\t\t}\n\n\t\t\t::-webkit-scrollbar {\n\t\t\t\twidth: 10px;\n\t\t\t}\n\n\t\t\t::-webkit-scrollbar-track {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.03);\n\t\t\t\tborder-radius: 10px;\n\t\t\t}\n\n\t\t\tbody.dark-mode ::-webkit-scrollbar-track {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.03);\n\t\t\t}\n\n\t\t\t::-webkit-scrollbar-thumb {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.15);\n\t\t\t\tborder-radius: 10px;\n\t\t\t\ttransition: all 0.2s ease;\n\t\t\t}\n\n\t\t\tbody.dark-mode ::-webkit-scrollbar-thumb {\n\t\t\t\tbackground: rgba(255, 255, 255, 0.2);\n\t\t\t}\n\n\t\t\t::-webkit-scrollbar-thumb:hover {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.4);\n\t\t\t}\n\n\t\t\tbody.dark-mode ::-webkit-scrollbar-thumb:hover {\n\t\t\t\tbackground: rgba(102, 126, 234, 0.6);\n\t\t\t}\n\n\t\t\t.settings-right::-webkit-scrollbar-track {\n\t\t\t\tbackground: transparent;\n\t\t\t}\n\t\t',"theme-dark":"\n\t\t\tbody {\n\t\t\t\tbackground: #22262f;\n\t\t\t}\n\n\t\t\t*, .about-link {\n\t\t\t\tcolor: #f1f5ff;\n\t\t\t}\n\n\t\t\tbutton {\n\t\t\t\tbackground: rgba(74, 125, 204, 0.95) !important;\n\t\t\t\tbackdrop-filter: blur(8px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(8px) !important;\n\t\t\t\tborder: 1px solid rgba(74, 125, 204, 0.3) !important;\n\t\t\t\tbox-shadow: 0 2px 8px rgba(74, 125, 204, 0.3) !important;\n\t\t\t}\n\n\t\t\tbutton:hover {\n\t\t\t\tbackground: rgba(91, 154, 255, 0.95) !important;\n\t\t\t\tbox-shadow: 0 4px 12px rgba(91, 154, 255, 0.4) !important;\n\t\t\t}\n\n\t\t\t.queue-edit-current, .progress-bar, .queue-edit-tag {\n\t\t\t\tbackground: rgba(41, 47, 60, 0.95) !important;\n\t\t\t\tbackdrop-filter: blur(8px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(8px) !important;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.06) !important;\n\t\t\t}\n\n\t\t\t.queue-edit-tag-minor {\n\t\t\t\tbackground: rgba(31, 36, 48, 0.95) !important;\n\t\t\t\tbackdrop-filter: blur(8px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(8px) !important;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08) !important;\n\t\t\t\tcolor: #a8b0c0 !important;\n\t\t\t}\n\n\t\t\t.minor-indicator {\n\t\t\t\tbackground: rgba(54, 62, 81, 0.9) !important;\n\t\t\t\tbackdrop-filter: blur(8px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(8px) !important;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08) !important;\n\t\t\t\tcolor: #a8b0c0 !important;\n\t\t\t}\n\n\t\t\t.queue-edit-content {\n\t\t\t\tborder-bottom: 2px solid #363e51 !important;\n\t\t\t}\n\n\t\t\t#queue {\n\t\t\t\tborder-right: 2px solid #363e51 !important;\n\t\t\t}\n\n\t\t\t#right-details {\n\t\t\t\tborder-left: 2px solid #363e51 !important;\n\t\t\t}\n\n\t\t\t#bottom-tools {\n\t\t\t\tborder-top: 2px solid #363e51 !important;\n\t\t\t}\n\n\t\t\t#bottom-tools-stats {\n\t\t\t\tcolor: #aaa !important;\n\t\t\t}\n\n\t\t\t#bottom-tools-stats .bottom-stat-value {\n\t\t\t\tcolor: #e0e0e0 !important;\n\t\t\t}\n\n\t\t\t.toast-notification {\n\t\t\t\tbackground: rgba(211, 47, 47, 0.96) !important;\n\t\t\t\tbackdrop-filter: blur(12px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(12px) !important;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.15) !important;\n\t\t\t\tbox-shadow: 0 6px 20px rgba(211, 47, 47, 0.4) !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-overlay {\n\t\t\t\tbackground: rgba(0, 0, 0, 0.7) !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal {\n\t\t\t\tbackground: rgba(41, 47, 60, 0.98) !important;\n\t\t\t\tbackdrop-filter: blur(20px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(20px) !important;\n\t\t\t\tbox-shadow: 0 12px 48px rgba(0, 0, 0, 0.7) !important;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.1) !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-header {\n\t\t\t\tborder-bottom: 1px solid #363e51 !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-title {\n\t\t\t\tcolor: #f1f5ff !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-body {\n\t\t\t\tcolor: #bbb !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-username {\n\t\t\t\tcolor: #5b9aff !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-footer {\n\t\t\t\tborder-top: 1px solid #363e51 !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-no {\n\t\t\t\tbackground: #363e51 !important;\n\t\t\t\tcolor: #f1f5ff !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-no:hover {\n\t\t\t\tbackground: #4a5468 !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-yes {\n\t\t\t\tbackground: #4a7dcc !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-yes:hover {\n\t\t\t\tbackground: #5b9aff !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-uaa {\n\t\t\t\tbackground: #c13030 !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-uaa:hover {\n\t\t\t\tbackground: #d94444 !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-reason {\n\t\t\t\tbackground: #4a7dcc !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-reason:hover {\n\t\t\t\tbackground: #5b9aff !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-cancel {\n\t\t\t\tbackground: #363e51 !important;\n\t\t\t\tcolor: #f1f5ff !important;\n\t\t\t}\n\n\t\t\t.confirmation-modal-button-cancel:hover {\n\t\t\t\tbackground: #4a5468 !important;\n\t\t\t}\n\n\t\t\t#user-contribs-top, #page-history-top {\n\t\t\t\tborder-bottom: 2px solid #363e51 !important;\n\t\t\t}\n\n\t\t\t#page-history {\n\t\t\t\tborder-top: 2px solid #363e51 !important;\n\t\t\t}\n\n\t\t\t/* Legacy selectors for compatibility */\n\t\t\t.settings-left-menu-item:hover, .settings-left-menu-item.selected,\n\t\t\t.context-menu div:not(#context-ores):hover {\n\t\t\t\tbackground: #292f3c !important;\n\t\t\t}\n\n\t\t\t.numeric-input-button:hover {\n\t\t\t\tbackground: #2e3442 !important;\n\t\t\t}\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08) !important;\n\t\t\t\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.4) !important;\n\t\t\t}\n\n\t\t\t.context-menu {\n\t\t\t\tbackground: rgba(41, 47, 60, 0.95) !important;\n\t\t\t\tbackdrop-filter: blur(12px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(12px) !important;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08) !important;\n\t\t\t\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.4) !important;\n\t\t\t}\n\n\t\t\t.settings {\n\t\t\t\tbackground: rgba(41, 47, 60, 0.95) !important;\n\t\t\t\tbackdrop-filter: blur(12px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(12px) !important;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08) !important;\n\t\t\t\tbox-shadow: 0 8px 32px rgba(0, 0, 0, 0.4) !important;\n\t\t\t}\n\n\t\t\t#notifications-panel {\n\t\t\t\tbackground: rgba(41, 47, 60, 0.95) !important;\n\t\t\t\tbackdrop-filter: blur(12px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(12px) !important;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08) !important;\n\t\t\t\tbox-shadow: 0 8px 32px rgba(0, 0, 0, 0.4) !important;\n\t\t\t}\n\n\t\t\tselect, input[type=text], .bottom-subcontent-button {\n\t\t\t\tbackground: rgba(46, 52, 66, 0.95) !important;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08) !important;\n\t\t\t\tcolor: #e0e0e0 !important;\n\t\t\t\tborder-radius: 8px !important;\n\t\t\t}\n\n\t\t\tselect:hover, input[type=text]:focus, .bottom-subcontent-button:hover {\n\t\t\t\tborder-color: rgba(91, 154, 255, 0.4) !important;\n\t\t\t\tbackground: rgba(46, 52, 66, 1) !important;\n\t\t\t}\n\n\t\t\t.queue-edit-change {\n\t\t\t\tbackground: linear-gradient(to right, rgba(34, 38, 47, 0), rgba(34, 38, 47, 1)) !important;\n\t\t\t}\n\n\t\t\t#middle-top, #queue-top, #right-top {\n\t\t\t\tbox-shadow: none !important;\n\t\t\t\tborder-bottom: 2px solid #363e51;\n\t\t\t}\n\n\t\t\t.queue-edit:not(.queue-edit-current) {\n\t\t\t\tanimation: fadeindark 0.5s linear 0s 1 !important;\n\t\t\t}\n\n\t\t\t@keyframes fadeindark {\n\t\t\t\tfrom {\n\t\t\t\t\tbackground: #363e51;\n\t\t\t\t}\n\n\t\t\t\tto {\n\t\t\t\t\tbackground: transparent;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.settings, .context-menu, .control-keys > div, .add-action-button, .control-container,\n\t\t\t.user-container > div {\n\t\t\t\tbackground: #22262f;\n\t\t\t\tborder: 2px solid #363e51;\n\t\t\t}\n\n\t\t\t.settings-left {\n\t\t\t\tborder-right: 2px solid #363e51;\n\t\t\t}\n\n\t\t\t.settings-section {\n\t\t\t\tbackground: rgba(35, 38, 48, 0.8) !important;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08) !important;\n\t\t\t\tbox-shadow: 0 4px 20px rgba(0, 0, 0, 0.3) !important;\n\t\t\t}\n\n\t\t\t.settings-section-title {\n\t\t\t\tcolor: #e0e0e0 !important;\n\t\t\t}\n\n\t\t\t.settings-section-desc {\n\t\t\t\tcolor: #999 !important;\n\t\t\t}\n\n\t\t\t.settings-section a {\n\t\t\t\tcolor: #8fa3ff !important;\n\t\t\t}\n\n\t\t\t.settings-section a:hover {\n\t\t\t\tcolor: #b0c0ff !important;\n\t\t\t}\n\n\t\t\t.settings-right {\n\t\t\t\tbackground: rgba(20, 22, 28, 0.5) !important;\n\t\t\t}\n\n\t\t\t#notifications-panel {\n\t\t\t\tbackground: rgba(34, 38, 47, 0.95) !important;\n\t\t\t\tbackdrop-filter: blur(12px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(12px) !important;\n\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.08) !important;\n\t\t\t\tbox-shadow: 0 8px 32px rgba(0, 0, 0, 0.4) !important;\n\t\t\t}\n\n\t\t\t#notifications-header {\n\t\t\t\tborder-bottom: 1px solid #363e51 !important;\n\t\t\t}\n\n\t\t\t.notification-item {\n\t\t\t\tborder-bottom: 1px solid #363e51 !important;\n\t\t\t}\n\n\t\t\t.notification-item:hover {\n\t\t\t\tbackground: #292f3c !important;\n\t\t\t}\n\n\t\t\t.notification-item.unread {\n\t\t\t\tbackground: #2a3a4a !important;\n\t\t\t\tborder-left-color: #5588cc !important;\n\t\t\t}\n\n\t\t\t.notification-subtitle {\n\t\t\t\tcolor: #aaa !important;\n\t\t\t}\n\n\t\t\t.notification-time {\n\t\t\t\tcolor: #888 !important;\n\t\t\t}\n\n\t\t\t.notification-type {\n\t\t\t\tcolor: #999 !important;\n\t\t\t}\n\n\t\t\t#page-metadata {\n\t\t\t\tcolor: #999 !important;\n\t\t\t}\n\n\t\t\t#mark-all-read {\n\t\t\t\tcolor: #6ba3d8 !important;\n\t\t\t}\n\n\t\t\t.queue-edit-user-highlight {\n\t\t\t\tcolor: #f4c430 !important;\n\t\t\t\tfont-weight: 600 !important;\n\t\t\t\tbackground: none !important;\n\t\t\t\tbackdrop-filter: none !important;\n\t\t\t\t-webkit-backdrop-filter: none !important;\n\t\t\t\tborder: none !important;\n\t\t\t\tpadding: 0 !important;\n\t\t\t\tborder-radius: 0 !important;\n\t\t\t\tbox-shadow: none !important;\n\t\t\t}\n\n\t\t\t.queue-edit-user-empty-talk {\n\t\t\t\tcolor: #ff6b6b !important;\n\t\t\t\tfont-weight: 600 !important;\n\t\t\t\tbackground: none !important;\n\t\t\t\tbackdrop-filter: none !important;\n\t\t\t\t-webkit-backdrop-filter: none !important;\n\t\t\t\tborder: none !important;\n\t\t\t\tpadding: 0 !important;\n\t\t\t\tborder-radius: 0 !important;\n\t\t\t\tbox-shadow: none !important;\n\t\t\t}\n\n\t\t\t.toggle-switch {\n\t\t\t\tbackground: #363e51 !important;\n\t\t\t}\n\n\t\t\t.settings-toggle.active .toggle-switch {\n\t\t\t\tbackground: #4a7dcc !important;\n\t\t\t}\n\n\t\t\t.toggle-slider {\n\t\t\t\tbackground: #f1f5ff !important;\n\t\t\t}\n\n\t\t\t#block-count-indicator {\n\t\t\t\tbackground: #22262f !important;\n\t\t\t\tborder-color: #ff6666 !important;\n\t\t\t}\n\n\t\t\t::-webkit-scrollbar {\n\t\t\t\tbackground: #22262f;\n\t\t\t\twidth: 10px;\n\t\t\t}\n\n\t\t\t::-webkit-scrollbar-track {\n\t\t\t\tbackground: #1a1e27;\n\t\t\t\tborder-radius: 10px;\n\t\t\t}\n\n\t\t\t::-webkit-scrollbar-thumb {\n\t\t\t\tbackground: #3a4052;\n\t\t\t\tborder-radius: 10px;\n\t\t\t\ttransition: background 0.2s;\n\t\t\t}\n\n\t\t\t::-webkit-scrollbar-thumb:hover {\n\t\t\t\tbackground: #4a5468;\n\t\t\t}\n\n\t\t\t.queue-edit-current {\n\t\t\t\tbackground: #2a3444 !important;\n\t\t\t\tborder-left: 4px solid #5b9aff !important;\n\t\t\t\tbox-shadow: inset 0 0 10px rgba(91, 154, 255, 0.15) !important;\n\t\t\t}\n\n\t\t\t#middle-top, #right-top {\n\t\t\t\tbackground: rgba(41, 47, 60, 0.98) !important;\n\t\t\t\tbackdrop-filter: blur(8px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(8px) !important;\n\t\t\t\tborder-bottom: 2px solid #363e51 !important;\n\t\t\t}\n\n\t\t\t#queue-top {\n\t\t\t\tbackground: rgba(41, 47, 60, 0.98) !important;\n\t\t\t\tbackdrop-filter: blur(8px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(8px) !important;\n\t\t\t}\n\n\t\t\t#bottom-tools {\n\t\t\t\tbackground: rgba(41, 47, 60, 0.98) !important;\n\t\t\t\tbackdrop-filter: blur(8px) !important;\n\t\t\t\t-webkit-backdrop-filter: blur(8px) !important;\n\t\t\t}\n\n\t\t\t#middle-top a, #right-top a {\n\t\t\t\tcolor: #6ba3d8 !important;\n\t\t\t}\n\n\t\t\t#middle-top a:hover, #right-top a:hover {\n\t\t\t\tcolor: #89b8e8 !important;\n\t\t\t}\n\n\t\t\t#middle-top .fa, #right-top .fa {\n\t\t\t\tcolor: #aaa !important;\n\t\t\t}\n\n\t\t\t/* Warning/Notice boxes - dark mode compatible */\n\t\t\t.warning-box, .notice-box {\n\t\t\t\tbackground: rgba(139, 92, 0, 0.15) !important;\n\t\t\t\tborder-left-color: #c5a000 !important;\n\t\t\t\tcolor: #f0d48a !important;\n\t\t\t}\n\n\t\t\t.error-box {\n\t\t\t\tbackground: rgba(139, 0, 0, 0.15) !important;\n\t\t\t\tborder-left-color: #dc3545 !important;\n\t\t\t\tcolor: #ffb3b3 !important;\n\t\t\t}\n\n\t\t\t/* Older edit notice */\n\t\t\t#old-edit-notice {\n\t\t\t\tbackground: rgba(139, 92, 0, 0.15) !important;\n\t\t\t\tborder-left-color: #c5a000 !important;\n\t\t\t\tcolor: #f0d48a !important;\n\t\t\t}\n\n\t\t\t#old-edit-notice a {\n\t\t\t\tcolor: #a3c5ff !important;\n\t\t\t}\n\n\t\t\t/* Code blocks in light backgrounds */\n\t\t\tcode {\n\t\t\t\tbackground: rgba(70, 80, 100, 0.5) !important;\n\t\t\t\tcolor: #e0e0e0 !important;\n\t\t\t}\n\t\t"},r={head:'\n\t\t\t<meta name="viewport" content="width=device-width, initial-scale=1.0">\n\t\t\t<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css">\n\t\t',initial:`\n\t\t\t<div id="container">\n\t\t\t\t<canvas id="dots-canvas"></canvas>\n\t\t\t\t<div class="sound-toggle" id="sound-toggle" title="Toggle sound"></div>\n\t\t\t\t<div id="welcome-container">\n\t\t\t\t\t<div class="shield-container">\n\t\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t\t<div class="glow-ring"></div>\n\t\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t\t<div class="sparkle"></div>\n\t\t\t\t\t\t<div class="shield-icon">🛡️</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h1>Welcome to WikiShield</h1>\n\t\t\t\t\t<div class="about-links">\n\t\t\t\t\t\t<a href="https://en.wikipedia.org/wiki/Wikipedia:WikiShield" target="_blank" class="about-link">About</a>\n\t\t\t\t\t\t<a href="https://en.wikipedia.org/wiki/Wikipedia talk:WikiShield" target="_blank" class="about-link">Discuss</a>\n\t\t\t\t\t\t<span class="about-link">v${n.version}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div id="rollback-needed" style="display: none;">\n\t\t\t\t\t\t<p><span class="fa fa-exclamation-triangle"></span> You must have rollback or admin rights to use this script.</p>\n\t\t\t\t\t\t<p>You can apply for rollback rights <a href="https://en.wikipedia.org/wiki/WP:PERM/R" target="_blank">here</a>.</p>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button id="start-button">\n\t\t\t\t\t\t<span class="fa fa-play"></span> Start WikiShield\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,main:'\n\t\t\t<div id="container">\n\t\t\t\t<div id="queue">\n\t\t\t\t\t<div id="queue-top">\n\t\t\t\t\t\t<div id="queue-top-left">\n\t\t\t\t\t\t\t<span id="queue-top-title">Queue</span>\n\t\t\t\t\t\t\t<span id="queue-top-items">0 items</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div id="queue-top-right">\n\t\t\t\t\t\t\t<span class="fa fa-bell" id="notifications-icon" data-tooltip="Notifications" style="position: relative;">\n\t\t\t\t\t\t\t\t<span id="notification-count" style="display: none; position: absolute; top: -5px; right: -5px; background: red; color: white; border-radius: 50%; width: 16px; height: 16px; font-size: 10px; text-align: center; line-height: 16px; font-family: sans-serif;"></span>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span class="fa fa-trash" id="delete-queue" data-tooltip="Clear queue"></span>\n\t\t\t\t\t\t\t<span class="fa fa-gear" id="open-settings" data-tooltip="Open settings"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div id="queue-items"></div>\n\t\t\t\t\t<div class="width-adjust" id="queue-width-adjust"></div>\n\t\t\t\t</div>\n\t\t\t\t<div id="notifications-panel">\n\t\t\t\t\t<div id="notifications-header">\n\t\t\t\t\t\t<span>Notifications</span>\n\t\t\t\t\t\t<span id="mark-all-read" style="font-size: 0.85em; font-weight: normal; cursor: pointer; color: #0645ad;">Mark all as read</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div id="notifications-list"></div>\n\t\t\t\t</div>\n\t\t\t\t<div id="right-container">\n\t\t\t\t\t<div id="middle-top"></div>\n\t\t\t\t\t<div id="right-top"></div>\n\t\t\t\t\t<div id="right-content">\n\t\t\t\t\t\t<div id="main-container">\n\t\t\t\t\t\t\t<div id="diff-container"></div>\n\t\t\t\t\t\t\t<div id="progress-bar-container"></div>\n\t\t\t\t\t\t\t<div id="bottom-tools">\n\t\t\t\t\t\t\t\t<div id="bottom-tools-left">\n\t\t\t\t\t\t\t\t\t<div class="bottom-tool-item" data-menu="revert">\n\t\t\t\t\t\t\t\t\t\t<div class="bottom-tool-trigger">\n\t\t\t\t\t\t\t\t\t\t\t<i class="fas fa-undo"></i>\n\t\t\t\t\t\t\t\t\t\t\t<span>Revert & Warn</span>\n\t\t\t\t\t\t\t\t\t\t\t<i class="fas fa-chevron-up bottom-tool-chevron"></i>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div class="bottom-tool-item" data-menu="warn">\n\t\t\t\t\t\t\t\t\t\t<div class="bottom-tool-trigger">\n\t\t\t\t\t\t\t\t\t\t\t<i class="fas fa-exclamation-triangle"></i>\n\t\t\t\t\t\t\t\t\t\t\t<span>Warn</span>\n\t\t\t\t\t\t\t\t\t\t\t<i class="fas fa-chevron-up bottom-tool-chevron"></i>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div class="bottom-tool-item" data-menu="user">\n\t\t\t\t\t\t\t\t\t\t<div class="bottom-tool-trigger">\n\t\t\t\t\t\t\t\t\t\t\t<i class="fas fa-user"></i>\n\t\t\t\t\t\t\t\t\t\t\t<span>User</span>\n\t\t\t\t\t\t\t\t\t\t\t<i class="fas fa-chevron-up bottom-tool-chevron"></i>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div class="bottom-tool-item" data-menu="page">\n\t\t\t\t\t\t\t\t\t\t<div class="bottom-tool-trigger">\n\t\t\t\t\t\t\t\t\t\t\t<i class="fas fa-file-lines"></i>\n\t\t\t\t\t\t\t\t\t\t\t<span>Page</span>\n\t\t\t\t\t\t\t\t\t\t\t<i class="fas fa-chevron-up bottom-tool-chevron"></i>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div class="bottom-tool-item" data-menu="edit">\n\t\t\t\t\t\t\t\t\t\t<div class="bottom-tool-trigger">\n\t\t\t\t\t\t\t\t\t\t\t<i class="fas fa-pen-to-square"></i>\n\t\t\t\t\t\t\t\t\t\t\t<span>Edit</span>\n\t\t\t\t\t\t\t\t\t\t\t<i class="fas fa-chevron-up bottom-tool-chevron"></i>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div id="bottom-tools-stats">\n\t\t\t\t\t\t\t\t\t<div class="stat-item">\n\t\t\t\t\t\t\t\t\t\t<i class="fas fa-user"></i>\n\t\t\t\t\t\t\t\t\t\t<span class="bottom-stat-value" id="stat-total-contribs">-</span>\n\t\t\t\t\t\t\t\t\t\t<span>edits</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div id="right-details">\n\t\t\t\t\t\t\t<div class="width-adjust" id="details-width-adjust"></div>\n\t\t\t\t\t\t\t<div id="user-contribs">\n\t\t\t\t\t\t\t\t<div id="user-contribs-top">\n\t\t\t\t\t\t\t\t\t<div id="user-contribs-left">\n\t\t\t\t\t\t\t\t\t\t\t<div id="user-contribs-title">User Contributions</div>\n\t\t\t\t\t\t\t\t\t\t<div id="user-contribs-count">_ edits</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div id="block-count-indicator" style="display: none;"></div>\n\t\t\t\t\t\t\t\t\t<div id="user-contribs-level" data-tooltip="Warning level">0</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div id="user-contribs-content"></div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class="height-adjust"></div>\n\t\t\t\t\t\t\t<div id="page-history">\n\t\t\t\t\t\t\t\t<div id="page-history-top">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<div id="page-history-title">Page History</div>\n\t\t\t\t\t\t\t\t\t\t<div id="page-metadata" style="font-size: 0.75em; color: #666; margin-top: 3px;"></div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div id="protection-indicator"></div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div id="page-history-content"></div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="bottom-tool-menu" id="revert-menu"></div>\n\t\t\t<div class="bottom-tool-menu" id="warn-menu"></div>\n\t\t\t<div class="bottom-tool-menu" id="user-menu">\n\t\t\t\t<div id="user-open-user-page" class="menu-option">\n\t\t\t\t\t<i class="fas fa-user-circle"></i>\n\t\t\t\t\t<span>Open user page</span>\n\t\t\t\t\t<i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n\t\t\t\t</div>\n\t\t\t\t<div id="user-open-user-talk" class="menu-option">\n\t\t\t\t\t<i class="fas fa-comments"></i>\n\t\t\t\t\t<span>Open user talk</span>\n\t\t\t\t\t<i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n\t\t\t\t</div>\n\t\t\t\t<div id="user-view-contribs" class="menu-option">\n\t\t\t\t\t<i class="fas fa-list"></i>\n\t\t\t\t\t<span>View contributions</span>\n\t\t\t\t\t<i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n\t\t\t\t</div>\n\t\t\t\t<div id="user-view-filter-log" class="menu-option">\n\t\t\t\t\t<i class="fas fa-filter"></i>\n\t\t\t\t\t<span>View filter log</span>\n\t\t\t\t\t<i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n\t\t\t\t</div>\n\t\t\t\t<div class="menu-divider"></div>\n\t\t\t\t<div id="user-add-whitelist" class="menu-option">\n\t\t\t\t\t<i class="fas fa-user-check"></i>\n\t\t\t\t\t<span>Add to whitelist</span>\n\t\t\t\t</div>\n\t\t\t\t<div id="user-highlight" class="menu-option">\n\t\t\t\t\t<i class="fas fa-star"></i>\n\t\t\t\t\t<span>Highlight user</span>\n\t\t\t\t</div>\n\t\t\t\t<div class="menu-divider"></div>\n\t\t\t\t<div id="user-welcome" class="menu-option submenu-trigger">\n\t\t\t\t\t<i class="fas fa-hand-wave"></i>\n\t\t\t\t\t<span>Welcome</span>\n\t\t\t\t\t<i class="fas fa-chevron-right menu-option-chevron"></i>\n\t\t\t\t\t<div class="submenu"></div>\n\t\t\t\t</div>\n\t\t\t\t<div id="user-report-aiv" class="menu-option submenu-trigger">\n\t\t\t\t\t<i class="fas fa-flag"></i>\n\t\t\t\t\t<span>Report (AIV)</span>\n\t\t\t\t\t<i class="fas fa-chevron-right menu-option-chevron"></i>\n\t\t\t\t\t<div class="submenu"></div>\n\t\t\t\t</div>\n\t\t\t\t<div id="user-report-uaa" class="menu-option submenu-trigger">\n\t\t\t\t\t<i class="fas fa-user-slash"></i>\n\t\t\t\t\t<span>Report (UAA)</span>\n\t\t\t\t\t<i class="fas fa-chevron-right menu-option-chevron"></i>\n\t\t\t\t\t<div class="submenu"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class="bottom-tool-menu" id="page-menu">\n\t\t\t\t<div id="page-open-page" class="menu-option">\n\t\t\t\t\t<i class="fas fa-file"></i>\n\t\t\t\t\t<span>Open page</span>\n\t\t\t\t\t<i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n\t\t\t\t</div>\n\t\t\t\t<div id="page-open-talk" class="menu-option">\n\t\t\t\t\t<i class="fas fa-comments"></i>\n\t\t\t\t\t<span>Open talk page</span>\n\t\t\t\t\t<i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n\t\t\t\t</div>\n\t\t\t\t<div id="page-view-history" class="menu-option">\n\t\t\t\t\t<i class="fas fa-clock-rotate-left"></i>\n\t\t\t\t\t<span>View page history</span>\n\t\t\t\t\t<i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n\t\t\t\t</div>\n\t\t\t\t<div class="menu-divider"></div>\n\t\t\t\t<div id="page-request-protection" class="menu-option submenu-trigger">\n\t\t\t\t\t<i class="fas fa-shield-halved"></i>\n\t\t\t\t\t<span>Request protection</span>\n\t\t\t\t\t<i class="fas fa-chevron-right menu-option-chevron"></i>\n\t\t\t\t\t<div class="submenu"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class="bottom-tool-menu" id="edit-menu">\n\t\t\t\t<div id="edit-view-revision" class="menu-option">\n\t\t\t\t\t<i class="fas fa-eye"></i>\n\t\t\t\t\t<span>View revision</span>\n\t\t\t\t\t<i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n\t\t\t\t</div>\n\t\t\t\t<div id="edit-view-diff" class="menu-option">\n\t\t\t\t\t<i class="fas fa-code-compare"></i>\n\t\t\t\t\t<span>View diff</span>\n\t\t\t\t\t<i class="fas fa-arrow-up-right-from-square menu-option-icon"></i>\n\t\t\t\t</div>\n\t\t\t\t<div class="menu-divider"></div>\n\t\t\t\t<div id="edit-thank-user" class="menu-option">\n\t\t\t\t\t<i class="fas fa-heart"></i>\n\t\t\t\t\t<span>Thank user</span>\n\t\t\t\t</div>\n\t\t\t\t<div id="edit-rollback" class="menu-option">\n\t\t\t\t\t<i class="fas fa-rotate-left"></i>\n\t\t\t\t\t<span>Rollback</span>\n\t\t\t\t</div>\n\t\t\t\t<div id="edit-rollback-goodfaith" class="menu-option submenu-trigger">\n\t\t\t\t\t<i class="fas fa-handshake"></i>\n\t\t\t\t\t<span>Rollback (good faith)</span>\n\t\t\t\t\t<i class="fas fa-chevron-right menu-option-chevron"></i>\n\t\t\t\t\t<div class="submenu"></div>\n\t\t\t\t</div>\n\t\t\t\t<div id="edit-undo" class="menu-option submenu-trigger">\n\t\t\t\t\t<i class="fas fa-arrow-rotate-left"></i>\n\t\t\t\t\t<span>Undo</span>\n\t\t\t\t\t<i class="fas fa-chevron-right menu-option-chevron"></i>\n\t\t\t\t\t<div class="submenu"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t',"edit-context-menu":'\n\t\t\t<div id="context-ores"><span id="context-ores-number">0</span> ORES score</div>\n\t\t\t<div id="context-remove">Remove from queue</div>\n\t\t\t<div id="context-whitelist">Whitelist user</div>\n\t\t\t<div id="context-open-history">View page history</div>\n\t\t\t<div id="context-open-contribs">View user contribs</div>\n\t\t',settings:'\n\t\t\t<div class="settings">\n\t\t\t\t<div class="settings-left">\n\t\t\t\t\t<div class="settings-category">\n\t\t\t\t\t\t<div class="settings-category-header">\n\t\t\t\t\t\t\t<span>CORE</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="settings-left-menu-item" id="settings-general-button">\n\t\t\t\t\t\t\t<span>General</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="settings-left-menu-item" id="settings-audio-button">\n\t\t\t\t\t\t\t<span>Audio</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="settings-left-menu-item" id="settings-appearance-button">\n\t\t\t\t\t\t\t<span>Appearance</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="settings-left-menu-item" id="settings-controls-button">\n\t\t\t\t\t\t\t<span>Controls</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="settings-category">\n\t\t\t\t\t\t<div class="settings-category-header">\n\t\t\t\t\t\t\t<span>MODERATION</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="settings-left-menu-item" id="settings-ai-button">\n\t\t\t\t\t\t\t<span>AI Analysis</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="settings-left-menu-item" id="settings-gadgets-button">\n\t\t\t\t\t\t\t<span>Gadgets</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="settings-left-menu-item" id="settings-whitelist-button">\n\t\t\t\t\t\t\t<span>Whitelist</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="settings-left-menu-item" id="settings-highlight-button">\n\t\t\t\t\t\t\t<span>Highlighted</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="settings-category">\n\t\t\t\t\t\t<div class="settings-category-header">\n\t\t\t\t\t\t\t<span>INFO</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="settings-left-menu-item" id="settings-statistics-button">\n\t\t\t\t\t\t\t<span>Statistics</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="settings-left-menu-item" id="settings-about-button">\n\t\t\t\t\t\t\t<span>About</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class="settings-category">\n\t\t\t\t\t\t<div class="settings-category-header">\n\t\t\t\t\t\t\t<span>MISC</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="settings-left-menu-item" id="settings-import-export-button">\n\t\t\t\t\t\t\t<span>Import / Export</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="settings-right"></div>\n\t\t\t</div>\n\t\t'};class s{utcString(t){return t.getUTCFullYear()+"-"+this.padString(t.getUTCMonth()+1,2)+"-"+this.padString(t.getUTCDate(),2)+"T"+this.padString(t.getUTCHours(),2)+":"+this.padString(t.getUTCMinutes(),2)+":"+this.padString(t.getUTCSeconds(),2)}padString(t,e){for(t=t.toString();t.length<e;)t="0"+t;return t}encodeuri(t){return encodeURIComponent(t)}monthSectionName(){return["January","February","March","April","May","June","July","August","September","October","November","December"][(new Date).getUTCMonth()]+" "+(new Date).getUTCFullYear()}expiryToMilliseconds(t){const e={none:0,"1 hour":36e5,"1 day":864e5,"1 week":6048e5,"1 month":24192e5,"3 months":24192e5,"6 months":24192e5,indefinite:1/0};return e[t]||e["1 hour"]}escapeHtml(t){return(t||"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}pageLink(t,e=!1){return e?`https://${y.options.wiki}.wikipedia.org/w/index.php${t}`:`https://${y.options.wiki}.wikipedia.org/wiki/${this.encodeuri(t)}`}maxStringLength(t,e){return t.length>e?t.substring(0,e)+"...":t}getChangeColor(t){if(0===t)return"#888";if(t>0)return t>=1e3?"#00b894":t>=500?"#00d4a1":t>=100?"#26de81":"#55efc4";{const e=Math.abs(t);return e>=1e3?"#d63031":e>=500?"#e74c3c":e>=100?"#ff6b6b":"#ff8787"}}getChangeString(t){return t>0?"+"+t:0===t?"0":"–"+Math.abs(t).toString()}timeAgo(t){const e=Date.now()-new Date(t),n=Math.floor(e/1e3);if(n<0)return"just now";if(n>60){if(n>3600){if(n>86400){const t=Math.floor(n/60/60/24);return t+" day"+(1!==t?"s":"")+" ago"}const t=Math.floor(n/60/60);return t+" hour"+(1!==t?"s":"")+" ago"}const t=Math.floor(n/60);return t+" minute"+(1!==t?"s":"")+" ago"}return n+" second"+(1!==n?"s":"")+" ago"}}class l{log(t){console.log(`🛡️WikiShield: ${t}`)}}class d{constructor(t){this.api=t}async edit(t,e,n,i={}){if(y.testingMode)return console.log("Edit",{title:t,content:e,summary:n}),!0;try{return await this.api.postWithEditToken(Object.assign({},{action:"edit",title:t,text:e,summary:n,format:"json",tags:"WikiShield script"},i)),!0}catch(e){return y.logger.log(`Could not edit page ${t}: ${e}`),!1}}async appendText(t,e,n){if(y.testingMode)return console.log("Append text",{title:t,content:e,summary:n}),!0;try{return await this.api.postWithEditToken({action:"edit",title:t,appendtext:"\n"+e,summary:n,format:"json",tags:"WikiShield script"}),!0}catch(e){return console.log(`Could not append text to page ${t}: ${e}`),!1}}async getText(t){try{const e=await this.api.get({action:"query",prop:"revisions",titles:t,rvprop:"content",rvslots:"*",format:"json",formatversion:2});return e.query.pages.map(t=>[t.title,t.missing?"":t.revisions[0].slots.main.content]).reduce((t,e)=>({...t,[e[0]]:e[1]}),{})}catch(e){y.logger.log(`Could not fetch page ${t}: ${e}`)}}async getSinglePageContent(t){try{return(await this.getText(t))[t]}catch(t){console.log("Could not fetch page",t)}}async pageExists(t){try{return!0!==(await this.api.get({action:"query",titles:t,format:"json",formatversion:2})).query.pages[0].missing}catch(e){return y.logger.log(`Could not check if page ${t} exists: ${e}`),!1}}async getTextByRevid(t){try{const e=(await this.api.get({action:"query",prop:"revisions",revids:t,rvprop:"content",rvslots:"*",format:"json",formatversion:2})).query.pages[0];return e.missing?"":e.revisions[0].slots.main.content}catch(e){y.logger.log(`Could not fetch page with revid ${t}: ${e}`)}}async getRevisionData(t){try{const e=(await this.api.get({action:"query",prop:"revisions",revids:t,rvprop:"ids|user|comment|timestamp|size",format:"json",formatversion:2})).query.pages[0];if(e.missing||!e.revisions||0===e.revisions.length)return null;const n=e.revisions[0];return{revid:n.revid,parentid:n.parentid,user:n.user,comment:n.comment||"",timestamp:n.timestamp,size:n.size,oldlen:n.parentid?null:0}}catch(e){return y.logger.log(`Could not fetch revision data for revid ${t}: ${e}`),null}}async diff(t,e,n){try{return(await this.api.get({action:"compare",fromrev:e,torev:n,prop:"diff",format:"json",formatversion:2})).compare.body}catch(e){y.logger.log(`Could not fetch diff for page ${t}: ${e}`)}}async countReverts(t,e){try{const n=(await this.api.get({action:"query",prop:"revisions",titles:t,rvstart:y.util.utcString(new Date(Date.now()-864e5)),rvuser:e,rvprop:"timestamp|tags",rvlimit:"max",format:"json",formatversion:2})).query.pages[0].revisions;return void 0===n?0:n.filter(t=>t.tags.some(t=>"mw-undo"===t||"mw-rollback"===t||"mw-manual-revert"===t)).length}catch(e){y.logger.log(`Could not fetch revert count for page ${t}: ${e}`)}}async categories(t){try{return(await this.api.get({action:"query",prop:"categories",revids:t,cllimit:"max",format:"json",formatversion:2})).query.pages[0].categories}catch(e){y.logger.log(`Could not fetch categories for revision ${t}: ${e}`)}}async consecutiveEdits(t,e){try{const n=await this.history(t);if(n.length>0&&n[0].user===e){let t,i=0,o=0;for(const a of n){if(a.user!==e)break;i++,o+=a.sizediff,t=a}return{timestamp:t.timestamp,count:i,sizediff:o}}return null}catch(t){return console.log("Error geting consecutive edits:",t),null}}async contribs(t){try{return(await this.api.get({action:"query",list:"usercontribs",ucuser:t,uclimit:10,ucprop:"title|ids|timestamp|comment|flags|sizediff|tags",format:"json",formatversion:2})).query.usercontribs}catch(e){y.logger.log(`Could not fetch contributions for user ${t}: ${e}`)}}async editCount(t){try{return(await this.api.get({action:"query",list:"users",ususers:t,usprop:"editcount",format:"json",formatversion:2})).query.users}catch(e){y.logger.log(`Could not fetch edit count for users ${t}: ${e}`)}}async filterLog(t){try{return(await this.api.get({action:"query",list:"logevents",letype:"filter",leuser:t,lelimit:50,format:"json",formatversion:2})).query.logevents}catch(e){y.logger.log(`Could not fetch filter log for user ${t}: ${e}`)}}async getBlockCount(t){try{const e=await this.api.get({action:"query",list:"logevents",letype:"block",letitle:`User:${t}`,leaction:"block/block",lelimit:"max",format:"json",formatversion:2});return e.query.logevents?e.query.logevents.length:0}catch(e){return console.log(`Could not fetch block count for user ${t}:`,e),0}}async getBlockHistory(t){try{return(await this.api.get({action:"query",list:"logevents",letype:"block",letitle:`User:${t}`,leaction:"block/block",lelimit:10,leprop:"user|timestamp|comment|details",format:"json",formatversion:2})).query.logevents||[]}catch(e){return console.log(`Could not fetch block history for user ${t}:`,e),[]}}async history(t){try{const e=(await this.api.get({action:"query",prop:"revisions",titles:t,rvprop:"title|ids|timestamp|comment|flags|sizediff|user|tags|size",rvlimit:11,format:"json",formatversion:2})).query.pages[0].revisions,i=Math.min(n.config.historyCount,e.length);for(let t=0;t<i;t++)t+1<e.length?e[t].sizediff=e[t].size-e[t+1].size:e[t].sizediff=e[t].size;return e.splice(0,n.config.historyCount)}catch(e){y.logger.log(`Could not fetch history for page ${t}: ${e}`)}}async getPageProtection(t){try{const e=(await this.api.get({action:"query",titles:t,prop:"info",inprop:"protection",format:"json",formatversion:2})).query.pages[0];if(e&&e.protection&&e.protection.length>0){const t=e.protection;let n=null,i=[];for(const e of t)i.push(e.type),"sysop"===e.level?n="full":"autoconfirmed"===e.level&&"full"!==n?n="semi":"extendedconfirmed"===e.level&&"full"!==n&&(n="extended");return{protected:!0,level:n,types:i}}return{protected:!1}}catch(e){return console.log(`Could not fetch protection info for ${t}:`,e),{protected:!1}}}async getLatestRevisions(t){try{const e=t.split("|"),n={};for(const t of e)try{const e=await this.api.get({action:"query",titles:t,prop:"revisions",rvprop:"ids",rvlimit:1,format:"json"});if(e.query&&e.query.pages)for(const t in e.query.pages){const i=e.query.pages[t];i.revisions&&i.revisions.length>0&&i.title&&(n[i.title]=i.revisions[0].revid)}}catch(e){console.log(`Failed to fetch revision for ${t}: ${e}`)}return n}catch(t){return y.logger.log(`Could not fetch latest revisions: ${t}`),{}}}async getPageMetadata(t){try{const e=await this.api.get({action:"parse",page:t,prop:"wikitext",format:"json",formatversion:2}),n=e.parse?e.parse.wikitext:"",i={dateFormat:{patterns:[{regex:/\{\{Use dmy dates/i,value:"dmy (day-month-year)"},{regex:/\{\{Use mdy dates/i,value:"mdy (month-day-year)"},{regex:/\{\{Use ymd dates/i,value:"ymd (year-month-day)"},{regex:/\{\{Use dMy dates/i,value:"dMy (day Month year)"}],default:"Unknown"},englishVariant:{patterns:[{regex:/\{\{Use British English/i,value:"British English"},{regex:/\{\{Use American English/i,value:"American English"},{regex:/\{\{Use Canadian English/i,value:"Canadian English"},{regex:/\{\{Use Australian English/i,value:"Australian English"},{regex:/\{\{Use New Zealand English/i,value:"New Zealand English"},{regex:/\{\{Use Irish English/i,value:"Irish English"},{regex:/\{\{Use South African English/i,value:"South African English"},{regex:/\{\{Use Indian English/i,value:"Indian English"},{regex:/\{\{Use Hong Kong English/i,value:"Hong Kong English"},{regex:/\{\{Use Singapore English/i,value:"Singapore English"}],default:"Unknown"}},o=(t,e)=>{for(const n of t)if(n.regex.test(e))return n.value;return null},a={};for(const[t,e]of Object.entries(i)){const i=o(e.patterns,n);a[t]=i||e.default}const r=[],s=/\{\{Use ([^}|]+)(?:\|[^}]*)?\}\}/gi;let l;for(;null!==(l=s.exec(n));){const t=l[1].trim();Object.values(i).flatMap(t=>t.patterns).some(t=>t.regex.test(l[0]))||r.push(t)}return r.length>0&&(a.otherTemplates=r),a}catch(e){return y.logger.log(`Could not fetch metadata for page ${t}: ${e}`),{dateFormat:"Unknown",englishVariant:"Unknown"}}}async recentChanges(t,e){try{return(await this.api.get({action:"query",list:"recentchanges",rcnamespace:t,rclimit:50,rcprop:"title|ids|sizes|flags|user|tags|comment|timestamp",rctype:"edit",format:"json",rcstart:e||"",rcdir:e?"newer":"older"})).query.recentchanges}catch(t){y.logger.log(`Could not fetch recent changes: ${t}`)}}async ores(t){try{const e=await this.api.get({action:"query",format:"json",formatversion:2,prop:"revisions",revids:t,rvprop:"oresscores|ids",rvslots:"*"});return e.query.pages.map(t=>"goodfaith"in t.revisions[0].oresscores?[t.revisions[0].revid,t.revisions[0].oresscores.goodfaith.false]:[t.revisions[0].revid,0]).reduce((t,e)=>({...t,[e[0]]:e[1]}),{})}catch(e){y.logger.log(`Could not fetch ORES scores for revision ${t}: ${e}`)}}async usersBlocked(t){try{const e=await this.api.get({action:"query",list:"blocks",bkusers:t,bkprop:"id|user|by|timestamp|expiry|reason",format:"json",formatversion:2}),n={};return t.split("|").forEach(t=>n[t]=!1),e.query.blocks.forEach(t=>n[t.user]=!t.partial),n}catch(e){y.logger.log(`Could not fetch blocks for users ${t}: ${e}`)}}async rollback(t,e,n){if(y.testingMode)return console.log("Rollback",{title:t,user:e,summary:n}),!0;try{return await this.api.rollback(t,e,{summary:n,tags:"WikiShield script"}),!0}catch(t){return console.log(t),!1}}async undoEdit(t,e){if(y.testingMode)return console.log("Undo",{edit:t,reason:e}),!0;try{const n=t.revid,i=t.page.title;return await this.api.postWithToken("csrf",{action:"edit",title:i,undo:n,summary:e,tags:"WikiShield script"}),!0}catch(t){return console.log("Error undoing edit:",t),!1}}async block(t,e,n,i=!1,o=!1,a=!1,r=!0){if(y.testingMode)return console.log("Block",{user:t,summary:e,duration:n}),!0;try{return await this.api.postWithToken("csrf",Object.assign({action:"block",user:t,expiry:n,reason:e,tags:"WikiShield script"},i?{nocreate:""}:{},o?{noemail:""}:{},a?{}:{allowusertalk:""},r?{anononly:""}:{})),!0}catch(t){return console.log(t),!1}}async thank(t){if(y.testingMode)return console.log("Thank",{revid:t}),!0;try{return await this.api.postWithToken("csrf",{action:"thank",rev:t}),!0}catch(t){return console.log(t),!1}}async getProtectionDetails(t){try{const e=await this.api.get({action:"query",list:"logevents",letype:"protect",letitle:t,lelimit:1}),n={edit:"all",editExpiry:"infinite",move:"all",moveExpiry:"infinite"};if(Object.keys(e).includes("params")&&Object.keys(e.params).includes("details"))for(const t of e.params.details)"edit"===t.type&&(n.edit=t.level,n.editExpiry=t.expiry),"move"===t.type&&(n.move=t.level,n.moveExpiry=t.expiry);return n}catch(t){console.log(t)}}async protect(t,e,n){if(y.testingMode)return console.log("Protect",{page:t,summary:e,details:n}),!0;try{return await this.api.postWithToken("csrf",{action:"protect",title:t,reason:e,protections:`edit=${n.edit}|move=${n.move}`,expiry:`${n.editExpiry}|${n.moveExpiry}`,tags:"WikiShield script"}),!0}catch(t){return console.log(t),!1}}async get(t){return await this.api.get(t)}async postWithToken(t,e){return await this.api.postWithToken(t,e)}}class c{constructor(t,e){this.serverUrl=t||"http://localhost:11434",this.model=e||"",this.cache=new Map,this.rateLimitDelay=1e3,this.lastCallTime=0,this.availableModels=[],this.activeRequests=new Map}async fetchModels(){try{const t=await fetch(`${this.serverUrl}/api/tags`,{method:"GET",headers:{"Content-Type":"application/json"}});if(!t.ok)throw new Error(`Failed to fetch models: ${t.status} ${t.statusText}`);const e=await t.json();return this.availableModels=e.models||[],this.availableModels}catch(t){throw console.error("Error fetching Ollama models:",t),t}}async testConnection(){try{return(await fetch(`${this.serverUrl}/api/version`,{method:"GET"})).ok}catch(t){return console.error("Ollama connection test failed:",t),!1}}async analyzeEdit(t){if(!y.options.enableOllamaAI||!y.options.enableEditAnalysis)return null;if(!this.model)return console.error("No Ollama model selected"),null;const e=`${t.revid}`;if(this.cache.has(e))return this.cache.get(e);this.activeRequests.has(e)&&(this.activeRequests.get(e).abort(),this.activeRequests.delete(e));const n=new AbortController;this.activeRequests.set(e,n);const i=Date.now()-this.lastCallTime;if(i<this.rateLimitDelay&&await new Promise(t=>setTimeout(t,this.rateLimitDelay-i)),n.signal.aborted)return this.activeRequests.delete(e),console.log(`AI analysis cancelled for edit ${e} (during rate limit)`),null;try{const i=this.buildAnalysisPrompt(t),o=await this.callOllamaAI(i,n.signal),a=this.parseOllamaResponse(o);if(this.cache.set(e,a),this.cache.size>100){const t=this.cache.keys().next().value;this.cache.delete(t)}return this.lastCallTime=Date.now(),this.activeRequests.delete(e),a}catch(t){var o;return this.activeRequests.delete(e),"AbortError"===t.name||null!==(o=t.message)&&void 0!==o&&o.includes("aborted")?(console.log(`AI analysis cancelled for edit ${e}`),null):(console.error("Ollama AI analysis error:",t),{hasIssues:!1,issues:[],summary:"Analysis failed",error:t.message})}}convertDiffToReadable(t){if(!t)return"No changes visible";const e=document.createElement("div");e.innerHTML=`<table>${t}</table>`;let n=[],i=[];const o=e.querySelectorAll("tr"),a=o.length;for(let t=0;t<a;t++){const e=o[t];if(e.querySelector(".diff-lineno"))continue;const a=e.querySelector(".diff-marker"),r=e.querySelector(".diff-side-deleted"),s=e.querySelector(".diff-side-added");if(!r||!s)continue;if(r.classList.contains("diff-context")&&s.classList.contains("diff-context")){const t=this.cleanDiffText(r);if(!t.trim()||"<br />"===t)continue;i.push(` ${t}`),i.length>2&&i.shift()}else{i.length>0&&(n.length>0&&n.push(""),n.push(...i),i=[]);const e=(null==a?void 0:a.getAttribute("data-marker"))||"";if("−"===e||r.classList.contains("diff-deletedline")){const t=this.cleanDiffText(r,!0);t.trim()&&"<br />"!==t&&n.push(`- ${t}`)}if("+"===e||s.classList.contains("diff-addedline")){const t=this.cleanDiffText(s,!0);t.trim()&&"<br />"!==t&&n.push(`+ ${t}`)}i=[];let l=0;const d=Math.min(t+1+2,o.length);for(let e=t+1;e<d;e++){const t=o[e],i=t.querySelector(".diff-side-deleted"),a=t.querySelector(".diff-side-added");if(!i||!a)continue;if(!(i.classList.contains("diff-context")&&a.classList.contains("diff-context")))break;{const t=this.cleanDiffText(i);t.trim()&&"<br />"!==t&&(n.push(` ${t}`),l++)}}t+=l}}if(0===n.length)return"No significant changes detected in diff";if(n.length>60){const t=n.slice(0,60);return t.push(`\n... (${n.length-60} more lines omitted)`),t.join("\n")}return n.join("\n")}cleanDiffText(t,e=!1){if(!t)return"";const n=t.querySelector("div");if(!n){return(t.textContent||"").trim()}const i=n.cloneNode(!0);if(e){i.querySelectorAll("ins").forEach(t=>{const e=t.textContent||"";t.replaceWith(`[[${e}]]`)});i.querySelectorAll("del").forEach(t=>{const e=t.textContent||"";t.replaceWith(`~~${e}~~`)})}else{i.querySelectorAll("ins").forEach(t=>{t.replaceWith(t.textContent||"")});i.querySelectorAll("del").forEach(t=>{t.replaceWith(t.textContent||"")})}let o=i.textContent||i.innerText||"";return o=o.replace(/\s+/g," ").trim(),o.length>500&&(o=o.substring(0,500)+"..."),o}buildAnalysisPrompt(e){return t(e)}buildUsernamePrompt(t,n){return e(t,n)}async callOllamaAI(t,e=null){try{const n={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.model,prompt:t,format:{type:"object",properties:{hasIssues:{type:"boolean"},probability:{type:"number",minimum:0,maximum:100},confidence:{type:"string",enum:["high","medium","low"]},reasoning:{type:"string"},issues:{type:"array",items:{type:"object",properties:{type:{type:"string",enum:["vandalism","spam","pov","unsourced","attack","copyright","disruptive","factual-error","policy","username"]},severity:{type:"string",enum:["critical","major","minor"]},description:{type:"string"}},required:["type","severity","description"]}},constructive:{type:"boolean"},flagUsername:{type:"boolean"},summary:{type:"string"},action:{type:"string",enum:["approve","thank","review","warn","warn-and-revert","rollback","report-aiv","welcome"]},recommendation:{type:"string"}},required:["hasIssues","probability","confidence","reasoning","issues","constructive","summary","action","recommendation"]},stream:!1,options:{temperature:.1,top_p:.9,num_predict:1024}})};e&&(n.signal=e);const i=await fetch(`${this.serverUrl}/api/generate`,n);if(!i.ok)throw new Error(`Ollama API error: ${i.status} ${i.statusText}`);const o=await i.json();if(!o.response)throw new Error("Empty response from Ollama");return o.response}catch(t){throw new Error(`Ollama AI error: ${(null==t?void 0:t.message)||"Unknown error"}`)}}parseOllamaResponse(t){try{"object"==typeof t&&null!==t&&(t=t.content?t.content:JSON.stringify(t)),"string"!=typeof t&&(t=String(t));let e=t.trim();const n=e.match(/```json\s*([\s\S]*?)\s*```/);if(n)e=n[1];else{const t=e.indexOf("{");if(-1!==t){let n=0,i=!1,o=!1,a=!1;const r=e.length;for(let s=t;s<r;s++){const r=e[s];if(o)o=!1;else if("\\"!==r)if('"'!==r){if(!i&&("{"!==r&&"["!==r||n++,"}"!==r&&"]"!==r||n--,0===n&&s>t)){e=e.substring(t,s+1),a=!0;break}}else i=!i;else o=!0}if(!a){e=e.substring(t);let n=0,a=0;i=!1,o=!1;const r=e.length;for(let t=0;t<r;t++){const r=e[t];o?o=!1:"\\"!==r?'"'!==r?i||("{"===r&&n++,"}"===r&&n--,"["===r&&a++,"]"===r&&a--):i=!i:o=!0}for(;a>0;)e+="]",a--;for(;n>0;)e+="}",n--}}}e=e.split("\n").map(t=>{let e=!1,n="";const i=t.length;for(let o=0;o<i&&('"'!==t[o]||0!==o&&"\\"===t[o-1]||(e=!e),e||"/"!==t[o]||"/"!==t[o+1]);o++)n+=t[o];return n}).join("\n").replace(/\/\*[\s\S]*?\*\//g,"");const i=JSON.parse(e);return{hasIssues:i.hasIssues||!1,probability:i.probability||0,confidence:i.confidence||"low",reasoning:i.reasoning||"",issues:i.issues||[],constructive:void 0===i.constructive||i.constructive,summary:i.summary||"No issues detected",action:i.action||"review",recommendation:i.recommendation||"No specific recommendation",rawResponse:t}}catch(e){console.error("Failed to parse Ollama response:",e),console.log("Raw response:",t);const n=String(t),i=n.toLowerCase().includes("issue")||n.toLowerCase().includes("problem")||n.toLowerCase().includes("vandalism");return{hasIssues:i,probability:i?50:10,confidence:"low",issues:[],summary:i?"Potential issues detected (parsing failed)":"No clear issues detected",action:"review",recommendation:"Manual review recommended due to parsing error",rawResponse:t,parseError:e.message}}}async analyzeUsername(t,e){if(!y.options.enableOllamaAI||!y.options.enableEditAnalysis)return null;try{const n=this.buildUsernamePrompt(t,e),i=new AbortController,o=`username:${t}`;this.activeRequests.set(o,i);try{const t=await fetch(`${this.serverUrl}/api/generate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:this.model,prompt:n,format:{type:"object",properties:{shouldFlag:{type:"boolean"},confidence:{type:"number",minimum:0,maximum:1},violationType:{type:"string",enum:["promotional","impersonation","offensive","confusing","shared","none"]},reasoning:{type:"string"},recommendation:{type:"string"}},required:["shouldFlag","confidence","violationType","reasoning","recommendation"]},stream:!1,options:{temperature:.1,top_p:.9,num_predict:512}}),signal:i.signal});if(!t.ok)throw new Error(`Ollama API error: ${t.status} ${t.statusText}`);const e=await t.json();if(!e.response)throw new Error("Empty response from Ollama");const o=JSON.parse(e.response);return{shouldFlag:o.shouldFlag||!1,confidence:o.confidence||0,violationType:o.violationType||"none",reasoning:o.reasoning||"",recommendation:o.recommendation||""}}finally{this.activeRequests.delete(o)}}catch(e){return"AbortError"===e.name?(console.log("Username analysis cancelled for:",t),{shouldFlag:!1,confidence:0,violationType:"none",reasoning:"Analysis cancelled",recommendation:"",cancelled:!0}):(console.error("Username analysis error:",e),{shouldFlag:!1,confidence:0,violationType:"none",reasoning:`Error analyzing username: ${e.message}`,recommendation:"Manual review recommended due to analysis error",error:e.message})}}clearCache(){this.cache.clear()}cancelAnalysis(t){const e=`${t}`;this.activeRequests.has(e)&&(console.log(`Cancelling AI analysis for edit ${e}`),this.activeRequests.get(e).abort(),this.activeRequests.delete(e))}cancelAllAnalyses(){console.log(`Cancelling ${this.activeRequests.size} active AI analysis requests`);for(const[,t]of this.activeRequests.entries())t.abort();this.activeRequests.clear()}}class p{constructor(){this.queue=[],this.previousItems=[],this.editsSince="",this.lastRevid=0,this.currentEdit=null,this.backoff=2e3}async fetchRecentChanges(){if(this.queue.length>=y.options.maxQueueSize)window.setTimeout(this.fetchRecentChanges.bind(this),n.config.refresh);else{try{this.editsSince=y.util.utcString(new Date);const t=y.options.namespacesShown.join("|"),e=(await y.api.recentChanges(t)).filter(t=>t.revid>this.lastRevid);this.lastRevid=Math.max(...e.map(t=>t.revid));for(const t of e){const e=[];for(const n of this.queue)this.currentEdit&&n.revid===this.currentEdit.revid||n.page.title===t.title&&n.revid<t.revid&&(e.push(n),console.log(`Removing outdated edit when adding new item: ${n.page.title} (rev ${n.revid}, newer is ${t.revid})`));for(const t of e){const e=this.queue.indexOf(t);e>-1&&(this.queue.splice(e,1),y.interface.removeQueueItem(t.revid))}}const i=e.reduce((t,e)=>t+(""===t?"":"|")+e.user,""),o=(await y.api.editCount(i)).filter(t=>t.invalid||t.editcount<=y.options.maxEditCount).reduce((t,e)=>({...t,[e.name]:e.editcount}),{}),a=await y.api.getText(e.reduce((t,e)=>t+(""===t?"":"|")+`User_talk:${e.user}`,"")),r=await y.api.usersBlocked(i),s=await y.api.ores(e.reduce((t,e)=>t+(""===t?"":"|")+e.revid,""));e.filter(t=>t.user in o).filter(t=>(s[t.revid]||0)>=y.options.minimumORESScore||y.highlighted.has(t.user)).filter(t=>!y.whitelist.has(t.user)).forEach(async t=>{const e=a[`User talk:${t.user}`]||"";this.addQueueItem(t,o[t.user]||-1,this.getWarningLevel(e),s[t.revid]||0,r[t.user]||!1,!await y.api.pageExists(`User talk:${t.user}`))}),await this.checkForOutdatedEdits(),this.backoff=n.config.refresh}catch(t){console.log("Error while fetching recent changes",t),this.backoff=Math.min(2*this.backoff,12e4)}window.setTimeout(this.fetchRecentChanges.bind(this),this.backoff)}}async addQueueItem(t,e,n,i,o,a){if(this.queue.filter(e=>e.revid===t.revid).length>0||this.previousItems.filter(e=>e.revid===t.revid).length>0)return;const r=await this.generateQueueItem(t,e,n,i,o,null,null,a);this.queue.push(r);const s=this.queue.splice(1).sort((t,e)=>e.ores+(y.highlighted.has(e.user.name)?100:0)-(t.ores+(y.highlighted.has(t.user.name)?100:0)));this.queue=[this.queue[0],...s],1!==this.queue.length||this.currentEdit||(this.currentEdit=this.queue[0]);const l=document.getElementById("welcome-container"),d=l&&"none"!==l.style.display;y.options.enableSoundAlerts&&i>=y.options.soundAlertORESScore&&!d&&this.playAlertSound(),y.interface.renderQueue(this.queue,this.currentEdit)}playSound(t){var e;if(!y.soundEnabled)return;const n=(null===(e=y.options.soundMappings)||void 0===e?void 0:e[t])||t,i=o.sounds[n];if(i&&"none"!==n)try{var a,r,s,l;const e=new(window.AudioContext||window.webkitAudioContext),n=null!==(a=y.options.masterVolume)&&void 0!==a?a:.5,o=n*(null!==(r=null===(s=y.options.volumes)||void 0===s?void 0:s[t])&&void 0!==r?r:.5)*(null!==(l=i.volume)&&void 0!==l?l:1),d=i.repeats||[0],c=i.frequencies;d.forEach((t,n)=>{const a=c[n%c.length],r=e.createOscillator(),s=e.createGain();r.connect(s),s.connect(e.destination),r.type=i.type;const l=e.currentTime+t;i.sweep?(r.frequency.setValueAtTime(i.sweep.from,l),r.frequency.exponentialRampToValueAtTime(i.sweep.to,l+i.duration)):r.frequency.setValueAtTime(a,l),"function"==typeof i.envelope&&i.envelope(s,e,l,o),r.start(l),r.stop(l+i.duration)})}catch(t){console.error(`Could not play ${n}:`,t)}}playAlertSound(){this.playSound("alert")}playNotificationSound(){this.playSound("notification")}playClickSound(){this.playSound("click")}playWhooshSound(){this.playSound("whoosh")}playWarnSound(){this.playSound("warn")}playRollbackSound(){this.playSound("rollback")}playReportSound(){this.playSound("report")}playThankSound(){this.playSound("thank")}playProtectionSound(){this.playSound("protection")}playBlockSound(){this.playSound("block")}playSparkleSound(){this.playSound("sparkle")}async checkForOutdatedEdits(){if(0===this.queue.length)return;const t=[...new Set(this.queue.map(t=>t.page.title))];if(0===t.length)return;const e=await y.api.getLatestRevisions(t.join("|")),n=[];for(const t of this.queue){if(this.currentEdit&&t.revid===this.currentEdit.revid)continue;const i=e[t.page.title];i&&i>t.revid&&(n.push(t),console.log(`Removing outdated edit: ${t.page.title} (rev ${t.revid}, latest is ${i})`))}if(n.length>0){for(const t of n){const e=this.queue.indexOf(t);e>-1&&(this.queue.splice(e,1),y.interface.removeQueueItem(t.revid))}y.interface.renderQueue(this.queue,this.currentEdit)}}async generateQueueItem(t,e,n,i,o,a,r,s){var l;a=a||await y.api.contribs(t.user),r=r||await y.api.history(t.title);const d=await y.api.diff(t.title,t.old_revid||t.parentid,t.revid),c=await y.api.getPageMetadata(t.title),p=null!==(l=await y.api.categories(t.old_revid||t.parentid))&&void 0!==l?l:[],u=mw.config.get("wgUserName"),g=await y.api.countReverts(t.title,u);let m=!1;if(u&&d){const t=document.createElement("div");t.innerHTML=d;m=(t.textContent||t.innerText||"").toLowerCase().includes(u.toLowerCase())}const b={page:{title:t.title,history:r,dateFormat:c.dateFormat,englishVariant:c.englishVariant,categories:p},user:{name:t.user,contribs:a,editCount:e,warningLevel:n,originalWarningLevel:n,blocked:o,emptyTalkPage:void 0!==s&&s},ores:i,revid:t.revid,timestamp:t.timestamp,comment:t.comment,minor:"minor"in t,sizediff:(t.newlen?t.newlen-t.oldlen:t.sizediff)||0,diff:d,tags:t.tags,reviewed:!1,mentionsMe:m,aiAnalysis:null,usernameAnalysis:null,isBLP:p.some(t=>"Category:Living people"===t.title),reverts:g,consecutive:y.api.consecutiveEdits(t.title,t.user)};return y.options.enableOllamaAI&&y.ollamaAI&&(y.ollamaAI.analyzeEdit(b).then(t=>{b.aiAnalysis=t,this.currentEdit&&this.currentEdit.revid===b.revid&&y.interface.updateAIAnalysisDisplay(t)}).catch(t=>{console.error("AI analysis failed:",t),b.aiAnalysis={hasIssues:!1,error:t.message}}),mw.util.isTemporaryUser(t.user)||y.whitelist.has(t.user)||y.ollamaAI.analyzeUsername(t.user,t.title).then(t=>{b.usernameAnalysis=t,t&&!t.cancelled&&t.shouldFlag&&t.confidence>=.5&&this.promptForUAAReport(b)}).catch(t=>{console.error("Username analysis failed:",t),b.usernameAnalysis={shouldFlag:!1,error:t.message}})),b}getWarningLevel(t){const e=t.split(/(?=== ?[\w\d ]+ ?==)/g);for(let t of e)if(new RegExp("== ?"+y.util.monthSectionName()+" ?==").test(t)){const e=t.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/g);if(null===e)return"0";const n=e.map(t=>{const e=t.match(/<\!-- Template:[\w-]+?(\d(?:i?m)?) -->/);return e?e[1]:"0"});return n.sort()[n.length-1].toString()}return"0"}getWarningHistory(t){const e=[],n=t.split(/(?=== ?[\w\d ]+ ?==)/g),i=y.util.monthSectionName();for(let t of n){const n=new RegExp("== ?"+i+" ?==").test(t);if(!n)continue;const o=t.match(/== ?([\w\d ]+) ?==/),a=o?o[1]:"Unknown",r=t.matchAll(/<!-- Template:([\w-]+?)(\d(?:i?m)?) -->([^]+?)(?=<!-- Template:|$)/g);for(let t of r){const i=t[1],o=t[2],r=t[3],s=r.match(/(\d{2}:\d{2}.*?\d{4} \(UTC\))/);let l=s?s[1]:null;l&&(l=l.replace(/<[^>]*>/g,""));let d=null;const c=r.match(/\[\[User(?:[ _]talk)?:([^\]|]+)/i);c&&(d=c[1].trim());const p=r.match(/\[\[([^\]]+?)\]\]/),u=p?p[1]:null;e.push({template:i,level:o,timestamp:l,username:d,article:u,section:a,isCurrentMonth:n})}}return e}nextItem(){if(0===this.queue.length)return;if(!this.currentEdit)return this.currentEdit=this.queue[0],void y.interface.renderQueue(this.queue,this.currentEdit);const t=this.queue.findIndex(t=>t.revid===this.currentEdit.revid);if(-1===t)return this.currentEdit=this.queue[0],void y.interface.renderQueue(this.queue,this.currentEdit);const e=this.currentEdit;e&&y.ollamaAI&&y.ollamaAI.cancelAnalysis(e.revid),0!==t||e.reviewed||(e.reviewed=!0,y.statistics.reviewed+=1,y.saveStats(y.statistics)),this.queue.splice(t,1),y.interface.removeQueueItem(e.revid),this.queue.length>0?t<this.queue.length?this.currentEdit=this.queue[t]:this.currentEdit=this.queue[this.queue.length-1]:this.currentEdit=null,this.previousItems.push(e),y.interface.renderQueue(this.queue,this.currentEdit),e&&(this.checkAndAutoWelcome(e),this.checkAndAutoReportUAA(e))}prevItem(){if(!this.currentEdit&&this.queue.length>0)return this.currentEdit=this.queue[0],void y.interface.renderQueue(this.queue,this.currentEdit);const t=this.currentEdit?this.queue.findIndex(t=>t.revid===this.currentEdit.revid):-1,e=this.currentEdit;if(t<=0){if(0===this.previousItems.length)return;return e&&y.ollamaAI&&y.ollamaAI.cancelAnalysis(e.revid),this.queue.unshift(this.previousItems.pop()),this.currentEdit=this.queue[0],y.interface.renderQueue(this.queue,this.currentEdit),void(e&&(this.checkAndAutoWelcome(e),this.checkAndAutoReportUAA(e)))}e&&y.ollamaAI&&y.ollamaAI.cancelAnalysis(e.revid),this.currentEdit=this.queue[t-1],y.interface.renderQueue(this.queue,this.currentEdit),e&&(this.checkAndAutoWelcome(e),this.checkAndAutoReportUAA(e))}async checkAndAutoWelcome(t){var e;if(!y.options.enableAutoWelcome)return;if(!t.user||!t.user.name||mw.util.isTemporaryUser(t.user.name))return;const n=(null===(e=t.page)||void 0===e?void 0:e.title)||"unknown";if(!n.toLowerCase().includes("/sandbox")&&!n.toLowerCase().endsWith(":sandbox")&&!y.noAutoWelcomeList.has(t.user.name)&&t.user.emptyTalkPage)if(t.aiAnalysis&&!1===t.aiAnalysis.constructive)console.log(`Skipping auto-welcome for ${t.user.name} - edit not constructive`);else try{if(await y.api.pageExists(`User talk:${t.user.name}`))return void(t.user.emptyTalkPage=!1);if(!await y.interface.showConfirmationDialog("Auto-welcome User",`Would you like to welcome <span class="confirmation-modal-username">${y.util.escapeHtml(t.user.name)}</span>?<br><br>\n\t\t\t\t\t<span style="font-size: 0.9em; color: #888;">Editing: <strong>${y.util.escapeHtml(t.page.title)}</strong></span>`,t.user.name))return console.log(`Auto-welcome cancelled for: ${t.user.name}`),void y.noAutoWelcomeList.add(t.user.name);const e=new f;e.set("Auto-welcoming...",.5,"var(--main-blue)");let n=null;if(y.options.enableWelcomeLatin){/[^\u0000-\u007F\u0080-\u00FF\u0100-\u017F\u0180-\u024F]/.test(t.user.name)&&(n="Latin")}null===n&&(n="Default"),await y.welcomeUser(t.user.name,n),e.set(`Welcomed ${t.user.name}`,1,"var(--main-green)"),console.log(`Auto-welcomed user: ${t.user.name}`)}catch(t){console.log("Error during auto-welcome check:",t)}}async promptForUAAReport(t){if(!t.user||!t.user.name||mw.util.isTemporaryUser(t.user.name))return;if(y.noAutoWelcomeList.has(t.user.name))return;const e=t.usernameAnalysis;if(!e||!e.shouldFlag)return;if(y.uaaReports&&y.uaaReports.includes(t.user.name))return console.log(`User ${t.user.name} is already reported to UAA, skipping prompt`),void y.noAutoWelcomeList.add(t.user.name);const n="none"!==e.violationType?` (${e.violationType})`:"",i=Math.round(100*e.confidence);if(!await y.interface.showConfirmationDialog("Report Username to UAA",`The username <span class="confirmation-modal-username">${y.util.escapeHtml(t.user.name)}</span> may violate Wikipedia's username policy${n}.<br><br>\n\t\t\t\t<span style="font-size: 0.9em; color: #888;">Would you like to report it to <a href="https://en.wikipedia.org/wiki/Wikipedia:Usernames_for_administrator_attention" target="_blank" style="color: #0645ad;">Usernames for administrator attention (UAA)</a>?</span><br><br>\n\t\t\t\t<strong>AI Confidence:</strong> ${i}%<br>\n\t\t\t\t<strong>Reasoning:</strong> ${y.util.escapeHtml(e.reasoning)}<br>\n\t\t\t\t<strong>Recommendation:</strong> ${y.util.escapeHtml(e.recommendation)}`,t.user.name))return console.log(`UAA report cancelled for: ${t.user.name}`),void y.noAutoWelcomeList.add(t.user.name);try{const e=y.events.events.reportUserUAA;e&&e.func&&await e.func(t),y.noAutoWelcomeList.add(t.user.name)}catch(t){console.log("Error during auto UAA report:",t)}}async checkAndAutoReportUAA(t){t.usernameAnalysis&&t.usernameAnalysis.shouldFlag&&t.usernameAnalysis.confidence>=.5&&!t.usernameAnalysis.cancelled&&await this.promptForUAAReport(t)}delete(){this.playWhooshSound(),y.ollamaAI&&y.ollamaAI.cancelAllAnalyses(),this.queue=[],this.currentEdit=null,y.interface.clearQueue(),y.interface.renderQueue(this.queue,this.currentEdit)}async loadFromContribs(t){const e=this.currentEdit.user.contribs.filter(e=>e.revid===Number(t))[0];y.interface.elem("#diff-container").innerHTML="",this.currentEdit=await this.generateQueueItem(e,this.currentEdit.user.editCount,this.currentEdit.user.warningLevel,null,this.currentEdit.user.blocked,null,null,this.currentEdit.user.emptyTalkPage),y.interface.renderQueue(this.queue,this.currentEdit)}async loadFromHistory(t){const e=this.currentEdit.page.history.filter(e=>e.revid===Number(t))[0];e.title=this.currentEdit.page.title;y.interface.elem("#diff-container").innerHTML="";const n=await Promise.all([y.api.editCount(e.user),y.api.getSinglePageContent(`User talk:${e.user}`),y.api.contribs(e.user),y.api.history(e.title)]),i=n[1];this.currentEdit=await this.generateQueueItem(e,n[0][0].editcount,this.getWarningLevel(i),null,!1,n[2],n[3],!await y.api.pageExists(`User talk:${e.user}`)),y.interface.renderQueue(this.queue,this.currentEdit)}async loadSpecificRevision(t,e){try{const n=y.interface.elem("#diff-container");n.innerHTML='<div class="loading-spinner">Loading revision...</div>';const i=await y.api.getRevisionData(t);if(!i)return void(n.innerHTML='<div class="error">Failed to load revision</div>');const o=await Promise.all([y.api.editCount(i.user),y.api.getSinglePageContent(`User talk:${i.user}`),y.api.contribs(i.user),y.api.history(e)]),a=o[1],r={revid:i.revid,parentid:i.parentid,user:i.user,comment:i.comment,timestamp:i.timestamp,size:i.size,oldlen:i.oldlen||0,newlen:i.size,title:e};this.currentEdit=await this.generateQueueItem(r,o[0][0].editcount,this.getWarningLevel(a),null,!1,o[2],o[3],!await y.api.pageExists(`User talk:${r.user}`)),y.interface.renderQueue(this.queue,this.currentEdit)}catch(t){console.error("Failed to load specific revision:",t),y.interface.elem("#diff-container").innerHTML='<div class="error">Failed to load revision</div>'}}}const u={conditions:{operatorNonAdmin:{desc:"You are not an admin",check:t=>!y.rights.block},operatorAdmin:{desc:"You are an admin",check:t=>y.rights.block},userIsHighlighted:{desc:"User is highlighted",check:t=>y.highlighted.has(t.user.name)},userIsWhitelisted:{desc:"User is whitelisted",check:t=>y.whitelist.has(t.user.name)},userIsAnon:{desc:"User is anonymous (temporary account)",check:t=>mw.util.isTemporaryUser(t.user.name)},userIsRegistered:{desc:"User is registered (not temporary account)",check:t=>!mw.util.isTemporaryUser(t.user.name)},userHasEmptyTalkPage:{desc:"User has an empty talk page",check:t=>t.user.emptyTalkPage},editIsMinor:{desc:"Edit is marked as minor",check:t=>t.minor},editIsMajor:{desc:"Edit is not marked as minor",check:t=>!t.minor},editSizeNegative:{desc:"Edit removes content (negative bytes)",check:t=>(t.sizediff||0)<0},editSizePositive:{desc:"Edit adds content (positive bytes)",check:t=>(t.sizediff||0)>0},editSizeLarge:{desc:"Edit is large (>1000 bytes change)",check:t=>Math.abs(t.sizediff||0)>1e3},userEditCountLow:{desc:"User has less than 10 edits",check:t=>t.user.editCount<10&&t.user.editCount>=0},userEditCountHigh:{desc:"User has 100 or more edits",check:t=>t.user.editCount>=100},atFinalWarning:{desc:"User already has a final warning (before any new warnings)",check:t=>{var e;const n=(null===(e=t.user.originalWarningLevel)||void 0===e?void 0:e.toString())||t.user.warningLevel.toString(),i=t.user.warningLevel.toString(),o=["4","4im"].includes(n);return console.log(`[atFinalWarning] User: ${t.user.name}, Original: ${n}, Current: ${i}, Result: ${o}`),o}},userHasWarnings:{desc:"User has received warnings (level 1+)",check:t=>{var e;const n=(null===(e=t.user.warningLevel)||void 0===e?void 0:e.toString())||"0";return!["0",""].includes(n)}},userNoWarnings:{desc:"User has no warnings (level 0)",check:t=>{var e;const n=(null===(e=t.user.warningLevel)||void 0===e?void 0:e.toString())||"0";return["0",""].includes(n)}}},welcomeTemplates:{Default:"{{subst:Welcome}} ~~~~",Basic:"{{subst:W-basic}}",Links:"{{subst:W-graphical}}",Latin:"{{subst:welcome non-latin|LuniZunie}} ~~~~",COI:"{{subst:welcome-coi}} ~~~~",Mentor:"{{subst:Mentor welcome-autosign}}"}};class g{constructor(){this.openWikipediaLink=(t,e,n=null)=>{n&&1===n.button||n&&(n.ctrlKey||n.metaKey)?window.open(t):window.open(t,"_blank")},this.events={prevEdit:{description:"Go to the previous edit in the queue",icon:"fas fa-arrow-left",runWithoutEdit:!0,func:()=>{y.queue.prevItem()}},nextEdit:{description:"Go to the next edit in the queue",icon:"fas fa-arrow-right",func:()=>{y.queue.nextItem()}},deleteQueue:{description:"Remove all items from the queue",icon:"fas fa-trash-can",runWithoutEdit:!0,func:()=>{y.queue.delete()}},openRevertMenu:{description:"Toggle the revert & warn menu",icon:"fas fa-undo",runWithoutEdit:!0,func:()=>{var t;const e=document.querySelector('[data-menu="revert"]'),n=y.interface.elem("#revert-menu");if(n.innerHTML="",console.log(y.queue.currentEdit),y.interface.createRevertMenu(n,null===(t=y.queue.currentEdit)||void 0===t?void 0:t.isBLP),e){const t=e.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${e.dataset.menu}-menu`);t&&n&&(n.classList.contains("show")?(n.classList.remove("show"),t.classList.remove("active")):(y.interface.closeAllBottomMenus(),n.classList.add("show"),t.classList.add("active"),y.interface.positionBottomMenu(e,n)))}}},openWarnMenu:{description:"Toggle the warn-only menu",icon:"fas fa-triangle-exclamation",runWithoutEdit:!0,func:()=>{const t=document.querySelector('[data-menu="warn"]');if(t){const e=t.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${t.dataset.menu}-menu`);e&&n&&(n.classList.contains("show")?(n.classList.remove("show"),e.classList.remove("active")):(y.interface.closeAllBottomMenus(),n.classList.add("show"),e.classList.add("active"),y.interface.positionBottomMenu(t,n)))}}},openReportMenu:{description:"Toggle the report menu",icon:"fas fa-flag",runWithoutEdit:!0,func:()=>{const t=document.querySelector('[data-menu="report"]');if(t){const e=t.querySelector(".bottom-tool-trigger"),n=document.querySelector(`#${t.dataset.menu}-menu`);e&&n&&(n.classList.contains("show")?(n.classList.remove("show"),e.classList.remove("active")):(y.interface.closeAllBottomMenus(),n.classList.add("show"),e.classList.add("active"),y.interface.positionBottomMenu(t,n)))}}},openSettings:{description:"Open the settings interface",icon:"fas fa-gear",runWithoutEdit:!0,func:()=>{y.interface.settings.openSettings()}},openUserPage:{description:"Open user page in a new tab",icon:"fas fa-circle-user",func:t=>{const e=this.getRelevantEdit().user.name,n=y.util.pageLink(`User:${e}`);this.openWikipediaLink(n,`User:${e}`,t)}},openUserTalk:{description:"Open user talk page in a new tab",icon:"fas fa-comment",func:t=>{const e=this.getRelevantEdit().user.name,n=y.util.pageLink(`User talk:${e}`);this.openWikipediaLink(n,`User talk:${e}`,t)}},openUserContribs:{description:"Open user contributions page in a new tab",icon:"fas fa-list",func:t=>{const e=this.getRelevantEdit().user.name,n=y.util.pageLink(`Special:Contributions/${e}`);this.openWikipediaLink(n,`Contributions: ${e}`,t)}},openFilterLog:{description:"Open user filter log in a new tab",icon:"fas fa-filter",func:t=>{const e=y.util.encodeuri(this.getRelevantEdit().user.name),n=y.util.pageLink(`?title=Special:AbuseLog&wpSearchUser=${e}`,!0),i=this.getRelevantEdit().user.name;this.openWikipediaLink(n,`Filter Log: ${i}`,t)}},addToWhitelist:{description:"Add user to the whitelist",icon:"fas fa-thumbs-up",includeInProgress:!0,progressDesc:"Whitelisting...",func:()=>{y.queue.playSparkleSound();const t=this.getRelevantEdit().user.name;y.whitelist.has(t)?(y.whitelist.delete(t),y.saveWhitelist(),y.logger.log(`Removed ${t} from whitelist`)):(y.whitelist.set(t,Date.now()),y.saveWhitelist(),y.statistics.whitelisted++,y.saveStats(y.statistics),y.logger.log(`Added ${t} to whitelist`)),y.interface.renderQueue(y.queue.queue,y.queue.currentEdit)}},highlight:{description:"Highlight this user's contributions",icon:"fas fa-highlighter",includeInProgress:!0,progressDesc:"Highlighting...",func:()=>{y.queue.playSparkleSound();const t=this.getRelevantEdit().user.name;if(y.highlighted.has(t))y.highlighted.delete(t),y.saveHighlighted(),y.logger.log(`Removed highlight from ${t}`);else{const e=y.util.expiryToMilliseconds(y.options.highlightedExpiry),n=Date.now()+e;y.highlighted.set(t,n),y.saveHighlighted(),y.statistics.highlighted++,y.saveStats(y.statistics),y.logger.log(`Highlighted user ${t} until ${new Date(n).toLocaleString()}`)}y.interface.renderQueue(y.queue.queue,y.queue.currentEdit)}},openPage:{description:"Open page being edited in new tab",icon:"fas fa-file-lines",func:t=>{const e=this.getRelevantEdit().page,n=y.util.pageLink(e.title);this.openWikipediaLink(n,e.title,t)}},openTalk:{description:"Open talk page in new tab",icon:"fas fa-comments",func:t=>{const e=this.getRelevantEdit().page.title.split(":");let n="Talk";e.length>1&&(n=e[0].toLowerCase().includes("talk")?e[0]:e[0]+" talk");const i=`${n}:${1===e.length?e[0]:e[1]}`,o=y.util.pageLink(i);this.openWikipediaLink(o,i,t)}},openHistory:{description:"Open page history in new tab",icon:"fas fa-clock-rotate-left",func:t=>{const e=this.getRelevantEdit().page,n=y.util.pageLink(`Special:PageHistory/${e.title}`);this.openWikipediaLink(n,`History: ${e.title}`,t)}},openRevision:{description:"Open revision in new tab",icon:"fas fa-pen-to-square",func:t=>{const e=this.getRelevantEdit().revid,n=y.util.pageLink(`Special:PermanentLink/${e}`);this.openWikipediaLink(n,`Revision ${e}`,t)}},openDiff:{description:"Open diff in new tab",icon:"fas fa-code-commit",func:t=>{const e=this.getRelevantEdit().revid,n=y.util.pageLink(`Special:Diff/${e}`);this.openWikipediaLink(n,`Diff ${e}`,t)}},thankUser:{description:"Thank user",icon:"fas fa-user-check",includeInProgress:!0,progressDesc:"Thanking...",func:async()=>{y.queue.playThankSound();const t=this.getRelevantEdit();if(mw.util.isTemporaryUser(t.user.name)){const e=`User talk:${t.user.name}`,n=await y.api.getSinglePageContent(e)||"";await y.api.edit(e,n+"\n{{subst:Thanks-autosign}}",`Thanking for edit to [[${t.page.title}]] ([[WP:WikiShield|WS]])`)}else await y.api.thank(t.revid)}},rollback:{description:"Rollback edits",icon:"fas fa-backward",includeInProgress:!0,progressDesc:"Rolling back...",func:async(t={})=>(y.queue.playRollbackSound(),await y.revert(this.getRelevantEdit(),t.label||""))},rollbackAndWarn:{description:"Rollback and warn for edits",icon:"fas fa-backward",includeInProgress:!0,progressDesc:"Rolling back and warning...",parameters:[{title:"Warning type",id:"warningType",type:"choice",options:Object.keys(o.warnings)},{title:"Level",id:"level",type:"choice",options:["auto",1,2,3,4,5]}],validateParameters:t=>!!t.warningTemplates||("auto"===t.level||o.warnings[t.warningType].templates.length>=t.level),func:async(t={})=>{y.queue.playRollbackSound();if(!1===await y.revert(this.getRelevantEdit(),t.label||""))return{wasAtFinalWarning:!1};let e,n,i;if(y.queue.playWarnSound(),t.warningTemplates)e=t.warningTemplates,n=t.warningLabel,i=t.requiresArticle;else{e=(t.warningType&&Object.keys(o.warnings).includes(t.warningType)?o.warnings[t.warningType]:o.warnings.Vandalism).templates,n=null,i=!0}const a=this.getRelevantEdit().user.warningLevel;return await y.warnUser(this.getRelevantEdit().user.name,e,t.level||"auto",!1!==i?this.getRelevantEdit().page.title:null,this.getRelevantEdit().revid),{wasAtFinalWarning:["4","4im"].includes(a.toString())}}},rollbackGoodFaith:{description:"Rollback edits (good faith)",icon:"fas fa-arrow-rotate-left",parameters:[{title:"Summary (optional)",id:"summary",type:"text"}],includeInProgress:!0,progressDesc:"Rolling back...",func:async t=>{y.queue.playRollbackSound();const e=this.getRelevantEdit();return await y.revert(e,t.summary||`Reverted good faith edits by ${e.user.name} ([[WP:WikiShield|WS]])`)}},undo:{description:"Undo this edit only",icon:"fas fa-undo",parameters:[{title:"Reason",id:"reason",type:"text"}],includeInProgress:!0,progressDesc:"Undoing...",func:async t=>{y.queue.playRollbackSound();const e=this.getRelevantEdit();return await y.api.undoEdit(e,t.reason||`Undid edit by ${e.user.name} ([[WP:WikiShield|WS]])`)}},warn:{description:"Warn user",icon:"fas fa-triangle-exclamation",parameters:[{title:"Warning type",id:"warningType",type:"choice",options:Object.keys(o.warnings)},{title:"Level",id:"level",type:"choice",options:["auto",1,2,3,4,5]}],includeInProgress:!0,progressDesc:"Warning...",needsContinuity:!0,validateParameters:t=>!!t.warningTemplates||("auto"===t.level||o.warnings[t.warningType].templates.length>=t.level),func:async t=>{let e,n,i;if(y.queue.playWarnSound(),t.warningTemplates)e=t.warningTemplates,n=t.warningLabel,i=t.requiresArticle;else{e=(t.warningType&&Object.keys(o.warnings).includes(t.warningType)?o.warnings[t.warningType]:o.warnings.Vandalism).templates,n=null,i=!0}const a=this.getRelevantEdit().user.warningLevel;return await y.warnUser(this.getRelevantEdit().user.name,e,t.level||"auto",!1!==i?this.getRelevantEdit().page.title:null,this.getRelevantEdit().revid),{wasAtFinalWarning:["4","4im"].includes(a.toString())}}},reportToAIV:{description:"Report user to AIV",icon:"fas fa-flag",parameters:[{title:"Report message",id:"reportMessage",type:"choice",options:["Vandalism past final warning","Vandalism-only account","Long-term abuse"]}],includeInProgress:!0,progressDesc:"Reporting...",func:async t=>{console.log(`[reportToAIV] Executing report for user: ${this.getRelevantEdit().user.name}, Message: ${t.reportMessage}`),y.queue.playReportSound(),await y.reportToAIV(this.getRelevantEdit().user.name,t.reportMessage)}},reportToUAA:{description:"Report user to UAA",icon:"fas fa-flag",parameters:[{title:"Report message",id:"reportMessage",type:"choice",options:["Disruptive username","Offensive username","Promotional username","Misleading username"]}],includeInProgress:!0,progressDesc:"Reporting...",func:async t=>{y.queue.playReportSound(),await y.reportToUAA(this.getRelevantEdit().user.name,t.reportMessage)}},requestProtection:{description:"Request protection",icon:"fas fa-shield",parameters:[{title:"Level",id:"level",type:"choice",options:["Semi-protection","Extended-confirmed protection","Full protection","Pending changes protection"]},{title:"Reason",id:"reason",type:"choice",options:["Persistent vandalism","Edit warring","BLP violations","Sockpuppetry"]}],includeInProgress:!0,progressDesc:"Requesting protection...",func:async t=>{y.queue.playProtectionSound(),await y.requestProtection(this.getRelevantEdit().page.title,t.level,t.reason)}},block:{description:"Block user",icon:"fas fa-ban",parameters:[{title:"Block summary",id:"blockSummary",type:"choice",options:["[[Wikipedia:Vandalism|Vandalism]]","[[Wikipedia:DISRUPTONLY|Vandalism-only account]]","Long-term abuse"]},{title:"Duration",id:"duration",type:"choice",options:["31 hours","1 week","2 weeks","1 month","3 months","6 months","1 year","3 years","infinite"]}],includeInProgress:!0,progressDesc:"Blocking...",func:async t=>{y.queue.playBlockSound();await y.api.block(this.getRelevantEdit().user.name,t.blockSummary,t.duration,!0,!1,!1,!0)&&(y.statistics.blocks++,y.saveStats(y.statistics))}},protect:{description:"Protect page",icon:"fas fa-lock",includeInProgress:!0,progressDesc:"Protecting...",func:async()=>{y.queue.playProtectionSound()}},welcome:{description:"Welcome user",icon:"fas fa-door-open",parameters:[{title:"Template",id:"template",type:"choice",options:Object.keys(u.welcomeTemplates)}],includeInProgress:!0,progressDesc:"Welcoming...",func:async t=>{y.queue.playSparkleSound(),await y.welcomeUser(this.getRelevantEdit().user.name,t.template)}}}}getRelevantEdit(){return y.tempCurrentEdit||y.queue.currentEdit}linkButton(t,e,n){const i=(t,i=!1)=>{var o;if((i||["openUserPage","openUserTalk","openUserContribs","openFilterLog","openPage","openPageHistory","openDiff"].includes(e))&&null!==(o=this.events[e])&&void 0!==o&&o.func&&(1===t.button||t.ctrlKey||t.metaKey||i))return this.events[e].func(),void t.preventDefault();y.interface.selectedMenu=null,y.interface.updateMenuElements(),n?this.events[e].func():y.executeScript({actions:[{name:e,params:{}}]})};t.addEventListener("click",t=>i(t,!1)),t.addEventListener("auxclick",t=>{1===t.button&&i(t,!0)})}}const m=["!","@","#","$","%","^","&","*","(",")","1","2","3","4","5","6","7","8","9","0","q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m","-","=","[","]","\\",";","'",",",".","/","enter","_","+","{","}","|",":",'"',"<",">","?"," ","arrowleft","arrowup","arrowdown","arrowright"];class b{constructor(){this.contentContainer=null,this.isOpen=!1,this.keypressCallback=null}createToggle(t,e,n){const i=document.createElement("div");i.classList.add("settings-toggle"),e&&i.classList.add("active"),t.appendChild(i),i.innerHTML='\n\t\t\t\t<div class="toggle-switch">\n\t\t\t\t\t<div class="toggle-slider"></div>\n\t\t\t\t</div>\n\t\t\t',i.addEventListener("click",()=>{y.queue.playClickSound(),(e=!e)?i.classList.add("active"):i.classList.remove("active"),n(e)})}createVolumeControl(t,e,n,i,a){var r,s,l;const d=document.createElement("div");d.classList.add("audio-volume-control"),t.appendChild(d);const c=null!==(r=null===(s=y.options.volumes)||void 0===s?void 0:s[e])&&void 0!==r?r:.5,p=(null===(l=y.options.soundMappings)||void 0===l?void 0:l[e])||e,u={};Object.entries(o.sounds).forEach(([t,e])=>{const n=e.category||"other";u[n]||(u[n]=[]),u[n].push({key:t,sound:e})});const g={ui:"UI Sounds",alert:"Alerts",warning:"Warnings",action:"Actions",notification:"Notifications",positive:"Positive",negative:"Negative",other:"Other"};let m="";["ui","alert","warning","action","notification","positive","negative","other"].forEach(t=>{u[t]&&(m+=`<optgroup label="${g[t]||t}">`,u[t].forEach(({key:t,sound:e})=>{m+=`<option value="${t}" ${t===p?"selected":""}>${e.name}</option>`}),m+="</optgroup>")}),d.innerHTML=`\n\t\t\t\t<div class="audio-control-header">\n\t\t\t\t\t<div class="audio-control-info">\n\t\t\t\t\t\t<div class="audio-control-title">${n}</div>\n\t\t\t\t\t\t<div class="audio-control-desc">${i}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="audio-preview-button">\n\t\t\t\t\t\t<span class="fa fa-play"></span>\n\t\t\t\t\t\tPreview\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<select class="audio-sound-selector">\n\t\t\t\t\t${m}\n\t\t\t\t</select>\n\t\t\t\t<div class="audio-control-slider-container">\n\t\t\t\t\t<input type="range" class="audio-volume-slider" min="0" max="1" step="0.01" value="${c}">\n\t\t\t\t\t<input type="number" class="audio-volume-input" min="0" max="1" step="0.01" value="${c}">\n\t\t\t\t</div>\n\t\t\t`;const b=d.querySelector(".audio-volume-slider"),h=d.querySelector(".audio-volume-input"),f=d.querySelector(".audio-preview-button"),v=d.querySelector(".audio-sound-selector"),x=t=>{const n=Math.max(0,Math.min(1,Number(t)));b.value=n,h.value=n.toFixed(2),y.options.volumes||(y.options.volumes={}),y.options.volumes[e]=n,y.saveOptions(y.options)};b.addEventListener("input",()=>x(b.value)),h.addEventListener("change",()=>x(h.value)),v.addEventListener("change",()=>{y.options.soundMappings||(y.options.soundMappings={}),y.options.soundMappings[e]=v.value,y.saveOptions(y.options)}),f.addEventListener("click",()=>{a&&a.call(y.queue)})}createNumericInput(t,e,n,i,o,a){const r=document.createElement("div");r.classList.add("numeric-input-container"),t.appendChild(r),r.innerHTML=`\n\t\t\t\t<span class="fa fa-minus numeric-input-button"></span>\n\t\t\t\t<input type="text" class="numeric-input" value=${e}>\n\t\t\t\t<span class="fa fa-plus numeric-input-button"></span>\n\t\t\t`;const s=r.querySelector("input");r.querySelector(".fa-minus").addEventListener("click",()=>{y.queue.playClickSound(),e=Math.round(100*Math.max(e-o,n))/100,s.value=e,a(e)}),r.querySelector(".fa-plus").addEventListener("click",()=>{y.queue.playClickSound(),e=Math.round(100*Math.min(e+o,i))/100,s.value=e,a(e)});const l=()=>{isNaN(Number(s.value))&&(s.value=e),e=Math.round(100*Math.min(Math.max(Number(s.value),n),i))/100,e=o>=1?Math.round(e):e,s.value=e,a(e)};s.addEventListener("blur",l),s.addEventListener("keyup",t=>{"enter"===t.key.toLowerCase()&&(l(),s.blur())})}openSettings(){this.closeSettings(),this.isOpen=!0;const t=document.createElement("div");t.classList.add("settings-container"),document.body.appendChild(t),document.body.classList.add("settings-open"),t.innerHTML=r.settings,t.addEventListener("click",this.closeSettings.bind(this)),t.querySelector(".settings").addEventListener("click",t=>t.stopPropagation()),t.querySelector("#settings-general-button").classList.add("selected"),this.contentContainer=t.querySelector(".settings-right"),[["#settings-general-button",this.openGeneral.bind(this)],["#settings-audio-button",this.openAudio.bind(this)],["#settings-appearance-button",this.openAppearance.bind(this)],["#settings-controls-button",this.openControls.bind(this)],["#settings-ai-button",this.openAI.bind(this)],["#settings-gadgets-button",this.openGadgets.bind(this)],["#settings-whitelist-button",this.openWhitelist.bind(this)],["#settings-highlight-button",this.openHighlighted.bind(this)],["#settings-statistics-button",this.openStatistics.bind(this)],["#settings-about-button",this.openAbout.bind(this)],["#settings-import-export-button",this.openImportExport.bind(this)]].forEach(([e,n])=>t.querySelector(e).addEventListener("click",()=>{y.queue.playClickSound(),this.contentContainer.innerHTML="",[...document.querySelectorAll(".settings-left-menu-item.selected")].forEach(t=>t.classList.remove("selected")),t.querySelector(e).classList.add("selected"),n()})),this.openGeneral()}openGeneral(){this.contentContainer.innerHTML='\n\t\t\t\t<div class="settings-compact-grid">\n\t\t\t\t\t<div class="settings-section compact" id="maximum-edit-count">\n\t\t\t\t\t\t<div class="settings-section-title">Maximum edit count</div>\n\t\t\t\t\t\t<div class="settings-section-desc">Edits from users with more than this edit count will not be shown</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="settings-section compact" id="maximum-queue-size">\n\t\t\t\t\t\t<div class="settings-section-title">Maximum queue size</div>\n\t\t\t\t\t\t<div class="settings-section-desc">The queue will not load additional edits after reaching this size</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="settings-section compact" id="minimum-ores-score">\n\t\t\t\t\t\t<div class="settings-section-title">Minimum ORES score</div>\n\t\t\t\t\t\t<div class="settings-section-desc">Edits with an <a href="https://www.mediawiki.org/wiki/ORES" target="_blank">ORES score</a> below this threshold will not be shown</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title">Expiries</div>\n\t\t\t\t\t<div class="settings-compact-grid">\n\t\t\t\t\t\t<div class="settings-section compact" id="watchlist-expiry">\n\t\t\t\t\t\t\t<div class="settings-section-title">Watchlist expiry for warned users</div>\n\t\t\t\t\t\t\t<div class="settings-section-desc">How long to watch user talk pages after issuing warnings</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="settings-section compact" id="highlighted-expiry">\n\t\t\t\t\t\t\t<div class="settings-section-title">Highlighted user expiry</div>\n\t\t\t\t\t\t\t<div class="settings-section-desc">How long to keep users highlighted before expiration</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title">Namespaces to show</div>\n\t\t\t\t\t<div class="settings-section-desc">Only edits from the selected namespaces will be shown in your queue.</div>\n\t\t\t\t\t<div id="namespace-container"></div>\n\t\t\t\t</div>\n\t\t\t',this.createNumericInput(this.contentContainer.querySelector("#maximum-edit-count"),y.options.maxEditCount,0,500,5,t=>{y.options.maxEditCount=t,y.saveOptions(y.options)}),this.createNumericInput(this.contentContainer.querySelector("#maximum-queue-size"),y.options.maxQueueSize,10,100,5,t=>{y.options.maxQueueSize=t,y.saveOptions(y.options)}),this.createNumericInput(this.contentContainer.querySelector("#minimum-ores-score"),y.options.minimumORESScore,0,1,.05,t=>{y.options.minimumORESScore=t,y.saveOptions(y.options)});const t=this.contentContainer.querySelector("#watchlist-expiry"),e=document.createElement("select");e.innerHTML='\n\t\t\t\t<option value="none">None</option>\n\t\t\t\t<option value="1 hour">1 hour</option>\n\t\t\t\t<option value="1 day">1 day</option>\n\t\t\t\t<option value="1 week">1 week</option>\n\t\t\t\t<option value="1 month">1 month</option>\n\t\t\t\t<option value="3 months">3 months</option>\n\t\t\t\t<option value="6 months">6 months</option>\n\t\t\t\t<option value="indefinite">Indefinite</option>\n\t\t\t',e.value=y.options.watchlistExpiry,e.addEventListener("change",()=>{y.options.watchlistExpiry=e.value,y.saveOptions(y.options)}),t.appendChild(e);const n=this.contentContainer.querySelector("#highlighted-expiry"),i=document.createElement("select");i.innerHTML='\n\t\t\t\t<option value="none">None</option>\n\t\t\t\t<option value="1 hour">1 hour</option>\n\t\t\t\t<option value="1 day">1 day</option>\n\t\t\t\t<option value="1 week">1 week</option>\n\t\t\t\t<option value="1 month">1 month</option>\n\t\t\t\t<option value="3 months">3 months</option>\n\t\t\t\t<option value="6 months">6 months</option>\n\t\t\t\t<option value="indefinite">Indefinite</option>\n\t\t\t',i.value=y.options.highlightedExpiry,i.addEventListener("change",()=>{y.options.highlightedExpiry=i.value,y.saveOptions(y.options)}),n.appendChild(i),o.namespaces.forEach(t=>{this.contentContainer.querySelector("#namespace-container").innerHTML+=`\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\ttype="checkbox"\n\t\t\t\t\t\t\tdata-nsid="${t.id}"\n\t\t\t\t\t\t\tclass="ns-checkbox"\n\t\t\t\t\t\t\t${y.options.namespacesShown.includes(t.id)?"checked":""}>\n\t\t\t\t\t\t<label>${t.name}</label>\n\t\t\t\t\t</div>\n\t\t\t\t`}),[...this.contentContainer.querySelectorAll(".ns-checkbox")].forEach(t=>{t.addEventListener("change",()=>{if(t.checked){const e=new Set(y.options.namespacesShown);e.add(Number(t.dataset.nsid)),y.options.namespacesShown=[...e]}else y.options.namespacesShown=y.options.namespacesShown.filter(e=>e!==Number(t.dataset.nsid));y.saveOptions(y.options)})})}openAudio(){var t;this.contentContainer.innerHTML='\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title">Master Volume</div>\n\t\t\t\t\t<div class="settings-section-desc">Controls the overall volume of all sounds</div>\n\t\t\t\t\t<div id="master-volume-control"></div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="settings-toggles-section">\n\t\t\t\t\t<div class="settings-section-header">\n\t\t\t\t\t\t<span class="settings-section-header-icon">ORES</span>\n\t\t\t\t\t\t<span>ORES Alerts</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="settings-section compact inline" id="sound-alert-toggle">\n\t\t\t\t\t\t<div class="settings-section-content">\n\t\t\t\t\t\t\t<div class="settings-section-title">Sound alerts for high ORES scores</div>\n\t\t\t\t\t\t\t<div class="settings-section-desc">Play a sound when an edit above the threshold is added to the queue</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="settings-section compact inline" id="sound-alert-ores-score">\n\t\t\t\t\t\t<div class="settings-section-content">\n\t\t\t\t\t\t\t<div class="settings-section-title">ORES score threshold</div>\n\t\t\t\t\t\t\t<div class="settings-section-desc">Play a sound alert when an edit with an ORES score above this value is added</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title">Individual Sound Volumes</div>\n\t\t\t\t\t<div class="settings-section-desc">Adjust the volume for each sound effect and preview them</div>\n\t\t\t\t\t<div id="sound-volumes-container"></div>\n\t\t\t\t</div>\n\t\t\t',this.createVolumeControl(this.contentContainer.querySelector("#master-volume-control"),null,"Master Volume","Controls all sound volumes",null);const e=this.contentContainer.querySelector("#master-volume-control");e.innerHTML="";const n=document.createElement("div");n.classList.add("audio-volume-control"),e.appendChild(n);const i=null!==(t=y.options.masterVolume)&&void 0!==t?t:.5;n.innerHTML=`\n\t\t\t\t<div class="audio-control-slider-container">\n\t\t\t\t\t<input type="range" class="audio-volume-slider" min="0" max="1" step="0.01" value="${i}">\n\t\t\t\t\t<input type="number" class="audio-volume-input" min="0" max="1" step="0.01" value="${i}">\n\t\t\t\t</div>\n\t\t\t`;const o=n.querySelector(".audio-volume-slider"),a=n.querySelector(".audio-volume-input"),r=t=>{const e=Math.max(0,Math.min(1,Number(t)));o.value=e,a.value=e.toFixed(2),y.options.masterVolume=e,y.saveOptions(y.options)};o.addEventListener("input",()=>r(o.value)),a.addEventListener("change",()=>r(a.value)),this.createToggle(this.contentContainer.querySelector("#sound-alert-toggle"),y.options.enableSoundAlerts,t=>{y.options.enableSoundAlerts=t,y.saveOptions(y.options)}),this.createNumericInput(this.contentContainer.querySelector("#sound-alert-ores-score"),y.options.soundAlertORESScore,0,1,.05,t=>{y.options.soundAlertORESScore=t,y.saveOptions(y.options)});const s=this.contentContainer.querySelector("#sound-volumes-container");[{key:"click",title:"Click Sound",desc:"Played when clicking buttons and UI elements",fn:y.queue.playClickSound},{key:"notification",title:"Notification Sound",desc:"Played when you recieve an alert or notice",fn:y.queue.playNotificationSound},{key:"alert",title:"Alert Sound",desc:"Played when a high ORES score edit is added to the queue",fn:y.queue.playAlertSound},{key:"whoosh",title:"Whoosh Sound",desc:"Played when items are removed or cleared",fn:y.queue.playWhooshSound},{key:"warn",title:"Warn Sound",desc:"Played when issuing a warning to a user",fn:y.queue.playWarnSound},{key:"rollback",title:"Rollback Sound",desc:"Played when performing a rollback action",fn:y.queue.playRollbackSound},{key:"report",title:"Report Sound",desc:"Played when reporting a user or page",fn:y.queue.playReportSound},{key:"thank",title:"Thank Sound",desc:"Played when thanking a user for their edit",fn:y.queue.playThankSound},{key:"protection",title:"Protection Sound",desc:"Played when requesting page protection",fn:y.queue.playProtectionSound},{key:"block",title:"Block Sound",desc:"Played when blocking a user",fn:y.queue.playBlockSound},{key:"sparkle",title:"Sparkle Sound",desc:"Played when highlighting or whitelisting users",fn:y.queue.playSparkleSound}].forEach(t=>{this.createVolumeControl(s,t.key,t.title,t.desc,t.fn)})}openAppearance(){this.contentContainer.innerHTML='\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title">Appearance</div>\n\t\t\t\t\t<div class="settings-section-desc">\n\t\t\t\t\t\tLight mode will come to WikiShield in a future release.\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style="\n\t\t\t\t\t\tmargin-top: 24px;\n\t\t\t\t\t\tpadding: 20px;\n\t\t\t\t\t\tbackground: linear-gradient(135deg, rgba(102, 126, 234, 0.15), rgba(240, 147, 251, 0.15));\n\t\t\t\t\t\tborder: 1px solid rgba(102, 126, 234, 0.3);\n\t\t\t\t\t\tborder-radius: 12px;\n\t\t\t\t\t\ttext-align: center;\n\t\t\t\t\t">\n\t\t\t\t\t\t<div style="font-size: 2em; margin-bottom: 12px;">🌙</div>\n\t\t\t\t\t\t<div style="font-weight: 600; font-size: 1.1em; margin-bottom: 8px; color: #e0e0e0;">Dark Mode Active</div>\n\t\t\t\t\t\t<div style="opacity: 0.8; font-size: 0.9em; color: #c0c0c0;">The ultimate viewing experience</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t'}openControls(){this.contentContainer.innerHTML='\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title">Control scripts</div>\n\t\t\t\t\t<div class="settings-section-desc">Below you can change what actions are completed when a key is pressed.</div>\n\t\t\t\t\t<div class="add-action-button new-control-script">\n\t\t\t\t\t\t<span class="fa fa-plus"></span>\n\t\t\t\t\t\tNew control script\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t';for(const t of y.options.controlScripts){const e=document.createElement("div");e.classList.add("settings-section"),this.contentContainer.appendChild(e),this.createControlInterface(e,t)}this.updateDuplicateControls();this.contentContainer.querySelector(".new-control-script").addEventListener("click",()=>{y.options.controlScripts.unshift({keys:[],actions:[]}),this.openControls()})}findDuplicateControls(){const t={};for(const e of y.options.controlScripts)for(const n of e.keys)t[n]||(t[n]=0),t[n]+=1;const e=[];return Object.keys(t).forEach(n=>{t[n]>1&&e.push(n)}),e}updateDuplicateControls(){const t=this.findDuplicateControls();[...document.querySelectorAll(".control-keys > div[data-key]")].forEach(e=>{t.includes(e.dataset.key)?e.classList.add("key-duplicate"):e.classList.remove("key-duplicate")})}createControlInterface(t,e){t.innerHTML='\n\t\t\t\t<div class="control-container">\n\t\t\t\t\t<div class="control-container-title">When these keys are pressed</div>\n\t\t\t\t\t<div class="control-keys"></div>\n\t\t\t\t\t<div class="control-container-title" style="margin-top: 10px;">Complete these actions</div>\n\t\t\t\t\t<div class="control-actions"></div>\n\t\t\t\t</div>\n\t\t\t';const n=t.querySelector(".control-keys"),i=t.querySelector(".control-actions");for(const i of e.keys){const o=document.createElement("div");n.appendChild(o),o.innerHTML=`\n\t\t\t\t\t<div class="key-elem-title">${" "===i?"space":i}</div>\n\t\t\t\t\t<span class="fas fa-trash-can remove"></span>\n\t\t\t\t`,o.dataset.key=i,o.querySelector(".remove").addEventListener("click",()=>{const n=new Set(e.keys);n.delete(i),e.keys=[...n],this.createControlInterface(t,e),this.updateDuplicateControls(),y.saveOptions(y.options)})}const o=document.createElement("div");n.appendChild(o),o.innerHTML='<span class="fas fa-plus"></span>',o.style.cursor="pointer",o.addEventListener("click",()=>{[...document.querySelectorAll(".key-select")].forEach(t=>t.remove());const n=document.createElement("div");n.classList.add("key-select"),n.innerHTML="Press a key...",o.parentElement.insertBefore(n,o),n.addEventListener("click",()=>n.remove()),this.keypressCallback=n=>{const i=new Set(e.keys);i.add(n),e.keys=[...i],this.createControlInterface(t,e),this.updateDuplicateControls(),this.keypressCallback=null,y.saveOptions(y.options)}});for(const n of e.actions)this.createActionItem(i,n,e,()=>{y.saveOptions(y.options),this.createControlInterface(t,e)});const a=document.createElement("div");a.classList.add("control-bottom-container"),a.innerHTML='\n\t\t\t\t<div class="add-action-container"></div>\n\t\t\t\t<div>\n\t\t\t\t\t<div class="add-action-button control-delete">Delete</div>\n\t\t\t\t</div>\n\t\t\t',i.appendChild(a),a.querySelector(".control-delete").addEventListener("click",()=>{y.queue.playClickSound(),y.options.controlScripts.splice(y.options.controlScripts.indexOf(e),1),y.saveOptions(y.options),this.openControls()});const r=a.querySelector(".add-action-container"),s=()=>{r.innerHTML='<div class="add-action-button new-button">Add new action</div>',r.querySelector(".new-button").addEventListener("click",()=>{y.queue.playClickSound(),r.innerHTML='\n\t\t\t\t\t\t<select style="height: 35px;"></select>\n\t\t\t\t\t\t<div class="add-action-button cancel-button">Cancel</div>\n\t\t\t\t\t\t<div class="add-action-button create-button">Create</div>\n\t\t\t\t\t';const n=r.querySelector("select");Object.keys(y.interface.eventManager.events).forEach(t=>{n.innerHTML+=`<option value="${t}">${y.interface.eventManager.events[t].description}</option>`}),n.innerHTML+='<option value="if">If condition</option>',r.querySelector(".cancel-button").addEventListener("click",()=>{y.queue.playClickSound(),s()}),r.querySelector(".create-button").addEventListener("click",()=>{y.queue.playClickSound();const i={name:n.value,params:{}};"if"===n.value&&(i.actions=[],i.condition="operatorNonAdmin"),e.actions.push(i),y.saveOptions(y.options),this.createControlInterface(t,e)})})};s()}findParentOfAction(t,e){if(-1!==e.actions.indexOf(t))return e;for(const n of e.actions)if("if"===n.name){const e=this.findParentOfAction(t,n);if(e)return e}}createActionItem(t,e,n,i){const o=document.createElement("div");if(o.classList.add("control-action"),t.appendChild(o),"if"===e.name){o.innerHTML='\n\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t<span class="fas fa-circle-question"></span>\n\t\t\t\t\t\t\tIf <select></select> then:\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="control-action-title-right"></div>\n\t\t\t\t\t</div>\n\t\t\t\t';const t=o.querySelector("select");for(const e in u.conditions)t.innerHTML+=`<option value=${e}>${u.conditions[e].desc}</option>`;t.value=e.condition,t.addEventListener("change",()=>{e.condition=t.value,i()});for(const t of e.actions)this.createActionItem(o,t,n,i)}else{const t=y.interface.eventManager.events[e.name];o.innerHTML=`\n\t\t\t\t\t<div class="control-action-title">\n\t\t\t\t\t\t<div class="control-action-title-left">\n\t\t\t\t\t\t\t<span class="${t.icon}"></span>\n\t\t\t\t\t\t\t${t.description}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="control-action-title-right"></div>\n\t\t\t\t\t</div>\n\t\t\t\t`;for(const n of t.parameters||[])this.createItemParameter(o,n,e.params[n.id]||"",t=>{e.params[n.id]=t,y.saveOptions(y.options)})}o.querySelector(".control-action-title-right").innerHTML='\n\t\t\t\t<span class="fas fa-chevron-up move-action-up"></span>\n\t\t\t\t<span class="fas fa-chevron-down move-action-down"></span>\n\t\t\t\t<span class="fas fa-trash-can delete-action"></span>\n\t\t\t',o.querySelector(".move-action-down").addEventListener("click",()=>{const t=this.findParentOfAction(e,n),o=t.actions.indexOf(e);if(t.actions.indexOf(e)===t.actions.length-1){if("if"!==t.name)return;const i=this.findParentOfAction(t,n);i.actions.splice(i.actions.indexOf(t)+1,0,e),t.actions.splice(o,1)}else{const n=t.actions[o+1];"if"===n.name?(n.actions.unshift(e),t.actions.splice(o,1)):(t.actions.splice(o,1),t.actions.splice(o+1,0,e))}i()}),o.querySelector(".move-action-up").addEventListener("click",()=>{const t=this.findParentOfAction(e,n),o=t.actions.indexOf(e);if(0===t.actions.indexOf(e)){if("if"!==t.name)return;const i=this.findParentOfAction(t,n);i.actions.splice(i.actions.indexOf(t),0,e),t.actions.splice(o,1)}else{const n=t.actions[o-1];"if"===n.name?(n.actions.push(e),t.actions.splice(o,1)):(t.actions.splice(o,1),t.actions.splice(o-1,0,e))}i()}),o.querySelector(".delete-action").addEventListener("click",()=>{const t=this.findParentOfAction(e,n);t.actions.splice(t.actions.indexOf(e),1),i()})}createItemParameter(t,e,n,i){const o=document.createElement("div");if(o.classList.add("action-parameter"),t.appendChild(o),o.innerHTML=`\n\t\t\t\t<div class="parameter-title">${e.title}</div>\n\t\t\t`,"choice"===e.type){o.innerHTML+="<select></select>";const t=o.querySelector("select");for(const n of e.options)t.innerHTML+=`<option>${n}</option>`;t.value=n,t.addEventListener("change",()=>i(t.value))}else if("text"===e.type){o.innerHTML+='<input type="text">';const t=o.querySelector("input");t.value=n,t.addEventListener("keydown",e=>{"enter"===e.key.toLowerCase()&&(i(t.value),t.blur())}),t.addEventListener("blur",()=>i(t.value))}}openAI(){this.contentContainer.innerHTML=`\n\t\t\t\t<div class="settings-section" id="enable-ollama-ai">\n\t\t\t\t\t<div class="settings-section-title">Enable Ollama AI Analysis</div>\n\t\t\t\t\t<div class="settings-section-desc">Use local AI models with complete privacy. Free & fast.</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="settings-section" id="ollama-server-url">\n\t\t\t\t\t<div class="settings-section-title">Server URL</div>\n\t\t\t\t\t<div class="settings-section-desc">\n\t\t\t\t\t\t<input type="text" id="ollama-url-input" value="${y.options.ollamaServerUrl}"\n\t\t\t\t\t\t\tstyle="width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; font-family: monospace; margin-bottom: 8px;"\n\t\t\t\t\t\t\tplaceholder="http://localhost:11434">\n\t\t\t\t\t\t<button id="test-connection-btn" style="padding: 6px 12px; background: #667eea; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 0.9em;">\n\t\t\t\t\t\t\tTest Connection\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<span id="connection-status" style="margin-left: 8px; font-size: 0.9em;"></span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="settings-section" id="ollama-model-select">\n\t\t\t\t\t<div class="settings-section-title">Model Selection</div>\n\t\t\t\t\t<div class="settings-section-desc">\n\t\t\t\t\t\t<button id="refresh-models-btn" style="padding: 6px 12px; background: #667eea; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 0.9em;">\n\t\t\t\t\t\t\t<span class="fa fa-sync"></span> Refresh Models\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<span id="models-status" style="margin-left: 8px; font-size: 0.9em;"></span>\n\t\t\t\t\t\t<div style="margin-top: 12px;" id="models-container">\n\t\t\t\t\t\t\t<div style="color: #666; font-style: italic; font-size: 0.9em;">Click "Refresh Models" to load available models</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title" style="color: #dc3545;">CORS Setup Required</div>\n\t\t\t\t\t<div class="settings-section-desc" style="background: #fff3cd20; padding: 10px; border-radius: 6px; border-left: 4px solid #ffc107; font-size: 0.9em; color: #333;">\n\t\t\t\t\t\t<strong>Set environment variable:</strong> <code style="background: #f0f0f0; padding: 2px 6px; border-radius: 3px; color: #333;">OLLAMA_ORIGINS</code>\n\t\t\t\t\t\t<br><strong>Value:</strong> <code style="background: #f0f0f0; padding: 2px 6px; border-radius: 3px; color: #333;">https://en.wikipedia.org,https://*.wikipedia.org</code>\n\t\t\t\t\t\t<br><br>\n\t\t\t\t\t\t<details style="cursor: pointer;">\n\t\t\t\t\t\t\t<summary style="font-weight: 600; margin-bottom: 6px;">Windows (Permanent)</summary>\n\t\t\t\t\t\t\t<ol style="margin: 6px 0; padding-left: 20px; font-size: 0.85em;">\n\t\t\t\t\t\t\t\t<li>System Properties → Environment Variables</li>\n\t\t\t\t\t\t\t\t<li>New Variable: <code style="color: #333;">OLLAMA_ORIGINS</code></li>\n\t\t\t\t\t\t\t\t<li>Value: <code style="color: #333;">https://en.wikipedia.org,https://*.wikipedia.org</code></li>\n\t\t\t\t\t\t\t\t<li>Restart Ollama</li>\n\t\t\t\t\t\t\t</ol>\n\t\t\t\t\t\t</details>\n\t\t\t\t\t\t<details style="cursor: pointer;">\n\t\t\t\t\t\t\t<summary style="font-weight: 600; margin-bottom: 6px;">Windows (Temporary)</summary>\n\t\t\t\t\t\t\t<pre style="background: #2d2d2d; color: #f8f8f2; padding: 8px; border-radius: 4px; font-size: 0.8em; margin: 6px 0;">$env:OLLAMA_ORIGINS="https://en.wikipedia.org,https://*.wikipedia.org"\n\tollama serve</pre>\n\t\t\t\t\t\t</details>\n\t\t\t\t\t\t<details style="cursor: pointer;">\n\t\t\t\t\t\t\t<summary style="font-weight: 600; margin-bottom: 6px;">macOS/Linux</summary>\n\t\t\t\t\t\t\tAdd to <code>~/.bashrc</code> or <code>~/.zshrc</code>:\n\t\t\t\t\t\t\t<pre style="background: #2d2d2d; color: #f8f8f2; padding: 8px; border-radius: 4px; font-size: 0.8em; margin: 6px 0;">export OLLAMA_ORIGINS="https://en.wikipedia.org,https://*.wikipedia.org"</pre>\n\t\t\t\t\t\t\tThen: <code>source ~/.bashrc && ollama serve</code>\n\t\t\t\t\t\t</details>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title">Quick Info</div>\n\t\t\t\t\t<div class="settings-section-desc" style="font-size: 0.9em;">\n\t\t\t\t\t\t<strong>Get Ollama:</strong> <a href="https://ollama.com" target="_blank" style="color: #667eea; font-weight: bold;">ollama.com</a>\n\t\t\t\t\t\t<br><strong>Popular models:</strong> llama3.2, mistral, gemma2, qwen2.5\n\t\t\t\t\t\t<br><strong>Detects:</strong> Vandalism, spam, POV, attacks, copyright issues, policy violations\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`,this.createToggle(this.contentContainer.querySelector("#enable-ollama-ai"),y.options.enableOllamaAI,t=>{y.options.enableOllamaAI=t,y.saveOptions(y.options),t?(y.ollamaAI=new c(y.options.ollamaServerUrl,y.options.ollamaModel),y.logger.log("Ollama AI integration enabled")):(y.ollamaAI=null,y.logger.log("Ollama AI integration disabled"))});const t=this.contentContainer.querySelector("#ollama-url-input");t.addEventListener("change",()=>{y.options.ollamaServerUrl=t.value.trim(),y.saveOptions(y.options),y.ollamaAI&&(y.ollamaAI.serverUrl=y.options.ollamaServerUrl),y.logger.log(`Ollama server URL updated: ${y.options.ollamaServerUrl}`)});const e=this.contentContainer.querySelector("#test-connection-btn"),n=this.contentContainer.querySelector("#connection-status");e.addEventListener("click",async()=>{y.ollamaAI&&y.ollamaAI.cancelAllAnalyses(),n.innerHTML='<span style="color: #ffc107;">Testing...</span>',e.disabled=!0;const t=new c(y.options.ollamaServerUrl,""),i=await t.testConnection();n.innerHTML=i?'<span style="color: #28a745;"><span class="fa fa-check-circle"></span> Connected!</span>':'\n\t\t\t\t\t\t<span style="color: #dc3545;">\n\t\t\t\t\t\t\t<span class="fa fa-times-circle"></span> Failed to connect\n\t\t\t\t\t\t\t<br><small style="font-size: 0.85em;">Make sure Ollama is running with CORS enabled (see instructions above)</small>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t',e.disabled=!1});const i=this.contentContainer.querySelector("#refresh-models-btn"),o=this.contentContainer.querySelector("#models-status"),a=this.contentContainer.querySelector("#models-container");i.addEventListener("click",async()=>{y.ollamaAI&&y.ollamaAI.cancelAllAnalyses(),o.innerHTML='<span style="color: #ffc107;">Loading...</span>',i.disabled=!0;try{const t=new c(y.options.ollamaServerUrl,""),e=await t.fetchModels();if(0===e.length)a.innerHTML='<div style="color: #dc3545;">No models found. Please install models using: <code>ollama pull [model-name]</code></div>',o.innerHTML='<span style="color: #dc3545;">No models found</span>';else{o.innerHTML=`<span style="color: #28a745;"><span class="fa fa-check-circle"></span> Found ${e.length} model(s)</span>`;let t='<div style="display: grid; gap: 8px; margin-top: 8px;">';e.forEach(e=>{const n=e.name===y.options.ollamaModel,i=(e.size/1024/1024/1024).toFixed(1);t+=`\n\t\t\t\t\t\t\t\t<div class="ollama-model-item" data-model="${e.name}" style="\n\t\t\t\t\t\t\t\t\tpadding: 12px;\n\t\t\t\t\t\t\t\t\tborder: 2px solid ${n?"#667eea":"rgba(128, 128, 128, 0.3)"};\n\t\t\t\t\t\t\t\t\tborder-radius: 6px;\n\t\t\t\t\t\t\t\t\tcursor: pointer;\n\t\t\t\t\t\t\t\t\tbackground: ${n?"rgba(102, 126, 234, 0.15)":"transparent"};\n\t\t\t\t\t\t\t\t\ttransition: all 0.2s;\n\t\t\t\t\t\t\t\t">\n\t\t\t\t\t\t\t\t\t<div style="display: flex; align-items: center; gap: 8px;">\n\t\t\t\t\t\t\t\t\t\t<span class="fa ${n?"fa-check-circle":"fa-circle"}" style="color: ${n?"#667eea":"rgba(128, 128, 128, 0.5)"};"></span>\n\t\t\t\t\t\t\t\t\t\t<strong style="flex: 1;">${e.name}</strong>\n\t\t\t\t\t\t\t\t\t\t<span style="font-size: 0.85em; opacity: 0.7;">${i} GB</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div style="font-size: 0.85em; opacity: 0.6; margin-top: 4px;">\n\t\t\t\t\t\t\t\t\t\tModified: ${new Date(e.modified_at).toLocaleDateString()}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`}),t+="</div>",a.innerHTML=t,a.querySelectorAll(".ollama-model-item").forEach(t=>{t.addEventListener("click",()=>{y.ollamaAI&&y.ollamaAI.cancelAllAnalyses();const e=t.dataset.model;y.options.ollamaModel=e,y.saveOptions(y.options),y.ollamaAI&&(y.ollamaAI.model=e),y.logger.log(`Ollama model selected: ${e}`),a.querySelectorAll(".ollama-model-item").forEach(t=>{t.style.border="2px solid rgba(128, 128, 128, 0.3)",t.style.background="transparent",t.querySelector(".fa").classList.remove("fa-check-circle"),t.querySelector(".fa").classList.add("fa-circle"),t.querySelector(".fa").style.color="rgba(128, 128, 128, 0.5)"}),t.style.border="2px solid #667eea",t.style.background="rgba(102, 126, 234, 0.15)",t.querySelector(".fa").classList.remove("fa-circle"),t.querySelector(".fa").classList.add("fa-check-circle"),t.querySelector(".fa").style.color="#667eea"}),t.addEventListener("mouseenter",()=>{t.dataset.model!==y.options.ollamaModel&&(t.style.borderColor="#667eea")}),t.addEventListener("mouseleave",()=>{t.dataset.model!==y.options.ollamaModel&&(t.style.borderColor="rgba(128, 128, 128, 0.3)")})})}}catch(t){a.innerHTML=`\n\t\t\t\t\t\t<div class="error-box" style="color: #721c24; padding: 12px; background: #fff3cd20; border-radius: 6px; border-left: 4px solid #dc3545;">\n\t\t\t\t\t\t\t<strong>Error:</strong> ${t.message}\n\t\t\t\t\t\t\t<br><br>\n\t\t\t\t\t\t\t<strong>Troubleshooting:</strong>\n\t\t\t\t\t\t\t<ul style="margin: 8px 0; padding-left: 20px;">\n\t\t\t\t\t\t\t\t<li>Make sure Ollama is running</li>\n\t\t\t\t\t\t\t\t<li>Check that CORS is enabled (see instructions above)</li>\n\t\t\t\t\t\t\t\t<li>Verify the server URL is correct</li>\n\t\t\t\t\t\t\t\t<li>Try the "Test Connection" button first</li>\n\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`,o.innerHTML='<span style="color: #dc3545;"><span class="fa fa-times-circle"></span> Error loading models</span>'}i.disabled=!1})}openGadgets(){this.contentContainer.innerHTML='\n\t\t\t\t<div class="settings-toggles-section">\n\t\t\t\t\t<div class="settings-section-header">\n\t\t\t\t\t\t<span class="settings-section-header-icon">Simple</span>\n\t\t\t\t\t\t<span></span>\n\t\t\t\t\t</div>\n <div class="settings-section compact inline" id="username-highlighting-toggle">\n\t\t\t\t\t\t<div class="settings-section-content">\n\t\t\t\t\t\t\t<div class="settings-section-title">Highlight username</div>\n\t\t\t\t\t\t\t<div class="settings-section-desc">If your username appears in a diff, the edit is highlighted in the queue and outlined in the diff.</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n <div class="settings-section compact inline" id="welcome-latin-toggle">\n\t\t\t\t\t\t<div class="settings-section-content">\n\t\t\t\t\t\t\t<div class="settings-section-title">Latin welcome</div>\n\t\t\t\t\t\t\t<div class="settings-section-desc">When a Latin character is detected in a username, the Latin welcome template will be used instead of the default.</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="settings-section compact inline" id="auto-welcome-toggle">\n\t\t\t\t\t\t<div class="settings-section-content">\n\t\t\t\t\t\t\t<div class="settings-section-title">Automatic welcoming of new users</div>\n\t\t\t\t\t\t\t<div class="settings-section-desc">Automatically welcome new users with empty talk pages when moving past their constructive edits</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="settings-toggles-section">\n\t\t\t\t\t<div class="settings-section-header">\n\t\t\t\t\t\t<span class="settings-section-header-icon">AI</span>\n\t\t\t\t\t\t<span>Requires AI Analysis to be enabled</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="settings-section compact inline" id="edit-analysis-toggle">\n\t\t\t\t\t\t<div class="settings-section-content">\n\t\t\t\t\t\t\t<div class="settings-section-title">Edit Analysis</div>\n\t\t\t\t\t\t\t<div class="settings-section-desc">Suggests actions to take on edits, such as "welcome", "thank", "rollback", "rever-and-warn"</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="settings-section compact inline" id="username-analysis-toggle">\n\t\t\t\t\t\t<div class="settings-section-content">\n\t\t\t\t\t\t\t<div class="settings-section-title">Username Analysis</div>\n\t\t\t\t\t\t\t<div class="settings-section-desc">Flags potentially problematic usernames and prompts you to report them to UAA</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t',this.createToggle(this.contentContainer.querySelector("#username-highlighting-toggle"),y.options.enableUsernameHighlighting,t=>{y.options.enableUsernameHighlighting=t,y.saveOptions(y.options)}),this.createToggle(this.contentContainer.querySelector("#welcome-latin-toggle"),y.options.enableWelcomeLatin,t=>{y.options.enableWelcomeLatin=t,y.saveOptions(y.options)}),this.createToggle(this.contentContainer.querySelector("#auto-welcome-toggle"),y.options.enableAutoWelcome,t=>{y.options.enableAutoWelcome=t,y.saveOptions(y.options)}),this.createToggle(this.contentContainer.querySelector("#edit-analysis-toggle"),y.options.enableEditAnalysis,t=>{y.options.enableEditAnalysis=t,y.saveOptions(y.options)}),this.createToggle(this.contentContainer.querySelector("#username-analysis-toggle"),y.options.enableUsernameAnalysis,t=>{y.options.enableUsernameAnalysis=t,y.saveOptions(y.options)})}openWhitelist(){this.contentContainer.innerHTML='\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title">Whitelisted users</div>\n\t\t\t\t\t<div class="settings-section-desc">This is a list of users you have whitelisted. Edits by these users will not appear in your queue.</div>\n\t\t\t\t\t<div class="user-input-container">\n\t\t\t\t\t\t<input type="text" id="whitelist-username-input" placeholder="Enter username to whitelist..." class="username-input">\n\t\t\t\t\t\t<button id="add-whitelist-user" class="add-user-button">\n\t\t\t\t\t\t\tAdd User\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="settings-section user-container"></div>\n\t\t\t';const t=this.contentContainer.querySelector(".user-container"),e=this.contentContainer.querySelector("#whitelist-username-input"),n=this.contentContainer.querySelector("#add-whitelist-user"),i=()=>{const t=e.value.trim();t&&(y.whitelist.set(t,Date.now()),y.saveWhitelist(),e.value="",this.openWhitelist(),y.sounds.success())};n.addEventListener("click",i),e.addEventListener("keypress",t=>{"Enter"===t.key&&i()}),this.createUserListWithDates(t,y.whitelist,y.saveWhitelist.bind(y))}createUserList(t,e){for(const n of[...e]){const i=document.createElement("div");t.appendChild(i),i.innerHTML=`\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<a target="_blank" href="https://dokumen123.com/en/${y.util.pageLink(`Special:Contributions/${n}`)}">${n}</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="add-action-button remove-button">Remove</div>\n\t\t\t\t`,i.querySelector(".remove-button").addEventListener("click",()=>{e.delete(n),i.remove()})}}createUserListWithDates(t,e,n){const i=[...e.entries()].sort((t,e)=>e[1]-t[1]);for(const[o,a]of i){const i=document.createElement("div");i.style.display="flex",i.style.justifyContent="space-between",i.style.alignItems="center",i.style.padding="8px 12px",i.style.marginBottom="6px",i.style.background="rgba(255, 255, 255, 0.05)",i.style.borderRadius="8px",i.style.border="1px solid rgba(255, 255, 255, 0.1)";const r=new Date(a),s=r.toLocaleDateString()+" "+r.toLocaleTimeString();t.appendChild(i),i.innerHTML=`\n\t\t\t\t\t<div style="display: flex; flex-direction: column; gap: 4px;">\n\t\t\t\t\t\t<a target="_blank" href="https://dokumen123.com/en/${y.util.pageLink(`Special:Contributions/${o}`)}" style="font-weight: 600;">${o}</a>\n\t\t\t\t\t\t<span style="font-size: 0.85em; opacity: 0.7;">Added: ${s}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="add-action-button remove-button">Remove</div>\n\t\t\t\t`,i.querySelector(".remove-button").addEventListener("click",()=>{e.delete(o),i.remove(),n&&n()})}0===i.length&&(t.innerHTML='<div style="opacity: 0.6; text-align: center; padding: 20px;">No users in list</div>')}openHighlighted(){const t=y.options.highlightedExpiry;this.contentContainer.innerHTML=`\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title">Highlighted users</div>\n\t\t\t\t\t<div class="settings-section-desc">This is a list of users you have highlighted. Edits by these users will appear before other edits in your queue. Highlights expire based on your configured expiry time (currently: ${t}).</div>\n\t\t\t\t\t<div class="user-input-container">\n\t\t\t\t\t\t<input type="text" id="highlighted-username-input" placeholder="Enter username to highlight..." class="username-input">\n\t\t\t\t\t\t<button id="add-highlighted-user" class="add-user-button">\n\t\t\t\t\t\t\tAdd User\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="settings-section user-container"></div>\n\t\t\t`;const e=this.contentContainer.querySelector(".user-container"),n=this.contentContainer.querySelector("#highlighted-username-input"),i=this.contentContainer.querySelector("#add-highlighted-user"),o=()=>{const t=n.value.trim();if(t){const e=y.util.expiryToMilliseconds(y.options.highlightedExpiry),i=Date.now()+e;y.highlighted.set(t,i),y.saveHighlighted(),n.value="",this.openHighlighted(),y.sounds.success()}};i.addEventListener("click",o),n.addEventListener("keypress",t=>{"Enter"===t.key&&o()}),this.createHighlightedUserList(e)}createHighlightedUserList(t){const e=[...y.highlighted.entries()].sort((t,e)=>e[1]-t[1]);for(const[n,i]of e){const e=document.createElement("div");e.style.display="flex",e.style.justifyContent="space-between",e.style.alignItems="center",e.style.padding="8px 12px",e.style.marginBottom="6px",e.style.background="rgba(255, 255, 255, 0.05)",e.style.borderRadius="8px",e.style.border="1px solid rgba(255, 255, 255, 0.1)";const o=y.util.expiryToMilliseconds(y.options.highlightedExpiry),a=new Date(i-o),r=a.toLocaleDateString()+" "+a.toLocaleTimeString(),s=new Date(i),l=s.toLocaleDateString()+" "+s.toLocaleTimeString(),d=Date.now()>i;t.appendChild(e),e.innerHTML=`\n\t\t\t\t\t<div style="display: flex; flex-direction: column; gap: 4px;">\n\t\t\t\t\t\t<a target="_blank" href="https://dokumen123.com/en/${y.util.pageLink(`Special:Contributions/${n}`)}" style="font-weight: 600;">${n}</a>\n\t\t\t\t\t\t<span style="font-size: 0.85em; opacity: 0.7;">Added: ${r}</span>\n\t\t\t\t\t\t<span style="font-size: 0.85em; opacity: 0.7; color: ${d?"#ff6b6b":"#51cf66"};">\n\t\t\t\t\t\t\t${d?"Expired":"Expires"}: ${l}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="add-action-button remove-button">Remove</div>\n\t\t\t\t`,e.querySelector(".remove-button").addEventListener("click",()=>{y.highlighted.delete(n),e.remove(),y.saveHighlighted()})}0===e.length&&(t.innerHTML='<div style="opacity: 0.6; text-align: center; padding: 20px;">No users highlighted</div>')}openStatistics(){const t=y.statistics,e=t.reviewed>0?Math.round(t.reverts/t.reviewed*1e3)/10:0,n=Date.now()-(t.sessionStart||Date.now()),i=Math.floor(n/36e5),o=Math.floor(n%36e5/6e4),a=i>0?Math.round(t.reviewed/i*10)/10:0;this.contentContainer.innerHTML=`\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title">Statistics Overview</div>\n\t\t\t\t\t<div class="stats-grid">\n\t\t\t\t\t\t<div class="stat-card">\n\t\t\t\t\t\t\t<div class="stat-value">${t.reviewed}</div>\n\t\t\t\t\t\t\t<div class="stat-label">Edits Reviewed</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="stat-card">\n\t\t\t\t\t\t\t<div class="stat-value">${t.reverts}</div>\n\t\t\t\t\t\t\t<div class="stat-label">Reverts Made</div>\n\t\t\t\t\t\t\t<div class="stat-sublabel">${e}% revert rate</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="stat-card">\n\t\t\t\t\t\t\t<div class="stat-value">${t.warnings}</div>\n\t\t\t\t\t\t\t<div class="stat-label">Warnings Issued</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="stat-card">\n\t\t\t\t\t\t\t<div class="stat-value">${t.reports}</div>\n\t\t\t\t\t\t\t<div class="stat-label">Reports Filed</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="stat-card">\n\t\t\t\t\t\t\t<div class="stat-value">${t.welcomes}</div>\n\t\t\t\t\t\t\t<div class="stat-label">Users Welcomed</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="stat-card">\n\t\t\t\t\t\t\t<div class="stat-value">${t.blocks}</div>\n\t\t\t\t\t\t\t<div class="stat-label">Blocks Issued</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="stat-card">\n\t\t\t\t\t\t\t<div class="stat-value">${t.whitelisted}</div>\n\t\t\t\t\t\t\t<div class="stat-label">Users Whitelisted</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="stat-card">\n\t\t\t\t\t\t\t<div class="stat-value">${t.highlighted}</div>\n\t\t\t\t\t\t\t<div class="stat-label">Users Highlighted</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="stat-card">\n\t\t\t\t\t\t\t<div class="stat-value">${i}h ${o}m</div>\n\t\t\t\t\t\t\t<div class="stat-label">Session Time</div>\n\t\t\t\t\t\t\t<div class="stat-sublabel">${a} edits/hour</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<button id="reset-stats-button" class="danger-button">Reset Statistics</button>\n\t\t\t\t</div>\n\t\t\t`,this.contentContainer.querySelector("#reset-stats-button").addEventListener("click",()=>{confirm("Are you sure you want to reset all statistics? This cannot be undone.")&&(y.statistics={reviewed:0,reverts:0,reports:0,warnings:0,welcomes:0,whitelisted:0,highlighted:0,blocks:0,sessionStart:Date.now()},y.saveStats(y.statistics),this.openStatistics(),y.sounds.success())})}openAbout(){this.contentContainer.innerHTML=`\n\t\t\t\t<div class="settings-section" style="text-align: center; padding: 40px 20px;">\n\t\t\t\t\t<div style="margin-bottom: 24px;">\n\t\t\t\t\t\t<div style="font-size: 3em; margin-bottom: 12px;">🛡️</div>\n\t\t\t\t\t\t<div style="font-size: 2em; font-weight: 700; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; margin-bottom: 8px;">\n\t\t\t\t\t\t\tWikiShield\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="font-size: 1.1em; color: #666; font-weight: 500;">\n\t\t\t\t\t\t\tAdvanced Anti-Vandalism Tool\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div style="display: inline-flex; gap: 12px; margin: 24px 0; flex-wrap: wrap; justify-content: center;">\n\t\t\t\t\t\t<div style="padding: 8px 16px; background: linear-gradient(135deg, rgba(102, 126, 234, 0.1), rgba(118, 75, 162, 0.1)); border-radius: 12px; border: 1px solid rgba(102, 126, 234, 0.2);">\n\t\t\t\t\t\t\t<span style="font-weight: 600;">Version</span>\n\t\t\t\t\t\t\t<span style="margin-left: 8px; color: #667eea;">${n.version}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="padding: 8px 16px; background: linear-gradient(135deg, rgba(102, 126, 234, 0.1), rgba(118, 75, 162, 0.1)); border-radius: 12px; border: 1px solid rgba(102, 126, 234, 0.2);">\n\t\t\t\t\t\t\t<span style="font-weight: 600;">Created by</span>\n\t\t\t\t\t\t\t<a href="https://en.wikipedia.org/wiki/User:LuniZunie" target="_blank" style="margin-left: 8px; color: #667eea; text-decoration: none; font-weight: 600;">User:LuniZunie</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin: 32px 0; text-align: center;">\n\t\t\t\t\t\t<div style="padding: 24px 16px; background: rgba(102, 126, 234, 0.05); border-radius: 12px; border: 1px solid rgba(102, 126, 234, 0.15);">\n\t\t\t\t\t\t\t<div style="font-size: 2em; margin-bottom: 8px;">⚡</div>\n\t\t\t\t\t\t\t<div style="font-weight: 600; margin-bottom: 4px; color: #aaa;">Real-time Detection</div>\n\t\t\t\t\t\t\t<div style="font-size: 0.9em; color: #888;">Monitor edits as they happen</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="padding: 24px 16px; background: rgba(102, 126, 234, 0.05); border-radius: 12px; border: 1px solid rgba(102, 126, 234, 0.15);">\n\t\t\t\t\t\t\t<div style="font-size: 2em; margin-bottom: 8px;">🤖</div>\n\t\t\t\t\t\t\t<div style="font-weight: 600; margin-bottom: 4px; color: #aaa;">AI-Powered ORES</div>\n\t\t\t\t\t\t\t<div style="font-size: 0.9em; color: #888;">Intelligent edit scoring</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div style="padding: 24px 16px; background: rgba(102, 126, 234, 0.05); border-radius: 12px; border: 1px solid rgba(102, 126, 234, 0.15);">\n\t\t\t\t\t\t\t<div style="font-size: 2em; margin-bottom: 8px;">🎨</div>\n\t\t\t\t\t\t\t<div style="font-weight: 600; margin-bottom: 4px; color: #aaa;">Modern Interface</div>\n\t\t\t\t\t\t\t<div style="font-size: 0.9em; color: #888;">Beautiful and intuitive</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title">Changelog</div>\n\t\t\t\t\t<div style="max-height: 400px; overflow-y: auto; padding: 16px; background: rgba(248, 249, 252, 0.15); border-radius: 8px;">\n\t\t\t\t\t\t${n.changelog.HTML||"<p style='text-align: center; opacity: 0.6;'>No changelog is available.</p>"}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`;this.contentContainer.querySelectorAll("a").forEach(t=>{t.style.padding&&(t.addEventListener("mouseenter",()=>{t.style.transform="translateY(-2px)",t.style.boxShadow="0 4px 12px rgba(102, 126, 234, 0.3)"}),t.addEventListener("mouseleave",()=>{t.style.transform="translateY(0)",t.style.boxShadow="none"}))})}validateAndMergeSettings(t){const e={success:!1,settings:JSON.parse(JSON.stringify(y.options)),warnings:[],appliedCount:0,error:null};if(!t||"object"!=typeof t)return e.error="Invalid settings format",e;const n=o.defaultSettings,i=Object.keys(o.sounds),a=o.namespaces.map(t=>t.id),r=["none","1 hour","1 day","1 week","1 month","3 months","6 months","indefinite"];for(const[s,l]of Object.entries(t))if(s in n)try{switch(s){case"maxQueueSize":case"maxEditCount":"number"==typeof l&&l>=1&&l<=500?(e.settings[s]=Math.floor(l),e.appliedCount++):e.warnings.push(`${s}: Invalid value (${l}), must be 1-500`);break;case"minimumORESScore":case"soundAlertORESScore":case"masterVolume":"number"==typeof l&&l>=0&&l<=1?(e.settings[s]=l,e.appliedCount++):e.warnings.push(`${s}: Invalid value (${l}), must be 0-1`);break;case"enableSoundAlerts":case"enableUsernameHighlighting":case"enableLatinWelcome":case"enableAutoWelcome":case"enableEditAnalysis":case"enableUsernameAnalysis":case"showTemps":case"showUsers":case"sortQueueItems":case"enableOllamaAI":"boolean"==typeof l?(e.settings[s]=l,e.appliedCount++):e.warnings.push(`${s}: Invalid value (${l}), must be boolean`);break;case"volumes":if("object"==typeof l&&null!==l){let t=0;for(const[n,i]of Object.entries(l))"number"==typeof i&&i>=0&&i<=1?(e.settings.volumes||(e.settings.volumes={}),e.settings.volumes[n]=i,t++):e.warnings.push(`volumes.${n}: Invalid value (${i}), must be 0-1`);t>0&&e.appliedCount++}else e.warnings.push("volumes: Invalid format, must be object");break;case"soundMappings":if("object"==typeof l&&null!==l){let t=0;for(const[n,o]of Object.entries(l))i.includes(o)?(e.settings.soundMappings||(e.settings.soundMappings={}),e.settings.soundMappings[n]=o,t++):e.warnings.push(`soundMappings.${n}: Invalid sound (${o})`);t>0&&e.appliedCount++}else e.warnings.push("soundMappings: Invalid format, must be object");break;case"watchlistExpiry":case"highlightedExpiry":"string"==typeof l&&r.includes(l)?(e.settings[s]=l,e.appliedCount++):e.warnings.push(`${s}: Invalid value (${l}), must be one of: ${r.join(", ")}`);break;case"wiki":"string"==typeof l&&l.length>=2&&l.length<=20?(e.settings[s]=l,e.appliedCount++):e.warnings.push(`${s}: Invalid value (${l}), must be 2-20 characters`);break;case"namespacesShown":if(Array.isArray(l)){const t=l.filter(t=>a.includes(t));t.length>0?(e.settings[s]=t,e.appliedCount++,t.length<l.length&&e.warnings.push("namespacesShown: Some invalid namespace IDs were excluded")):e.warnings.push("namespacesShown: No valid namespace IDs found")}else e.warnings.push("namespacesShown: Invalid format, must be array");break;case"ollamaServerUrl":"string"==typeof l&&(l.startsWith("http://")||l.startsWith("https://"))?(e.settings[s]=l,e.appliedCount++):e.warnings.push(`${s}: Invalid URL format`);break;case"ollamaModel":"string"==typeof l?(e.settings[s]=l,e.appliedCount++):e.warnings.push(`${s}: Invalid value, must be string`);break;case"controlScripts":if(Array.isArray(l)){const t=l.filter(t=>t&&Array.isArray(t.keys)&&Array.isArray(t.actions)&&t.keys.length>0);t.length>0?(e.settings[s]=t,e.appliedCount++,t.length<l.length&&e.warnings.push("controlScripts: Some invalid scripts were excluded")):e.warnings.push("controlScripts: No valid control scripts found")}else e.warnings.push("controlScripts: Invalid format, must be array");break;case"selectedPalette":"number"==typeof l&&l>=0&&l<o.colorPalettes.length?(e.settings[s]=Math.floor(l),e.appliedCount++):e.warnings.push(`${s}: Invalid value (${l}), must be 0-${o.colorPalettes.length-1}`);break;case"theme":"string"==typeof l&&["theme-light","theme-dark"].includes(l)?(e.settings[s]=l,e.appliedCount++):e.warnings.push(`${s}: Invalid value (${l}), must be 'theme-light' or 'theme-dark'`);break;default:typeof l==typeof n[s]?(e.settings[s]=l,e.appliedCount++):e.warnings.push(`${s}: Type mismatch, expected ${typeof n[s]}, got ${typeof l}`)}}catch(t){e.warnings.push(`${s}: Error validating - ${t.message}`)}else e.warnings.push(`${s}: Unknown setting, ignored`);return e.success=e.appliedCount>0,e.success||0!==e.warnings.length||(e.error="No valid settings found in import"),e}openImportExport(){this.contentContainer.innerHTML='\n\t\t\t\t<div class="settings-section">\n\t\t\t\t\t<div class="settings-section-title">Import/Export Settings</div>\n\t\t\t\t\t<div class="settings-section-desc">\n\t\t\t\t\t\tImport, export, or reset your WikiShield settings. Settings are encoded as a base64 string for easy sharing.\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style="display: flex; gap: 12px; margin-top: 12px; flex-wrap: wrap;">\n\t\t\t\t\t\t<button id="export-settings-btn" class="add-action-button" style="flex: 1; min-width: 120px;">\n\t\t\t\t\t\t\t<span class="fa fa-download"></span> Export Settings\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button id="import-settings-btn" class="add-action-button" style="flex: 1; min-width: 120px;">\n\t\t\t\t\t\t\t<span class="fa fa-upload"></span> Import Settings\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button id="reset-settings-btn" class="add-action-button" style="flex: 1; min-width: 120px; background: #dc3545;">\n\t\t\t\t\t\t\t<span class="fa fa-undo"></span> Reset to Default\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div id="import-export-status" style="margin-top: 12px; padding: 12px; border-radius: 6px; display: none;"></div>\n\t\t\t\t\t<textarea id="import-settings-input"\n\t\t\t\t\t\tplaceholder="Paste base64 settings string here..."\n\t\t\t\t\t\tstyle="\n\t\t\t\t\t\t\twidth: 100%;\n\t\t\t\t\t\t\tmin-height: 100px;\n\t\t\t\t\t\t\tmargin-top: 12px;\n\t\t\t\t\t\t\tpadding: 12px;\n\t\t\t\t\t\t\tborder: 2px solid rgba(128, 128, 128, 0.3);\n\t\t\t\t\t\t\tborder-radius: 6px;\n\t\t\t\t\t\t\tfont-family: \'Courier New\', monospace;\n\t\t\t\t\t\t\tfont-size: 0.85em;\n\t\t\t\t\t\t\tbackground: rgba(0, 0, 0, 0.2);\n\t\t\t\t\t\t\tcolor: inherit;\n\t\t\t\t\t\t\tdisplay: none;\n\t\t\t\t\t\t"></textarea>\n\t\t\t\t</div>\n\t\t\t';const t=this.contentContainer.querySelector("#export-settings-btn"),e=this.contentContainer.querySelector("#import-settings-btn"),n=this.contentContainer.querySelector("#reset-settings-btn"),i=this.contentContainer.querySelector("#import-export-status"),a=this.contentContainer.querySelector("#import-settings-input");t.addEventListener("click",()=>{try{const t=JSON.stringify(y.options),e=btoa(t),n=document.createElement("textarea");n.value=e,document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n),i.style.display="block",i.style.background="rgba(40, 167, 69, 0.2)",i.style.border="2px solid #28a745",i.style.color="#28a745",i.innerHTML='\n\t\t\t\t\t\t<div style="display: flex; align-items: center; gap: 8px;">\n\t\t\t\t\t\t\t<span class="fa fa-check-circle"></span>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<strong>Settings exported successfully!</strong>\n\t\t\t\t\t\t\t\t<div style="font-size: 0.9em; margin-top: 4px;">The base64 string has been copied to your clipboard.</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t',setTimeout(()=>{i.style.display="none"},5e3)}catch(t){i.style.display="block",i.style.background="rgba(220, 53, 69, 0.2)",i.style.border="2px solid #dc3545",i.style.color="#dc3545",i.innerHTML=`\n\t\t\t\t\t\t<div style="display: flex; align-items: center; gap: 8px;">\n\t\t\t\t\t\t\t<span class="fa fa-times-circle"></span>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<strong>Export failed!</strong>\n\t\t\t\t\t\t\t\t<div style="font-size: 0.9em; margin-top: 4px;">${t.message}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`}}),e.addEventListener("click",()=>{if("none"===a.style.display)a.style.display="block",e.innerHTML='<span class="fa fa-check"></span> Apply Import',e.style.background="#28a745",i.style.display="none";else{const t=a.value.trim();if(!t)return i.style.display="block",i.style.background="rgba(220, 53, 69, 0.2)",i.style.border="2px solid #dc3545",i.style.color="#dc3545",void(i.innerHTML='\n\t\t\t\t\t\t\t<div style="display: flex; align-items: center; gap: 8px;">\n\t\t\t\t\t\t\t\t<span class="fa fa-exclamation-circle"></span>\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<strong>No input!</strong>\n\t\t\t\t\t\t\t\t\t<div style="font-size: 0.9em; margin-top: 4px;">Please paste a base64 settings string.</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t');try{const e=atob(t),n=JSON.parse(e),o=this.validateAndMergeSettings(n);if(!o.success)throw new Error(o.error);{y.options=o.settings,y.saveOptions(y.options),i.style.display="block",i.style.background="rgba(40, 167, 69, 0.2)",i.style.border="2px solid #28a745",i.style.color="#28a745";let t="";o.warnings.length>0&&(t=`\n\t\t\t\t\t\t\t\t\t<div style="margin-top: 8px; padding-top: 8px; border-top: 1px solid rgba(40, 167, 69, 0.3);">\n\t\t\t\t\t\t\t\t\t\t<strong>Warnings:</strong>\n\t\t\t\t\t\t\t\t\t\t<ul style="margin: 4px 0 0 20px; font-size: 0.9em;">\n\t\t\t\t\t\t\t\t\t\t\t${o.warnings.map(t=>`<li>${t}</li>`).join("")}\n\t\t\t\t\t\t\t\t\t\t</ul>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t`),i.innerHTML=`\n\t\t\t\t\t\t\t\t<div style="display: flex; align-items: start; gap: 8px;">\n\t\t\t\t\t\t\t\t\t<span class="fa fa-check-circle" style="margin-top: 2px;"></span>\n\t\t\t\t\t\t\t\t\t<div style="flex: 1;">\n\t\t\t\t\t\t\t\t\t\t<strong>Settings imported successfully!</strong>\n\t\t\t\t\t\t\t\t\t\t<div style="font-size: 0.9em; margin-top: 4px;">\n\t\t\t\t\t\t\t\t\t\t\t${o.appliedCount} setting(s) applied.\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t${t}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t`}}catch(t){i.style.display="block",i.style.background="rgba(220, 53, 69, 0.2)",i.style.border="2px solid #dc3545",i.style.color="#dc3545",i.innerHTML=`\n\t\t\t\t\t\t\t<div style="display: flex; align-items: center; gap: 8px;">\n\t\t\t\t\t\t\t\t<span class="fa fa-times-circle"></span>\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<strong>Import failed!</strong>\n\t\t\t\t\t\t\t\t\t<div style="font-size: 0.9em; margin-top: 4px;">${t.message}</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`}a.style.display="none",a.value="",e.innerHTML='<span class="fa fa-upload"></span> Import Settings',e.style.background=""}}),n.addEventListener("click",()=>{confirm("Are you sure you want to reset all settings to default? This cannot be undone.")&&(y.options=JSON.parse(JSON.stringify(o.defaultSettings)),y.saveOptions(y.options),i.style.display="block",i.style.background="rgba(255, 193, 7, 0.2)",i.style.border="2px solid #ffc107",i.style.color="#ffc107",i.innerHTML='\n\t\t\t\t\t\t<div style="display: flex; align-items: center; gap: 8px;">\n\t\t\t\t\t\t\t<span class="fa fa-info-circle"></span>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<strong>Settings reset to default!</strong>\n\t\t\t\t\t\t\t\t<div style="font-size: 0.9em; margin-top: 4px;">Settings have been reset.</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t')})}closeSettings(){this.isOpen=!1,document.body.classList.remove("settings-open"),[...document.querySelectorAll(".settings-container")].forEach(t=>t.remove())}handleKeypress(t){"escape"!==t.key.toLowerCase()?this.keypressCallback&&m.includes(t.key.toLowerCase())&&(this.keypressCallback(t.key.toLowerCase()),t.preventDefault()):this.closeSettings()}}class h{constructor(){this.selectedWidthAdjust=null,this.startingSectionWidth=null,this.startingMouseX=null,this.lastCurrentEdit=null,this.newerRevisionInterval=null,this.eventManager=new g,this.settings=new b,this.selectedMenu=null,this.selectedSubmenu=null}loadTheme(t){this.removeTheme();const e=document.createElement("style");e.classList.add("wikishield-theme-base"),e.innerHTML=a.base,document.head.appendChild(e);const n=document.createElement("style");n.classList.add("wikishield-theme"),n.innerHTML=a["theme-dark"],document.head.appendChild(n),document.documentElement.setAttribute("data-theme","dark"),document.body.classList.add("dark-mode"),y.options.theme="theme-dark",y.saveOptions(y.options)}removeTheme(){document.querySelectorAll(".wikishield-theme, .wikishield-theme-base").forEach(t=>t.remove()),document.documentElement.removeAttribute("data-theme"),document.body.classList.remove("dark-mode")}openFloatingIframe(t,e){this.closeFloatingIframe();const n=document.createElement("div");n.classList.add("wiki-iframe-overlay"),n.id="wiki-iframe-overlay";const i=document.createElement("div");i.classList.add("wiki-iframe-container");const o=document.createElement("div");o.classList.add("wiki-iframe-header");const a=document.createElement("div");a.classList.add("wiki-iframe-title"),a.innerHTML=`\n\t\t\t\t<span class="fa fa-book"></span>\n\t\t\t\t<span class="wiki-iframe-title-text">${this.escapeHTML(e)}</span>\n\t\t\t`;const r=document.createElement("div");r.classList.add("wiki-iframe-controls");const s=document.createElement("button");s.classList.add("wiki-iframe-btn"),s.innerHTML='<span class="fa fa-external-link-alt"></span> Open in New Tab',s.addEventListener("click",()=>{window.open(t,"_blank")});const l=document.createElement("button");l.classList.add("wiki-iframe-btn","close-btn"),l.innerHTML='<span class="fa fa-times"></span> Close',l.addEventListener("click",()=>{this.closeFloatingIframe()}),r.appendChild(s),r.appendChild(l),o.appendChild(a),o.appendChild(r);const d=document.createElement("div");d.classList.add("wiki-iframe-content");const c=document.createElement("div");c.classList.add("wiki-iframe-loading"),c.innerHTML='\n\t\t\t\t<div class="wiki-iframe-spinner"></div>\n\t\t\t\t<span>Loading Wikipedia page...</span>\n\t\t\t',d.appendChild(c);const p=document.createElement("iframe");p.src=t,p.setAttribute("sandbox","allow-same-origin allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox");let u=!1;p.addEventListener("load",()=>{u=!0,c.remove()}),p.addEventListener("error",()=>{c.innerHTML=`\n\t\t\t\t\t<span class="fa fa-exclamation-triangle" style="color: var(--danger); font-size: 2rem;"></span>\n\t\t\t\t\t<span>This page cannot be displayed in a frame. <a href="https://dokumen123.com/en/${t}" target="_blank" style="color: var(--primary); text-decoration: underline;">Open in new tab instead</a></span>\n\t\t\t\t`}),setTimeout(()=>{u||(this.closeFloatingIframe(),window.open(t,"_blank"),this.showToast("Wikipedia doesn't allow embedding. Opening in a new tab instead.","info"))},3e3),d.appendChild(p),i.appendChild(o),i.appendChild(d),n.appendChild(i),n.addEventListener("click",t=>{t.target===n&&this.closeFloatingIframe()}),i.addEventListener("click",t=>{t.stopPropagation()});document.addEventListener("keydown",t=>{"Escape"===t.key&&this.closeFloatingIframe()}),n.dataset.escapeHandler="true",document.body.appendChild(n)}closeFloatingIframe(){const t=document.getElementById("wiki-iframe-overlay");t&&(t.dataset.escapeHandler&&document.removeEventListener("keydown",this.closeFloatingIframe),t.remove())}escapeHTML(t){const e=document.createElement("div");return e.textContent=t,e.innerHTML}async build(){document.head.innerHTML=`\n\t\t\t\t<title>WikiShield</title>\n\t\t\t\t<style>${a.initial}</style>\n\t\t\t`,document.body.innerHTML=r.initial;const t=document.getElementById("dots-canvas"),e=t.getContext("2d");let n,i=[];const o=()=>{t.width=window.innerWidth,t.height=window.innerHeight};o(),window.addEventListener("resize",o);class s{constructor(){this.x=Math.random()*t.width,this.y=Math.random()*t.height,this.vx=.5*(Math.random()-.5),this.vy=.5*(Math.random()-.5),this.radius=2;const e=["102, 126, 234","240, 147, 251","118, 75, 162","217, 70, 239"];this.color=e[Math.floor(Math.random()*e.length)]}update(){this.x+=this.vx,this.y+=this.vy,this.x<0&&(this.x=t.width),this.x>t.width&&(this.x=0),this.y<0&&(this.y=t.height),this.y>t.height&&(this.y=0)}draw(){e.beginPath(),e.arc(this.x,this.y,this.radius,0,2*Math.PI),e.fillStyle=`rgba(${this.color}, 0.8)`,e.shadowBlur=10,e.shadowColor=`rgba(${this.color}, 0.8)`,e.fill(),e.shadowBlur=0}}const l=Math.floor(t.width*t.height/5e3);for(let t=0;t<l;t++)i.push(new s);const d=()=>{e.clearRect(0,0,t.width,t.height),i.forEach(t=>{t.update(),t.draw()});const o=i.length;for(let t=0;t<o;t++)for(let n=t+1;n<o;n++){const o=i[t].x-i[n].x,a=i[t].y-i[n].y,r=Math.sqrt(o*o+a*a);if(r<150){e.beginPath(),e.moveTo(i[t].x,i[t].y),e.lineTo(i[n].x,i[n].y);const o=.4*(1-r/150),a=(parseInt(i[t].color.split(",")[0])+parseInt(i[n].color.split(",")[0]))/2,s=(parseInt(i[t].color.split(",")[1])+parseInt(i[n].color.split(",")[1]))/2,l=(parseInt(i[t].color.split(",")[2])+parseInt(i[n].color.split(",")[2]))/2;e.strokeStyle=`rgba(${a}, ${s}, ${l}, ${o})`,e.lineWidth=1,e.stroke()}}n=requestAnimationFrame(d)};d();let c=null;y.soundEnabled=!0;const p=(t,e,n=.15,i="sine")=>{if(!y.soundEnabled||!c)return;const o=c.createOscillator(),a=c.createGain();o.connect(a),a.connect(c.destination),o.frequency.value=t,o.type=i,a.gain.setValueAtTime(n,c.currentTime),a.gain.exponentialRampToValueAtTime(.01,c.currentTime+e),o.start(c.currentTime),o.stop(c.currentTime+e)},u=()=>{p(800,.05,.08,"sine")},g=()=>{p(1200,.1,.1,"square"),setTimeout(()=>p(1e3,.08,.08,"square"),50)},m=()=>{if(!c)try{const t=window.AudioContext||window.webkitAudioContext;c=new t,(()=>{if(!c)try{const t=window.AudioContext||window.webkitAudioContext;c=new t}catch(t){return}p(523.25,.15,.12,"sine"),setTimeout(()=>p(659.25,.15,.12,"sine"),150),setTimeout(()=>p(783.99,.15,.12,"sine"),300),setTimeout(()=>p(1046.5,.4,.15,"sine"),450)})()}catch(t){}},b=this.elem("#sound-toggle");b.addEventListener("click",()=>{y.soundEnabled=!y.soundEnabled,b.classList.toggle("muted"),y.soundEnabled&&(m(),g())});const h=(t,e)=>{const n=this.elem(t);n&&("hover"===e?n.addEventListener("mouseenter",u):"click"===e&&n.addEventListener("click",()=>{m(),g()}))};h("#start-button","hover"),h("#start-button","click"),document.querySelectorAll(".about-link").forEach(t=>{t.addEventListener("mouseenter",u),t.addEventListener("click",()=>{m(),g()})}),setTimeout(()=>{m()},500),y.rights.rollback?this.elem("#rollback-needed").style.display="none":this.elem("#start-button").style.display="none",this.elem("#start-button").addEventListener("click",()=>{n&&cancelAnimationFrame(n),y.start()}),this.loadTheme("theme-dark")}start(){document.head.innerHTML=`\n\t\t\t\t<title>WikiShield</title>\n\t\t\t\t<style>${a.main}</style>\n\t\t\t\t${r.head}\n\t\t\t`,this.loadTheme("theme-dark"),document.body.innerHTML=r.main,[...document.querySelectorAll(".bottom-tool-trigger")].forEach(t=>{t.addEventListener("click",e=>{e.stopPropagation();const n=t.closest(".bottom-tool-item"),i=document.querySelector(`#${n.dataset.menu}-menu`),o=i.classList.contains("show");this.closeAllBottomMenus(),o||(i.classList.add("show"),t.classList.add("active"),this.positionBottomMenu(n,i))})}),[...document.querySelectorAll(".submenu-trigger")].forEach(t=>{t.addEventListener("mouseenter",()=>{const e=t.closest(".bottom-tool-menu");e&&e.querySelectorAll(".submenu").forEach(t=>t.classList.remove("show"));const n=t.querySelector(".submenu");n&&(n.classList.add("show"),this.positionSubmenu(n,t))})}),[...document.querySelectorAll(".menu-option:not(.submenu-trigger)")].forEach(t=>{t.addEventListener("click",()=>{this.closeAllBottomMenus()})}),[...document.querySelectorAll(".submenu")].forEach(t=>{t.addEventListener("click",t=>t.stopPropagation())}),[this.elem("#delete-queue"),this.elem("#open-settings"),this.elem("#notifications-icon"),this.elem("#user-contribs-level")].forEach(t=>this.addTooltipListener(t)),this.elem("#notifications-icon").addEventListener("click",t=>{t.stopPropagation();this.elem("#notifications-panel").classList.toggle("show")}),this.elem("#mark-all-read").addEventListener("click",()=>{y.markAllNotificationsRead()}),document.addEventListener("click",t=>{const e=this.elem("#notifications-panel"),n=this.elem("#notifications-icon");!e||e.contains(t.target)||n.contains(t.target)||e.classList.remove("show");const i=document.querySelector("#bottom-tools");i&&!i.contains(t.target)&&this.closeAllBottomMenus()}),this.eventManager.linkButton(this.elem("#delete-queue"),"deleteQueue",!0),this.eventManager.linkButton(this.elem("#open-settings"),"openSettings",!0),this.eventManager.linkButton(this.elem("#user-open-user-page"),"openUserPage"),this.eventManager.linkButton(this.elem("#user-open-user-talk"),"openUserTalk"),this.eventManager.linkButton(this.elem("#user-view-contribs"),"openUserContribs"),this.eventManager.linkButton(this.elem("#user-view-filter-log"),"openFilterLog"),this.eventManager.linkButton(this.elem("#user-add-whitelist"),"addToWhitelist"),this.eventManager.linkButton(this.elem("#user-highlight"),"highlight"),this.eventManager.linkButton(this.elem("#page-open-page"),"openPage"),this.eventManager.linkButton(this.elem("#page-open-talk"),"openTalk"),this.eventManager.linkButton(this.elem("#page-view-history"),"openHistory"),this.eventManager.linkButton(this.elem("#edit-view-revision"),"openRevision"),this.eventManager.linkButton(this.elem("#edit-view-diff"),"openDiff"),this.eventManager.linkButton(this.elem("#edit-thank-user"),"thankUser"),this.eventManager.linkButton(this.elem("#edit-rollback"),"rollback"),this.createSubmenu(this.elem("#edit-rollback-goodfaith .submenu"),"rollbackGoodFaith"),this.createSubmenu(this.elem("#edit-undo .submenu"),"undo"),this.createSubmenu(this.elem("#user-report-aiv .submenu"),"reportToAIV"),this.createSubmenu(this.elem("#user-report-uaa .submenu"),"reportToUAA"),this.createSubmenu(this.elem("#page-request-protection .submenu"),"requestProtection"),this.createSubmenu(this.elem("#user-welcome .submenu"),"welcome"),y.rights.block||[...document.querySelectorAll(".tool-block")].forEach(t=>t.style.display="none"),y.rights.protect||[...document.querySelectorAll(".tool-protect")].forEach(t=>t.style.display="none"),[...this.elem("#bottom-tools").querySelectorAll("[data-tooltip]")].forEach(t=>this.addTooltipListener(t)),this.createWarnMenu(this.elem("#warn-menu"));const t=this.elem("#queue-width-adjust"),e=this.elem("#queue"),i=this.elem("#details-width-adjust"),o=this.elem("#right-details"),s=localStorage.getItem("WS:queueWidth"),l=localStorage.getItem("WS:detailsWidth");if(s&&(e.style.width=s,this.elem("#right-container").style.width=`calc(100% - ${s})`),l&&(o.style.width=l,this.elem("#main-container").style.width=`calc(100% - ${l})`,this.elem("#middle-top").style.width=`calc(100% - ${l})`,this.elem("#right-top").style.width=l),t.addEventListener("mousedown",n=>{this.selectedWidthAdjust=t,this.startingMouseX=n.clientX,this.startingSectionWidth=e.getBoundingClientRect().width}),i.addEventListener("mousedown",t=>{this.selectedWidthAdjust=i,this.startingMouseX=t.clientX,this.startingSectionWidth=o.getBoundingClientRect().width}),window.addEventListener("mouseup",()=>{this.selectedWidthAdjust===t&&localStorage.setItem("WS:queueWidth",e.style.width),this.selectedWidthAdjust===i&&localStorage.setItem("WS:detailsWidth",o.style.width),this.selectedWidthAdjust=null}),window.addEventListener("mousemove",n=>{if(this.selectedWidthAdjust===t){const t=n.clientX-this.startingMouseX+this.startingSectionWidth;e.style.width=`${Math.min(Math.max(t/window.innerWidth*100,10),30)}vw`,this.elem("#right-container").style.width=`calc(100% - ${e.style.width})`}if(this.selectedWidthAdjust===i){const t=this.startingMouseX-n.clientX+this.startingSectionWidth;o.style.width=`${Math.min(Math.max(t/window.innerWidth*100,10),30)}vw`,this.elem("#main-container").style.width=`calc(100% - ${o.style.width})`,this.elem("#middle-top").style.width=`calc(100% - ${o.style.width})`,this.elem("#right-top").style.width=o.style.width}}),window.addEventListener("click",()=>{[...document.querySelectorAll(".context-menu")].forEach(t=>t.remove())}),document.addEventListener("click",t=>{const e=t.target.closest("a[href][target='_blank']");if(!e)return;const n=e.getAttribute("href");if(!n||!n.includes("wikipedia.org"))return;if(1===t.button)return;if(t.ctrlKey||t.metaKey)return;t.preventDefault(),t.stopPropagation();let i="Wikipedia";try{const t=new URL(n).pathname.split("/");t.length>2&&(i=decodeURIComponent(t[t.length-1]).replace(/_/g," "))}catch(t){console.error("Failed to parse URL:",t)}window.open(n,"_blank")},!0),document.addEventListener("auxclick",t=>{const e=t.target.closest("a[href][target='_blank']");if(!e)return;const n=e.getAttribute("href");n&&n.includes("wikipedia.org")&&t.button},!0),y.getChangelogVersion()!==n.changelog.version){const t=document.createElement("div");t.classList.add("settings-container"),document.body.appendChild(t),t.innerHTML=`\n\t\t\t\t\t<div class="settings">\n\t\t\t\t\t\t<div class="settings-section changelog">\n\t\t\t\t\t\t\t${n.changelog.HTML}\n\t\t\t\t\t\t\t<button id="close-changelog" class="add-action-button">Close</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`,document.getElementById("close-changelog").addEventListener("click",()=>{t.remove(),y.updateChangelogVersion()})}}updateMenuElements(){}closeAllMenus(){this.closeAllBottomMenus()}closeAllBottomMenus(){document.querySelectorAll(".bottom-tool-menu").forEach(t=>t.classList.remove("show")),document.querySelectorAll(".bottom-tool-trigger").forEach(t=>t.classList.remove("active")),document.querySelectorAll(".submenu").forEach(t=>t.classList.remove("show"))}positionBottomMenu(t,e){e.style.bottom="",e.style.top="",requestAnimationFrame(()=>{e.getBoundingClientRect();const n=t.getBoundingClientRect();e.style.left=`${n.left}px`,e.style.bottom=window.innerHeight-n.top+"px"})}positionSubmenu(t,e){t.style.left="",t.style.right="",t.style.top="",t.style.bottom="",requestAnimationFrame(()=>{const n=t.getBoundingClientRect(),i=e.getBoundingClientRect(),o=window.innerWidth,a=window.innerHeight,r=o-i.right,s=i.left;r<n.width+20&&s>r&&(t.style.left="auto",t.style.right="calc(100% + 4px)");const l=a-i.bottom,d=i.top;n.bottom>a&&d>l&&(t.style.top="auto",t.style.bottom="0")})}createRevertMenu(t,e=!1){const n=document.createElement("table");n.classList.add("revert-menu-table"),t.appendChild(n);const i={Vandalism:["Vandalism","Subtle vandalism","Editing tests","Deleting","Image vandalism","Errors"],"Content Issues":[e?"Unsourced (BLP)":"Unsourced","POV","Commentary","MOS violation","AI-generated content","Censoring"],"Spam & Promotion":["Advertising","Spam links"],"Disruptive Behavior":["Disruption","Owning","Chatting","AfD removal","Jokes"],"Personal Conduct":["Personal attacks"]};for(const t in i){const e=document.createElement("tr"),a=document.createElement("td");a.colSpan=8,a.classList.add("revert-menu-category"),a.innerText=t,e.appendChild(a),n.appendChild(e);for(const e of i[t]){if(!o.warnings[e])continue;const t=document.createElement("tr");n.appendChild(t);const i=["Auto","1","2","3","4","4im"];t.innerHTML+=`\n\t\t\t\t\t\t<td class="revert-menu-title">${e}</td>\n\t\t\t\t\t\t<td class="revert-menu-info" data-tooltip="${o.warnings[e].desc}">\n\t\t\t\t\t\t\t<span class="fas fa-circle-question"></span>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t`;const a=["Auto",...o.warnings[e].templates];for(const n in a){const a=i[n],r=document.createElement("td");t.appendChild(r),r.innerText=a,r.style.backgroundColor="Auto"===a?"#00a000":o.warningTemplateColors[a],r.classList.add("revert-menu-item"),r.addEventListener("click",async()=>{await y.executeScript({actions:[{name:"rollbackAndWarn",params:{label:o.warnings[e].label,warningType:e,level:"Auto"===a?"auto":"4im"===a?"4im":Number(n)+1}},{name:"highlight",params:{}},{name:"if",condition:"atFinalWarning",actions:[{name:"if",condition:"operatorNonAdmin",actions:[{name:"reportToAIV",params:{reportMessage:"Vandalism past final warning"}}]}]},{name:"nextEdit",params:{}}]}),this.selectedMenu=null,this.updateMenuElements()})}}}[...t.querySelectorAll("[data-tooltip]")].forEach(t=>{this.addTooltipListener(t)})}createWarnMenu(t){const e={"Disruptive Behavior":{"Gaming the system":{templates:["subst:uw-gaming1","subst:uw-gaming2","subst:uw-gaming3","subst:uw-gaming4","subst:uw-gaming4im"],label:"[[WP:GAME|gaming the system]]",desc:"Warning for gaming the system or manipulating Wikipedia processes.",requiresArticle:!0},"Misleading edit summaries":{templates:["subst:uw-mislead1","subst:uw-mislead2","subst:uw-mislead3","subst:uw-mislead4"],label:"using [[WP:EDITSUMMARY|misleading edit summaries]]",desc:"Warning for using misleading or false edit summaries.",requiresArticle:!0}},"Editing Practice":{"Incorrect minor edits":{templates:["subst:uw-minor"],label:"incorrect use of [[Help:Minor edit|minor edits]]",desc:"Warning for incorrectly marking edits as minor.",requiresArticle:!1}}},n=document.createElement("table");n.classList.add("revert-menu-table"),t.appendChild(n);for(const t in e){const i=document.createElement("tr"),a=document.createElement("td");a.colSpan=8,a.classList.add("revert-menu-category"),a.innerText=t,i.appendChild(a),n.appendChild(i);const r=e[t];for(const t in r){const e=document.createElement("tr");n.appendChild(e);const i=r[t],a=i.templates.length,s=1===a?["0"]:["1","2","3","4","4im"];e.innerHTML+=`\n\t\t\t\t\t\t<td class="revert-menu-title">${t}</td>\n\t\t\t\t\t\t<td class="revert-menu-info" data-tooltip="${i.desc}">\n\t\t\t\t\t\t\t<span class="fas fa-circle-question"></span>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t`;for(let n=0;n<a;n++){i.templates[n];const r=s[n],l=document.createElement("td");e.appendChild(l),l.innerText=r,l.style.backgroundColor=1===a?"#4a90e2":"4im"===r?o.warningTemplateColors["4im"]:o.warningTemplateColors[r],l.classList.add("revert-menu-item"),l.addEventListener("click",async()=>{await y.executeScript({actions:[{name:"warn",params:{warningType:t,level:n+1,warningTemplates:i.templates,warningLabel:i.label,requiresArticle:i.requiresArticle}},{name:"highlight",params:{}},{name:"nextEdit",params:{}}]}),this.selectedMenu=null,this.updateMenuElements()})}}}[...t.querySelectorAll("[data-tooltip]")].forEach(t=>{this.addTooltipListener(t)})}createSubmenu(t,e){if(!t)return;const n=this.eventManager.events[e];t.innerHTML=`\n\t\t\t\t<div class="bottom-subcontent-title">${n.description}</div>\n\t\t\t`;for(const e of n.parameters||[])switch(t.innerHTML+=`<div class="bottom-subcontent-input-title">${e.title}</div>`,e.type){case"choice":const n=e.options.reduce((t,e)=>t+`<option>${e}</option>`,"");t.innerHTML+=`\n\t\t\t\t\t\t\t<select data-paramid="${e.id}">\n\t\t\t\t\t\t\t\t${n}\n\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t`;break;case"text":t.innerHTML+=`<input type="text" data-paramid="${e.id}">`}const i=document.createElement("button");i.innerText="Submit",i.classList.add("bottom-subcontent-button"),t.appendChild(i),i.addEventListener("click",()=>{const i={};for(const e of n.parameters||[]){const n=t.querySelector(`[data-paramid="${e.id}"]`);i[e.id]=n.value}y.executeScript({actions:[{name:e,params:i}]}),this.closeAllBottomMenus()})}renderQueue(t,e){let n=null;this.elem("#queue-top-items").innerText=t.length+" item"+(1===t.length?"":"s");for(const i of t){let o=this.elem(`#queue-items .queue-edit[data-revid="${i.revid}"]`);o||(o=document.createElement("div"),o.classList.add("queue-edit"),i.mentionsMe&&y.options.enableUsernameHighlighting&&(o.classList.add("queue-edit-mentions-me"),o.dataset.tooltip="This edit contains your username",this.addTooltipListener(o)),o.dataset.revid=i.revid.toString(),o.innerHTML=this.generateEditHTML(i),n?n.parentElement.insertBefore(o,n.nextSibling):i===e?this.elem("#queue-items").prepend(o):this.elem("#queue-items").appendChild(o),[...o.querySelectorAll("[data-tooltip]")].forEach(t=>{this.addTooltipListener(t)}),o.addEventListener("contextmenu",n=>{n.preventDefault(),y.queue.playClickSound(),[...document.querySelectorAll(".context-menu")].forEach(t=>t.remove());const o=document.createElement("div");o.classList.add("context-menu"),o.innerHTML=r["edit-context-menu"],document.body.appendChild(o),o.style.left=n.clientX+"px",o.style.top=n.clientY+"px",o.querySelector("#context-ores-number").innerText=Math.round(100*i.ores)||0,o.querySelector("#context-ores-number").style.color=this.getORESColor(i.ores||0);const a=o.querySelector("#context-whitelist");a&&(y.whitelist.has(i.user.name)?a.textContent="Remove from whitelist":a.textContent="Whitelist user"),o.querySelector("#context-remove").addEventListener("click",()=>{if(y.queue.playClickSound(),y.ollamaAI&&y.ollamaAI.cancelAnalysis(i.revid),i===e){const e=t.findIndex(t=>t.revid===i.revid);-1!==e&&(t.splice(e,1),t.length>0?e<t.length?y.queue.currentEdit=t[e]:y.queue.currentEdit=t[t.length-1]:y.queue.currentEdit=null,this.removeQueueItem(i.revid),y.interface.renderQueue(t,y.queue.currentEdit))}else{const e=t.length;for(let n=0;n<e;n++)if(t[n]===i){t.splice(n,1);break}this.removeQueueItem(i.revid)}y.queue.previousItems.push(i),o.remove()}),o.querySelector("#context-whitelist").addEventListener("click",()=>{y.queue.playSparkleSound(),y.whitelist.has(i.user.name)?(y.whitelist.delete(i.user.name),y.saveWhitelist(),y.logger.log(`Removed ${i.user.name} from whitelist`)):(y.whitelist.set(i.user.name,Date.now()),y.saveWhitelist(),y.logger.log(`Added ${i.user.name} to whitelist`)),y.interface.renderQueue(y.queue.queue,y.queue.currentEdit),o.remove()}),o.querySelector("#context-open-history").addEventListener("click",t=>{y.queue.playClickSound();const e=y.util.pageLink(`Special:PageHistory/${i.page.title}`);y.interface.eventManager.openWikipediaLink(e,`History: ${i.page.title}`,t),o.remove()}),o.querySelector("#context-open-contribs").addEventListener("click",t=>{y.queue.playClickSound();const e=y.util.pageLink(`Special:Contributions/${i.user.name}`);y.interface.eventManager.openWikipediaLink(e,`Contributions: ${i.user.name}`,t),o.remove()}),o.addEventListener("click",t=>{t.stopPropagation()})}),o.addEventListener("click",()=>{y.queue.currentEdit=i,this.renderQueue(y.queue.queue,i),i&&y.options.enableOllamaAI&&y.ollamaAI&&y.ollamaAI.analyzeEdit(i).then(t=>{i.aiAnalysis=t,y.queue.currentEdit===i&&y.interface&&y.interface.updateAIAnalysisDisplay(t)}).catch(t=>{console.error("AI analysis failed:",t)})})),i===e?o.classList.add("queue-edit-current"):o.classList.remove("queue-edit-current"),n=o}this.lastCurrentEdit!==e&&(this.lastCurrentEdit=e,this.newEditSelected(e))}generateEditHTML(t,e=!0,n=!0,i=!0,o=!1){let a="";if(t.tags&&Array.isArray(t.tags))for(const e of t.tags)a+=`<span class="queue-edit-tag">${e}</span>`;const r=t.sizediff||0,s=t.comment?y.util.escapeHtml(y.util.maxStringLength(t.comment,100)):"",l=t.comment?y.util.escapeHtml(t.comment):"",d=t.minor?'<span class="minor-indicator" data-tooltip="Minor edit">m</span> ':"",c=t.ores||0,p=Math.round(100*c),u=e?`<div class="queue-edit-color" data-ores-score="${p}%" style="background: ${this.getORESColor(c)};"></div>`:"",g=n?`\n\t\t\t\t<div class="queue-edit-title" data-tooltip="${t.page?t.page.title:t.title}">\n\t\t\t\t\t<span class="fa fa-file-lines queue-edit-icon"></span>\n\t\t\t\t\t${t.page?t.page.title:t.title}\n\t\t\t\t</div>`:"";let m="";t.user&&y.highlighted.has(t.user.name)?m="queue-edit-user-highlight":t.user&&"object"==typeof t.user&&t.user.emptyTalkPage&&(m="queue-edit-user-empty-talk");return`\n\t\t\t\t${u}\n\t\t\t\t<div class="queue-edit-content">\n\t\t\t\t\t${g}\n\t\t\t\t\t${i?`\n\t\t\t\t<div class="queue-edit-user ${m}">\n\t\t\t\t\t<span class="fa fa-user queue-edit-icon"></span>\n\t\t\t\t\t${t.user?"string"==typeof t.user?t.user:t.user.name:"<em>Username removed</em>"}\n\t\t\t\t</div>`:""}\n\t\t\t\t\t<div class="queue-edit-summary" data-tooltip="${l}">\n\t\t\t\t\t\t<span class="fa fa-comment-dots queue-edit-icon"></span>\n\t\t\t\t\t\t${d}${s||"<em>No summary provided</em>"}\n\t\t\t\t\t</div>\n\t\t\t\t\t${o?`\n\t\t\t\t<div class="queue-edit-time" data-tooltip="${t.timestamp}">\n\t\t\t\t\t<span class="fa fa-clock queue-edit-icon"></span>\n\t\t\t\t\t${y.util.timeAgo(t.timestamp)}\n\t\t\t\t</div>`:""}\n\t\t\t\t\t<div class="queue-edit-tags">\n\t\t\t\t\t\t${a}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="queue-edit-change" style="${Math.abs(r)>=500?"font-weight: bold;":""}color: ${y.util.getChangeColor(r)}">\n\t\t\t\t\t${y.util.getChangeString(r)}\n\t\t\t\t</div>\n\t\t\t`}async newEditSelected(t){this.closeAllMenus();const e=this.elem("#user-contribs-level"),i=this.elem("#user-contribs-content"),a=this.elem("#page-history-content");if(i.innerHTML="",a.innerHTML="",this.removeTooltips(),null===t){this.elem("#middle-top").innerHTML="",this.elem("#right-top").innerHTML="",this.elem("#page-metadata").innerHTML="",this.elem("#user-contribs-count").innerText="_ edits",e.style.display="none",this.elem("#diff-container").innerHTML="",this.elem("#protection-indicator").innerHTML="";const t=document.querySelector("#ai-analysis-container");t&&t.remove();const n=document.querySelector("#old-edit-notice");n&&n.remove(),this.updateDiffContainerHeight();const i=document.querySelector("#user-contribs #block-count-indicator");i&&(i.style.display="none",i.innerHTML="");const o=document.querySelector("#page-history #protection-indicator");return void(o&&(o.innerHTML=""))}this.stopNewerRevisionCheck(),this.startNewerRevisionCheck(t),e.style.display="initial",e.style.background=o.warningTemplateColors[t.user.warningLevel]||"grey",e.innerText=t.user.warningLevel;const r=()=>{const t=e.cloneNode(!0);e.parentNode.replaceChild(t,e),this.addTooltipListener(t)};"0"!==t.user.warningLevel?y.api.getSinglePageContent(`User talk:${t.user.name}`).then(n=>{const i=y.queue.getWarningHistory(n);if(i.length>0){let t='<div class="tooltip-title">Warning History</div>';i.slice(0,5).forEach(e=>{const n=`${e.template}${e.level}`,i=e.article?`<span class="tooltip-item-article"> (${y.util.escapeHtml(e.article)})</span>`:"",o=e.username?`User:${y.util.escapeHtml(e.username)}`:e.timestamp||e.section;t+='<div class="tooltip-item">',t+=`<span class="tooltip-item-level">${y.util.escapeHtml(n)}</span>`,t+=i,t+=`<br><span class="tooltip-item-time">${y.util.escapeHtml(o)}</span>`,t+="</div>"}),i.length>5&&(t+=`<div class="tooltip-more">... and ${i.length-5} more</div>`),e.setAttribute("data-tooltip",t),e.setAttribute("data-tooltip-html","true")}else e.setAttribute("data-tooltip",`Warning level: ${t.user.warningLevel}`),e.setAttribute("data-tooltip-html","false")}).catch(()=>{e.setAttribute("data-tooltip",`Warning level: ${t.user.warningLevel}`),e.setAttribute("data-tooltip-html","false")}).finally(r):(e.setAttribute("data-tooltip","No warnings"),e.setAttribute("data-tooltip-html","false"),r()),this.elem("#user-contribs-count").innerText=-1===t.user.editCount?"N/A edits":t.user.editCount+" edit"+(1===t.user.editCount?"":"s");const s=t.comment?y.util.escapeHtml(y.util.maxStringLength(t.comment,150)):"",l=t.comment?y.util.escapeHtml(t.comment):"",d=t.minor?'<span class="minor-indicator" data-tooltip="Minor edit">m</span> ':"",c=y.util.escapeHtml(y.util.maxStringLength(t.page.title,50)),p=y.util.escapeHtml(t.page.title),u=y.util.escapeHtml(y.util.maxStringLength(t.user.name,30)),g=y.util.escapeHtml(t.user.name),m=y.api.getPageProtection(t.page.title),b=y.api.getBlockCount(t.user.name);this.elem("#middle-top").innerHTML=`\n\t\t\t\t<div style="display: flex; overflow: auto hidden; white-space: nowrap">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<span class="fa fa-file-lines"></span>\n\t\t\t\t\t\t<a href="https://dokumen123.com/en/${y.util.pageLink(t.page.title)}" target="_blank" data-tooltip="${p}">${c}</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<span class="fa fa-user"></span>\n\t\t\t\t\t\t<a href="https://dokumen123.com/en/${y.util.pageLink("Special:Contributions/"+t.user.name)}" target="_blank" data-tooltip="${g}">${u}</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<span class="fa fa-pencil"></span>\n\t\t\t\t\t\t<span style="color: ${y.util.getChangeColor(t.sizediff||0)}">${y.util.getChangeString(t.sizediff||0)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="middle-top-comment" data-tooltip="${l}">\n\t\t\t\t\t<span class="fa fa-comment-dots"></span>\n\t\t\t\t\t${d}${s||"<em>No summary provided</em>"}\n\t\t\t\t</div>\n\t\t\t`;const h=this.elem("#right-top");h.innerHTML=`\n\t\t\t\t<div class="right-top-comment">\n\t\t\t\t\tConsecutive edits\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span class="fa fa-clock"></span>\n\t\t\t\t\t<span id="consecutive-time">-</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span class="fa fa-edit"></span>\n\t\t\t\t\t<span id="consecutive-edits">-</span>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<span class="fa fa-pencil"></span>\n\t\t\t\t\t<span id="consecutive-sizediff" style="color: ${y.util.getChangeColor(0)}">-</span>\n\t\t\t\t</div>\n\t\t\t`,t.consecutive.then(e=>{if(null===e)return h.querySelector("#consecutive-time").innerHTML="?",h.querySelector("#consecutive-edits").innerHTML="?",void(h.querySelector("#consecutive-sizediff").innerHTML="?");let{timestamp:i,count:o,sizediff:a}=e;const r=h.querySelector("#consecutive-time");r.innerHTML=y.formatNotificationTimeShort(new Date(i)),r.parentElement.dataset.tooltip=i,this.addTooltipListener(r.parentElement),o===n.config.historyCount&&(o+="+"),h.querySelector("#consecutive-edits").innerHTML=o;const s=h.querySelector("#consecutive-sizediff");s.style.color=y.util.getChangeColor(a),s.innerHTML=y.util.getChangeString(t.sizediff||0)}),requestAnimationFrame(()=>{const e=this.elem("#middle-top").children[1],n=e?e.querySelector("a"):null,i=e?e.querySelector(".fa-user"):null;n&&(n.style.color="",n.style.fontWeight="",i&&(i.style.color=""),y.highlighted.has(t.user.name)?(n.style.setProperty("color","#f4c430","important"),n.style.setProperty("font-weight","600","important"),i&&i.style.setProperty("color","#f4c430","important")):t.user.emptyTalkPage&&(n.style.setProperty("color","#ff6b6b","important"),n.style.setProperty("font-weight","600","important"),i&&i.style.setProperty("color","#ff6b6b","important")))});const f=this.elem("#user-add-whitelist"),v=this.elem("#user-highlight");if(f){const e=y.whitelist.has(t.user.name),n=f.querySelector("i"),i=f.querySelector("span");e?(i.textContent="Remove from whitelist",n&&(n.className="fas fa-user-xmark")):(i.textContent="Add to whitelist",n&&(n.className="fas fa-user-check"))}if(v){const e=y.highlighted.has(t.user.name),n=v.querySelector("i"),i=v.querySelector("span");e?(i.textContent="Remove highlight",n&&(n.className="fas fa-star-half-stroke")):(i.textContent="Highlight user",n&&(n.className="fas fa-star"))}m.then(t=>{const e=document.querySelector("#page-history #protection-indicator");if(e)if(t.protected){let n="🔒",i="Protected";"full"===t.level?(n="🔒",i="Fully protected"):"semi"===t.level?(n="🔓",i="Semi-protected"):"extended"===t.level&&(n="🔐",i="Extended confirmed protected"),e.innerHTML=`<span style="cursor: help;" data-tooltip="${i}">${n}</span>`,this.addTooltipListener(e.querySelector("[data-tooltip]"))}else e.innerHTML=""}),b.then(async e=>{const n=document.querySelector("#user-contribs #block-count-indicator");if(n)if(e>0){const i=await y.api.getBlockHistory(t.user.name);let o=`<div class="tooltip-title">🚫 Block History (${e} total)</div>`;i.length>0&&(i.forEach(t=>{var e;let n=t.user||"Unknown";n=n.replace(/<[^>]*>/g,"");const i=new Date(t.timestamp).toLocaleString("en-US",{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"});let a=(null===(e=t.params)||void 0===e?void 0:e.duration)||"Unknown duration";a=a.replace(/<[^>]*>/g,"");let r=t.comment||"No reason specified";r=r.replace(/<[^>]*>/g,""),o+='<div class="tooltip-item">',o+=`<span class="tooltip-item-level">By ${y.util.escapeHtml(n)}</span><br>`,o+=`<span class="tooltip-item-time">${i} • ${y.util.escapeHtml(a)}</span><br>`,o+=`<span class="tooltip-item-article">${y.util.escapeHtml(r)}</span>`,o+="</div>"}),e>i.length&&(o+=`<div class="tooltip-more">... and ${e-i.length} more</div>`)),n.style.display="initial",n.setAttribute("data-tooltip",o),n.setAttribute("data-tooltip-html","true"),n.innerHTML=`${e}×`,n.style.cursor="help",this.addTooltipListener(n)}else n.style.display="none",n.innerHTML="",n.removeAttribute("data-tooltip"),n.removeAttribute("data-tooltip-html")}),[...this.elem("#middle-top").querySelectorAll("[data-tooltip]")].forEach(t=>{this.addTooltipListener(t)});const x=this.elem("#page-metadata");if(x){const e=[];t.page.dateFormat&&"Unknown"!==t.page.dateFormat&&e.push(t.page.dateFormat),t.page.englishVariant&&"Unknown"!==t.page.englishVariant&&e.push(t.page.englishVariant),x.innerHTML=e.length>0?e.join(" • "):""}for(const e of t.user.contribs){const t=e.revid===y.queue.currentEdit.revid?"queue-edit-current":"";i.innerHTML+=`\n\t\t\t\t\t<div class="queue-edit ${t}" data-revid="${e.revid}">\n\t\t\t\t\t\t${this.generateEditHTML(e,!1,!0,!1,!0)}\n\t\t\t\t\t</div>\n\t\t\t\t`}for(const e of t.page.history){const t=e.revid===y.queue.currentEdit.revid?"queue-edit-current":"";a.innerHTML+=`\n\t\t\t\t\t<div class="queue-edit ${t}" data-revid="${e.revid}">\n\t\t\t\t\t\t${this.generateEditHTML(e,!1,!1,!0,!0)}\n\t\t\t\t\t</div>\n\t\t\t\t`}[...i.querySelectorAll("[data-tooltip]"),...a.querySelectorAll("[data-tooltip]")].forEach(t=>this.addTooltipListener(t)),[...i.querySelectorAll(".queue-edit")].forEach(t=>{t.addEventListener("click",()=>y.queue.loadFromContribs(t.dataset.revid))}),[...a.querySelectorAll(".queue-edit")].forEach(t=>{t.addEventListener("click",()=>y.queue.loadFromHistory(t.dataset.revid))}),this.elem("#diff-container").innerHTML=`<table>${t.diff}</table>`;const k=document.querySelector("#old-edit-notice");if(k&&k.remove(),this.updateDiffContainerHeight(),y.options.enableUsernameHighlighting){const t=mw.config.get("wgUserName");if(t){this.elem("#diff-container").querySelectorAll("td").forEach(e=>{e.textContent.includes(t)&&(e.style.outline="2px solid #ffc107",e.style.outlineOffset="-2px")})}}const w=this.elem("#diff-container").querySelector(".diff-addedline, .diff-deletedline");w&&setTimeout(()=>{w.scrollIntoView({behavior:"smooth",block:"center"})},100),this.updateAIAnalysisDisplay(t.aiAnalysis),this.hide3RRNotice(),t.reverts>=3&&this.show3RRNotice(t.reverts)}updateAIAnalysisDisplay(t){let e=document.querySelector("#ai-analysis-container");if(!t)return e&&e.remove(),void this.updateDiffContainerHeight();if(!e){const t=document.querySelector("#diff-container");if(!t)return;e=document.createElement("div"),e.id="ai-analysis-container",e.style.cssText="\n\t\t\t\t\tmargin: 12px;\n\t\t\t\t\tpadding: 0;\n\t\t\t\t\tborder-radius: 12px;\n\t\t\t\t\tbackground: linear-gradient(135deg,\n\t\t\t\t\t\trgba(102, 126, 234, 0.95) 0%,\n\t\t\t\t\t\trgba(118, 75, 162, 0.95) 50%,\n\t\t\t\t\t\trgba(102, 126, 234, 0.9) 100%);\n\t\t\t\t\tbackdrop-filter: blur(20px);\n\t\t\t\t\t-webkit-backdrop-filter: blur(20px);\n\t\t\t\t\tcolor: white;\n\t\t\t\t\tbox-shadow:\n\t\t\t\t\t\t0 8px 24px rgba(102, 126, 234, 0.4),\n\t\t\t\t\t\tinset 0 1px 0 rgba(255, 255, 255, 0.2),\n\t\t\t\t\t\tinset 0 -1px 0 rgba(0, 0, 0, 0.1);\n\t\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.15);\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t\tflex-shrink: 0;\n\t\t\t\t\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n\t\t\t\t",t.parentElement.insertBefore(e,t)}if(t.error)return e.innerHTML=`\n\t\t\t\t\t<div style="display: flex; align-items: center; gap: 10px; padding: 16px; background: rgba(220, 53, 69, 0.15); border-left: 4px solid #dc3545;">\n\t\t\t\t\t\t<span class="fa fa-exclamation-triangle" style="font-size: 1.3em; color: #ff6b6b;"></span>\n\t\t\t\t\t\t<span style="font-weight: 500;">AI analysis failed: ${t.error}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`,void this.updateDiffContainerHeight();let n="";if(t.hasIssues&&t.issues&&t.issues.length>0){const e={critical:"rgba(220, 53, 69, 0.95)",major:"rgba(253, 126, 20, 0.95)",minor:"rgba(255, 193, 7, 0.95)"},i={vandalism:"fa-skull-crossbones",spam:"fa-spam",pov:"fa-balance-scale",unsourced:"fa-question-circle",attack:"fa-bomb",copyright:"fa-copyright",disruptive:"fa-circle-exclamation",error:"fa-bug",policy:"fa-gavel","ai-generated":"fa-robot"};n='<div style="display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px;">';for(const o of t.issues.slice(0,5)){const t=i[o.type]||"fa-exclamation-circle";n+=`\n\t\t\t\t\t<span style="\n\t\t\t\t\t\tdisplay: inline-flex;\n\t\t\t\t\t\talign-items: center;\n\t\t\t\t\t\tgap: 4px;\n\t\t\t\t\t\tpadding: 4px 8px;\n\t\t\t\t\t\tbackground: ${e[o.severity]||"rgba(108, 117, 125, 0.95)"};\n\t\t\t\t\t\tborder-radius: 6px;\n\t\t\t\t\t\tfont-size: 0.75em;\n\t\t\t\t\t\tfont-weight: 600;\n\t\t\t\t\t\tletter-spacing: 0.2px;\n\t\t\t\t\t\tbox-shadow: 0 1px 6px rgba(0, 0, 0, 0.2);\n\t\t\t\t\t\tborder: 1px solid rgba(255, 255, 255, 0.2);\n\t\t\t\t\t\tcursor: help;\n\t\t\t\t\t\ttransition: all 0.2s ease;\n\t\t\t\t\t" data-tooltip="${y.util.escapeHtml(o.description)}"\n\t\t\t\t\tonmouseover="this.style.transform='translateY(-1px)'; this.style.boxShadow='0 3px 10px rgba(0, 0, 0, 0.3)';"\n\t\t\t\t\tonmouseout="this.style.transform='translateY(0)'; this.style.boxShadow='0 1px 6px rgba(0, 0, 0, 0.2)';">\n\t\t\t\t\t\t<span class="fa ${t}"></span>\n\t\t\t\t\t\t${o.type}\n\t\t\t\t\t</span>\n\t\t\t\t`}t.issues.length>5&&(n+=`<span style="opacity: 0.85; font-size: 0.75em; padding: 4px 8px; background: rgba(0, 0, 0, 0.15); border-radius: 6px; font-weight: 500;">+${t.issues.length-5} more</span>`),n+="</div>"}const i=t.action||"review",o={rollback:"rgba(220, 53, 69, 0.95)","warn-and-revert":"rgba(231, 76, 60, 0.95)",warn:"rgba(253, 126, 20, 0.95)","report-aiv":"rgba(142, 68, 173, 0.95)",review:"rgba(255, 193, 7, 0.95)",approve:"rgba(40, 167, 69, 0.95)",thank:"rgba(23, 162, 184, 0.95)",welcome:"rgba(32, 201, 151, 0.95)"}[i]||"rgba(108, 117, 125, 0.95)",a={rollback:"fa-rotate-left","warn-and-revert":"fa-exclamation-triangle",warn:"fa-exclamation-triangle","report-aiv":"fa-gavel",review:"fa-eye",approve:"fa-check-circle",thank:"fa-heart",welcome:"fa-hand-wave"}[i]||"fa-question",r=t.probability||0;e.innerHTML=`\n\t\t\t<div style="padding: 10px 12px;">\n\t\t\t\t\x3c!-- Compact Header --\x3e\n\t\t\t\t<div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px;">\n\t\t\t\t\t<div style="display: flex; align-items: center; gap: 6px;">\n\t\t\t\t\t\t<span class="fa fa-robot" style="font-size: 1.1em;"></span>\n\t\t\t\t\t\t<strong style="font-size: 0.95em; letter-spacing: 0.3px;">AI Analysis</strong>\n\t\t\t\t\t\t<span style="padding: 3px 8px; background: rgba(255,255,255,0.25); border-radius: 6px; font-size: 0.8em; font-weight: 700;">\n\t\t\t\t\t\t\t${r}%\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span style="padding: 3px 8px; background: rgba(255,255,255,0.18); border-radius: 6px; font-size: 0.75em; font-weight: 600; text-transform: uppercase;">\n\t\t\t\t\t\t\t${t.confidence||"unknown"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span style="display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; background: ${o}; border-radius: 6px; font-size: 0.8em; font-weight: 700; text-transform: uppercase; letter-spacing: 0.3px;">\n\t\t\t\t\t\t<span class="fa ${a}"></span>\n\t\t\t\t\t\t${i.replace(/-/g," ")}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t\x3c!-- Compact Summary --\x3e\n\t\t\t\t<div style="font-size: 0.85em; line-height: 1.4; margin-bottom: 6px; opacity: 0.95;">\n\t\t\t\t\t${t.summary}\n\t\t\t\t</div>\n\n\t\t\t\t${t.reasoning?`\n\t\t\t\t<div style="font-size: 0.8em; line-height: 1.3; padding: 6px 8px; background: rgba(0,0,0,0.15); border-radius: 4px; margin-bottom: 6px; border-left: 3px solid rgba(143,163,255,0.5); opacity: 0.9;">\n\t\t\t\t\t<strong style="font-size: 0.85em;">🔍</strong> ${t.reasoning}\n\t\t\t\t</div>\n\t\t\t\t`:""}\n\n\t\t\t\t\x3c!-- Compact Recommendation --\x3e\n\t\t\t\t<div style="font-size: 0.82em; line-height: 1.3; padding: 6px 8px; background: rgba(255,255,255,0.08); border-radius: 4px; margin-bottom: ${t.hasIssues&&t.issues&&t.issues.length>0?"8px":"0"}; border-left: 3px solid rgba(40,167,69,0.6); opacity: 0.95;">\n\t\t\t\t\t<strong style="font-size: 0.85em;">💡</strong> ${t.recommendation}\n\t\t\t\t</div>\n\n\t\t\t\t\x3c!-- Compact Issues --\x3e\n\t\t\t\t${n}\n\t\t\t</div>\n\t\t`,e.querySelectorAll("[data-tooltip]").forEach(t=>{this.addTooltipListener(t)}),this.updateDiffContainerHeight()}show3RRNotice(t){if(this.hide3RRNotice(),t<3)return void console.error("Cannot show 3RR notice: improper revert count");const e=document.createElement("div");e.id="warn-3RR-notice",e.style.cssText="\n\t\t\t\tmargin: 10px 10px 0 10px;\n\t\t\t\tpadding: 8px 12px;\n\t\t\t\tbackground: #f73214;\n\t\t\t\tborder-radius: 4px;\n\t\t\t\tcolor: #0c5460;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tflex-shrink: 0;\n\t\t\t",e.innerHTML=`\n\t\t\t\t<span class="fa fa-warning"></span>\n\t\t\t\t<span style="flex: 1;"><b>3RR:</b> You have made ${t} reverts on this article in the last 24 hours.</span>\n\t\t\t`;const n=this.elem("#diff-container");n&&n.parentElement&&n.parentElement.insertBefore(e,n)}hide3RRNotice(){const t=document.querySelector("#warn-3RR-notice");t&&t.remove()}showNewerEditButton(t,e){if(this.hideNewerEditButton(),!t||!e)return void console.error("Cannot show newer edit button: missing revid or page title");const n=document.createElement("div");n.id="old-edit-notice",n.setAttribute("data-newer-revision","true"),n.setAttribute("data-target-revid",t),n.setAttribute("data-target-page",e),n.style.cssText="\n\t\t\t\tmargin: 10px 10px 0 10px;\n\t\t\t\tpadding: 8px 12px;\n\t\t\t\tbackground: #d1ecf1;\n\t\t\t\tborder-left: 4px solid #17a2b8;\n\t\t\t\tborder-radius: 4px;\n\t\t\t\tcolor: #0c5460;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tfont-size: 0.9em;\n\t\t\t\tflex-shrink: 0;\n\t\t\t",n.innerHTML='\n\t\t\t\t<span class="fa fa-clock-rotate-left"></span>\n\t\t\t\t<span style="flex: 1;">Newer revision available on this page</span>\n\t\t\t\t<a href="#" id="view-newest-edit" style="color: #004085; font-weight: 600; text-decoration: none; white-space: nowrap;">\n\t\t\t\t\tView latest →\n\t\t\t\t</a>\n\t\t\t';const i=this.elem("#diff-container");i&&i.parentElement&&(i.parentElement.insertBefore(n,i),document.getElementById("view-newest-edit").addEventListener("click",t=>{t.preventDefault();const e=n.getAttribute("data-target-revid"),i=n.getAttribute("data-target-page");e&&i&&y.queue.loadSpecificRevision(Number(e),i)}))}hideNewerEditButton(){const t=document.querySelector("#old-edit-notice[data-newer-revision='true']");t&&t.remove()}startNewerRevisionCheck(t){this.stopNewerRevisionCheck(),this.checkForNewerRevision(t),this.newerRevisionInterval=setInterval(()=>{y.queue.currentEdit&&y.queue.currentEdit.revid===t.revid?this.checkForNewerRevision(t):this.stopNewerRevisionCheck()},1e4)}stopNewerRevisionCheck(){this.newerRevisionInterval&&(clearInterval(this.newerRevisionInterval),this.newerRevisionInterval=null),this.hideNewerEditButton()}async checkForNewerRevision(t){try{const e=t.page.title,n=t.revid,i=(await y.api.getLatestRevisions(e))[e];if(!i)return void this.hideNewerEditButton();i>n?this.showNewerEditButton(i,e):this.hideNewerEditButton()}catch(t){console.error("Failed to check for newer revision:",t),this.hideNewerEditButton()}}updateDiffContainerHeight(){}addTooltipListener(t){t.addEventListener("mouseenter",()=>{if(this.removeTooltips(),!t.dataset.tooltip)return;const e=document.createElement("div");e.classList.add("tooltip"),"true"===t.dataset.tooltipHtml?e.innerHTML=t.dataset.tooltip:e.innerText=t.dataset.tooltip,document.body.appendChild(e),e.offsetHeight;const n=e.getBoundingClientRect().width,i=e.getBoundingClientRect().height,o=t.getBoundingClientRect(),a=(o.left+o.right-n)/2,r=o.right<window.innerWidth-n-30,s=o.left>n+30,l=a>10&&a+n<window.innerWidth-10,d=l&&o.top>i+30,c=l&&o.bottom<window.innerHeight-i-30;d?(e.style.left=(o.left+o.right-n)/2+"px",e.style.top=o.top-i-10+"px"):c?(e.style.left=(o.left+o.right-n)/2+"px",e.style.top=o.bottom+10+"px"):r?(e.style.left=o.right+10+"px",e.style.top=o.top-4+"px"):s?(e.style.left=o.left-10-n+"px",e.style.top=o.top-4+"px"):(e.style.left=Math.max(10,(o.left+o.right-n)/2)+"px",e.style.top=Math.max(10,o.bottom+10)+"px"),e.style.opacity=1}),t.addEventListener("mouseleave",()=>{this.removeTooltips()})}removeTooltips(){[...document.querySelectorAll(".tooltip")].forEach(t=>{t.style.opacity=0,window.setTimeout(()=>t.remove(),200)})}clearQueue(){this.elem("#queue-items").innerHTML=""}removeQueueItem(t){const e=this.elem(`.queue-edit[data-revid="${t}"]`);e&&e.remove()}getORESColor(t){const e=o.colorPalettes[y.options.selectedPalette];return e[Math.floor(t*e.length)]}elem(t){return document.querySelector(t)}escapeHtml(t){const e=document.createElement("div");return e.textContent=t,e.innerHTML}showToast(t,e,n=5e3,i="default"){const o=document.createElement("div");o.classList.add("toast-notification"),"success"===i?o.classList.add("success"):"error"===i?o.classList.add("error"):"warning"===i&&o.classList.add("warning");let a="⚠️";"success"===i?a="✓":"error"===i?a="✕":"warning"===i&&(a="⚠️"),o.innerHTML=`\n\t\t\t\t<div class="toast-icon">${a}</div>\n\t\t\t\t<div class="toast-content">\n\t\t\t\t\t<div class="toast-title">${this.escapeHtml(t)}</div>\n\t\t\t\t\t<div class="toast-message">${this.escapeHtml(e)}</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="toast-close">×</div>\n\t\t\t`,document.body.appendChild(o),setTimeout(()=>o.classList.add("show"),10);o.querySelector(".toast-close").addEventListener("click",()=>{this.hideToast(o)}),setTimeout(()=>{this.hideToast(o)},n)}hideToast(t){t&&t.parentElement&&(t.classList.add("hide"),setTimeout(()=>{t.parentElement&&t.remove()},300))}showUAAReasonDialog(t){return new Promise(e=>{const n=document.createElement("div");n.classList.add("confirmation-modal-overlay");const i=document.createElement("div");i.classList.add("confirmation-modal"),i.innerHTML=`\n\t\t\t\t\t<div class="confirmation-modal-header">\n\t\t\t\t\t\t<div class="confirmation-modal-title">Report to UAA</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="confirmation-modal-body">\n\t\t\t\t\t\tSelect reason for reporting <span class="confirmation-modal-username">${this.escapeHtml(t)}</span>:\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="confirmation-modal-footer confirmation-modal-footer-vertical">\n\t\t\t\t\t\t<button class="confirmation-modal-button confirmation-modal-button-reason" data-reason="Disruptive username">Disruptive username</button>\n\t\t\t\t\t\t<button class="confirmation-modal-button confirmation-modal-button-reason" data-reason="Offensive username">Offensive username</button>\n\t\t\t\t\t\t<button class="confirmation-modal-button confirmation-modal-button-reason" data-reason="Promotional username">Promotional username</button>\n\t\t\t\t\t\t<button class="confirmation-modal-button confirmation-modal-button-reason" data-reason="Misleading username">Misleading username</button>\n\t\t\t\t\t\t<button class="confirmation-modal-button confirmation-modal-button-cancel">Cancel</button>\n\t\t\t\t\t</div>\n\t\t\t\t`,n.appendChild(i),document.body.appendChild(n);const o=t=>"Escape"===t.key?(t.preventDefault(),t.stopPropagation(),a(null),!1):"Tab"!==t.key?(t.preventDefault(),t.stopPropagation(),!1):void 0;document.addEventListener("keydown",o,!0);const a=t=>{document.removeEventListener("keydown",o,!0),n.classList.add("closing"),i.classList.add("closing"),setTimeout(()=>{n.remove(),e(t)},200)};i.querySelectorAll(".confirmation-modal-button-reason").forEach(t=>{t.addEventListener("click",()=>{a(t.dataset.reason)})}),i.querySelector(".confirmation-modal-button-cancel").addEventListener("click",()=>{a(null)}),n.addEventListener("click",t=>{t.target===n&&a(null)})})}showConfirmationDialog(t,e,n=null){return new Promise(i=>{const o=document.createElement("div");o.classList.add("confirmation-modal-overlay");const a=document.createElement("div");a.classList.add("confirmation-modal");const r=n?'<button class="confirmation-modal-button confirmation-modal-button-uaa">Report to UAA</button>':"";a.innerHTML=`\n\t\t\t\t\t<div class="confirmation-modal-header">\n\t\t\t\t\t\t<div class="confirmation-modal-title">${this.escapeHtml(t)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="confirmation-modal-body">${e}</div>\n\t\t\t\t\t<div class="confirmation-modal-footer">\n\t\t\t\t\t\t${r}\n\t\t\t\t\t\t<div class="confirmation-modal-footer-right">\n\t\t\t\t\t\t\t<button class="confirmation-modal-button confirmation-modal-button-no">No</button>\n\t\t\t\t\t\t\t<button class="confirmation-modal-button confirmation-modal-button-yes">Yes</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`,o.appendChild(a),document.body.appendChild(o);const s=t=>"Enter"===t.key?(t.preventDefault(),t.stopPropagation(),p(!0),!1):"Escape"===t.key?(t.preventDefault(),t.stopPropagation(),p(!1),!1):"Tab"!==t.key?(t.preventDefault(),t.stopPropagation(),!1):void 0;document.addEventListener("keydown",s,!0);const l=a.querySelector(".confirmation-modal-button-yes"),d=a.querySelector(".confirmation-modal-button-no"),c=a.querySelector(".confirmation-modal-button-uaa"),p=t=>{document.removeEventListener("keydown",s,!0),o.classList.add("closing"),a.classList.add("closing"),setTimeout(()=>{o.remove(),i(t)},200)};l.addEventListener("click",()=>p(!0)),d.addEventListener("click",()=>p(!1)),c&&n&&c.addEventListener("click",async()=>{document.removeEventListener("keydown",s,!0),o.classList.add("closing"),a.classList.add("closing"),setTimeout(async()=>{o.remove();const a=await this.showUAAReasonDialog(n);if(a){const t=new f;t.set("Reporting to UAA...",.5,"var(--main-blue)");try{await y.reportToUAA(n,a),t.set(`Reported ${n} to UAA`,1,"var(--main-green)")}catch(e){t.set("Report failed",1,"var(--main-red)"),console.error("UAA report error:",e)}i(!1)}else{const o=await this.showConfirmationDialog(t,e,n);i(o)}},200)}),o.addEventListener("click",t=>{t.target===o&&p(!1)}),setTimeout(()=>l.focus(),50)})}}class f{constructor(){this.element=document.createElement("div"),this.element.className="progress-bar",this.overlay=document.createElement("div"),this.overlay.className="progress-bar-overlay",this.text=document.createElement("div"),this.text.className="progress-bar-text",y.interface.elem("#progress-bar-container").appendChild(this.element),this.element.appendChild(this.overlay),this.element.appendChild(this.text),this.nextChangeTime=0}set(t,e,n){const i=Math.max(0,this.nextChangeTime-Date.now());window.setTimeout(()=>{this.text.innerHTML=t,this.overlay.style.width=`${Math.round(100*e)}%`,this.overlay.style.background=n,1===e&&this.remove(2e3)},i),this.nextChangeTime=Math.max(Date.now()+200,this.nextChangeTime+200)}remove(t){window.setTimeout(()=>{this.element.style.opacity="0"},t-300),window.setTimeout(()=>{this.element.remove()},t)}}class v{constructor(){this.options=this.loadOptions(),this.statistics=this.loadStats(),this.interface=new h,this.queue=new p,this.api=new d(new mw.Api),this.logger=new l,this.util=new s,this.whitelist=this.loadWhitelist(),this.highlighted=this.loadHighlighted(),this.noAutoWelcomeList=new Set,this.highlightCleanupInterval=setInterval(()=>{this.cleanupExpiredHighlights()},3e4),this.ollamaAI=null,this.options.enableOllamaAI&&(this.ollamaAI=new c(this.options.ollamaServerUrl,this.options.ollamaModel),this.logger.log("Ollama AI integration enabled")),this.aivReports=[],this.uaaReports=[],this.rights={rollback:!1,protect:!1,block:!1},this.username=mw.config.values.wgUserName,this.handleLoadingReported(),this.handleLoadingNotifications(),this.testingMode=!1,this.tempCurrentEdit=null,this.notifications=[],this.lastSeenRevision=null}async startInterface(){const t=await mw.user.getRights();this.rights.rollback=t.includes("rollback"),this.rights.protect=t.includes("protect"),this.rights.block=t.includes("block"),this.interface.build(),this.handleUpdatingContributions()}async updateMyContributions(){try{const t=await this.api.api.get({action:"query",list:"users",ususers:this.username,usprop:"editcount"});if(t.query&&t.query.users&&t.query.users[0]){const e=t.query.users[0].editcount||0,n=document.querySelector("#stat-total-contribs");n&&(n.textContent=e.toLocaleString())}}catch(t){console.log("Failed to fetch user contribution count:",t)}}handleUpdatingContributions(){this.updateMyContributions(),window.setTimeout(()=>{this.handleUpdatingContributions()},1e4)}cleanupExpiredHighlights(){const t=Date.now();let e=!1;for(const[n,i]of this.highlighted.entries())t>=i&&(this.highlighted.delete(n),e=!0,this.logger.log(`Removed expired highlight for user: ${n}`));e&&(this.saveHighlighted(),this.queue&&this.interface&&this.interface.renderQueue(this.queue.queue,this.queue.currentEdit))}start(){this.interface.start(),this.queue.fetchRecentChanges()}loadOptions(){let t={};try{t=JSON.parse(mw.storage.store.getItem("wikishieldSettings"))}catch(t){}t||(t={});for(const e in o.defaultSettings){const n=t[e];if(null==n)t[e]=o.defaultSettings[e];else if("object"==typeof n&&!Array.isArray(n))for(const t in o.defaultSettings[e])void 0===n[t]&&(n[t]=o.defaultSettings[e][t])}for(const e in t.controls){"string"==typeof t.controls[e]&&(t.controls[e]=[t.controls[e]]);const n=t.controls[e].length;for(let i=0;i<n;i++)t.controls[e][i]=t.controls[e][i].toLowerCase()}return this.saveOptions(t),t}saveOptions(t){mw.storage.store.setItem("wikishieldSettings",JSON.stringify(t))}saveWhitelist(){const t=[...this.whitelist.entries()];mw.storage.store.setItem("wikishieldWhitelist",JSON.stringify(t))}loadWhitelist(){try{const t=JSON.parse(mw.storage.store.getItem("wikishieldWhitelist"));return t&&t.length>0?"string"==typeof t[0]?new Map(t.map(t=>[t,Date.now()])):new Map(t):new Map}catch(t){return new Map}}saveHighlighted(){const t=[...this.highlighted.entries()];mw.storage.store.setItem("wikishieldHighlighted",JSON.stringify(t))}loadHighlighted(){try{const t=JSON.parse(mw.storage.store.getItem("wikishieldHighlighted"));return new Map(t||[])}catch(t){return new Map}}getChangelogVersion(){const t=mw.storage.store.getItem("__script__.changelog.version");return t||(mw.storage.store.setItem("__script__.changelog.version",0),0)}updateChangelogVersion(){mw.storage.store.setItem("__script__.changelog.version",n.changelog.version)}loadStats(){let t;try{t=JSON.parse(mw.storage.store.getItem("wikishieldStats"))}catch(t){}return t||(t={reviewed:0,reverts:0,reports:0,warnings:0,welcomes:0,whitelisted:0,highlighted:0,blocks:0,sessionStart:Date.now()}),void 0===t.warnings&&(t.warnings=0),void 0===t.welcomes&&(t.welcomes=0),void 0===t.whitelisted&&(t.whitelisted=0),void 0===t.highlighted&&(t.highlighted=0),void 0===t.blocks&&(t.blocks=0),void 0===t.sessionStart&&(t.sessionStart=Date.now()),this.saveStats(t),t}saveStats(t){mw.storage.store.setItem("wikishieldStats",JSON.stringify(t))}async revert(t,e,n=!1){if(!t)return;const i=`Reverted ${n?"[[WP:AGF|good faith]] ":""}edits by [[Special:Contributions/${t.user.name}|${t.user.name}]] ([[User talk:${t.user.name}|talk]])${e?": "+e:""} ([[WP:WikiShield|WS]])`;if(!this.rights.rollback)return!1;if(!await this.api.rollback(t.page.title,t.user.name,i))return this.interface.showToast("Revert Failed",`Could not revert edits on "${t.page.title}" - a newer edit may have been made`),!1;return this.statistics.reverts++,this.saveStats(this.statistics),this.updateMyContributions(),!0}async warnUser(t,e,n,i,o){if(!e)return;let a=await this.api.getSinglePageContent(`User talk:${t}`),r="";if("auto"!==n&&("4im"===n?r=e.length>=5?e[4]:e[e.length-1]:n>0&&n<=e.length&&(r=e[n-1])),"auto"===n){const t=this.queue.getWarningLevel(a),n="4im"===t?5:Number(t);if("4"===t||"4im"===t||n>=e.length)return;r=e[n]}if(!r)return;a.match("== ?"+y.util.monthSectionName()+" ?==")||(a+=`\n== ${y.util.monthSectionName()} ==\n`);const s=a.split(/(?=== ?[\w\d ]+ ?==)/g);for(let t in s)if(s[t].match(new RegExp("== ?"+y.util.monthSectionName()+" ?=="))){s[t]+=i?`\n\n{{${r}|${i}}} ~~~~`:`\n\n{{${r}}} ~~~~`;break}const l=s.join("").replace(/(\n){3,}/g,"\n\n"),d=r.match(/(\d(?:im)?)$/),c=d?d[1]:null,p=i?c?`Message about [[Special:Diff/${o}|your edit]] on [[${i}]] (level ${c}) ([[WP:WikiShield|WS]])`:`Message about [[Special:Diff/${o}|your edit]] on [[${i}]] ([[WP:WikiShield|WS]])`:c?`Message about your edits (level ${c}) ([[WP:WikiShield|WS]])`:"Message about your edits ([[WP:WikiShield|WS]])";await this.api.edit(`User talk:${t}`,l,p),this.statistics.warnings++,this.saveStats(this.statistics);try{await this.api.postWithToken("watch",{action:"watch",titles:`User talk:${t}`,expiry:y.options.watchlistExpiry})}catch(e){console.log(`Could not add User talk:${t} to watchlist:`,e)}c&&this.queue.currentEdit&&this.queue.currentEdit.user.name===t&&(console.log(`[warnUser] Updating warning level for ${t} from ${this.queue.currentEdit.user.warningLevel} to ${c}`),console.log(`[warnUser] Original warning level: ${this.queue.currentEdit.user.originalWarningLevel}`),this.queue.currentEdit.user.warningLevel=c)}async loadReportedUsers(){try{const t=await this.api.getText(`${n.pages.AVI}|${n.pages.UAA}`),e=new RegExp("{{(?:(?:ip)?vandal|user-uaa)\\|(?:1=)?(.+?)}}","gi");t&&t[n.pages.AVI]?this.aivReports=[...t[n.pages.AVI].matchAll(e)].map(t=>t[1]):(console.warn("AVI content not found, skipping AVI reports"),this.aivReports=[]),t&&t[n.pages.UAA]?this.uaaReports=[...t[n.pages.UAA].matchAll(e)].map(t=>t[1]):(console.warn("UAA content not found, skipping UAA reports"),this.uaaReports=[])}catch(t){console.log("Error while fetching reported users",t),this.aivReports=this.aivReports||[],this.uaaReports=this.uaaReports||[]}}async handleLoadingReported(){await this.loadReportedUsers(),window.setTimeout(()=>{this.handleLoadingReported()},15e3)}async loadNotifications(){try{var t,e,n;const[p,u,g]=await Promise.all([this.api.api.get({action:"query",meta:"notifications",notlimit:20,notprop:"list",notfilter:"!read",notsections:"alert"}),this.api.api.get({action:"query",meta:"notifications",notlimit:20,notprop:"list",notfilter:"!read",notsections:"message"}),this.api.api.get({action:"query",prop:"revisions",titles:`User talk:${this.username}`,rvlimit:10,rvprop:"timestamp|user|comment|ids",rvdir:"older"})]),m=[];if(null!==(t=p.query)&&void 0!==t&&null!==(t=t.notifications)&&void 0!==t&&t.list){const t=Object.values(p.query.notifications.list);for(const e of t){var i,o,a,r;let t=(null===(i=e.timestamp)||void 0===i?void 0:i.mw)||(null===(o=e.timestamp)||void 0===o?void 0:o.utcmw);t=t&&"string"==typeof t&&14===t.length?`${t.slice(0,4)}-${t.slice(4,6)}-${t.slice(6,8)}T${t.slice(8,10)}:${t.slice(10,12)}:${t.slice(12,14)}Z`:(new Date).toISOString();let n="Alert";"mention"===e.type||"mention-success"===e.type?n="Mention":"thank-you-edit"===e.type?n="Thanks":"page-linked"===e.type?n="Page Link":"reverted"===e.type?n="Revert":"edit-user-talk"===e.type&&(n="Talk"),m.push({id:`alert-${e.id}`,type:"alert",subtype:e.type,timestamp:t,title:(null===(a=e.title)||void 0===a?void 0:a.full)||"Unknown page",agent:(null===(r=e.agent)||void 0===r?void 0:r.name)||"Someone",category:n,read:!1})}}if(null!==(e=u.query)&&void 0!==e&&null!==(e=e.notifications)&&void 0!==e&&e.list){const t=Object.values(u.query.notifications.list);for(const e of t){var s,l,d,c;let t=(null===(s=e.timestamp)||void 0===s?void 0:s.mw)||(null===(l=e.timestamp)||void 0===l?void 0:l.utcmw);t=t&&"string"==typeof t&&14===t.length?`${t.slice(0,4)}-${t.slice(4,6)}-${t.slice(6,8)}T${t.slice(8,10)}:${t.slice(10,12)}:${t.slice(12,14)}Z`:(new Date).toISOString();let n="Notice";"user-rights"===e.type?n="User Rights":"emailuser"===e.type&&(n="Email"),m.push({id:`notice-${e.id}`,type:"notice",subtype:e.type,timestamp:t,title:(null===(d=e.title)||void 0===d?void 0:d.full)||"Notification",agent:(null===(c=e.agent)||void 0===c?void 0:c.name)||"System",category:n,read:!1})}}const b=null===(n=g.query)||void 0===n?void 0:n.pages;if(b){const t=Object.values(b)[0].revisions||[];if(this.lastSeenRevision){for(const e of t){if(!(e.revid>this.lastSeenRevision))break;e.user!==this.username&&m.push({id:`talk-${e.revid}`,type:"talk",revid:e.revid,user:e.user,comment:e.comment||"Edit to your talk page",timestamp:e.timestamp,read:!1})}t.length>0&&(this.lastSeenRevision=Math.max(this.lastSeenRevision,t[0].revid))}else t.length>0&&(this.lastSeenRevision=t[0].revid)}let h=!1;for(const t of m){this.notifications.find(e=>e.id===t.id)||(this.notifications.unshift(t),h=!0)}h&&this.notifications.length>0&&y.queue.playNotificationSound(),this.notifications.sort((t,e)=>{const n=new Date(t.timestamp);return new Date(e.timestamp)-n}),this.notifications.length>25&&(this.notifications=this.notifications.slice(0,25)),this.updateNotificationDisplay()}catch(t){console.log("Error while fetching notifications",t)}}async handleLoadingNotifications(){await this.loadNotifications(),window.setTimeout(()=>{this.handleLoadingNotifications()},1e4)}updateNotificationDisplay(){const t=this.notifications.filter(t=>!t.read).length,e=document.querySelector("#notification-count"),n=document.querySelector("#notifications-list");e&&n&&(t>0?(e.textContent=t>9?"9+":t,e.style.display="block"):e.style.display="none",n&&(0===this.notifications.length?n.innerHTML='<div style="padding: 20px; text-align: center; color: #666;">No new notifications</div>':(n.innerHTML=this.notifications.map(t=>{const e=new Date(t.timestamp),n=this.formatNotificationTime(e);let i,o,a,r;"alert"===t.type?(a=t.category||"Alert","mention"===t.subtype||"mention-success"===t.subtype?(i=`${t.agent} mentioned you`,o=`on ${t.title}`):"thank-you-edit"===t.subtype?(i=`${t.agent} thanked you`,o=`for your edit on ${t.title}`):"page-linked"===t.subtype?(i="Your page was linked",o=`from ${t.title}`):"reverted"===t.subtype?(i=`${t.agent} reverted your edit`,o=`on ${t.title}`):"edit-user-talk"===t.subtype?(i=`${t.agent} edited your talk page`,o=t.title):"emailuser"===t.subtype?(i=`${t.agent} sent you an email`,o=t.title):"foreign"===t.subtype?(i=`Alert from ${t.agent}`,o=t.title):(i=`Alert: ${t.subtype||"notification"}`,o=`${t.agent} - ${t.title}`),r=`data-page="${this.escapeHtml(t.title)}"`):"notice"===t.type?(a=t.category||"Notice","user-rights"===t.subtype?(i="Your user rights were changed",o=t.title):"emailuser"===t.subtype?(i="Email notification",o=t.title):"flow-discussion"===t.subtype?(i="New discussion activity",o=t.title):(i=`Notice: ${t.subtype||"system notification"}`,o=`${t.agent} - ${t.title}`),r=`data-page="${this.escapeHtml(t.title)}"`):(a="Talk Page",i=`${t.user} edited your talk page`,o=t.comment||"No edit summary",r=`data-revid="${t.revid}"`);return`\n\t\t\t\t\t\t\t<div class="notification-item ${t.read?"":"unread"}" data-notif-id="${t.id}" data-notif-type="${t.type}" ${r}>\n\t\t\t\t\t\t\t\t<div class="notification-header">\n\t\t\t\t\t\t\t\t\t<span class="notification-type">${a}</span>\n\t\t\t\t\t\t\t\t\t<span class="notification-time">${n}</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class="notification-title">${this.escapeHtml(i)}</div>\n\t\t\t\t\t\t\t\t${o?`<div class="notification-subtitle">${this.escapeHtml(o)}</div>`:""}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`}).join(""),n.querySelectorAll(".notification-item").forEach(t=>{t.addEventListener("click",()=>{const e=t.dataset.notifId,n=t.dataset.notifType;if(this.markNotificationRead(e),"alert"===n||"notice"===n){const e=t.dataset.page;e&&window.open(mw.util.getUrl(e),"_blank")}else{const e=t.dataset.revid;e&&window.open(mw.util.getUrl(`Special:Diff/${e}`),"_blank")}})}))))}addLocalNotification(t){const e={id:`local-${Date.now()}-${Math.random()}`,type:t.type||"info",title:t.title||"Notification",subtitle:t.subtitle||"",page:t.page||"",timestamp:(new Date).toISOString(),read:!1};this.notifications.unshift(e),this.updateNotificationDisplay()}escapeHtml(t){const e=document.createElement("div");return e.textContent=t,e.innerHTML}formatNotificationTime(t){const e=new Date,n=Math.floor((e-t)/1e3);if(n<0)return"Just now";if(n<60)return"Just now";if(n<3600){const t=Math.floor(n/60);return`${t} min${1!==t?"s":""} ago`}if(n<86400){const t=Math.floor(n/3600);return`${t} hour${1!==t?"s":""} ago`}if(n<604800){const t=Math.floor(n/86400);return`${t} day${1!==t?"s":""} ago`}return t.toLocaleDateString()}formatNotificationTimeShort(t){const e=new Date,n=Math.floor((e-t)/1e3);if(n<0)return"Now";if(n<60)return"Now";if(n<3600){return`${Math.floor(n/60)}m`}if(n<86400){return`${Math.floor(n/3600)}h`}if(n<604800){return`${Math.floor(n/86400)}d`}return t.toLocaleDateString()}markNotificationRead(t){const e=this.notifications.find(e=>e.id===t);e&&(e.read=!0),this.updateNotificationDisplay()}markAllNotificationsRead(){this.notifications.forEach(t=>t.read=!0),this.updateNotificationDisplay()}async userReportedToAiv(t,e=!0){return e&&await this.loadReportedUsers(),this.aivReports.some(e=>e.toLowerCase()===t.toLowerCase())}async userReportedToUaa(t,e=!0){return e&&await this.loadReportedUsers(),this.uaaReports.some(e=>e.toLowerCase()===t.toLowerCase())}async welcomeUser(t,e){try{const n=`User talk:${t}`,i=await this.api.getSinglePageContent(n);if(await this.api.pageExists(n))return;await this.api.edit(n,i+`\n${u.welcomeTemplates[e]}`,"Welcome to Wikipedia! ([[WP:WikiShield|WS]])"),this.statistics.welcomes++,this.saveStats(this.statistics),this.tempCurrentEdit&&this.tempCurrentEdit.user&&this.tempCurrentEdit.user.name===t&&(this.tempCurrentEdit.user.emptyTalkPage=!1),this.queue.currentEdit&&this.queue.currentEdit.user.name===t&&(this.queue.currentEdit.user.emptyTalkPage=!1),this.queue.queue.forEach(e=>{if(e.user&&e.user.name===t){e.user.emptyTalkPage=!1;const t=document.querySelector(`.queue-edit[data-revid="${e.revid}"]`);t&&t.remove()}}),this.interface.renderQueue(this.queue.queue,this.queue.currentEdit)}catch(t){console.log("Error while welcoming user",t)}}async checkIfProtectionRequested(t){const e=await this.api.getSinglePageContent(n.pages.RFPP),i=new RegExp(`= ?${RegExp.escape(t)} ?=`,"i");return null!==e.match(i)}async requestProtection(t,e,i){if(await this.checkIfProtectionRequested(t))return!1;await this.api.appendText(n.pages.RFPP,`\n\t\t\t\t=== [[${t}]] ===\n\t\t\t\t* {{pagelinks|${t}}}\n\t\t\t\t'''${e}''': ${i} ~~~~\n\t\t\t`.replaceAll("\t",""),`Requesting protection for [[${t}]] ([[WP:WikiShield|WS]])`),this.statistics.reports++,this.saveStats(this.statistics)}async reportToAIV(t,e){if((await this.api.usersBlocked(t))[t])return;if(await this.userReportedToAiv(t))return;const i=`* {{vandal|${t}}} – ${e} ~~~~`;await this.api.appendText(n.pages.AVI,i,`Reporting [[Special:Contributions/${t}|${t}]] ([[WP:WikiShield|WS]])`),this.statistics.reports++,this.saveStats(this.statistics)}async reportToUAA(t,e){if((await this.api.usersBlocked(t))[t])return;if(await this.userReportedToUaa(t))return;const i=`* {{user-uaa|${t}}} – ${e} ~~~~`;await this.api.appendText(n.pages.UAA,i,`Reporting [[Special:Contributions/${t}|${t}]] ([[WP:WikiShield|WS]])`),this.noAutoWelcomeList.add(t),this.statistics.reports++,this.saveStats(this.statistics)}keyPressed(t){if(this.interface.settings.isOpen)this.interface.settings.handleKeypress(t);else if("input"!==document.activeElement.tagName.toLowerCase()&&!(t.ctrlKey||t.altKey||t.metaKey||(" "===t.key&&t.target===document.body&&t.preventDefault(),this.tempCurrentEdit)))for(const e of this.options.controlScripts)e.keys.includes(t.key.toLowerCase())&&this.executeScript(e)}async executeScript(t,e=!0,n=null){const i=null===n;if(i&&this.tempCurrentEdit)return;if(i){const e=[t];let i=0;for(;e.length>0;){const t=e[0];(t.name&&"if"===t.name&&u.conditions[t.condition].check(this.queue.currentEdit)||!t.name)&&e.push(...t.actions),t.name&&"if"!==t.name&&this.interface.eventManager.events[t.name].includeInProgress&&i++,e.splice(0,1)}if(i>0){let t=0;const e=new f;n=n=>{const o="Done"===n?1:t/i;e.set(n,o,"var(--main-blue)"),t++}}else n=t=>{};this.tempCurrentEdit=this.queue.currentEdit||1}const o=t.name&&"if"===t.name&&u.conditions[t.condition].check(this.tempCurrentEdit);if("if"===t.name&&console.log(`[executeScript] Evaluating condition: ${t.condition}, Result: ${o}`),o||!t.name)for(const i of t.actions)if("if"===i.name)e=this.executeScript(i,e,n);else{const t=this.interface.eventManager.events[i.name];if((e||!t.needsContinuity)&&(t.includeInProgress&&n(t.progressDesc),1!==this.tempCurrentEdit||t.runWithoutEdit)){!1===await t.func(i.params)&&(e=!1)}}return t.name||n("Done"),i&&(this.tempCurrentEdit=null),e}}let y;"Wikipedia:WikiShield/run"===mw.config.get("wgRelevantPageName")&&"view"===mw.config.get("wgAction")?(y=new v,y.startInterface(),window.addEventListener("keydown",y.keyPressed.bind(y))):(mw.util.addPortletLink("p-personal",mw.util.getUrl("Wikipedia:WikiShield/run"),"🛡️ WikiShield","pt-wikishield","wikishield",null,"#pt-preferences"),mw.util.addPortletLink("p-personal-sticky-header",mw.util.getUrl("Wikipedia:WikiShield/run"),"🛡️ WikiShield","pt-wikishield","WikiShield",null,"#pt-preferences"))}})();Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.